在Pandas分组中使用Sklearn指标时解决AttributeError问题
解决Groupby结合MSE计算均方误差的报错问题
原始DataFrame结构
A B type month model forecast_value actual_value 0 71022 ETF backtest 4 Arima 10 11 1 71022 ETF backtest 5 Arima 10 11 2 71022 ETF backtest 4 MA 20 11 3 71023 ADC backtest 4 Arima 5 10 4 71024 DAC backtest 4 Arima 8 20 ...
报错信息
AttributeError: 'Series' object has no attribute 'actual_value'
错误原因
你使用agg时,lambda的参数x是单个列的Series对象,而非整个分组的DataFrame,因此无法通过x.actual_value访问另一列的数据。agg是针对每一列单独处理的,而计算MSE需要同时用到forecast_value和actual_value两列,所以直接用agg的lambda方式行不通。
解决方案
方法1:使用groupby.apply(兼容sklearn的MSE)
apply会把整个分组的DataFrame传入函数,可直接访问两列计算MSE:
from sklearn.metrics import mean_squared_error def compute_mse(group): return mean_squared_error(group['actual_value'], group['forecast_value']) # 计算并整理结果 result = df.groupby(['A', 'B', 'model'], as_index=False).apply(compute_mse) result = result.rename(columns={0: 'mean_squared_error'}).reset_index(drop=True)
方法2:直接用Pandas运算(更高效)
均方误差本质是(预测值-实际值)²的均值,无需依赖sklearn,直接用Pandas计算更高效:
# 先计算每个样本的误差平方 df['error_squared'] = (df['forecast_value'] - df['actual_value']) ** 2 # 分组取均值并重命名列 result = df.groupby(['A', 'B', 'model'], as_index=False)['error_squared'].mean() result = result.rename(columns={'error_squared': 'mean_squared_error'})
方法3:用agg的多列匹配方式
也可以在agg中通过索引关联两列计算:
result = df.groupby(['A', 'B', 'model'], as_index=False).agg( mean_squared_error=('forecast_value', lambda x: ((x - df.loc[x.index, 'actual_value'])**2).mean()) )
最终输出结果
A B model mean_squared_error 0 71022 ETF Arima 2 1 71022 ETF MA 81 2 71023 ADC Arima 25 3 71024 DAC Arima 144 ...
内容的提问来源于stack exchange,提问作者PV8
相关产品推荐
相关产品推荐

