基于Python Apply方法按月份计算小时级与月度RMSE的技术问询
Pandas按月份+小时分组计算小时级RMSE及月度平均值
你的思路完全正确!按月份+小时双重分组正是实现这个需求的核心,下面我一步步给你拆解实现方法,结合你已有的代码逻辑来优化:
第一步:确保时间列格式正确
首先要确认你的dates列是datetime类型(如果还没转换的话),这样才能方便提取月份和小时:
import pandas as pd import numpy as np # 转换时间列(如果还没做的话) dfr['dates'] = pd.to_datetime(dfr['dates']) # 可选:将时间设为索引,方便后续操作 dfr = dfr.set_index('dates')
第二步:实现月份+小时的双重分组计算
你可以直接利用Pandas索引的dt属性提取月份和小时,进行双重分组,然后复用你已经写好的rmse函数:
# 你的rmse函数(可去掉调试用的print语句) def rmse(group, s1, s2): if len(group) == 0: return np.nan s = (group[s1] - group[s2]).pow(2).sum() rmseO = np.sqrt(s / len(group)) return rmseO # 按【月份+小时】双重分组,计算每个组的RMSE hourly_rmse_bb = dfr.groupby([dfr.index.month, dfr.index.hour]).apply(rmse, s1='AA', s2='BB') hourly_rmse_cc = dfr.groupby([dfr.index.month, dfr.index.hour]).apply(rmse, s1='AA', s2='CC')
执行后你会得到一个带MultiIndex(月份、小时)的Series,比如hourly_rmse_bb.loc[(1, 0)]就是1月0点的BB相对于AA的RMSE。
第三步:计算每月的小时级RMSE平均值
对上面得到的小时级RMSE结果,再按月份做二次分组,就能得到每个月的小时级RMSE平均值:
# 计算每月的小时级RMSE平均值(所有24小时参与计算) monthly_avg_rmse_bb = hourly_rmse_bb.groupby(level='month').mean() monthly_avg_rmse_cc = hourly_rmse_cc.groupby(level='month').mean()
第四步:筛选特定小时参与平均值计算
如果只想让部分小时参与月度平均(比如仅工作日的8-18点),可以通过索引筛选实现:
# 示例:筛选8点到18点的小时数据 filtered_hourly_bb = hourly_rmse_bb.loc[ hourly_rmse_bb.index.get_level_values('hour').between(8, 18) ] # 计算筛选后的月度平均值 filtered_monthly_avg_bb = filtered_hourly_bb.groupby(level='month').mean()
可选:转成DataFrame提升可读性
如果想让结果更直观,可以把多重索引的Series转成普通DataFrame:
hourly_rmse_df = pd.DataFrame({ 'BB_RMSE': hourly_rmse_bb, 'CC_RMSE': hourly_rmse_cc }).reset_index(names=['month', 'hour'])
这样你就能看到每一行对应【月份、小时、BB的RMSE、CC的RMSE】的清晰表格。
内容的提问来源于stack exchange,提问作者diedro
相关产品推荐
相关产品推荐

