我的数据框如下:
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初学者,将非常感谢您的帮助。谢谢!
答案 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
,然后使用unstack
和add_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)
提供预期的输出