问题
如果我创建一个居中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)
问题
是否有可能获得一个滚动窗口,保留其窗口宽度,并且仅在第一个/最后几个值的开始或结束处边界?
这将有效地为第一个/最后一个值提供相同的值,因为它们的窗口是相同的。因此,不需要在开始或结束处绑定滚动窗口来填充这些数字。反而:
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)