在python中排名和分组以每月形成10个投资组合

问题描述

我有一组包含以下内容的股票面板:日期,股票行情,零售,MTB。 我想每月根据MTB值对股票进行排名,然后将它们分为10组。当我要制作投资组合时,需要执行此步骤。 我以前使用以下代码在SAS中很容易做到这一点:


proc rank data=dt out=dt group=10;
  by Date;
    var MTB;
    ranks MTB_Rank;
run;

但是,在Python中,我找不到一种简单的排序和分组方法。我使用以下方法对日期进行排名和分组,但答案并不令人满意!

***dt['MTB_Rank'] = dt.groupby(['Date'])['MTB'].transform(lambda x: pd.qcut(x,q=10,labels=False,duplicates= 'drop'))*** 

问题在于它不会为每个日期创建10个组。实际上,它只为整个数据创建7个组,每个日期可能只有一些组。我也无法删除“ duplicates ='drop'”,因为这样代码会向我显示错误,认为Bin边缘必须唯一。 如果您能指导我解决这个问题,我将不胜感激。 谢谢

A picture of the data sample

解决方法

虽然无法提供单线 有时最好分成较小的步骤。

1。正确排序您的DataFrame

df.sort_values(by=['Column1','Column2'],ascending=[True,False],inplace=True)

2。创建一个简单的迭代器列(与Rank相同):

df['MTB_Rank'] = df.groupby(['name']).cumcount()+1

3。阈值后刷新组:

df['MTB_Rank2'] = df.MTB_Rank.apply(lambda x: x - 10 if x > 10 else x)