如何在熊猫中获得连续滚动平均值?

Posted

技术标签:

【中文标题】如何在熊猫中获得连续滚动平均值?【英文标题】:how to get a continuous rolling mean in pandas? 【发布时间】:2020-04-23 16:01:56 【问题描述】:

希望获得数据帧的连续滚动平均值。

df 是这样的

index price

0      4
1      6
2      10
3      12

希望获得连续滚动的价格

目标是让它看起来是所有价格的移动平均值。

index price  mean

0      4      4
1      6      5
2      10     6.67
3      12     8 

提前谢谢你!

【问题讨论】:

【参考方案1】:

你可以使用扩展:

df['mean'] = df.price.expanding().mean()

df
index   price   mean
0       4       4.000000
1       6       5.000000
2       10      6.666667
3       12      8.000000

【讨论】:

【参考方案2】:

欢迎来到 SO:希望人们很快就会从之前的 SO 帖子中记住您,例如这篇文章。

从您的示例来看,@Allen 似乎为您提供了在您的表格中生成答案的代码。也就是说,这与“滚动”的意思并不完全相同。艾伦使用的expanding() 函数取第一行的平均值除以 n(即 1),然后将第 1 行和第 2 行相加并除以 n(现在为 2),依此类推,这样最后一行是 (4+6+10+12)/4 = 8。

如果您希望滚动平均值的窗口为 4,则最后一个数字可能是答案,因为这表明您需要 4 个观察值的平均值。但是,如果您继续使用大小为 4 的窗口,并开始包括第 5、6、7 行......那么来自expanding() 的答案可能与您想要的不同。实际上,expanding() 正在记录整个系列的平均值(在这种情况下为price),就好像它在每一行都接收到一条新数据一样。另一方面,“滚动”为您提供某个窗口大小的聚合结果。

这是进行滚动计算的另一个选项:pandas.dataframe 中的 rolling() 方法。

在你的情况下,你会这样做:

df['rolling_mean'] = df.price.rolling(4).mean()

df
index   price   rolling_mean
0       4       nan
1       6       nan
2       10      nan
3       12      8.000000

那些nans 是窗口化的结果:直到有足够的行来计算平均值,结果是nan。您可以设置一个较小的窗口:

df['rolling_mean'] = df.price.rolling(2).mean()

df
index   price   rolling_mean
0       4       nan
1       6       5.000000
2       10      8.000000
3       12      11.00000

这显示了 nan 条目的减少以及滚动功能:它仅在您提供的大小为 2 的窗口内进行平均。这会导致 df['rolling_mean'] 值与使用 df.price.expanding() 时不同。

注意:您可以通过使用.rolling(2, min_periods = 1) 来摆脱nan,它告诉函数在一个窗口中必须存在的最小数量的定义值才能计算结果。

【讨论】:

以上是关于如何在熊猫中获得连续滚动平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得每个特定时间范围熊猫的平均值

熊猫在相对时间范围内通过另一个值获得平均值

为啥熊猫滚动意味着居中窗口

熊猫滚动加权平均值

具有时间偏移熊猫的滚动平均值

熊猫移动平均线[重复]