rolling関数使用の事例
データの分析や予測にあたって、グラフの作成等で移動平均が必要な場面は多いと思います。
sqlでもwindow関数を使用すれば、同様の事は可能だと思いますが、pandasのほうが簡単に実現出来る様に思います。
pandasのrolling関数を利用して、移動平均を算出する場合のメモを投稿します。
以下の様なcsvがあったとすると。
・ターミナルからheadコマンドの結果
$ head dexjpus_20200417.csv
DATE,DEXJPUS
2015-01-01,
2015-01-02,120.2
2015-01-05,119.64
2015-01-06,118.26
2015-01-07,119.52
2015-01-08,119.51
2015-01-09,118.66
2015-01-12,118.32
2015-01-13,118.16
【1】移動平均の場合、rolling関数は、以下の様に実行しました。
- 1.ローリング関数のmeanで移動平均の処理
- 2.欠損値の処理(この例では、fillnaのbfillを適用)
#rolling関数の使用
df = df.rolling('30D' ,min_periods = 1).mean()
#欠損値の処理
df = df.fillna(method ='bfill' )
30日の移動平均の場合
・頻度コード(D)を使用して、'30D'で指定しました
このデータは、最初から空白の値があったのですが、欠損値が無い元データであっても、移動平均を適用すると、nullが発生する為、欠損値の処理をfillna、若しくはdropnaでnullを処理する事になると思います。
・この例では、fillnaでmethodにbfillを適用し、初日の値に翌日の値を適用
df.isnull()
DEXJPUS
DATE
2015-01-01 True
2015-01-02 False
2015-01-05 False
2015-01-06 False
2015-01-07 False
欠損値の処理
#欠損値の処理
df = df.fillna(method ='bfill' )
df.isnull().sum()
DEXJPUS 0
dtype: int64
【2】データの確認
df
DEXJPUS
DATE
2015-01-01 120.200000
2015-01-02 120.200000
2015-01-05 119.920000
2015-01-06 119.366667
2015-01-07 119.405000
初日のデータが翌日のデータと同じになっているのが確認できる。
データ・セットは、datareaderで取得したfredの為替相場(DEXJPUS)を、csv_readで再利用しました。因みに、以前は取引がない日は、DEXJPUSの値はドット(.)になっていたと思いますが、現在はnullになっている様です。
実行したpythonのコードをまとめると、以下の様な感じです。
# 移動平均の処理の例
# infile = './dexjp_20200417.csv'(fred 対$USの円相場)
import pandas as pd
import numpy as np
import datetime
# csv読み込み
df = pd.read_csv('./dexjpus_20200417.csv' ,index_col=0 ,parse_dates=['DATE'])
# 移動平均の算出(roling関数のmeanを適用)
# 期間は30日で設定の場合(時系列データの場合、頻度コードでも指定できる)
df = df.rolling('30D' ,min_periods = 1).mean()
#欠損値の処理
df = df.fillna(method ='bfill' )
df.isnull().sum()
df
以上、初心者向けpandasで移動平均の算出でした。