左对齐一个熊猫滚动对象

Ale*_*lex 16 python pandas

使用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)

  • 我接受了这个答案,因为所需的功能并不是真正在pandas滚动对象中,这提供了最优雅的解决方案.如果想要更动态地管理这个左对齐,可以用变量w设置窗口大小,然后.shift()方法中的参数可以是w-1. (5认同)
  • @Alex,它的 (1-w) 实际上不是 (w-1) (3认同)
  • 实际上,移位不会处理 min_periods=1 且 nan 不存在但适当缩小的情况。在这种情况下,我认为做到这一点的唯一方法是按上述方式反转数据。取决于您的具体情况。如果 min_periods 没有设置,那么移位就可以了。Pandas 最终应该添加这个。 (2认同)

blu*_*e10 8

另一种解决方案是在应用右对齐滚动窗口之前简单地反转 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是,在基于时间的窗口的情况下,它应该与可变大小的窗口一起使用。


Ben*_*n F 7

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)