ローリングウィンドウ、エクスパンディングウィンドウ、スライディングウィンドウの違いとは?

2024-04-02

Pandasの窓関数(Windowing operations)は、データフレーム内の特定の範囲(ウィンドウ)に対して集計を行い、各データポイントに集計結果を追加する強力な機能です。株価分析、移動平均、季節性分析など、様々なデータ分析で活躍します。

この解説で分かること

  • 窓関数の種類とそれぞれの特徴
  • 代表的な窓関数の使い方(例示)
  • 便利なオプション設定
  • よくある質問と回答

目次

  1. 窓関数の種類と特徴
    • ローリングウィンドウ
    • エクスパンディングウィンドウ
    • スライディングウィンドウ
  2. 代表的な窓関数の使い方
    • 移動平均
    • 累計
    • 最大値・最小値
  3. 便利なオプション設定
    • オフセット
    • 重み付け
  4. まとめ

窓関数の種類と特徴

窓関数は、データフレーム内のデータポイントをグループ化し、そのグループ内での集計を行います。グループ分けには、以下の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 と組み合わせて使用する