Я почти уверен, что это проблема того, как здесь используется reset_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 есть только одна дата, мы ожидаем NaN:
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
решение состоит в том, чтобы выполнять задания внутри каждой группы, например:
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
person
piterbarg
schedule
21.03.2021
priceDF.groupby('symbol')['Close'].rolling(3).mean()
, посмотрите, имеют ли числа смысл) - person piterbarg   schedule 21.03.2021