Вам нужно только groupby
в столбце Rise
и агрегировать в столбце Return_M
.
В следующем фрагменте предполагается, что вы хотите разделить на 12 (в зависимости от вашего вопроса)
df2 = df1.groupby('Rise').agg({'Return_M': 'sum'}).reset_index()
df2['avg'] = df2['Return_M']/12
df2[['Rise', 'avg']]
Но если вам нужно среднее значение, основанное на том количестве записей, которое у вас есть для каждой группы Rise
, вы можете просто сделать:
df2 = df1.groupby('Rise').agg('Return_M': 'mean')
РЕДАКТИРОВАТЬ : редактированиеответ на основе комментария ОП:
Чтобы получить геометрический годовой доход согласно вашей формуле, будет работать следующее:
df.groupby('Rise').Return_M.apply(lambda x: (1+x).product() ** (12/float(len(x))))
Однако результат отличается от ожидаемого результата, который вы опубликовали вВаш вопрос:
Rise
0 0.986765
1 1.952498
Это, однако, является абсолютно правильным выводом согласно формуле, которую вы описали.
Я также сделал этот расчет вручную, для Rise = 1
:
- Я взял произведение каждого (1 плюс
Return_M
) значения - Поднял произведение до (12, деленное на длину группы, которая равна 7 для этой группы).
(1 + 0.097425) * (1 + 0.188547) * (1 + -0.1509) * (1 + 0.28011) * (1 + -0.09596)* (1 + 0.041459)* (1 + 0.106838) = 1.4774446702
1.4774446702 ^ (12/7) = 1.9524983367
Так что просто проверьте, если ваша логикадый правильный.Пожалуйста, отметьте этот ответ как принятый, если он решит вашу проблему.