如何按周计算Pandas DataFrame中两列的Pearson与Spearman相关性?
如何按周计算Pandas DataFrame中两列的Pearson与Spearman相关性?
你的思路完全靠谱!用resample结合corr确实是实现按周计算相关性的高效方案,我来给你拆解具体操作,还会教你怎么一次性得到两种相关性结果。
首先先确认你的数据构建逻辑没问题,2018年1月1日到28日正好是4个完整周,完美适配按周分组的需求。
方法1:单独计算单一相关性(比如你提到的Spearman)
你写的df.resample('W').corr(method='spearman')是完全可行的,不过运行后会得到一个层次化索引的相关矩阵(每个周对应A-A、A-B、B-A、B-B四个值),如果只想提取A和B之间的相关系数,可以用xs来筛选:
# 计算每周Spearman相关性并提取A-B的系数 weekly_spearman = df.resample('W').corr(method='spearman').xs('A', level=1)['B'] print(weekly_spearman)
默认'W'是把周日作为每周的结束日,如果你想调整周的结束时间(比如周一),可以改成'W-MON';要是想用每周的起始日作为结果的索引标签,加上label='left'参数即可,比如df.resample('W', label='left').corr(...)。
方法2:同时计算Pearson和Spearman两种相关性
如果想一次性得到两种方法的结果,我们可以自定义一个函数,然后用resample的apply方法批量处理每个周的分组:
def calculate_correlations(group): # 计算当前周的Pearson相关系数(A与B) pearson_corr = group.corr(method='pearson').loc['A', 'B'] # 计算当前周的Spearman相关系数(A与B) spearman_corr = group.corr(method='spearman').loc['A', 'B'] # 返回包含两种结果的Series return pd.Series({'Pearson': pearson_corr, 'Spearman': spearman_corr}) # 按周重采样并应用自定义函数 weekly_corrs = df.resample('W').apply(calculate_correlations) print(weekly_corrs)
这样得到的weekly_corrs是一个结构清晰的DataFrame,每一行对应一个周,两列分别是Pearson和Spearman的相关系数,非常直观。
注意事项
- 如果你的数据中有缺失日期或者某周的样本量不足2个,计算相关性时会返回
NaN,可以根据需求用dropna()或者填充值处理。 - 周的时间标签可以通过
label和loffset参数灵活调整,比如label='left'用周起始日作为索引,loffset='-1d'可以把结束日调整为周六。
备注:内容来源于stack exchange,提问作者diedro




