Как получить группы из данных временных рядов, которые обновляются каждый месяц в Python / pandas? - PullRequest
0 голосов
/ 30 января 2020

У меня есть данные временных рядов доходности акций, которые выглядят следующим образом:
Stock Date Return A 2012-01 6 A 2012-02 4 A ... ... A 2019-08 2 B 2012-01 5 B ... ... B 2019-08 5 ... ... ...

Я хочу создать портфель акций ios для полного периода времени на основе показателей доходности, которые обновляются каждые месяц:
Портфель 1 - лучшие 10% каждого месяца
Портфель 2 - следующие 20% каждого месяца
Портфель 3 - следующие 40% каждого месяца
Портфель 4 - следующие 20% каждого месяца
Портфель 5 - наименьший 10% каждого месяца

Каждый месяц я хотел бы назначать каждую акцию одному из пяти портфелей ios в зависимости от его рейтинга эффективности. Например, если доходность акций А находится в лучших 10% в 2012-01 годах, я хочу присвоить их портфелю 1. Если затем он падает в производительности и получает только лучшие 30% - 20% в 2012- 02, я хочу переместить его в портфель 2.

Для каждого из пяти портфелей ios я хочу получить DataFrame, который в идеале должен выглядеть следующим образом:
Portfolio Date Stocks included Stock Return 1 2012-01 A 6 1 2012-01 ... ... 1 2012-01 ... ... 1 2012-02 ... ... ... ... ... ... 1 2019-08 ... ...

Каков наилучший способ сделать это в pandas? Будем очень благодарны за любые подсказки!
Я новичок в pandas и, следовательно, пока не очень опытен. Я попробовал groupby и pd.cut, но не смог сделать это правильно.

Вот что я написал до сих пор. Кажется, это работает, но я не уверен, что это лучший способ сделать это.

# Group by Date
grouped = df_total.groupby('Date')

# Iterate through every month; get portfolio ranks and store them in df_total
for name, group in grouped:
    portfolio_category = pd.qcut(group.Return, q=[0, .1, .3, .7, .9, 1], labels=False)
    df_total['PortfolioNr'].update(portfolio_category)

# Portfolio 1 (top 10%)
df_portfolio10 = df_total.loc[df_total['PortfolioNr'] == 4.0]
df_portfolio10 = df_portfolio10.sort_values(by=['Date'])

# Portfolio 2 (next 20%)
df_portfolio10to30 = df_total.loc[df_total['PortfolioNr'] == 3.0]
df_portfolio10to30 = df_portfolio10to30.sort_values(by=['Date'])

# Portfolio 3 (next 40%)
df_portfolio30to70 = df_total.loc[df_total['PortfolioNr'] == 2.0]
df_portfolio30to70 = df_portfolio30to70.sort_values(by=['Date'])

# Portfolio 4 (next 20%)
df_portfolio70to90 = df_total.loc[df_total['PortfolioNr'] == 1.0]
df_portfolio70to90 = df_portfolio70to90.sort_values(by=['Date'])

# Portfolio 5 (lowest 10%)
df_portfolio90to100 = df_total.loc[df_total['PortfolioNr'] == 0.0]
df_portfolio90to100 = df_portfolio90to100.sort_values(by=['Date'])
...