【Python】Pandasデータフレームのshiftメソッドの使い方を実例ベースで解説

Python

Pandasは、Pythonでデータ分析を行うための強力なライブラリであり、データの操作、クリーニング、などの前処理や分析の工程で使われます。このライブラリには多くの有用なメソッドがありますが、今日はその中でも特にshiftメソッドについて詳しく見ていきましょう。

shiftメソッドとは

shiftメソッドは、データフレームの全ての要素を一定の方向(上か下)にシフト(移動)します。これは時系列データの分析やデータのラグ値を計算する際に非常に便利です。

基本的な使用方法は以下の通りです:

DataFrame.shift(periods=1, freq=None, axis=0, fill_value=None)

ここでパラメータは次のとおりです:

  • periods: 移動させる位置数。正の値は下方向(’future’)に、負の値は上方向(’past’)にシフトします。デフォルトは1です。
  • freq: オプションで指定可能なパラメータで、時系列データの頻度(’D’、’H’、’T’、’S’など)を指定します。
  • axis: シフト方向を指定します。0は行方向(デフォルト)、1は列方向です。
  • fill_value: シフトによって生成されたNA/NaN位置を埋める値を指定します。

使用例: shiftメソッドの基本的な使い方

それではまず、shiftメソッドの基本的な使い方について見ていきましょう。以下のようなデータフレームを考えます:

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
})
print(df)

これを実行すると以下のようなデータフレームが表示されます:

   A   B    C
0  1  10  100
1  2  20  200
2  3  30  300
3  4  40  400
4  5  50  500

ここでshiftメソッドを適用してみます:

df_shifted = df.shift(1)
print(df_shifted)

結果は以下のようになります:

     A     B      C
0  NaN   NaN    NaN
1  1.0  10.0  100.0
2  2.0  20.0  200.0
3  3.0  30.0  300.0
4  4.0  40.0  400.0

ここでわかるように、shiftメソッドはデータフレームの全ての要素を1行下に移動しました。最初の行はNaNで埋まり、それ以降の行は元の値から1行分ずれています。

また、shiftメソッドに負の値を指定すると、データは上に移動します:

df_shifted = df.shift(-1)
print(df_shifted)

結果は以下のようになります:

     A     B      C
0  2.0  20.0  200.0
1  3.0  30.0  300.0
2  4.0  40.0  400.0
3  5.0  50.0  500.0
4  NaN   NaN    NaN

この例では、全ての要素が1行上に移動し、最後の行がNaNで埋まりました。

shiftメソッドの応用: 時系列データ分析

shiftメソッドは特に時系列データの分析に有用です。たとえば、データのラグ値を計算したり、変化率を計算したりする際に使います。

以下に、時系列データ分析でのshiftメソッドの使用例を示します:

df = pd.DataFrame({
    'date': pd.date_range(start='1/1/2023', periods=5),
    'sales': [100, 200, 300, 400, 500]
})

# 日付をインデックスに設定
df.set_index('date', inplace=True)

# 前日の売上を新たな列として追加
df['prev_day_sales'] = df['sales'].shift(1)

print(df)

これを実行すると以下のようなデータフレームが表示されます:

            sales  prev_day_sales
date                             
2023-01-01    100             NaN
2023-01-02    200           100.0
2023-01-03    300           200.0
2023-01-04    400           300.0
2023-01-05    500           400.0

この例では、前日の売上を新たな列として追加しました。これにより、前日との売上の比較や変化率の計算が可能になります。それでは、上記のデータフレームを使って、前日との売上の変化率を計算してみましょう。

# 前日との売上の変化率を計算
df['sales_change'] = (df['sales'] - df['prev_day_sales']) / df['prev_day_sales']

print(df)

これを実行すると以下のようなデータフレームが表示されます:

            sales  prev_day_sales  sales_change
date                                           
2023-01-01    100             NaN           NaN
2023-01-02    200           100.0           1.0
2023-01-03    300           200.0           0.5
2023-01-04    400           300.0           0.333333
2023-01-05    500           400.0           0.25

この例では、前日との売上の変化率を計算しています。このように、shiftメソッドは時系列データの分析において非常に有用です。

また、shiftメソッドを用いて、特定の期間(例えば3日間)の移動平均を計算することも可能です。以下に、3日間の移動平均を計算し、その値を次の日にシフトするコードを示します。

# 3日間の移動平均を計算し、その値を次の日にシフト
df['sales_rolling_mean'] = df['sales'].rolling(window=3).mean().shift(1)

print(df)

これを実行すると以下のようなデータフレームが表示されます:

            sales  prev_day_sales  sales_change  sales_rolling_mean
date                                                               
2023-01-01    100             NaN           NaN                 NaN
2023-01-02    200           100.0           1.0                 NaN
2023-01-03    300           200.0           0.5                 NaN
2023-01-04    400           300.0           0.333333      200.000000
2023-01-05    500           400.0           0.25          300.000000

この例では、まず3日間の移動平均を計算し、その後shiftメソッドを使用して移動平均を1日ずらしています。これにより、ある日のsales_rolling_meanの値は、その前の3日間の売上の移動平均となります。

このように、shiftメソッドは移動平均などの特徴量を作成する際にも利用可能です。ただし、shiftメソッドを使用するときは、データが時間順にソートされていることを確認してください。そうでないと、予期しない結果を得る可能性があります。

以上が、Pandasのshiftメソッドの使い方と実用例についての説明です。このメソッドをうまく使いこなすことで、データ分析の幅が広がります。特に時系列データの分析においては、このメソッドは非常に有用です。ぜひ活用してみてください。

データサイエンティストの書評ブログ
趣味が読書くらいしかない駆け出しデータサイエンティストの書評ブログです。日々の勉強のアウトプットや趣味の読書のおすすめをしていきます。
pandasでデータを行・列(縦・横)方向にずらすshift | note.nkmk.me
pandas.DataFrame, pandas.Seriesのデータを行または列方向にずらすにはshift()を使う。pandas.DataFrame.shift — pandas 0.23.3 documentation 行または列の差分や変化率を取得するにはdiff()やpct_change()が使えるのでshi...

コメント

タイトルとURLをコピーしました