如何使用For循环处理不同命名的预测变量并批量计算MSE后保存至Excel表格
解决多组预测值的MSE计算与Excel保存问题(带循环实现)
嘿,我来帮你搞定这个问题!你已经写了大部分代码,现在只需要把这些预测值用循环批量处理,计算MSE,然后把公式和结果一起存到Excel里就行。下面是完整的解决方案:
步骤1:重构代码,用结构化方式管理预测公式和结果
与其单独定义14个prediction_i变量,不如把每个预测的名称、公式文本(用于后续存Excel)和计算结果放到一个列表里,这样循环处理起来非常方便:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import math # 读取数据 df = pd.read_excel(r'D:/Phd_3_yr_start/kanwar_ka_bas/Rabi_19_20_index/testing/testing.xlsx', sheet_name = '9_feb') productivity = df.iloc[:,0] wdrvi = df.iloc[:,1] cvi = df.iloc[:,2] ndvi = df.iloc[:,3] tndvi = df.iloc[:,4] ndwi2 = df.iloc[:,5] # 定义所有预测项:(预测名称, 公式文本, 预测值) predictions = [ ("prediction_1", "3.24 + 0.37*cvi", 3.24 + 0.37*cvi), ("prediction_2", "62.15*ndvi + 2.64*cvi + 32.79*ndwi2*tndvi - 28.09 - 22.37*tndvi - 31.29*ndwi2 - 62.19*wdrvi", 62.15*ndvi + 2.64*cvi + 32.79*ndwi2*tndvi - 28.09 - 22.37*tndvi - 31.29*ndwi2 - 62.19*wdrvi), ("prediction_3", "2.45 + 4.06*ndvi", 2.45 + 4.06*ndvi), ("prediction_4", "3.45 + 2.49*ndwi2", 3.45 + 2.49*ndwi2), ("prediction_5", "8.48*tndvi - 3.86", 8.48*tndvi - 3.86), ("prediction_6", "5.14 + 2.76*wdrvi", 5.14 + 2.76*wdrvi), ("prediction_7", "9.46 + 0.37*cvi*ndwi2 + 2.76*cvi*ndwi2*wdrvi - 1.08*cvi - 18.36*wdrvi**2", 9.46 + 0.37*cvi*ndwi2 + 2.76*cvi*ndwi2*wdrvi - 1.08*cvi - 18.36*wdrvi**2), ("prediction_8", "2.43 + 16.21*ndvi + 0.15*cvi**2 - 2.38*cvi", 2.43 + 16.21*ndvi + 0.15*cvi**2 - 2.38*cvi), ("prediction_9", "1.85 + 19.37*ndvi + 2.77*cvi*ndwi2 - 2.21*cvi - 17.34*ndvi*ndwi2", 1.85 + 19.37*ndvi + 2.77*cvi*ndwi2 - 2.21*cvi - 17.34*ndvi*ndwi2), ("prediction_10", "15.09*ndvi - 4.89 - 8.01*wdrvi", 15.09*ndvi - 4.89 - 8.01*wdrvi), ("prediction_11", "4.47 + 11.75*ndvi - 0.57*cvi - 3.99*tndvi", 4.47 + 11.75*ndvi - 0.57*cvi - 3.99*tndvi), ("prediction_12", "24.69*ndvi + 0.73*cvi - 10.57 - 4.24*tndvi - 19.69*wdrvi", 24.69*ndvi + 0.73*cvi - 10.57 - 4.24*tndvi - 19.69*wdrvi), ("prediction_13", "ndwi2 + 29.88*ndvi + 1.24*cvi - 17.24 - 4.24*tndvi - 28.64*wdrvi", ndwi2 + 29.88*ndvi + 1.24*cvi - 17.24 - 4.24*tndvi - 28.64*wdrvi), ("prediction_14", "36.54*ndvi + 1.15*cvi*ndwi2 - 14.67 - 2.93*ndwi2 - 6.07*tndvi - 28.05*wdrvi", 36.54*ndvi + 1.15*cvi*ndwi2 - 14.67 - 2.93*ndwi2 - 6.07*tndvi - 28.05*wdrvi) ]
步骤2:用For循环批量计算MSE并整理结果
接下来,我们遍历这个predictions列表,逐个计算每个预测值的MSE,然后把结果存到一个新的列表里,最后转成DataFrame:
# 初始化结果列表 mse_results = [] for pred_name, pred_formula, pred_values in predictions: # 计算MSE:(真实值-预测值)的平方的均值 mse = np.square(np.subtract(productivity, pred_values)).mean() # 把结果添加到列表,包含预测名称、公式、MSE值 mse_results.append({ "预测名称": pred_name, "预测公式": pred_formula, "MSE值": round(mse, 4) # 保留4位小数,让结果更整洁 }) # 转成DataFrame方便查看和保存 results_df = pd.DataFrame(mse_results) print(results_df)
步骤3:保存结果到Excel
最后,把这个结果DataFrame保存到你指定的Excel文件里(可以选择覆盖原文件或者存到新文件):
# 保存到Excel,这里选择保存到一个新文件,避免覆盖原数据 results_df.to_excel(r'D:/Phd_3_yr_start/kanwar_ka_bas/Rabi_19_20_index/testing/mse_results.xlsx', sheet_name='MSE_Results', index=False)
为什么这么做?
- 可维护性:如果后续要添加或修改预测公式,只需要在
predictions列表里调整,不用改循环代码 - 可读性:把预测名称、公式和计算结果绑定在一起,一目了然
- 高效性:批量处理14个预测值,避免重复写14次MSE计算代码
内容的提问来源于stack exchange,提问作者Sudesh Singh Choudhary
相关产品推荐
相关产品推荐

