Pandas shiftでデータを行列方向にずらす!時系列分析に必須の操作
Pandasの**shift**メソッドは、DataFrameやSeriesのデータを指定した数だけ行(縦)方向または列(横)方向にずらすことができる便利な機能です。特に時系列データ分析において、前日比や翌日予測などの計算を行う際に頻繁に利用されます。この記事では、shiftメソッドの基本的な使い方から、その応用例までを詳しく解説します。
shiftメソッドとは?
shiftメソッドは、SeriesやDataFrameのインデックスを保ちつつ、その中の値を指定した数だけずらします。ずらした結果、新しくデータがない箇所にはデフォルトでNaN(Not a Number)が挿入されます。
例えば、株価データで前日の終値を取得したい場合や、現在の売上と翌日の売上を比較したい場合に役立ちます。
Pandas shiftメソッドの基本
Seriesでのshift:時系列データのずれを表現
まずは、Seriesを使って基本的な使い方を見てみましょう。
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引数は、データをずらす量を指定します。正の値を指定すると下に(未来に)ずらし、負の値を指定すると上に(過去に)ずらします。
# 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引数を使うことで、列方向のずれも指定できます。
# サンプル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のメソッドと組み合わせることで、より高度なデータ分析に活用できます。
前日比・変化率の算出
shiftとdiffやpct_changeを組み合わせることで、前日比や変化率を簡単に算出できます。実際、diff()やpct_change()メソッドは内部的にshiftを使用しています。
# 株価データの日次変化 (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は有効です。
# 月次売上データ (時系列インデックスを持つ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は非常に役立ちます。
# 時系列データからラグ特徴量を作成
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メソッドを使いこなすことで、データ分析の幅が大きく広がり、より深い洞察を得られるようになるでしょう。ぜひ、ご自身のデータ分析に役立ててください。


