我有每日数据,想要计算每个用户 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