使用f'{col}'的Python函数异常,无法正确生成EWMA列
问题排查与代码修正
原代码核心问题
- 逻辑终止过早:
EWMA函数内遍历索引时,第一次循环就触发return,直接终止函数执行,最终返回None - 列匹配错误:遍历
p1所有列生成_EWMA列,包含价格列等非目标列,导致生成大量无效列 - 语法与索引错误:
if f'_Ret' in p1.columns末尾多余冒号;i-1的索引方式不适用于非整数型索引 - 运算类型不兼容:用
math.sqrt处理DataFrame数组,该函数仅支持标量运算,无法返回有效结果
修正步骤与代码
步骤1:提取目标工具列
先筛选收益率列,提取对应金融工具名称,避免无差别处理所有列:
import pandas as pd import numpy as np # 提前定义平滑系数X(示例值为0.94,可根据需求修改) lam = 0.94 min_Date = '2018-04-13' # 筛选p1中的收益率列,提取工具前缀 ret_cols = [col for col in p1.columns if col.endswith('_ret')] tools = [col.split('_')[0] for col in ret_cols]
步骤2:逐工具计算EWMA
针对每个工具单独递推计算,确保逻辑清晰且仅生成目标列:
# 先按日期排序,简化索引遍历(若p1已排序可跳过) p1 = p1.sort_values('Date').reset_index(drop=True) for tool in tools: ret_col = f"{tool}_ret" # 从seed中提取对应工具的标准差 sd_val = seed[f"{tool}_SD"].iloc[0] ewma_col = f"{tool}_EWMA" # 初始化EWMA数组 ewma_vals = np.zeros(len(p1)) # 计算最早日期的EWMA值 ewma_vals[0] = np.sqrt(lam * (sd_val ** 2) + (1 - lam) * (p1.iloc[0][ret_col] ** 2)) # 递推计算后续日期的EWMA值 for i in range(1, len(p1)): ewma_vals[i] = np.sqrt(lam * (ewma_vals[i-1] ** 2) + (1 - lam) * (p1.iloc[i][ret_col] ** 2)) # 将结果写入p1 p1[ewma_col] = ewma_vals
关键说明
- 仅针对收益率列生成对应
_EWMA列,严格控制新增列数量 - 使用
numpy.sqrt替代math.sqrt,支持数组运算 - 先按日期排序,用整数索引递推,避免复杂的位置查找逻辑
- 逐工具独立计算,避免批量列操作的混乱
内容的提问来源于stack exchange,提问作者CristinaK
相关产品推荐
相关产品推荐

