如何在大熊猫中将每日数据添加到数据框中来增量计算移动平均线?



我有每日数据,想要计算每个用户 5 天、30 天和 90 天的移动平均值并写入 CSV。 每天都有新的数据出现。 假设我将用过去 89 天的数据加上今天的数据加载数据框,如何仅计算新数据的这些平均值。

日期用户daily_sales 5_days_MA 30_days_MV 90_days_MV 2019-05-01 1 34 2019-05-01 2 20 ....

2019-07-18 .....

每天的行数约为 100 万行。如果 90 天的数据太多,30 天就可以了

如果数据集采用数据帧格式,则可以rolling()方法应用于数据集。

your_df['MA_30_days'] = df[where_to_apply].rolling(window = 30).mean()

如果您需要计算移动平均线的不同窗口,只需更改window参数即可。在我的示例中,我使用mean()进行计算,但您也可以选择其他一些统计数据。

此代码将在数据帧中创建另一名为"MA_30_days">的列,其中包含计算的移动平均值。

您还可以创建另一个数据帧,您将在其中收集和循环访问数据集以计算所有移动平均值,并根据需要将其保存为 CSV 格式。

your_df.to_csv('filename.csv')

在您的情况下,计算应该只考虑最新的数据。如果要对最新数据执行此操作,只需将其切片即可。但是,第一行将被NaN(取决于window)。

df[where_to_apply][-90:].rolling(window = 30).mean()

这将计算某些 df 中特定列的最后 90 行的移动平均值,前 29 行将NaN。如果最近的 90 行应该是所有有意义的数据,则可以比最后 90 行更早开始计算 - 取决于window大小。

如果 df 已经包含昨天的移动平均线,并且只需要新一天的简单 MA,我会说使用这种方法:

MAlength=90
df.loc[day-1:'MA']=(
(df.loc[day-1:'MA']*MAlength) #expand yesterday's MA value
-df.loc[day-MAlength:'Price']  #remove oldest price
+df.loc[day-MAlength:'Price']  #add newest price
)/MAlength   #re-average

最新更新