Pandas shiftでデータを行列方向にずらす!時系列分析に必須の操作


 

Pandasの**shift**メソッドは、DataFrameやSeriesのデータを指定した数だけ行(縦)方向または列(横)方向にずらすことができる便利な機能です。特に時系列データ分析において、前日比や翌日予測などの計算を行う際に頻繁に利用されます。この記事では、shiftメソッドの基本的な使い方から、その応用例までを詳しく解説します。


 

shiftメソッドとは?

 

shiftメソッドは、SeriesやDataFrameのインデックスを保ちつつ、その中の値を指定した数だけずらします。ずらした結果、新しくデータがない箇所にはデフォルトでNaN(Not a Number)が挿入されます。

例えば、株価データで前日の終値を取得したい場合や、現在の売上と翌日の売上を比較したい場合に役立ちます。


 

Pandas shiftメソッドの基本

 

 

Seriesでのshift:時系列データのずれを表現

 

まずは、Seriesを使って基本的な使い方を見てみましょう。

Python
 
import pandas as pd

# サンプルSeriesの作成
s = pd.Series([10, 12, 15, 11, 18])
print("元のSeries:\n", s)

# 1つ下にずらす (デフォルト)
s_shifted_down = s.shift(1)
print("\n1つ下にずらしたSeries (shift(1)):\n", s_shifted_down)

上記の例では、s.shift(1)とすることで、データが1つ下にずらされ、最初の要素にはNaNが挿入されます。

 

periods引数: ずらす数を指定

 

periods引数は、データをずらす量を指定します。正の値を指定すると下に(未来に)ずらし、負の値を指定すると上に(過去に)ずらします。

Python
 
# 2つ下にずらす
s_shifted_2down = s.shift(2)
print("\n2つ下にずらしたSeries (shift(2)):\n", s_shifted_2down)

# 1つ上にずらす
s_shifted_up = s.shift(-1)
print("\n1つ上にずらしたSeries (shift(-1)):\n", s_shifted_up)

 

DataFrameでのshift:行・列方向のずれ

 

DataFrameの場合、デフォルトでは行方向(インデックス方向)にデータをずらします。axis引数を使うことで、列方向のずれも指定できます。

Python
 
# サンプルDataFrameの作成
df = pd.DataFrame({
    'A': [10, 20, 30],
    'B': [5, 12, 18],
    'C': [1, 2, 3]
})
print("元のDataFrame:\n", df)

# 行方向に1つ下にずらす (デフォルト: axis=0)
df_shifted_row = df.shift(1)
print("\n行方向に1つ下にずらしたDataFrame:\n", df_shifted_row)

# 列方向に1つ右にずらす (axis=1)
df_shifted_col = df.shift(1, axis=1)
print("\n列方向に1つ右にずらしたDataFrame:\n", df_shifted_col)

 

shiftメソッドの応用例

 

shiftメソッドは、他のPandasのメソッドと組み合わせることで、より高度なデータ分析に活用できます。

 

前日比・変化率の算出

 

shiftdiffpct_changeを組み合わせることで、前日比や変化率を簡単に算出できます。実際、diff()pct_change()メソッドは内部的にshiftを使用しています。

Python
 
# 株価データの日次変化 (diffとshiftの比較)
prices = pd.Series([100, 102, 101, 105, 103])

# diffで前日との差分を計算
daily_diff = prices.diff(1)
print("\ndiffによる日次差分:\n", daily_diff)

# shiftを使って手動で差分を計算
manual_diff = prices - prices.shift(1)
print("\nshiftを使った手動日次差分:\n", manual_diff)

# pct_changeで前日との変化率を計算
daily_pct_change = prices.pct_change(1) * 100
print("\npct_changeによる日次変化率 (%):\n", daily_pct_change)

 

特定の期間との比較

 

特定の期間(例:1年前、1週間前)のデータと比較する際にもshiftは有効です。

Python
 
# 月次売上データ (時系列インデックスを持つSeries)
sales = pd.Series([100, 110, 105, 120, 130, 125, 140, 150, 145, 160, 170, 165],
                  index=pd.date_range('2024-01-01', periods=12, freq='M'))

print("月次売上:\n", sales)

# 前年同月比を計算 (もしデータが複数年あれば)
# sales.shift(12) など
# ここでは例として2ヶ月前との比較
sales_vs_2months_ago = sales / sales.shift(2) - 1
print("\n2ヶ月前からの変化率:\n", sales_vs_2months_ago)

 

タイムラグを考慮した特徴量エンジニアリング

 

機械学習モデルの構築において、現在の値を予測するために過去のデータ(ラグ特徴量)を用いることがあります。このようなラグ特徴量の作成にshiftは非常に役立ちます。

Python
 
# 時系列データからラグ特徴量を作成
df_lag = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6]})
df_lag['value_lag1'] = df_lag['value'].shift(1) # 1つ前の値
df_lag['value_lag2'] = df_lag['value'].shift(2) # 2つ前の値

print("\nラグ特徴量を追加したDataFrame:\n", df_lag)

 

まとめ

 

Pandasの**shift**メソッドは、データをシンプルに行方向または列方向にずらす機能を提供します。

  • shift(periods): Series/DataFrameの値をperiods分だけずらします。正の値は下に(インデックスが増える方向に)、負の値は上に(インデックスが減る方向に)ずらします。

  • axis: DataFrameの場合、axis=0で行方向(デフォルト)、axis=1で列方向にずらします。

  • 主に、前日比の計算特定の期間との比較ラグ特徴量の作成など、時系列データ分析で幅広く活用されます。

このshiftメソッドを使いこなすことで、データ分析の幅が大きく広がり、より深い洞察を得られるようになるでしょう。ぜひ、ご自身のデータ分析に役立ててください。