问题描述
各位大佬好,
请问下面这段代码中的T.apply(f_sum)是什么意思?
在API里搜过,也百度过,但是没有找到结果
#获取综合得分
df['point'] = df[['pb_ratio','1/roe']].rank().T.apply(f_sum)
#打分工具
def f_sum(x):
return sum(x)
code
多谢
解决方案
你好!这段代码是量化交易多因子选股策略中非常常见的**“等权打分法”**。为了让你彻底明白,我们把这段代码拆解开来看。
代码拆解分析
整句代码 df[['pb_ratio','1/roe']].rank().T.apply(f_sum) 可以分为四个步骤:
1. df[['pb_ratio','1/roe']]
这是从你的数据表(DataFrame)中提取出两列数据:市净率(pb_ratio)和 ROE的倒数(1/roe)。
2. .rank()
这是 Pandas 的排序函数。它会对提取出来的这两列数据分别进行排名。比如,把所有股票的 pb_ratio 从小到大排个名次(1, 2, 3...),再把 1/roe 也排个名次。此时,你得到的是一个包含两列排名数据的 DataFrame,每一行代表一只股票,每一列代表一个因子的排名。
3. .T (转置)
T 是 Transpose(转置)的缩写。它的作用是把表格的行和列对调。
- 转置前:行是“股票”,列是“因子排名”。
- 转置后:行变成了“因子排名”,列变成了“股票”。
4. .apply(f_sum)
apply() 是 Pandas 中用来对数据应用某个函数的工具。默认情况下,apply() 是按列(axis=0)逐列执行的。
因为你在第3步做了转置(.T),现在的“列”实际上代表的是某一只股票。所以,.apply(f_sum) 的意思就是:把每一只股票的 pb_ratio 排名和 1/roe 排名传给 f_sum 函数进行求和。
最终,df['point'] 得到的就是每只股票在这两个因子上的排名总和(综合得分)。
💡 强烈建议的优化方案(Pandas进阶)
虽然原作者的代码能实现功能,但先转置再 apply 自定义函数,在 Pandas 中是非常低效的写法,尤其是在股票数量很多的时候,运行速度会很慢。
其实,Pandas 已经内置了按行求和的功能,你完全可以去掉 .T.apply(f_sum),直接使用 .sum(axis=1) 来代替。这不仅代码更短,而且底层是 C 语言实现的,运行速度快得多!
优化后的代码如下:
# 获取综合得分(按行求和,axis=1表示跨列按行计算)
df['point'] = df[['pb_ratio', '1/roe']].rank().sum(axis=1)
这样写,你甚至连那个 def f_sum(x): 的自定义函数都可以直接删掉了,代码更加优雅和高效!
在 JoinQuant 中的应用场景
在 JoinQuant (聚宽) 编写多因子策略时,我们经常需要综合多个指标来选股。比如你想选出“估值低(PB低)”且“盈利能力强(ROE高,即1/ROE低)”的股票。通过 .rank().sum(axis=1) 计算出综合排名得分后,你就可以使用 .sort_values('point') 对得分进行排序,从而选出得分最低(排名最靠前)的 N 只股票进行买入操作了。