如何基于pandas价格DataFrame高效生成收益率DataFrame,无需遍历列?
基于Pandas价格表生成收益率表的高效实现
完全不需要写for循环遍历列,直接用Pandas内置向量化操作即可,性能远高于Python层面的循环,实现代码如下:
import pandas as pd import numpy as np # 构造示例价格表 PriceTable = pd.DataFrame({ 'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'], 'Stock1':[10, 12, 13.5, 11.5], 'Stock2':[5, 5.5, 'NaN', 'NaN'], 'Stock3':['NaN', 9, 9.5, 10.5], 'Stock4':[20, 20, 19.5, 15]}) # 第一步:将字符串格式的NaN转换为Pandas可识别的缺失值,数值列转浮点型 num_cols = [col for col in PriceTable.columns if col != 'Dates'] PriceTable[num_cols] = PriceTable[num_cols].replace('NaN', np.nan).astype(float) # 第二步:计算收益率(t期价格 / t-1期价格) ReturnTable = PriceTable.copy() # 对数值列做向量化计算:当期除以前一期,首行自动为NaN ReturnTable[num_cols] = ReturnTable[num_cols] / ReturnTable[num_cols].shift(1) # 按照需求将每列第一个非NaN的位置填充为0,剩余NaN保持不变 ReturnTable[num_cols] = ReturnTable[num_cols].apply(lambda x: x.fillna(0, limit=1)) # 可选:保留三位小数和示例输出一致 ReturnTable[num_cols] = ReturnTable[num_cols].round(3)
方案优势
- 全程没有Python层面的循环,所有计算都是Pandas底层C语言实现的向量化运算,列数越多、数据量越大,效率优势越明显,比手动for循环遍历列快至少1~2个数量级
- 自动兼容缺失值处理,不需要额外写判断逻辑,输出结果和需求完全匹配
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

