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

时间:2018-02-23 17:31:56

标签: 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

问题

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

1 个答案:

答案 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