Pandas rollingで移動平均をサクッと算出!窓関数の基本と活用法
Pandasの**rollingメソッドは、時系列データ分析において非常に強力なツールです。これを使えば、移動平均や移動合計**など、特定期間(窓)内の統計量を簡単に計算できます。この記事では、rollingメソッドの基本的な使い方から、具体的なデータ分析への応用例まで、初心者にも分かりやすく解説します。
窓関数(Rolling Window Functions)とは?
窓関数とは、時系列データのある時点から**一定期間(窓)**のデータを切り出し、その窓の中で統計量(平均、合計、標準偏差など)を計算する手法です。この窓をデータに沿って移動させることで、データの局所的な特徴や傾向を捉えることができます。
例えば、株価の移動平均は、過去N日間の平均株価を計算し、それを日々更新していくことで、短期的な価格変動を平滑化し、トレンドを把握するのに役立ちます。
Pandas rollingメソッドの基本
Pandasのrollingメソッドは、DataFrameやSeriesに対して適用し、移動窓オブジェクトを生成します。このオブジェクトに対して、mean()やsum()などの集計関数を適用することで、窓関数が実行されます。
基本的な使い方:移動平均の算出
まずは、移動平均を計算する最も基本的な例を見てみましょう。
import pandas as pd
import numpy as np
# サンプル時系列データの作成
data = pd.Series(np.random.randint(1, 100, 20),
index=pd.date_range('2024-01-01', periods=20, freq='D'))
print("元のデータ:\n", data)
# 3日間の移動平均を計算
rolling_mean = data.rolling(window=3).mean()
print("\n3日移動平均:\n", rolling_mean)
上記のコードでは、data.rolling(window=3)で3日間の窓を作成し、.mean()でその窓内の平均値を計算しています。最初の2日間は、窓に必要なデータが揃わないためNaN(Not a Number)となります。
window引数: 窓のサイズを指定
window引数は、窓のサイズ(移動平均を計算する期間の長さ)を指定します。
-
整数: 固定サイズの窓を指定します。上記の例では
window=3でした。 -
オフセットエイリアス: 時間ベースの窓を指定します。例えば、
'3D'とすると3日間、'7D'とすると7日間を意味します。これは、データのインデックスがDatetimeIndexの場合に特に便利です。
# 7日間の移動合計を計算 (時間ベースの窓)
rolling_sum_7d = data.rolling(window='7D').sum()
print("\n7日移動合計:\n", rolling_sum_7d)
min_periods引数: 最小観測数を指定
デフォルトでは、窓のサイズ分のデータが揃わないとNaNになりますが、min_periods引数を使うことで、窓内の有効なデータが指定した数以上あれば計算を行うことができます。
# 3日間の移動平均、最低1日データがあれば計算
rolling_mean_min1 = data.rolling(window=3, min_periods=1).mean()
print("\n3日移動平均 (min_periods=1):\n", rolling_mean_min1)
この例では、min_periods=1と設定したため、最初のデータから移動平均が計算されています(窓が完全に埋まらなくても計算されます)。
その他の集計関数と応用例
rollingオブジェクトには、mean()以外にも様々な集計関数を適用できます。
よく使う集計関数
-
.sum(): 移動合計 -
.std(): 移動標準偏差 -
.var(): 移動分散 -
.min(): 移動最小値 -
.max(): 移動最大値 -
.median(): 移動中央値 -
.count(): 窓内の非NaN値の数 -
.apply(func): 独自の関数を適用
# 3日間の移動標準偏差
rolling_std = data.rolling(window=3).std()
print("\n3日移動標準偏差:\n", rolling_std)
複雑な窓関数 (.apply()の活用)
apply()メソッドを使うと、rollingオブジェクトに対してユーザー定義関数を適用できます。これにより、より複雑な計算も可能になります。
例えば、窓内の最大値と最小値の差を計算してみましょう。
# 窓内の最大値と最小値の差を計算する関数
def max_min_diff(series):
return series.max() - series.min()
# 5日間の最大最小差を計算
rolling_diff = data.rolling(window=5).apply(max_min_diff, raw=False) # raw=FalseでPandas Seriesが渡される
print("\n5日間移動最大最小差:\n", rolling_diff)
rollingメソッドの応用例
rollingメソッドは、金融、気象、販売データなど、様々な時系列データの分析に応用できます。
データの平滑化
移動平均は、データのノイズを除去し、 underlying (基礎となる)なトレンドを可視化するのに非常に効果的です。特に株価や売上データのような変動の大きいデータで威力を発揮します。
ボラティリティの測定
移動標準偏差や移動分散は、データの変動の大きさ(ボラティリティ)を時系列で追うために使われます。金融市場の分析でよく用いられます。
アノマリー検知
移動平均や移動標準偏差を使って、データが通常の範囲から大きく外れていないかをチェックすることで、異常値(アノマリー)を検出する手がかりになります。
まとめ
Pandasのrollingメソッドは、時系列データの窓関数計算を簡単かつ効率的に行うための強力な機能です。
-
window: 窓のサイズを指定(整数またはオフセットエイリアス) -
min_periods: 計算に必要な最小データ数を指定 -
.mean(),.sum(),.std()など、様々な集計関数を適用可能 -
.apply(): 独自の関数を適用して、より複雑な計算も実現可能
このメソッドをマスターすることで、時系列データのトレンド分析や特性把握が格段に容易になります。ぜひ、ご自身のデータでrollingメソッドを試してみてください。

