pandasでrollingの窓を開く方向を後方に変える
pandasのwindow関数を扱っていれば窓を開く方向を変えたくなることもある。
今回は窓を開く方向の変え方について紹介する。
窓関数(window function)とは
窓関数(window function)とは、配列の一部を切り出してその一部の中で合計や平均を取ったりできる関数。
以前同様にpandasの窓関数の使い方に触れた記事をご参考。
pandasでrollingしたときにcolumnが重複して困った話
窓を開く方向とは
以下のようなcsvとpythonファイルを用意して実行して移動平均をとると、windowで指定した窓の幅分最初は移動平均が計算できないので NaN
になる。
リストに対して上方向(前方)に窓を開いているので、2019/01/07のデータは (7+8+9+10)/4 = 8.5
という結果になる。
rolling_forward.csv
date,value 2019/01/10,10 2019/01/09,9 2019/01/08,8 2019/01/07,7 2019/01/06,6 2019/01/05,5 2019/01/04,4 2019/01/03,3 2019/01/02,2 2019/01/01,1
rolling_forward.py
import pandas as pd # CSV読み込み df_csv = pd.read_csv("rolling_forward.csv", encoding='shift-jis') # 直近4レコードの平均をとる df_csv["MA"] = df_csv["value"].rolling(window=4).mean() print(df_csv)
結果
date value MA 0 2019/01/10 10 NaN 1 2019/01/09 9 NaN 2 2019/01/08 8 NaN 3 2019/01/07 7 8.5 4 2019/01/06 6 7.5 5 2019/01/05 5 6.5 6 2019/01/04 4 5.5 7 2019/01/03 3 4.5 8 2019/01/02 2 3.5 9 2019/01/01 1 2.5
これを2019/01/07のデータは (7+6+5+4)/4 = 5.5
というようにリストに対して下方向(後方)に開いて窓を開いて計算するにはどうすれば良いのか。
窓を開く方向を変える
DataFrameの定義を見ても中心から両方向に窓を開く方法はあっても後方に開く方法は記載されていない。
検索してもなかなかそれらしい記事を見つけることができなかったが、stackoverflowにて以下の回答を見つけた。
Rolling backwards is the same as rolling forward and then shifting the result:
x.rolling(window=3).sum().shift(-2)
python - How to Reverse Rolling Sum? - Stack Overflow
翻訳すると 後方にrollingするのは、前方にrollingした結果をshiftするのと同じ。
試してみた。
rolling_forward.py
# shiftする df_csv["MA2"] = df_csv["value"].rolling(window=4).mean().shift(-3) print(df_csv)
結果
date value MA MA2 0 2019/01/10 10 NaN 8.5 1 2019/01/09 9 NaN 7.5 2 2019/01/08 8 NaN 6.5 3 2019/01/07 7 8.5 5.5 4 2019/01/06 6 7.5 4.5 5 2019/01/05 5 6.5 3.5 6 2019/01/04 4 5.5 2.5 7 2019/01/03 3 4.5 NaN 8 2019/01/02 2 3.5 NaN 9 2019/01/01 1 2.5 NaN
ほ、ほんまや・・・。
まとめ
- 後方に窓を開く = 前方に窓を開いて結果をshiftさせれば同じ結果が得られる