pandas rolling()メソッドの挙動


はじめに

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