2016-11-20 5 views
2

Я уверен, что мне нужно использовать какую-то прикладную функциональность, но я изо всех сил пытаюсь создать тот, который это выполнит. У меня есть dataframe с биржевыми котировками и ежемесячными доходами. Мне нужно рассчитать передовые 3-месячные возвращения. Он структурирован таким образом, что на каждый месяц будет 500 (сделанных с номером вверх) строк со всеми запасами и доходами за этот месяц. Я пытался что-то вроде этого, но он не работает.Как использовать pandas groupby и сменить вместе

mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'].apply(mr['monthly_returns']+mr['monthly_returns'].shift(-1)+mr['monthly_returns'].shift(-2)) 

И совет?

+0

вам нужно 'мР [ 'Quarterly_Returns'] = mr.groupby ('тикер') [ ''] monthly_returns ли применять (лямбда-х.: x + x.shift (-1) + x.shift (-2)) '? – jezrael

+0

Я так не думаю. Это, похоже, дает мне ключ к столбцу «month_returns». Однако я это рассмотрю. – user3451026

+0

Извините, я редактирую комментарий. – jezrael

ответ

0

Вам нужно lambda x и apply вместо имен столбцов использовать x, так как работает только с колонкой monthly_returns:

mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'] 
          .apply(lambda x: x+x.shift(-1)+x.shift(-2)) 
0

Вы могли бы также рассмотреть возможность использования rolling функций.

mr.groupby('ticker')['monthly_returns'].rolling(3).sum()

Более полный пример:

df=pd.concat([pd.DataFrame(index=pd.date_range('1/1/2016','12/31/2016',freq='M'),data={'ticker':x,'return':np.random.rand(12)}) for x in list('ABCD')]) 
df.groupby('ticker')['return'].rolling(3).sum().unstack('ticker') 

ticker A B C D 
2016-01-31 NaN  NaN  NaN  NaN 
2016-02-29 NaN  NaN  NaN  NaN 
2016-03-31 2.062552 1.508062 1.317836 1.051874 
2016-04-30 1.727587 1.856383 1.308263 1.113360 
2016-05-31 1.602858 2.112790 1.533763 1.039221 
2016-06-30 1.716985 2.403718 1.850741 1.726469 
2016-07-31 1.828597 1.809054 1.543079 1.569896 
2016-08-31 2.003484 1.531877 1.376907 1.852235 
2016-09-30 1.854642 1.319289 1.438446 0.946304 
2016-10-31 1.308001 1.718987 1.764252 1.157938 
2016-11-30 0.962660 2.255580 1.489076 0.493370 
2016-12-31 0.949810 1.753511 1.321650 1.377429 
+0

Я тестирую его, но он возвращает что-то еще. – jezrael

+0

Вы также можете проверить это - 'mr = pd.DataFrame ({'ticker': np.random.choice (['a', 'b', 'c', 'd'], 20), 'daily_returns' : np.random.choice (1000, 20)}) ' – jezrael

+0

Может быть, я в замешательстве, но мне кажется, что он делает именно то, что нужно - вычисляет текущую сумму для каждого тикера. Другое решение объединяет все результаты вместе, хотя я не уверен, что полностью понимаю, почему. –