问题描述
我有一组包含以下内容的股票面板:日期,股票行情,零售,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边缘必须唯一。 如果您能指导我解决这个问题,我将不胜感激。 谢谢
解决方法
虽然无法提供单线 有时最好分成较小的步骤。
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)