Python pandas groupby возвращает все записи, а не сгруппированные записи - PullRequest
0 голосов
/ 25 января 2020

У меня есть временной ряд возвратов в pandas фрейме данных с индексом даты и столбцом возврата, помеченным 'TRI', как таковой:

VALUE_DATE  TRI        
2007-06-26 -0.000727
2007-06-27  0.015004
2007-06-28  0.000758
2007-06-29 -0.006408
2007-07-02  0.013844
2007-07-03  0.003866

Я пытаюсь агрегировать совокупный доход за изменяющиеся интервалы с использованием метода pandas groupby. Я создал собственный метод:

def cumRets(z):
        return np.exp(np.log(1 + z).cumsum()) - 1

Но я не могу успешно использовать его в вызове apply.

Для справки, эта группа (по годам), как и ожидалось, хотя и с простой суммой:

returns.groupby(returns.index.year).sum()

Вывод:

VALUE_DATE  TRI        
2007       -0.046283
2008       -0.240282
2009        0.259417
2010        0.268445
2011        0.054842
2012        0.162453
2013        0.331585
2014        0.063425
2015       -0.009367
2016        0.242511
2017        0.132732
2018       -0.099919
2019        0.233057
2020       -0.002414

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

returns.groupby(returns.index.year).apply(cumRets) 

Вывод:

VALUE_DATE  TRI
2019-12-26  0.250672
2019-12-27  0.247278
2019-12-30  0.246734
2019-12-31  0.248562
2020-01-02  0.000143
2020-01-03 -0.002414

Желаемый результат будет выглядеть следующим образом (сокращенно):

VALUE_DATE  TRI        
...
...
2019        0.248562
2020       -0.002414

Вопрос 1a , это то, как я бы делал то же самое для месячных и еженедельных интервалов, где желаемый вывод будет выглядеть примерно так, соответственно (только формат, значения являются заполнителями):

Вывод, Ежемесячно:

VALUE_DATE  TRI
...
...
    2019-12  0.066746
    2020-01 -0.002414

Выходные данные, еженедельно:

VALUE_DATE  TRI
...
...
    2019-12-w3  0.013228
    2019-12-w4  0.022367
    2020-01-w1 -0.002414

1 Ответ

0 голосов
/ 25 января 2020

Вот способ, которым вы можете попробовать использовать resample:

def cumRets(z):
        return z.add(1).prod().sub(1)


# yearly
df.resample('Y', kind='period').apply(cumRets)

# monthly
df.resample('M', kind='period').apply(cumRets)
...