0

我有一个包含这些列的股票面板:日期,股票代码,Ret,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 边缘必须是唯一的。如果您能指导我解决这个问题,我将不胜感激。谢谢

数据样本的图片

4

1 回答 1

0

无法提供单线,但有时最好分成更小的步骤。

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)
于 2020-09-24T18:09:05.973 回答