Python 開発

pandasでrollingの窓を開く方向を後方に変える

pandasでrollingの窓を開く方向を後方に変える

pandasでrollingの窓を開く方向を後方に変える

pandasのwindow関数を扱っていれば窓を開く方向を変えたくなることもある。
今回は窓を開く方向の変え方について紹介する。


窓関数(window function)とは

窓関数(window function)とは、配列の一部を切り出してその一部の中で合計や平均を取ったりできる関数。
以前同様にpandasの窓関数の使い方に触れた記事をご参考。




窓を開く方向とは

以下のような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させれば同じ結果が得られる


コチラもオススメ

KRSW

駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

役に立ったらシェアしてくれると励みになります。

にほんブログ村 IT技術ブログへ

-Python, 開発
-,

Translate »

Copyright© ITips , 2020 All Rights Reserved.