行间排名

时间:2018-06-27 19:10:59

标签: python pandas

我的数据框如下:

      Date       AAPL      NFLX       INTC    AAPL_Ret   NFLX_Ret   INTC_Ret
0 2008-01-31  27.834286  3.764286  25.350000       
1 2008-02-29  27.847143  3.724286  24.670000   -0.07     0.25       -0.05     
2 2008-03-31  25.721428  3.515714  22.670000    0.15     0.10       0.06  
3 2008-04-30  25.377142  3.554286  22.879999    etc
4 2008-05-31  24.464285  3.328571  22.260000

我想为我的df行中的股票收益计算分位数。因此,例如,分位数(假设我们使用3个组)会将收益的第一行排在第3位数中的AAPL和INTC上,将NFLX放在第1位数中(因为这是最高的收益)。预期的输出将是(下面,滚动到右边):

      Date       AAPL       NFLX       INTC    AAPL_Ret   NFLX_Ret   INTC_Ret   AAPL_Ret Q   NFLX_Ret Q   INTC Ret Q
0 2008-01-31  27.834286  3.764286  25.350000       
1 2008-02-29  27.847143  3.724286  24.670000   -0.07     0.25       -0.05        3              1            3
2 2008-03-31  25.721428  3.515714  22.670000    0.15     0.10       0.06         1              2            2
3 2008-04-30  25.377142  3.554286  22.879999    etc
4 2008-05-31  24.464285  3.328571  22.260000

我尝试过的方法:我本来想在公式中将pd.qcut与axis = 1一起使用,但是该方法没有这样的参数。所以我想我可以做一个for循环之类的事情(因为我最终会将文件扩展到很多股票中)

for col in df.columns:
    if '_Ret' in col:
        df[col+'_Rank'] = df.apply(pd.qcut(df[col], 5, labels=np.arange(5, 0, -1), axis=1)

但是我被困在这里。

Python初学者,将非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

一种方法可能是使用filter仅选择具有'_Ret'和stack的列,以使其成为以后可以使用qcut的意向。

# I only copy the two rows with values in _Ret columns
print (df.filter(like = '_Ret').stack())

1  AAPL_Ret   -0.07
   NFLX_Ret    0.25
   INTC_Ret   -0.05
2  AAPL_Ret    0.15
   NFLX_Ret    0.10
   INTC_Ret    0.06

现在您可以在此系列中使用qcut,然后使用unstackadd_suffix重命名:

df_Q = (pd.qcut(df.filter(like = '_Ret').stack(), 3, labels=np.arange(3, 0, -1))
           .unstack().add_suffix(' Q'))

print (df_Q)
  AAPL_Ret Q NFLX_Ret Q INTC_Ret Q
1          3          1          3
2          1          2          2

只需使用原始数据帧join,因为该行的编号与原始数据帧的编号相同。

df = df.join(df_Q)

提供预期的输出