Я пытаюсь получить кумулятивное среднее из предыдущих значений для разных групп, используя панд.
Мой исходный кадр данных (df):
idx = [np.array(['Jan-18', 'Jan-18', 'Feb-18', 'Mar-18', 'Mar-18', 'Mar-18','Apr-18', 'Apr-18', 'May-18', 'Jun-18', 'Jun-18', 'Jun-18','Jul-18', 'Aug-18', 'Aug-18', 'Sep-18', 'Sep-18', 'Oct-18','Oct-18', 'Oct-18', 'Nov-18', 'Dec-18', 'Dec-18',]),np.array(['A', 'B', 'B', 'A', 'B', 'C', 'A', 'B', 'B', 'A', 'B', 'C','A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'A', 'B', 'C'])]
data = [{'xx': 1}, {'xx': 5}, {'xx': 3}, {'xx': 2}, {'xx': 7}, {'xx': 3},{'xx': 1}, {'xx': 6}, {'xx': 3}, {'xx': 5}, {'xx': 2}, {'xx': 3},{'xx': 1}, {'xx': 9}, {'xx': 3}, {'xx': 2}, {'xx': 7}, {'xx': 3}, {'xx': 6}, {'xx': 8}, {'xx': 2}, {'xx': 7}, {'xx': 9}]
df = pd.DataFrame(data, index=idx, columns=['xx'])
df.index.names=['date','type']
df=df.reset_index()
df['date'] = pd.to_datetime(df['date'],format = '%b-%y')
df=df.set_index(['date','type'])
df['xx'] = df.xx.astype('float')
И результат, который я ищу(кумулятивное среднее предыдущих значений для разных типов) выглядит следующим образом:
date type xx yy
0 2018-01-01 A 1.0 NaN
1 2018-01-01 B 5.0 NaN
2 2018-02-01 B 3.0 5.000000
3 2018-03-01 A 2.0 1.000000
4 2018-03-01 B 7.0 4.000000
5 2018-03-01 C 3.0 NaN
6 2018-04-01 A 1.0 1.500000
7 2018-04-01 B 6.0 5.000000
8 2018-05-01 B 3.0 5.250000
9 2018-06-01 A 5.0 1.333333
10 2018-06-01 B 2.0 4.800000
11 2018-06-01 C 3.0 3.000000
12 2018-07-01 A 1.0 2.250000
13 2018-08-01 B 9.0 4.333333
14 2018-08-01 C 3.0 3.000000
15 2018-09-01 A 2.0 2.000000
16 2018-09-01 B 7.0 5.000000
17 2018-10-01 C 3.0 3.000000
18 2018-10-01 A 6.0 2.000000
19 2018-10-01 B 8.0 5.250000
20 2018-11-01 A 2.0 2.571429
21 2018-12-01 B 7.0 5.555556
22 2018-12-01 C 9.0 3.000000
Я безуспешно пробовал следующий код Pandas (при выполнении операции прокрутки возникает ошибка):
df['yy'] = (df.assign(H=(df.groupby('type').xx.transform('cumsum')/(df.groupby('type').xx.cumcount()+1)))).groupby('type').H.rolling(1).apply(lambda x: x[-1])
Обратите внимание, что первая часть кода работает нормально:
df['yy'] = (df.groupby('type').xx.transform('cumsum')/(df.groupby('type').xx.cumcount()+1))
** Было бы полезно, если вы можете решить мою ошибку или предложите другой элегантный способ сделать то же самое с Pandas,Спасибо!