python - Pandas RMSE Groupby 多个条件
问题描述
我正在尝试根据多个条件计算熊猫数据帧的 RMSE:(植物名称、年份、月份)。我的数据帧(df3m)如下所示:
plant_name year month obsvals modelvals
0 ARIZONA I 2021 1 8.900582 8.298038
1 ARIZONA I 2021 2 7.976660 7.410446
2 ARIZONA I 2021 3 10.803689 11.480000
3 CAETITE I 2021 1 9.104309 7.778750
4 CAETITE I 2021 2 6.054558 6.022783
我尝试按植物名称、年份、月份分组,然后使用“mean_squared_error”应用
from sklearn.metrics import mean_squared_error
我尝试这样做的一行代码看起来像这样......也许我需要在这里定义一个函数?
rmse = df3m.groupby(['plant_name'])
[['obsvals','modelvals']].mean_squared_error(squared = False) #for rmse use "False"
使用上面我得到这个错误:
AttributeError: 'DataFrameGroupBy' object has no attribute 'mean_squared_error'
我的最终输出应如下所示:
plant_name year rmse
0 ARIZONA I 2021 ?
1 CAETITE I 2021 ?
感谢您的时间,
解决方案
您可以使用.GroupBy.apply()
并将调用mean_squared_error
放入其中,如下所示:
df_out = (df3m.groupby(['plant_name','year','month'])[['obsvals','modelvals']]
.apply(lambda x: mean_squared_error(x['obsvals'], x['modelvals'], squared=False))
).to_frame(name='rmse').reset_index()
结果:
print(df_out)
plant_name year month rmse
0 ARIZONA I 2021 1 0.602544
1 ARIZONA I 2021 2 0.566214
2 ARIZONA I 2021 3 0.676311
3 CAETITE I 2021 1 1.325559
4 CAETITE I 2021 2 0.031775
编辑
根据问题的编辑以仅使用plant_name
and获得预期结果year
,我们可以修改上面的代码以排除分组 by month
,如下所示:
df_out2 = (df3m.groupby(['plant_name','year'])[['obsvals','modelvals']]
.apply(lambda x: mean_squared_error(x['obsvals'], x['modelvals'], squared=False))
).to_frame(name='rmse').reset_index()
结果:
print(df_out2)
plant_name year rmse
0 ARIZONA I 2021 0.616726
1 CAETITE I 2021 0.937581
推荐阅读
- python - 使用roundcube通过python发送邮件
- javascript - 如何动态将选项属性设置为“已选择”并在选择其他选项时删除
- lua - 有没有办法检测 NaN 和 -NaN?
- reactjs - 使用 react + asp.net core 2 应用程序上传文件不起作用
- java - 如何为有意义的相等对象创建线程锁定/同步并防止相应线程的并行执行?
- c# - 带有嵌入式窗口的 UI 滞后
- android - 城市飞艇生产配置
- sql - SQL Server WHERE 基于 CASE
- visual-studio-code - Visual Studio Code 中未验证的断点
- ios - 如何快速转换日期 yyyy-mm-dd'T'HH:mm:ss.SSSZ