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

使用For循环递归生成EWMA列失败:DataFrame未新增该列问题排查

问题出在这几个地方,直接给你修正后的代码和说明:

核心错误点

  • 赋值运算符用错:代码里用了==(比较相等),这不会给df['EWMA']赋值,必须用=(赋值)。
  • 循环判断逻辑完全错误:min_Date是日期类型,和True/False比较永远不成立,等于白写了循环里的判断;而且循环遍历df['Date']时,直接操作整个列,不是针对当前行计算。
  • 初始值赋值范围错:最小日期对应的是单行,你代码里直接给整列赋值,逻辑混乱。

修正后的代码

import pandas as pd
import numpy as np
from numpy import log as ln
import statistics

# 读取数据
df = pd.read_excel(r'C:\Users\cristinamariaromano\Downloads\RACE.TSLAMI.xlsx', parse_dates=['Date'])
# 计算收益率
df['Returns RACE'] = ln(df['Close RACE'].div(df['Close RACE'].shift(3)))
df['Returns RACE'] = df['Returns RACE'].replace(np.nan, 0)
df['Returns TSLA'] = ln(df['Close TSLA'].div(df['Close TSLA'].shift(3)))
df['Returns TSLA'] = df['Returns TSLA'].replace(np.nan, 0)

lam = 0.98
# 计算样本标准差
SD_sample = statistics.stdev(df['Returns RACE'])
print(SD_sample)

# 初始化EWMA列,先设为NaN
df['EWMA'] = np.nan
# 找到最小日期对应的行索引
min_date_idx = df[df['Date'] == df['Date'].min()].index[0]
# 给最小日期的行赋值初始EWMA值
df.loc[min_date_idx, 'EWMA'] = np.sqrt(lam * (SD_sample ** 2) + (1 - lam) * (df.loc[min_date_idx, 'Returns RACE'] ** 2))

# 从最小日期的下一行开始逐行计算EWMA
for i in range(min_date_idx + 1, len(df)):
    # 前一行的EWMA值
    prev_ewma = df.loc[i-1, 'EWMA']
    # 当前行的收益率平方
    curr_ret_sq = df.loc[i, 'Returns RACE'] ** 2
    df.loc[i, 'EWMA'] = np.sqrt(lam * (prev_ewma ** 2) + (1 - lam) * curr_ret_sq)

print(df)

额外说明

  • 用df.loc精准定位行和列,避免整列操作的混乱。
  • 初始化EWMA列为NaN,确保只有计算过的行有值,其他保持空值更合理。
  • 循环从最小日期的下一行开始,逐行依赖前一行的计算结果,符合递归逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:57:27