Python 上一次计算的移动平均线的移动平均线
我有一个数据帧,如下所示:Python 上一次计算的移动平均线的移动平均线,python,pandas,moving-average,Python,Pandas,Moving Average,我有一个数据帧,如下所示: 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,
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),并将该值放入一个新的列中(假设为“MA”),但问题是我希望该窗口覆盖实际销售额和之前计算的MA。下图是说明:
很抱歉,我不得不用图片表达我的问题:|
我知道我必须按门店分组,我可以使用滚动(2),但该方法只能计算一列的移动平均数
我原来的窗口是15,上面只是一个例子
非常感谢您的帮助。如果不为问题编写自定义代码,我想不出一种解决方法,因为您正在使用之前生成步骤的数据。下面的片段就是我想到的。它以线性时间运行,我相信这是你能得到的最好的,大部分在原地运行,只需要一个pd额外的存储。一系列的长度
窗口
,进行最小的复制,只查看每个值一次,并且可以与任意的窗口大小一起使用,这使得它可以直接扩展到你的实际用例
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
存储列和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
如果您最终在大量的实际数据上使用它,我很想听听它在运行时的表现。干杯事实上,我的场景已经改变了一点,我必须更改您代码的某些部分。顺便说一句,谢谢。