gpt4 book ai didi

python - 跨行排名

转载 作者:行者123 更新时间:2023-12-01 09:17:52 24 4
gpt4 key购买 nike

我的数据框如下所示:

      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 中各行的股票 yield 的分位数。例如,分位数(假设我们使用 3 个组)会将第一行返回排名为分位数 3 中的 AAPL 和 INTC,以及分位数 1 中的 NFLX(因为它是最高返回)。预期输出为(如下,向右滚动):

      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初学者。谢谢!

最佳答案

一种方法是使用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

只需与原始数据帧连接,因为行号与原始数据帧相同。

df = df.join(df_Q)

给出预期的输出

关于python - 跨行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51069903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com