如何基于日度数据高效计算月度频率的R squared值?
高效计算月度R²值的方法
我现在能计算全数据集的R²值,但计算月度R²时需要把DataFrame按月份切片成多个小数据集,处理大数据集时特别麻烦,有没有更简便的方法?
全数据集R²计算代码
from sklearn.metrics import r2_score y_true = df['no2'] y_pred = df['temp'] r2_score(y_true, y_pred)
数据集示例
date,no2,temp 2022-03-27,22.0,12.0 2022-03-28,21.0,11.0 2022-03-29,25.0,15.0 2022-03-30,29.0,12.0 2022-03-31,24.0,17.0 2022-04-21,34.0,16.0 2022-04-22,32.0,19.0 2022-04-23,38.0,18.0 2022-04-24,37.0,19.0 2022-04-25,32.0,20.0 2022-05-25,36.0,21.0 2022-05-26,34.0,23.0 2022-05-27,39.0,21.0 2022-05-28,33.0,24.0 2022-05-29,31.0,22.0 2022-05-30,30.0,26.0
期望输出
date,r_squared 2022-03,45 2022-04,42 2022-05,56
解决方案:用Pandas Groupby批量计算
不用手动切片分组,直接利用Pandas的groupby功能按月份聚合计算,代码简洁且效率更高,适合大数据集:
import pandas as pd from sklearn.metrics import r2_score # 1. 加载数据并转换日期格式 df = pd.read_csv('your_dataset.csv') # 替换成你的数据加载方式 df['date'] = pd.to_datetime(df['date']) # 2. 按年月分组,计算每组的R²值 monthly_r2 = df.groupby(df['date'].dt.to_period('M')).apply( lambda group: r2_score(group['no2'], group['temp']) ).reset_index(name='r_squared') # 3. 调整格式匹配期望输出 monthly_r2['date'] = monthly_r2['date'].astype(str) # 把周期类型转为字符串 monthly_r2['r_squared'] = (monthly_r2['r_squared'] * 100).round().astype(int) # 转为百分比整数 # 查看结果 print(monthly_r2.to_csv(index=False))
代码说明
dt.to_period('M'):将日期列转换为年月周期(如2022-03),是按月份分组的关键groupby.apply():对每个月度分组自动调用r2_score,无需手动循环拆分数据集- 最后一步的格式调整是为了匹配你给出的期望输出样式,可根据实际需求修改小数位数或是否转为百分比
这种方法依赖Pandas的高效分组机制,处理大数据集时比手动切片快得多,代码也更易维护。
内容的提问来源于stack exchange,提问作者user16511234
相关产品推荐
相关产品推荐

