You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在DataFrame中批量用其他列减去最后一列(无风险利率)计算超额收益?

用Pandas快速计算多列的超额收益率

嘿,这个需求在pandas里完全可以用一行代码搞定,根本不用费劲去循环每一列,核心就是利用pandas的广播机制——它会自动把单列数据扩展成和多列匹配的维度来做运算。

给你两种常用的简洁实现方式:

方法一:直接切片运算

这是最直观的写法,一步到位:

# 假设你的DataFrame叫df
excess_returns = df.iloc[:, :-1] - df.iloc[:, -1]

解释一下:

  • df.iloc[:, :-1]:选中除了最后一列之外的所有列(也就是你的40个行业收益率列)
  • df.iloc[:, -1]:单独选中最后一列(无风险利率)
  • 直接相减后,pandas会自动把无风险利率列广播到每一行,和对应的行业收益率做减法,得到每一列的超额收益率

如果想把结果和原无风险利率列合并成新的DataFrame,只需要再加一步:

# 合并超额收益率和原无风险利率列
result_df = pd.concat([excess_returns, df.iloc[:, -1]], axis=1)

方法二:用sub方法(更灵活)

如果你需要调整运算的细节(比如处理缺失值),可以用pandas的sub方法:

excess_returns = df.iloc[:, :-1].sub(df.iloc[:, -1], axis=0)

这里的axis=0指定按行对齐广播,和直接减效果一样,但如果有特殊需求(比如填充缺失值),可以加fillna参数,比如:

# 遇到缺失值时用0填充再做减法
excess_returns = df.iloc[:, :-1].sub(df.iloc[:, -1], axis=0, fill_value=0)

小例子演示

比如我们构造一个小的测试DataFrame:

import pandas as pd
import numpy as np

# 模拟3个行业收益率+1个无风险利率列
data = {
    '行业A': [0.05, 0.03, -0.02],
    '行业B': [0.04, 0.06, 0.01],
    '行业C': [0.07, -0.01, 0.03],
    '无风险利率': [0.01, 0.01, 0.01]
}
df = pd.DataFrame(data)

# 计算超额收益率
excess = df.iloc[:, :-1] - df.iloc[:, -1]
print(excess)

输出结果就是每个行业的超额收益率:

行业A  行业B  行业C
0  0.04  0.03  0.06
1  0.02  0.05 -0.02
2 -0.03  0.00  0.02

这种方式不管你前面有多少列(哪怕不是40列)都能自动适配,完全不用修改代码,非常方便~

内容的提问来源于stack exchange,提问作者Niccola Tartaglia

火山引擎 最新活动