Годовой доход по группам - PullRequest
0 голосов
/ 28 ноября 2018

Я имею ежемесячный доход и хочу рассчитать годовой доход по двум группам.Ниже приведен пример данных.

Return_M    Rise
0.097425    1
0.188547    1
-0.1509     1
0.28011     1
-0.09596    1
0.041459    1
0.106838    1
0.046581    0
-0.16068    0
0.009242    0
0.006104    0
-0.00709    0
0.050352    0
-0.01023    0
-0.00731    0
0.031946    0
0.048552    0

Это то, что я пробовал, но код фактически учитывает длину df1, а не по группе.Я надеюсь, что метод, который может быть применен широко.

df2 = df1.groupby(['Rise'])[['Return_M']].apply(lambda x:np.prod(1+x)**(12/len(x)))

Это ожидаемый результат:

Rise    Return_M
1      0.249862
0      -0.00443

1 Ответ

0 голосов
/ 28 ноября 2018

Вам нужно только 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

Так что просто проверьте, если ваша логикадый правильный.Пожалуйста, отметьте этот ответ как принятый, если он решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...