Pandas按多列分组后基于TTM列实现price列线性插值的问题
Pandas按多列分组后基于TTM列实现price列线性插值的问题
嗨,你已经离正确结果很近了,问题出在默认的线性插值逻辑上——原来的代码是沿着行索引位置做插值,而非你需要的以TTM列作为自变量(x轴)的插值,这就是为什么会得到54.06而不是期望的53.99。
问题根源拆解
拿你提到的这个子数据集举例:
4 SCOM_WTI 68801903 WTI Nymex BBG:CL 2015-01-02 77 53.69 5 SCOM_WTI 68801903 WTI Nymex BBG:CL 2015-01-02 90 NaN 6 SCOM_WTI 68801903 WTI Nymex BBG:CL 2015-01-02 109 54.42
原代码中未指定插值的自变量,所以Pandas会自动用行索引的位置(4、5、6)当作x轴计算:
- 索引差值:6-4=2
- Price差值:54.42-53.69=0.73
- 中间位置的Price:53.69 + 0.73/2 = 54.055 ≈ 54.06
这显然和你基于TTM的插值需求不匹配。
修正后的解决方案
Pandas的Series.interpolate()方法支持通过x参数指定插值的自变量列,只需在插值时传入group["TTM"],就能让计算基于TTM的数值而非行索引:
def interpolate_group(group): # 明确指定以TTM作为x变量执行线性插值 group["price"] = group["price"].interpolate( method='linear', limit_direction='both', axis=0, x=group["TTM"] ) return group new_df = df.groupby(["reference","sicovam","label","id","date"])[["TTM","price"]].apply(interpolate_group)
结果验证
用你提到的子数据集测试,基于TTM的线性插值计算过程为:
- TTM区间差值:109 - 77 = 32
- Price区间差值:54.42 - 53.69 = 0.73
- 单位TTM对应的Price涨幅:0.73 / 32 ≈ 0.0228125
- TTM=90时的Price:53.69 + (90-77)*0.0228125 ≈ 53.99
完全符合你的预期结果。
性能说明
这种方法是Pandas内置的矢量化操作,不需要手动循环或临时将TTM设为索引,能高效处理大型数据集,完美规避你担心的性能瓶颈。
备注:内容来源于stack exchange,提问作者Whitebeard13
相关产品推荐
相关产品推荐

