You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:42:27