Pandasの shift
メソッド は、時系列データや順序付きデータを扱うときに非常に便利な関数です。
特に「データを上下にずらす」処理を簡単に行えるので、前後の比較や差分計算などに多用されます。
以下で詳しく解説します。
目次
主な引数の意味
periods
(デフォルト=1)
- データを何行(または何列)ずらすかを指定します。
- 正の値なら下方向(未来方向)、負の値なら上方向(過去方向)にシフトします。
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50])
print(s.shift(1))
print(s.shift(-1))
freq
- DatetimeIndex を持つ場合に利用可能で、日付や時間単位でシフトできます。
- 例えば
"D"
は日単位、"M"
は月単位です。
dates = pd.date_range("2023-01-01", periods=5)
s = pd.Series(range(5), index=dates)
print(s.shift(1, freq="D"))
freq
を指定すると、インデックスごと移動します。
単純にデータをずらすのではなく、日付そのものがシフトされる点が重要です。
axis
- データをどちらの軸でシフトするかを指定します。
axis=0
(デフォルト):行方向にシフトaxis=1
:列方向にシフト
df = pd.DataFrame({"A": [1, 2, 3], "B": [10, 20, 30]})
print(df.shift(1, axis=1))
fill_value
- シフトによって生じた 欠損値(NaN) を指定した値で埋めます。
print(s.shift(1, fill_value=0))
よくある使い方
前日との差分を取る
import pandas as pd
df = pd.DataFrame({"value": [100, 105, 103, 110, 120]})
# 前日との差分
df["diff"] = df["value"] - df["value"].shift(1)
print(df)
過去N期間の値を参照
例えば株価データで「昨日の終値」「一昨日の終値」を作りたい場合:
import pandas as pd
df = pd.DataFrame({"Close": [100, 102, 101, 105, 107]})
# 昨日の値
df["yesterday"] = df["Close"].shift(1)
# 一昨日の値
df["two_days_ago"] = df["Close"].shift(2)
print(df)
移動平均と組み合わせ
import pandas as pd
df = pd.DataFrame({"value": [10, 20, 30, 40, 50]})
# 3期間移動平均
df["ma_3"] = df["value"].rolling(3).mean()
# 1つ前の移動平均
df["ma_3_prev"] = df["ma_3"].shift(1)
print(df)
shift
と類似メソッドとの違い
tshift
(古いバージョン):インデックスごとシフト(現在はshift(freq=...)
で統合)pct_change
:shift
を利用して割合変化を計算するメソッドdiff
:差分を直接計算(s.diff(1)
はs - s.shift(1)
と同じ)
まとめ
shift
は「行や列をずらす」メソッドで、欠損を伴います。- 時系列データなら
freq
を使ってインデックス自体を移動できるのが大きな特徴。 - 差分計算や前日比較、遅行変数(lag features)の生成などに広く活用されます。
以上、PythonのPandasのshiftメソッドについてでした。
最後までお読みいただき、ありがとうございました。