Pandas rollingで移動平均をサクッと算出!窓関数の基本と活用法


 

Pandasの**rollingメソッドは、時系列データ分析において非常に強力なツールです。これを使えば、移動平均や移動合計**など、特定期間(窓)内の統計量を簡単に計算できます。この記事では、rollingメソッドの基本的な使い方から、具体的なデータ分析への応用例まで、初心者にも分かりやすく解説します。


 

窓関数(Rolling Window Functions)とは?

 

窓関数とは、時系列データのある時点から**一定期間(窓)**のデータを切り出し、その窓の中で統計量(平均、合計、標準偏差など)を計算する手法です。この窓をデータに沿って移動させることで、データの局所的な特徴や傾向を捉えることができます。

例えば、株価の移動平均は、過去N日間の平均株価を計算し、それを日々更新していくことで、短期的な価格変動を平滑化し、トレンドを把握するのに役立ちます。


 

Pandas rollingメソッドの基本

 

Pandasのrollingメソッドは、DataFrameやSeriesに対して適用し、移動窓オブジェクトを生成します。このオブジェクトに対して、mean()sum()などの集計関数を適用することで、窓関数が実行されます。

 

基本的な使い方:移動平均の算出

 

まずは、移動平均を計算する最も基本的な例を見てみましょう。

Python
 
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の場合に特に便利です。

Python
 
# 7日間の移動合計を計算 (時間ベースの窓)
rolling_sum_7d = data.rolling(window='7D').sum()

print("\n7日移動合計:\n", rolling_sum_7d)

 

min_periods引数: 最小観測数を指定

 

デフォルトでは、窓のサイズ分のデータが揃わないとNaNになりますが、min_periods引数を使うことで、窓内の有効なデータが指定した数以上あれば計算を行うことができます。

Python
 
# 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): 独自の関数を適用

Python
 
# 3日間の移動標準偏差
rolling_std = data.rolling(window=3).std()

print("\n3日移動標準偏差:\n", rolling_std)

 

複雑な窓関数 (.apply()の活用)

 

apply()メソッドを使うと、rollingオブジェクトに対してユーザー定義関数を適用できます。これにより、より複雑な計算も可能になります。

例えば、窓内の最大値と最小値の差を計算してみましょう。

Python
 
# 窓内の最大値と最小値の差を計算する関数
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メソッドを試してみてください。