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

无法保存计算值到DataFrame 仅最后股票收益率留存其余为NaN

问题原因

你在循环中每次给trading_df['Return']整列赋值时,pandas会自动按索引对齐数据:筛选单只股票得到的收益率序列仅包含该股票对应行的有效值,其余行均为NaN。每次赋值都会覆盖整个Return列的历史数据,前面循环计算出的其他股票收益率会被全部替换为NaN,循环结束后自然只剩最后一只股票的计算结果。

修复方案

推荐写法:分组计算(无循环,效率最高)

直接按股票代码分组后计算每组的涨跌幅,用transform把计算结果映射回原DataFrame的对应行,从根源避免整列覆盖问题:

trading_df['Return'] = trading_df.groupby('Symbol')['Adj Close'].transform(lambda col: col.pct_change(1))

兼容原有循环逻辑的写法

如果要保留循环结构,不要直接给整列赋值,先定位到当前股票对应的行,仅给这部分行写入计算结果:

# 先初始化Return列
trading_df['Return'] = pd.NA
for stock in test_stocks:
    # 标记当前股票对应的所有行
    stock_row_mask = trading_df['Symbol'] == stock
    # 仅对目标行赋值,不会覆盖其他股票的结果
    trading_df.loc[stock_row_mask, 'Return'] = trading_df.loc[stock_row_mask, 'Adj Close'].pct_change(1)
额外优化提示

你当前逐次append拼接多只股票数据的写法性能较差,且DataFrame.append方法已在新版pandas中被弃用,推荐先把所有单只股票的DataFrame存入列表,最后一次性拼接:

stock_container = []
for stock in test_stocks:
    single_stock_df = web.DataReader(stock, 'yahoo', start, end)
    single_stock_df['Symbol'] = stock
    stock_container.append(single_stock_df)
trading_df = pd.concat(stock_container)
问题附的运行结果截图

运行结果示例

内容的提问来源于stack exchange,提问作者Egor K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:36:21