使用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
相关产品推荐
相关产品推荐

