pandas 滚动窗口:系列开始/结束的边界?

asc*_*ter 5 python pandas

问题

如果我创建一个居中pandas.DataFrame.rolling窗口,则对其计算的任何统计数据都将包含nan在系列的开始和结束处(或仅在 的开始处center=False)。这当然是有道理的,因为窗口在那里没有完全定义。

import pandas as pd
s = pd.Series([2,1,3,2,4,5,6])
window = 5
print (s.rolling(window, center=True).median())

0    NaN
1    NaN
2    2.0
3    3.0
4    4.0
5    NaN
6    NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)

问题

是否有可能获得一个滚动窗口,保留其窗口宽度,并且仅在第一个/最后几个值的开始或结束处边界?

asc*_*ter 6

这将有效地为第一个/最后一个值提供相同的值,因为它们的窗口是相同的。因此,不需要在开始或结束处绑定滚动窗口来填充这些数字。反而:

s2 = s.rolling(window, center=True).median()
s2.iloc[-window//2:] = s2.iloc[-window//2]
s2.iloc[:window//2] = s2.iloc[window//2]
print (s2)

0    2.0
1    2.0
2    2.0
3    3.0
4    4.0
5    4.0
6    4.0
dtype: float64    
Run Code Online (Sandbox Code Playgroud)

边注

填写值的另一种可能性是min_periods=window//2在给定情况下进行设置(否则默认值是窗口宽度,这就是为什么出现NaN在第一个位置)。第一个和最后一个值仍然具有3需要考虑的有效值。在许多情况下,这可能是首选策略。

print (s.rolling(window, min_periods=(window//2), center=True).median())

0    2.0
1    2.0
2    2.0
3    3.0
4    4.0
5    4.5
6    5.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

  • 旁注才是真正的答案。窗口滚动越过边界,但仅使用具有值的元素。所以第一个值是从窗口`|生成的 | |2|1|3|`,第二个是从窗口 `| 生成的 |2|1|3|2|` 等等。这也适用于均值,即第一个窗口的结果将为 (2+1+3) / 3。请注意,您可以简单地使用“min_periods=1”。 (4认同)