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

Python循环中使用F-string遇KeyError,如何正确存储误差指标?

问题分析与解决办法

核心错误点

  • 列名生成错误:你写的"f'Price_REG{j}'"是把整段字符串当作列名,而非动态生成Price_REG1/Price_REG2这类真实列名,导致Python找不到对应列报KeyError。
  • 动态DataFrame调用错误:f'df_test_{i}'是字符串,不是实际的DataFrame变量,Python不会自动将字符串解析为变量名。
  • 命名冲突:用mae作为变量名,会覆盖导入的mean_absolute_error函数(或别名mae),导致后续调用函数时出错。

修正后的代码(用字典存储结果,方便后续调用)

# 确保导入所需的指标计算函数
from sklearn.metrics import mean_squared_error, mean_absolute_error

# 先把所有需要用到的df_test_xxx存入字典,避免动态变量名的坑
test_dataframes = {
    '24': df_test_24,
    '168': df_test_168,
    'standard': df_test_standard,
    'custom': df_test_custom
}

# 用字典存储误差指标,键名明确对应每个指标的来源
error_results = {}
naive_list = ['24', '168', 'standard', 'custom']

for i in naive_list:
    # 从字典中取出当前循环对应的DataFrame
    current_df = test_dataframes[i]
    for j in range(1, 5):
        # 正确生成列名:Price_REG1、Price_REG2...
        column_name = f"Price_REG{j}"
        # 计算指标,变量名避免和函数重名
        rmse_value = mean_squared_error(df_test[column_name], current_df[column_name], squared=False)
        mae_value = mean_absolute_error(df_test[column_name], current_df[column_name])
        # 将结果存入字典,键名格式为"指标_类型_编号"
        error_results[f'rmse_{i}_{j}'] = rmse_value
        error_results[f'mae_{i}_{j}'] = mae_value

# 后续调用示例:获取custom类型下REG3的MAE
# print(error_results['mae_custom_3'])

补充说明

  1. 如果坚持用列表存储,可以把每个指标和对应的标识打包成元组存入,比如:
error_list = []
# ... 循环部分同上 ...
error_list.append(('rmse', i, j, rmse_value))
error_list.append(('mae', i, j, mae_value))

这样后续可以通过遍历列表筛选需要的指标,但字典的可读性和调用便捷性更强。

  1. 不要用globals()或locals()去动态获取变量名(比如globals()[f'df_test_{i}']),这种方式不安全,且代码可读性差,用字典统一管理是更规范的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:31:35