如何从Python/pandas中每月更新的timeseries数据中获取组?

2024-04-20 07:41:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的股票收益的时间序列数据:
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 ... ... ...

我想根据每月更新的回报表现,为整个时间框架创建股票投资组合:
投资组合1-每月最佳10%
投资组合2-每月下一个20%
投资组合3-每个月的下一个40%
投资组合4-每个月的下一个20%
投资组合5-每月最低10%

每个月,我都会根据业绩排名将每只股票分配到五个投资组合中的一个。例如,如果A股的回报率在2012-01年达到最好的10%,我想将其分配给投资组合1。如果它在2012-02年度的表现有所下降,并且只获得了30%-20%的最好成绩,我想把它转移到投资组合2

对于这五个投资组合中的每一个,我都希望得到一个理想情况下应该如下所示的数据帧:
Portfolio Date Stocks included Stock Return 1 2012-01 A 6 1 2012-01 ... ... 1 2012-01 ... ... 1 2012-02 ... ... ... ... ... ... 1 2019-08 ... ...

在熊猫身上这样做的最佳方式是什么?任何提示都将不胜感激
我对熊猫还不熟悉,因此还不是很有经验。我试过groupbypd.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'])

Tags: dfdatebyreturnsortlocnexttotal