Python计算滚动RMSE时出现ValueError的问题求助
问题解决:滚动RMSE计算的ValueError问题
错误原因
使用pandas.DataFrame.rolling().apply()时,默认raw=True,此时传递给lambda函数的参数x是扁平化的NumPy数组(或带日期索引的Series),而非DataFrame切片。你尝试用x['Realized']索引时,pandas会把'Realized'当作日期字符串去匹配行索引,因此抛出日期解析错误。
解决方案
方案1:设置raw=False传递DataFrame切片
修改rolling.apply的调用参数,指定raw=False,让每个滚动窗口以DataFrame形式传入lambda,即可正常通过列名访问数据:
vols_rolling = vols.rolling(window=52) from sklearn.metrics import mean_squared_error as mse import numpy as np # 注意RMSE是MSE的平方根,需额外开方 rolling_rmse = vols_rolling.apply(lambda x: np.sqrt(mse(x['Realized'], x['Predicted'])), raw=False)
方案2:手动向量化计算(性能更优)
避免使用apply的逐窗口循环,直接用pandas向量化操作计算,效率提升明显:
import numpy as np # 先计算逐行平方误差,再滚动求均值,最后开平方得到RMSE rolling_rmse = np.sqrt(((vols['Realized'] - vols['Predicted']) ** 2).rolling(window=52).mean())
补充说明
- 方案2的性能远高于方案1,因为
apply是Python层面的循环,而向量化操作由pandas内部C优化实现,处理大数量级数据时差异显著。 - 原代码仅计算了均方误差(MSE),若需求是均方根误差(RMSE),必须添加
np.sqrt()步骤。
内容的提问来源于stack exchange,提问作者deb
相关产品推荐
相关产品推荐

