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“