R语言计算两个DataFrame相关系数并生成结果表的实现方法
相关系数计算函数实现
核心逻辑
- 统一两个数据框的时间列字段,关联后自动过滤不在真实数据时间范围内的预测数据,排除2021-11-02的无效记录
- 将宽格式存储的多商品数据转为长格式,自动遍历所有商品类别和预测方法组合
- 按方法、商品类别分组后,匹配对应时间点的真实值和预测值计算相关系数
R 语言实现(基于tidyverse生态)
library(tidyverse) calc_cor <- function(pred_df, real_df) { # 关联过滤有效预测数据 pred_filtered <- pred_df %>% inner_join(real_df %>% select(datex, hourx), by = c("datex", "hour" = "hourx")) # 预测数据转长格式 pred_long <- pred_filtered %>% pivot_longer(cols = c(books, shirts, shoes, hats), names_to = "metrics", values_to = "pred_value") # 真实数据转长格式 real_long <- real_df %>% pivot_longer(cols = c(books, shirts, shoes, hats), names_to = "metrics", values_to = "real_value") # 分组计算相关系数 res <- pred_long %>% left_join(real_long, by = c("datex", "hour" = "hourx", "metrics")) %>% group_by(method, metrics) %>% summarise(correlation = cor(pred_value, real_value), .groups = "drop") %>% select(metrics, method, correlation) return(res) } # 调用方法 result <- calc_cor(data.predicted, data.real)
Python 实现(基于pandas)
import pandas as pd def calc_cor(pred_df, real_df): # 过滤有效预测数据 pred_filtered = pd.merge( pred_df, real_df[["datex", "hourx"]], left_on=["datex", "hour"], right_on=["datex", "hourx"], how="inner" ) # 预测数据转长格式 pred_long = pred_filtered.melt( id_vars=["datex", "hour", "method"], value_vars=["books", "shirts", "shoes", "hats"], var_name="metrics", value_name="pred_value" ) # 真实数据转长格式 real_long = real_df.melt( id_vars=["datex", "hourx"], value_vars=["books", "shirts", "shoes", "hats"], var_name="metrics", value_name="real_value" ) # 关联后分组计算相关系数 merge_df = pd.merge( pred_long, real_long, left_on=["datex", "hour", "metrics"], right_on=["datex", "hourx", "metrics"], how="left" ) res = merge_df.groupby(["method", "metrics"], group_keys=False).apply( lambda x: x["pred_value"].corr(x["real_value"]) ).reset_index(name="correlation")[["metrics", "method", "correlation"]] return res # 调用方法 result = calc_cor(data.predicted, data.real)
内容的提问来源于stack exchange,提问作者Faryan
相关产品推荐
相关产品推荐

