问题
如果我创建了一个居中的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
问题
是否有可能获得一个滚动窗口,该窗口保留其窗口宽度,并且在开始或结束时仅限于第一个/最后几个值?
答案 0 :(得分:1)
这将有效地为第一个/最后一个值提供相同的值,因为窗口对于它们是相同的。因此,只需要填充这些数字就不需要在开始或结束处绑定滚动窗口。代替:
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
<强>旁注强>
填写值的另一种可能性是在给定的情况下设置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