You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:36:04