python - 先前计算的移动平均线的移动平均线
问题描述
我有一个数据框如下:
data = pd.DataFrame({'Date':['20191001','20191002','20191003','20191004','20191005','20191006','20191001','20191002','20191003','20191004','20191005','20191006'],'Store':['A','A','A','A','A','A','B','B','B','B','B','B'],'Sale':[1,2,8,6,9,0,4,3,0,2,3,7]})
我想要做的是计算每个商店前 2 天的移动平均值(窗口大小 = 2)并将值放在一个新列中(比如说“MA”),但问题是我希望这个窗口翻转实际销售和先前计算的 MA。下图是解释:
抱歉,我不得不用图片表达我的问题:|
我知道我必须按商店分组,我可以使用 rolling(2) 但该方法只会计算一列的移动平均值。
我原来的窗口是 15,上面只是一个例子。
任何帮助都将不胜感激。
解决方案
如果不为问题编写自定义代码,我无法完全想出解决此问题的方法,因为您正在使用您之前生成的步骤的数据。下面的片段是我想出的。它以线性时间运行,我相信它和你能得到的一样好,主要是就地运行,只需要额外的存储来存储一个 pd.Series 的 length window
,复制最少,只查看每个值一次,它可以用于任意窗口大小,可以直接扩展到您的实际用例
def fill_ma(sales: pd.Series, window: int):
# "manually" do the first steps on the sales data
iter_data = sales.iloc[0:window]
for i in range(window):
iter_data.iloc[i] = np.mean(iter_data)
sales.iloc[0:window] = np.nan
sales.iloc[window:(2 * window)] = iter_data.values
# loop over the rest of the Series and compute the moving average of MA data
for i in range(2 * window, sales.shape[0]):
tmp = np.mean(iter_data)
iter_data.iloc[i % window] = tmp
sales.iloc[i] = tmp
return sales
使用这个函数非常简单: groupby
Store 列和apply
函数就像这样:
window = 2
data.groupby('Store')['Sale'].apply(lambda x: fill_ma(x, window))
0 NaN
1 NaN
2 1.5000
3 1.7500
4 1.6250
5 1.6875
6 NaN
7 NaN
8 3.5000
9 3.2500
10 3.3750
11 3.3125
Name: Sale, dtype: float64
如果您最终在大量真实数据上使用它,我很想听听它在运行时方面的表现。干杯
推荐阅读
- r - Convert JSON to data.frame using tidyjson
- locust - 如何在蝗虫中为每个用户类分配固定数量的用户
- javascript - 依赖注入 MSAL Javascript 库
- citrix - 在 Citrix 环境中传输和运行已编译的程序 - 替代选项以及如何
- php - 为什么 AJAX 不向我的 PHP 页面发送数据?
- python - Python DataFrame通过计算动态重复列
- sql - 带分组的 SQL 行号
- java - 创建约会中心程序,但无法将变量保存到循环之外
- r - 根据奇数行或偶数行更改 color_bar 颜色,R 表
- spring - Spring Statemachine中如何检查事件是否触发了状态机?