Рассчитать ежемесячные доходы от ежедневных доходов в пандах (cumpound) - PullRequest
0 голосов
/ 07 сентября 2018

Я пытался рассчитать ежемесячную доходность для конкретной акции, но я не могу найти хороший метод, который не использует большое количество циклов. У df есть следующая форма

           MSFT-US  AAPL-US    GE    RF
 20150501    1.01   -0.33   -0.60   0.000
 20150504    0.32    0.06    0.16   0.000
 20150505   -1.19   -0.10    0.34   0.000
 20150506   -0.31    0.62   -0.20   0.000
 20150507    0.39    0.03   -0.43   0.000
 20150508    1.21   -0.54   -0.21   0.000
 20150511   -0.39    0.67   -0.11   0.000
 20150512   -0.27    0.00    0.11   0.000
 20150513    0.01    0.02   -0.06   0.000
 20150514    1.01   -0.10   -0.36   0.000
 20150515    0.05   -0.26   -0.01   0.000
 20150518    0.44    0.72   -0.09   0.000
 20150519   -0.09   -0.08    0.03   0.000
 20150520   -0.05    0.21   -0.09   0.000
 20150521    0.23   -0.31    0.09   0.000
 20150522   -0.22   -0.11   -0.14   0.000
 20150526   -1.01   -0.04   -0.02   0.000
 20150527    0.93    0.33   -0.39   0.000
 20150528   -0.11    0.11    0.07   0.000
 20150529   -0.58    0.02    0.05   0.000

Итак, я хочу получить что-то вроде этого (но не суммировать):

         MSFT-US   AAPL-US     GE      RF
 201505    1.36     0.92     -1.89    0.00

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018
df.index = df.index.map(lambda x:pd.to_datetime(str(x)))
df.groupby([df.index.year,df.index.month]).sum()

вывод:

        MSFT-US AAPL-US GE  RF
2015    5   1.38    0.92    -1.86   0.0
0 голосов
/ 16 мая 2019

Я предполагаю, что ваш Dataframe имеет DatetimeIndex. Если это так, я предпочитаю этот подход от ежедневной до ежемесячной доходности:

df.resample('M').agg(lambda x: (x + 1).prod() - 1)

Но вы также можете подать заявку на другую частоту. Например, для еженедельных возвратов в прошлую пятницу:

df.resample('W-FRI').agg(lambda x: (x + 1).prod() - 1) 
0 голосов
/ 07 сентября 2018

Предполагается, что ваш столбец даты называется 'date':

df['month'] = df['date'].astype(str).str[:6]

monthly_total = df.groupby('month').sum().drop('date', axis='columns')

дает вам

        MSFT-US  AAPL-US    GE   RF
month                              
201505     1.38     0.92 -1.86  0.0

Чтобы получить сложный результат, нам нужно добавить 1 к каждому значению, а затем использовать .prod():

df[['MSFT-US', 'AAPL-US', 'GE', 'RF']] += 1
monthly_total = df.groupby('month').prod().drop('date', axis='columns')

Дает нам:

         MSFT-US   AAPL-US        GE   RF
month                                    
201505  0.008739  0.946043  0.070769  1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...