【问题标题】:Left-align a pandas rolling object左对齐熊猫滚动对象
【发布时间】:2023-03-16 08:52:01
【问题描述】:

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

标准方法自动向右对齐,因此在前两个索引处没有值,窗口大小为 3:

 df.rolling(window=3).mean()
           A
0        NaN
1        NaN
2   3.666667
3   5.666667
4  11.333333
5  18.333333

我们可以像这样居中对齐操作:

df.rolling(window=3).mean(center=True)
           A
0        NaN
1   3.666667
2   5.666667
3  11.333333
4  18.333333
5        NaN

但我正在寻找的是这个:

df.rolling(3).mean()
            A
 0   3.666667
 1   5.666667
 2  11.333333
 3  18.333333
 4        NaN
 5        NaN

我可以通过使用默认的右对齐来实现这一点,然后重新索引它,或者通过颠倒行的顺序然后“右对齐”来实现,但这些是应该做的解决方法一个简单的操作。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我觉得你可以用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
    

    【讨论】:

    • 这是一个很好的解决方案,尽管我希望有更直接的方法来做到这一点。我猜这个功能还没有在滚动对象中。
    • 我接受了这个答案,因为所需的功能并不真正在 pandas 滚动对象中,这提供了最优雅的解决方案。如果想要更动态地管理这种左对齐,可以使用变量 w 设置窗口大小,然后 .shift() 方法中的参数可以是 w-1。
    • 实际上,移位不会处理 min_periods=1 和 nan 不存在但适当缩小的情况。在这种情况下,我看到的唯一方法是按照提到的反转数据。取决于你的上下文。如果 min_periods 没有设置,那么移位就可以了。熊猫最终应该添加这个。
    • @Alex,它的 (1-w) 实际上不是 (w-1)
    • 谢谢@user2561747 这就是我的意思,对不起,我也被我相当神秘的评论弄糊涂了。即当窗口在数据末尾收缩时,默认情况下会导致右对齐收缩窗口。所以你必须反转它,以最小周期 1 滚动它,然后再次反转它,以获得左对齐的窗口。没有最小周期为 1 的 NaN,所以是的,移位没有应用程序,但是如果没有所有这些额外的处理,就不可能在左侧缩小窗口。
    【解决方案2】:

    另一种解决方案是在应用右对齐滚动窗口之前简单地反转 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
    

    相对于shift 的好处是,在基于时间的窗口的情况下,它应该适用于可变大小的窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2020-11-26
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多