使用pandas实现移动平均或滚动均值,但不指定窗口大小。

5

如何计算滚动平均值或移动平均值,考虑到我已经看到的所有项目。

假设我有一个如下的数据框:

   col   new_col
0    1      1
1    2      1.5
2    3      2

等等。现在我想添加一个新列,计算该列到目前为止所有项的平均值。 指定窗口将意味着我会得到前几个项目的Nan,然后它只执行滚动窗口。但我需要像上面这样的东西。


5
扩展窗口的动量函数是一种用于计算时间序列数据滚动统计值的方法。它们可以计算累积平均数、标准差和其他统计数据。这些函数在 Pandas 库中得到了实现,可以通过调用rolling()方法并设置min_periods参数来使用。除了标准滚动函数外,还提供了expanding()函数,该函数将考虑所有观察值,而不仅仅是固定大小的窗口。 - Karl D.
对于您的情况,可以使用 df.expanding().mean()。我找不到更好的重复目标,但是那篇帖子总结了扩展计算。 - ayhan
1个回答

0
下面的代码片段将会精确地完成你所请求的操作。不过,这里有很多改进的空间。它使用了一个带有 if-else 语句的 for 循环。当然,使用向量化函数肯定有更快的方法来完成这个任务。如果省略 pd.options.mode.chained_assignment = None 部分,它也会触发 SettingsWithCopyWarning。但它确实能够完成工作:
# Libraries
import pandas as pd
import numpy as np

# Settings
pd.options.mode.chained_assignment = None

# Dataframe with desired input
df = pd.DataFrame({'col':[1,2,3]})

# Make room for a new column
df['new_col'] = np.nan

# Fill the new column with values
for i in df.index + 1:
    if i == 0:
        df['new_col'].iloc[i] = np.nan
    else:
        df['new_col'].iloc[i-1] = pd.rolling_mean(df.col.iloc[:i].values, window = i)[-1]
print(df)

输出:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接