ローリングウィンドウ、エクスパンディングウィンドウ、スライディングウィンドウの違いとは?
Pandasの窓関数(Windowing operations)は、データフレーム内の特定の範囲(ウィンドウ)に対して集計を行い、各データポイントに集計結果を追加する強力な機能です。株価分析、移動平均、季節性分析など、様々なデータ分析で活躍します。
この解説で分かること
- 窓関数の種類とそれぞれの特徴
- 代表的な窓関数の使い方(例示)
- 便利なオプション設定
- よくある質問と回答
目次
- 窓関数の種類と特徴
- ローリングウィンドウ
- エクスパンディングウィンドウ
- スライディングウィンドウ
- 代表的な窓関数の使い方
- 移動平均
- 累計
- 最大値・最小値
- 便利なオプション設定
- オフセット
- 重み付け
- まとめ
窓関数の種類と特徴
窓関数は、データフレーム内のデータポイントをグループ化し、そのグループ内での集計を行います。グループ分けには、以下の3つの種類があります。
- ローリングウィンドウ:一定期間(行数)のデータポイントをグループ化します。過去データの分析に適しています。
- エクスパンディングウィンドウ:データの先頭から現在までのデータポイントをグループ化します。時間の経過に伴う変化を分析するのに適しています。
- スライディングウィンドウ:一定期間(行数)のデータポイントをグループ化しますが、グループはデータフレーム全体をスライドしながら作成されます。過去・現在・未来のデータ比較に適しています。
代表的な窓関数の使い方
例:ローリングウィンドウで移動平均を計算
import pandas as pd
# データフレーム作成
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
# ローリングウィンドウで移動平均を計算(期間3)
df['moving_average'] = df['data'].rolling(3).mean()
# 結果確認
print(df)
# 出力
# data moving_average
# 0 1 NaN
# 1 2 NaN
# 2 3 2.0
# 3 4 3.333333
# 4 5 4.666667
# 5 6 6.0
# 6 7 7.333333
# 7 8 8.666667
# 8 9 9.0
# 9 10 NaN
例:エクスパンディングウィンドウで累計を計算
# エクスパンディングウィンドウで累計を計算
df['cumulative_sum'] = df['data'].expanding().sum()
# 結果確認
print(df)
# 出力
# data moving_average cumulative_sum
# 0 1 NaN 1
# 1 2 NaN 3
# 2 3 2.0 6
# 3 4 3.333333 10
# 4 5 4.666667 15
# 5 6 6.0 21
# 6 7 7.333333 28
# 7 8 8.666667 36
# 8 9 9.0 45
# 9 10 NaN 55
例:スライディングウィンドウで最大値・最小値を計算
# スライディングウィンドウで最大値・最小値を計算(期間3)
df['max'] = df['data'].rolling(3).max()
df['min'] = df['data'].rolling(3).min()
# 結果確認
print(df)
# 出力
# data moving_average cumulative_sum max min
# 0 1 NaN 1 1 1
# 1 2 NaN 3 2 1
# 2 3 2.0 6 3 2
# 3 4 3.333333 10 4 3
Pandasで窓関数(Windowing operations)を使いこなす!
ローリングウィンドウ
移動平均
- 単純移動平均
df['moving_average'] = df['data'].rolling(window_size).mean()
- 加重移動平均
weights = np.linspace(1, window_size, window_size)
df['moving_average'] = df['data'].rolling(window_size).apply(lambda x: np.dot(x, weights) / weights.sum())
指数移動平均
alpha = 0.5
df['moving_average'] = df['data'].ewm(alpha=alpha, min_periods=window_size).mean()
累計
df['cumulative_sum'] = df['data'].rolling(window_size).sum()
最大値・最小値
df['max'] = df['data'].rolling(window_size).max()
df['min'] = df['data'].rolling(window_size).min()
標準偏差
df['std'] = df['data'].rolling(window_size).std()
変動係数
df['cv'] = df['data'].rolling(window_size).std() / df['data'].rolling(window_size).mean()
順位
df['rank'] = df['data'].rolling(window_size).rank(method='min')
相関係数
df['corr'] = df['data'].rolling(window_size).corr(df['other_data'])
エクスパンディングウィンドウ
上記と同様の関数を expanding()
を用いて使用できます。
例:累計
df['cumulative_sum'] = df['data'].expanding().sum()
スライディングウィンドウ
上記と同様の関数を rolling()
を用いて使用できます。
例:最大値・最小値
df['max'] = df['data'].rolling(window_size).max()
df['min'] = df['data'].rolling(window_size).min()
その他
オフセット
df['moving_average'] = df['data'].rolling(window_size, offset=1).mean()
重み付け
weights = np.linspace(1, window_size, window_size)
df['moving_average'] = df['data'].rolling(window_size).apply(lambda x: np.dot(x, weights) / weights.sum())
グループ化と窓関数
df['moving_average'] = df.groupby('group')['data'].rolling(window_size).mean()
マージ
df_moving_average = df['data'].rolling(window_size).mean().to_frame('moving_average')
df = df.merge(df_moving_average, on='index')
可視化
import matplotlib.pyplot as plt
plt.plot(df['data'])
plt.plot(df['moving_average'])
plt.show()
各サンプルコードの詳細については、以下の情報源を参照してください。
補足
- 上記はあくまでもサンプルコードです。必要に応じて修正・変更してください。
Pandasで窓関数(Windowing operations)を使いこなす!
自作関数
def moving_average(data, window_size):
moving_averages = []
for i in range(len(data)):
start_index = max(0, i - window_size + 1)
end_index = i + 1
window = data[start_index:end_index]
moving_average = sum(window) / len(window)
moving_averages.append(moving_average)
return moving_averages
df['moving_average'] = moving_average(df['data'], window_size)
NumPy
import numpy as np
def moving_average(data, window_size):
moving_averages = np.convolve(data, np.ones(window_size), 'valid') / window_size
return moving_averages
df['moving_average'] = moving_average(df['data'], window_size)
statsmodels
from statsmodels.tsa.stattools import moving_average
df['moving_average'] = moving_average(df['data'], window_size)
Ta-Lib
import talib
df['moving_average'] = talib.SMA(df['data'], window_size)
注意事項
- 自作関数は、他の方法よりも処理速度が遅くなる可能性があります。
- NumPy、statsmodels、Ta-Libは、Pandasよりも古いライブラリです。
各サンプルコードの詳細については、以下の情報源を参照してください。
pandas.tseries.offsets.BusinessMonthEnd.apply_indexを使いこなす! 月末の営業日を効率的に取得する方法
Data offsets は、pandas の時間軸操作機能の一つです。日付や時刻に特定の期間を加減したり、特定の日付や時刻を取得したりすることができます。BusinessMonthEnd は、月末の営業日を表す Data offset です。例えば、2023年12月2日に BusinessMonthEnd を適用すると、2023年12月31日(金曜日)が返されます。
pandas.Series.cat.remove_unused_categories メソッドの使い方
pandas. Series. cat. remove_unused_categories メソッドは、カテゴリ変数において、実際に使用されていないカテゴリーを削除するためのメソッドです。メモリ使用量の削減や、データ分析の効率化に役立ちます。
Pandas Series オブジェクトの name 属性:データフレームとの結合や名前の変更をわかりやすく解説
pandas. Series. name 属性は、Series オブジェクトの名前を設定または取得するために使用されます。名前は、Series オブジェクトを識別したり、データフレームに結合したりする際に役立ちます。設定Series. name 属性は、文字列を直接代入するか、name 引数を使用して設定できます。
pandas.read_sas vs その他の方法
引数filepath: 読み込む SAS データファイルのパスformat: SAS データファイルのフォーマット 'xport': XPORT フォーマット 'sas7bdat': SAS 7BDAT フォーマット'xport': XPORT フォーマット
Pandas Data Offsets と BDay の使い方
BDay は、Data Offsets の中でも ビジネスデイ を扱うためのオフセットです。つまり、土日や祝日を除いた営業日のみを加算・減算することができます。BDay は以下の方法で使用できます。単独で使用するDateOffset と組み合わせて使用する