使用pandas 0.18.1,我想采用一列数据帧的滚动平均值.从版本0.18.0开始,这是使用rolling()对象完成的.这些滚动对象的默认值是右对齐的.你可以传递一个布尔参数,center = True,将滚动对象与中心值对齐,但似乎没有办法左对齐它.这是一个例子:
df = pandas.DataFrame({'A': [2,3,6,8,20, 27]})
df
A
0 2
1 3
2 6
3 8
4 20
5 27
Run Code Online (Sandbox Code Playgroud)
标准方法自动对齐到右边,因此前两个凹槽没有值,窗口大小为3:
df.rolling(window=3).mean()
A
0 NaN
1 NaN
2 3.666667
3 5.666667
4 11.333333
5 18.333333
Run Code Online (Sandbox Code Playgroud)
我们可以像这样对齐操作:
df.rolling(window=3).mean(center=True)
A
0 NaN
1 3.666667
2 5.666667
3 11.333333
4 18.333333
5 NaN
Run Code Online (Sandbox Code Playgroud)
但我正在寻找的是:
df.rolling(3).mean()
A
0 3.666667
1 5.666667
2 11.333333
3 18.333333
4 NaN
5 NaN
Run Code Online (Sandbox Code Playgroud)
我可以用默认右对齐做它做到这一点,然后再重新建立索引,或通过颠倒行的顺序,然后做"右对齐",但这些都是变通什么应该是一个直前进操作.
jez*_*ael 18
我想你可以用shift:
a = df.rolling(window=3).mean().shift(-2)
print (a)
A
0 3.666667
1 5.666667
2 11.333333
3 18.333333
4 NaN
5 NaN
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是在应用右对齐滚动窗口之前简单地反转 DataFrame/Series,然后再重新反转。就像是:
In [1]: df["A"][::-1].rolling(3).mean()[::-1]
Out[1]:
0 3.666667
1 5.666667
2 11.333333
3 18.333333
4 NaN
5 NaN
Name: A, dtype: float64
Run Code Online (Sandbox Code Playgroud)
这样做的好处shift是,在基于时间的窗口的情况下,它应该与可变大小的窗口一起使用。
FixedForwardWindowIndexer您可以按照.rolling()文档使用:
>>> df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
>>> df
B
0 0.0
1 1.0
2 2.0
3 NaN
4 4.0
...
>>> indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=2)
>>> df.rolling(window=indexer, min_periods=1).sum()
B
0 1.0
1 3.0
2 2.0
3 4.0
4 4.0
Run Code Online (Sandbox Code Playgroud)