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

计算股票日收益率并新增列失败问题求助

问题分析与解决方法

核心问题

你的代码存在两个关键问题:

  1. 代码末尾的多余星号(*100***)属于语法冗余,虽未触发报错,但影响代码规范性;
  2. 链式索引导致赋值失效:使用stk_prc.amer_air['Daily Returns']这种链式访问方式时,pandas可能返回原数据的副本而非视图,赋值操作仅修改临时副本,不会同步到原数据对象,因此新列无法生成。

解决步骤

1. 修正语法冗余

先去除计算式末尾的多余星号,保留正确的计算逻辑:

# 封装日收益率计算逻辑,避免重复代码
daily_return_calc = lambda df: ((df['Close'] - df['Open']) / df['Open']) * 100

2. 避免链式索引,改用安全赋值方式

根据你的数据结构选择对应方案:

方案A:若stk_prc是多层列索引的DataFrame(每只股票对应一列组)

使用.loc精准定位层级列,确保赋值直接修改原数据:

# 为amer_air添加日收益率列
stk_prc.loc[:, ('amer_air', 'Daily Returns')] = daily_return_calc(stk_prc['amer_air'])
# 为alsk_air添加日收益率列
stk_prc.loc[:, ('alsk_air', 'Daily Returns')] = daily_return_calc(stk_prc['alsk_air'])
方案B:若stk_prc的每个属性(如amer_air)是独立DataFrame

使用assign()方法生成包含新列的DataFrame,并重新赋值给原属性:

# 更新amer_air数据,添加新列
stk_prc.amer_air = stk_prc.amer_air.assign(**{'Daily Returns': daily_return_calc(stk_prc.amer_air)})
# 更新alsk_air数据,添加新列
stk_prc.alsk_air = stk_prc.alsk_air.assign(**{'Daily Returns': daily_return_calc(stk_prc.alsk_air)})

3. 批量处理优化(可选)

针对12只股票的场景,可通过遍历批量生成新列,减少重复代码:

# 定义所有股票名称列表
stock_names = ['amer_air', 'alsk_air', ...]  # 补充其余10只股票名称

# 多层列索引场景批量处理
for stock in stock_names:
    stk_prc.loc[:, (stock, 'Daily Returns')] = daily_return_calc(stk_prc[stock])

# 独立DataFrame属性场景批量处理
for stock in stock_names:
    df = getattr(stk_prc, stock)
    setattr(stk_prc, stock, df.assign(**{'Daily Returns': daily_return_calc(df)}))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:24:32