今回の課題
Store Sales - Time Series Forecastingのトレーニングデータの移動平均をグラフ化してみたい。
KaggleのTrend(Time Series)のチュートリアルを見ながら、
Store Sales - Time Series Forecastingのトレーニングデータの移動平均を可視化することに挑戦してみた。
使用したコード
# train_df(トレーニングデータ)をdate毎に集計して、salesの平均値を出す。
# dateはインデックス化しておく。
trend_df = train_df[["date", "sales"]].groupby(["date"], as_index=True).mean()
# rollingでウィンドウ関数を使用する。
moving_average = trend_df.rolling(
window=365
, center=True
, min_periods=183,
).mean()
# 変数axに、点でプロットするための情報を渡す。
ax = trend_df.plot(style=".", color="0.5", legend=False)
# 折れ線グラフをプロットする。引数にax変数を渡して、同じグラフに点でもプロットする。
moving_average.plot(ax=ax, linewidth=3, legend=False)
plt.show
出力結果
移動平均の折れ線グラフと、日別平均の点が同じグラフにプロットされる。
使用したコードの解説
1)train_dfのdateカラム毎に集計して、salesの平均値を算出する
下記のコードを使用する。
date
カラムはindex化しておく。
trend_df = train_df[["date", "sales"]].groupby(["date"], as_index=True).mean()
2)移動平均を算出する
moving_average = trend_df.rolling(
window=365
, center=True
, min_periods=183,
).mean()
-
rolling()
・・・SQLのウィンドウ関数のように使用できる。 -
window引数
・・・集計するwindowの範囲を指定。 -
center引数
・・・center=True
でwindowの中心に結果の値を格納する。 -
min_periods引数
・・・移動平均の数がwindowに指定した数値に満たない場合は、欠損値NaNとして保持されてしまうが、min_periods
に整数値を指定しておくと、その値の個数のデータが含まれていれば結果が算出される。
※ここではWINDOW
が365,min_periods
が183となっている。
center
がTrueなので、min_periods
に365の半分の値が指定されていれば、NaNが格納されることを避けられる
※参考:pandasでWINDOW関数を適用するrollingを使って移動平均などを算出
3)移動平均は折れ線グラフ、日別の売上(sales)は点をプロットして可視化
最後にこれを実行することで、グラフを出力することができる。
ax = trend_df.plot(style=".", color="0.5", legend=False)
moving_average.plot(ax=ax, linewidth=3, legend=False)
plt.show
- まず、
ax
に点をプロットするための情報を格納。 -
moving_average.plot
(2)
で移動平均を計算したもの)の情報を可視化する。この時に、引数にax
に点をプロットするための情報を格納したものを渡す。
以上で実装完了です。