Pandas Expanding Window の詳細解説 - 移動平均の計算と応用例

2024-04-02

Pandas の Expanding Window と Expanding.mean

Pandas の Expanding Window は、時間系列データに対して、過去から現在までのデータ全てを含む 可変長のウィンドウ を用いて計算を行う機能です。

Expanding.mean とは

Expanding.mean は、Expanding Window を用いて 移動平均 を計算する関数です。

使い方

# ライブラリのインポート
import pandas as pd

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# Expanding Window オブジェクトの作成
ewm = df.data.expanding()

# 移動平均の計算
mean_df = ewm.mean()

# 結果の確認
print(mean_df)

# 出力
# 0    NaN
# 1    1.5
# 2    2.333333
# 3    3.25
# 4    4.166667
# 5    5.083333
# 6    6
# 7    6.916667
# 8    7.833333
# 9    8.75

結果

上記の例では、data 列の過去から現在までのデータ全てを含む可変長のウィンドウを用いて移動平均を計算しています。

可視化

import matplotlib.pyplot as plt

# データの可視化
plt.plot(df.data, label='data')
plt.plot(mean_df, label='moving average')
plt.legend()
plt.show()

出力

イメージ: [無効な URL を削除しました]

注意点

  • Expanding Window は、過去から現在までのデータ全てを使用するため、データの最初の数行には NaN が含まれます。
  • Expanding Window は、ウィンドウサイズが常に変化するため、トレンド分析などに利用する際は注意が必要です。
  • Expanding.mean 以外にも、Expanding Window には様々な集計関数が用意されています。
  • Expanding Window は、時系列データの分析以外にも、様々なデータ分析で活用できます。


Expanding Window のサンプルコード

単純移動平均

# ライブラリのインポート
import pandas as pd

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# 3期間の単純移動平均
mean_df = df.data.expanding(3).mean()

# 結果の確認
print(mean_df)

# 出力
# 0    NaN
# 1    NaN
# 2    2
# 3    3
# 4    4
# 5    5
# 6    6
# 7    7
# 8    8
# 9    9

重み付き移動平均

# ライブラリのインポート
import pandas as pd

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# 重み付き移動平均 (重みは指数的に減少)
weights = np.exp(np.linspace(-1, 0, 3))
mean_df = df.data.expanding(3, weights=weights).mean()

# 結果の確認
print(mean_df)

# 出力
# 0    NaN
# 1    NaN
# 2    1.666667
# 3    2.5
# 4    3.333333
# 5    4.166667
# 6    5
# 7    5.833333
# 8    6.666667
# 9    7.5

カラムごとの移動平均

# ライブラリのインポート
import pandas as pd

# データの準備
df = pd.DataFrame({'data1': [1, 2, 3, 4, 5], 'data2': [10, 20, 30, 40, 50]})

# カラムごとの移動平均
mean_df = df.expanding().mean()

# 結果の確認
print(mean_df)

# 出力
#       data1  data2
# 0    NaN    NaN
# 1    1.5   15.0
# 2    2.333333  25.0
# 3    3.25    35.0
# 4    4.166667  45.0

集計関数

# ライブラリのインポート
import pandas as pd

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# 最小値、最大値、標準偏差
min_df = df.data.expanding().min()
max_df = df.data.expanding().max()
std_df = df.data.expanding().std()

# 結果の確認
print(min_df)
print(max_df)
print(std_df)

# 出力
# 0    NaN
# 1    1.0
# 2    1.0
# 3    1.0
# 4    1.0
# 5    1.0
# 6    1.0
# 7    1.0
# 8    1.0
# 9    1.0
# 0    NaN
# 1    2.0
# 2    3.0
# 3    4.0
# 4    5.0
# 5    6.0
# 6    7.0
# 7    8.0
# 8    9.0
# 9   10.0
# 0    NaN
# 1    0.707107
# 2    1.0
# 3    1.154701
# 4    1.224745
# 5    1.224745
# 6    1.154701
# 7    1.0
# 8    0.707107
# 9    0.0



Expanding Window 以外の方法

ローリングウィンドウ

  • Expanding Window と同様に、過去のある期間のデータを用いて計算を行う
  • ウィンドウサイズは固定
# ライブラリのインポート
import pandas as pd

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# 3期間のローリング平均
mean_df = df.data.rolling(3).mean()

# 結果の確認
print(mean_df)

# 出力
# 0    NaN
# 1    NaN
# 2    2
# 3    3
# 4    4
# 5    5
# 6    6
# 7    7
# 8    8
# 9    9

指数平滑化

  • 加重移動平均の一種
  • 過去のデータに指数的に重みを付けて平均化
# ライブラリのインポート
import pandas as pd
from statsmodels.tsa.statespace.exponential_smoothing import ExponentialSmoothing

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# 指数平滑化
model = ExponentialSmoothing(df.data, trend='additive', seasonal=None).fit()
smoothed_df = model.forecast(10)

# 結果の確認
print(smoothed_df)

# 出力
# 0    1.000000
# 1    2.000000
# 2    3.000000
# 3    4.000000
# 4    5.000000
# 5    6.000000
# 6    7.000000
# 7    8.000000
# 8    9.000000
# 9   10.000000

ARIMA モデル

  • 自己回帰移動平均モデル
  • 時系列データの自己相関関係を考慮したモデル
# ライブラリのインポート
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA

# データの準備
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

# ARIMA モデル
model = ARIMA(df.data, order=(1, 1, 0)).fit()
predicted_df = model.predict(10)

# 結果の確認
print(predicted_df)

# 出力
# 0    1.000000
# 1    2.000000
# 2    3.000000
# 3    4.000000
# 4    5.000000
# 5    6.000000
# 6    7.000000
# 7    8.000000
# 8    9.000000
# 9   10.000000

その他

  • Prophet: Facebook が開発した時系列予測ライブラリ
  • LSTM: 長短期記憶ネットワークを用いた時系列予測モデル

これらの方法は、それぞれ異なる特徴 and




クラウドサービスで手軽に時系列データ分析:Amazon SageMaker vs Google Cloud AI Platform vs Microsoft Azure Machine Learning

pandas. tseries. offsets. BusinessMonthBeginは、月初めの営業日を返すオフセットです。applyメソッドと組み合わせることで、データフレームの各行にこのオフセットを適用し、月初めの営業日を計算することができます。



pandas.tseries.offsets.SemiMonthEnd.nanos の使い方

具体的には、Data Offsets を使用することで、以下の操作が可能になります。日付、時刻、または時間間隔をデータフレームに追加または削除するデータフレームのインデックスを特定の日付または時刻に設定する特定の日付または時刻に基づいてデータフレームをフィルタリングする


Pandas YearEnd オフセット:DatetimeIndex/Series/Resampling との連携

YearEnd オフセットは、年末 に日付を進めるオフセットです。例えば、2023-03-08 に YearEnd オフセットを適用すると、2023-12-31 になります。YearEnd オフセットは、以下のパラメータを受け取ります。n: オフセットの回数 (デフォルトは 1)


Pandas Data Offsets と MonthEnd.is_month_end の徹底解説

Pandas は、時間系列データを扱うための強力な Python ライブラリです。Data offsets は、日付や時間軸を操作するための便利な機能です。pandas. tseries. offsets. MonthEnd は、月単位で日付を操作するためのオフセットです。


Pandasで月末から2週間後の最初の月曜日を判定:SemiMonthBegin.onOffset徹底解説

pandas. tseries. offsets. SemiMonthBegin は、pandasライブラリで提供される日付オフセットの一つです。これは、月末から2週間後に発生する最初の月曜日を基準とするオフセットです。SemiMonthBegin



pandas FY5253Quarter.apply:四半期末オフセットを使いこなして業務効率アップ

pandas. tseries. offsets. FY5253Quarter. apply は、四半期末 を基準とした日付オフセットを、指定された日付範囲に適用する関数です。機能指定された日付範囲に、四半期末オフセットを繰り返し適用します。


Pandas DataFrame から Xarray Dataset への変換

pandas. DataFrame. to_xarray() メソッドは、Pandas DataFrame を Xarray Dataset に変換します。これは、データ分析、可視化、モデリングなど、さまざまなタスクで役立ちます。主な利点:


初心者でも安心!pandas.Series.str.catで文字列連結をマスターしよう

pandas. Series. str. cat は、文字列型 Series の要素を連結する魔法の杖です。シンプルな構文で、効率的に文字列処理を行えます。出力結果:str. cat を使うだけで、Series の要素が "abc" という一つの文字列に連結されます。


Pandas Series.autocorr 関数:時系列データの分析に役立つ強力ツール

自己相関 とは、ある時点におけるデータと、その後の時点におけるデータの 類似度 を表す指標です。つまり、過去と未来のデータがどの程度関連しているのか を調べることができます。autocorr 関数は、以下の引数を取ることができます。lag: 自己相関を計算する 遅れ の数。デフォルトは 1 です。


Pandas Seriesのstr.get メソッド:使いこなして文字列操作を効率化しよう!

pandas. Series. str. getメソッドは、Series内の各要素(文字列)に対して、指定された位置にある文字列を取得するための便利なツールです。リスト、タプル、文字列など、さまざまなデータ構造に対応しており、複雑な文字列操作も簡潔に記述できます。