无法保存计算值到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
相关产品推荐
相关产品推荐

