Pandas 分组计算移动平均是错误的
我的数据帧价格是这样开始的:Pandas 分组计算移动平均是错误的,pandas,pandas-groupby,moving-average,rolling-computation,Pandas,Pandas Groupby,Moving Average,Rolling Computation,我的数据帧价格是这样开始的: Date symbol Close 0 2000-01-03 HELN.SW 28.28 1 2000-01-04 HELN.SW 27.50 2 2000-01-05 HELN.SW 26.71 3 2000-01-06 HELN.SW 27.16 4 2000-01-07 HELN.SW 27.50 df.groupby('symbol').apply(lambda g: g.assign(avg = g[
Date symbol Close
0 2000-01-03 HELN.SW 28.28
1 2000-01-04 HELN.SW 27.50
2 2000-01-05 HELN.SW 26.71
3 2000-01-06 HELN.SW 27.16
4 2000-01-07 HELN.SW 27.50
df.groupby('symbol').apply(lambda g: g.assign(avg = g['Close'].rolling(3).mean())).reset_index(drop=True)
要计算收盘的移动平均数,请按符号I进行分组:
priceDF['avg']=priceDF.groupby('symbol')'Close'].rolling(3.mean().reset_index(drop=True)
我得到:
Date symbol Close avg
0 2000-01-03 HELN.SW 28.28 NaN
1 2000-01-04 HELN.SW 27.50 NaN
2 2000-01-05 HELN.SW 26.71 12.537398
3 2000-01-06 HELN.SW 27.16 12.022164
4 2000-01-07 HELN.SW 27.50 11.922733
在第2行中,我希望avg=27.50,即第0到2行中的平均值。
我误解了什么?我很确定这是一个关于如何使用
reset\u index
的问题,与使用多个组相结合。让我们考虑一个稍微扩展的例子:
from io import StringIO
data = StringIO(
'''
Date symbol Close
0 2000-01-03 HELN.SW 28.28
1 2000-01-04 HELN.SW 27.50
2 2000-01-05 HELN.SW 26.71
3 2000-01-06 HELN.SW 27.16
4 2000-01-07 HELN.SW 27.50
5 2000-01-07 AAAA.SW 30.00
''')
df = pd.read_csv(data, sep = '\s+', index_col=0)
(我们已将AAAA.SW添加到列表中)
现在:
df.groupby('symbol')['Close'].rolling(3).mean()
产生合理的数字(因为AAAA只有一个日期,我们预计:
symbol
AAAA.SW 5 NaN
HELN.SW 0 NaN
1 NaN
2 27.496667
3 27.123333
4 27.123333
Name: Close, dtype: float64
但这是:
df.groupby('symbol')['Close'].rolling(3).mean().reset_index(drop=True)
生成错误的索引
0 NaN
1 NaN
2 NaN
3 27.496667
4 27.123333
5 27.123333
Name: Close, dtype: float64
当放入原始df时,会出现错误的行:
df['avg'] = df.groupby('symbol')['Close'].rolling(3).mean().reset_index(drop=True)
df
产生
Date symbol Close avg
0 2000-01-03 HELN.SW 28.28 NaN
1 2000-01-04 HELN.SW 27.50 NaN
2 2000-01-05 HELN.SW 26.71 NaN
3 2000-01-06 HELN.SW 27.16 27.496667
4 2000-01-07 HELN.SW 27.50 27.123333
5 2000-01-07 AAAA.SW 30.00 27.123333
解决方案是在每个组内进行AQSSignment,如下所示:
Date symbol Close
0 2000-01-03 HELN.SW 28.28
1 2000-01-04 HELN.SW 27.50
2 2000-01-05 HELN.SW 26.71
3 2000-01-06 HELN.SW 27.16
4 2000-01-07 HELN.SW 27.50
df.groupby('symbol').apply(lambda g: g.assign(avg = g['Close'].rolling(3).mean())).reset_index(drop=True)
所以我们得到了
Date symbol Close avg
0 2000-01-07 AAAA.SW 30.00 NaN
1 2000-01-03 HELN.SW 28.28 NaN
2 2000-01-04 HELN.SW 27.50 NaN
3 2000-01-05 HELN.SW 26.71 27.496667
4 2000-01-06 HELN.SW 27.16 27.123333
5 2000-01-07 HELN.SW 27.50 27.123333
我无法复制您的问题,也就是说,我得到了正确的数字。您的代码中有一个小的语法错误,但假设这是一个复制和粘贴问题,而不是实际代码(因为它不会像编写的那样运行)。检查您的pandas版本?查看calc在没有赋值的情况下做了什么(例如只运行此部分
priceDF.groupby('symbol')['Close'])。滚动(3)。意思是()
看看这些数字是否有意义)非常感谢皮特堡详细的回答和正确的解决方案。非常感谢皮特堡详细的回答。现在,我理解了我的错误。作业价格为=…这是个坏主意,因为groupby返回按符号排序的值。HELN.SW是原始数据帧中许多符号中的第一个符号。从groupby返回的第一个符号是0012.HK。因此,我将0012.HK的移动平均数加入到HELN.SW中。应用代码后,生成的数据帧开始如下“”,日期符号Close avg 0 2000-01-040012.HK 13.450359 NaN 1 2000-01-05 0012.HK 12.474124 NaN 2 2000-01-06 0012.HK 11.687712 12.53 3 2000-01-07 0012.HK 11.904655 12.02“