python - 如何使用添加到熊猫数据框中的每日数据来增量计算移动平均值?
问题描述
我有每日数据,想计算每个用户 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()
如果它是 DataFrame 格式,您可以在数据集上应用方法。
your_df['MA_30_days'] = df[where_to_apply].rolling(window = 30).mean()
如果您需要计算移动平均线的不同窗口,只需更改window
参数即可。在我的示例中,我曾经mean()
计算过,但您也可以选择其他一些统计数据。
此代码将在您的 DataFrame 中创建另一个名为“MA_30_days”的列,其中包含计算的移动平均值。
您还可以创建另一个 DataFrame,您将在其中收集和循环您的数据集以计算所有移动平均值并根据需要将其保存为 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
大小。
推荐阅读
- sql-server - 如何查找与另一列中的 itemA 链接的项目列是否在特定列中具有特定值?
- java - Spring Root Context 创建了两次
- c# - 如何修复“错误 CS0009:元数据文件“System.Xml.dll”无法打开——图像太小”?
- java - java类继承练习
- amazon-web-services - AWS Lambda 是否复制每条消息?
- node.js - 为什么“每 1 分钟”是我可以使用 later.js 的唯一时间表?
- html - 如何为包含选定单词的列添加图形标记?
- jquery - Twitter 的 Bootstrap 4 - ComboBox 更改项目的行高
- http - 如何使 tcl https 与 mitmproxy 一起工作?
- php - 调用 close() 后有什么方法可以比较 ZipArchive 对象?