はじめに
Advanced Python(時系列解析)を読んで知りました。
移動平均を取る際にrolling()メソッドを使うとのこと。
いくつか疑問が出たので簡単な検証のメモです。
疑問1: 指定したwindowサイズに自身は含まれるの?
-> 含まれます。
まずはSeriesの作成。
series = pd.Series(range(10))
print(series)
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# 5 5
# 6 6
# 7 7
# 8 8
# 9 9
window=3で試してみます。 (上2行 + 自身の行)の平均が出てますね。
series_size3 = series.rolling(window=3).mean()
print(series_size3)
# 0 NaN
# 1 NaN
# 2 1.0
# 3 2.0
# 4 3.0
# 5 4.0
# 6 5.0
# 7 6.0
# 8 7.0
# 9 8.0
疑問2: center=Trueの場合も自分は含まれる?
-> 含まれます。
引数で`center=True`を指定すると、前後の行との平均をとっていることがわかります。
series_size3 = series.rolling(window=3, center=True).mean()
print(series_size3)
# 0 NaN
# 1 1.0
# 2 2.0
# 3 3.0
# 4 4.0
# 5 5.0
# 6 6.0
# 7 7.0
# 8 8.0
# 9 NaN
疑問3: center=Trueでwindowサイズが偶数の時はどうなるの?
-> 上の行が優先して取られます。
window=2とwindow=4で検証。 window=2の場合 (上の1行 + 自身の行)の平均になっています。
series_size2 = series.rolling(window=2, center=True).mean()
print(series_size2)
# 0 NaN
# 1 0.5
# 2 1.5
# 3 2.5
# 4 3.5
# 5 4.5
# 6 5.5
# 7 6.5
# 8 7.5
# 9 8.5
window=4の場合は(上の2行 + 自身の行 + 下の1行)の平均。
series_size4 = series.rolling(window=4, center=True).mean()
print(series_size4)
# 0 NaN
# 1 NaN
# 2 1.5
# 3 2.5
# 4 3.5
# 5 4.5
# 6 5.5
# 7 6.5
# 8 7.5
# 9 NaN
疑問4: shift()でindex番号をズラす場合は計算する行もズレる?
-> ズレない
わかりやすいように、先頭の値を100にする。
series = pd.Series([100, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(series)
# 0 100
# 1 1
# 2 2
# 3 3
# 4 4
# 5 5
# 6 6
# 7 7
# 8 8
# 9 9
ズラしてないものと2行ズラしたものを比較。 平均をとってから、indexがズレていることがわかります。
series_size4 = series.rolling(window=4).mean()
series_size4_shift = series.rolling(window=4).mean().shift(-2)
print(series_size4)
print(series_size4_shift)
# 0 NaN
# 1 NaN
# 2 NaN
# 3 26.5
# 4 2.5
# 5 3.5
# 6 4.5
# 7 5.5
# 8 6.5
# 9 7.5
# 0 NaN
# 1 26.5
# 2 2.5
# 3 3.5
# 4 4.5
# 5 5.5
# 6 6.5
# 7 7.5
# 8 NaN
# 9 NaN