如何在pandas中筛选相关系数绝对值高于threshold的唯一特征对
实现方案
核心思路是利用相关系数矩阵的对称性,仅保留上三角(排除对角线自相关)的数据,再按阈值筛选即可,完整实现代码如下:
import pandas as pd import numpy as np # 示例数据 foo = pd.DataFrame({'vars': ['col_a', 'col_b', 'col_c', 'col_d'], 'col_a': [1, 0.9, 0.04, 0.03], 'col_b': [0.9,1,0.05,0.03], 'col_c': [0.04, 0.05, 1, -0.04], 'col_d': [0.03, 0.03, -0.04,1]}) def get_high_corr_pairs(corr_df, threshold=0.8): # 将变量名列设为索引,保证行列变量对应 corr_mat = corr_df.set_index('vars') # 生成上三角掩码,k=1表示跳过对角线(排除自相关) upper_mask = np.triu(np.ones(corr_mat.shape, dtype=bool), k=1) # 仅保留上三角的相关系数,其余位置置为空 upper_corr = corr_mat.where(upper_mask) # 转为长格式并过滤空值 corr_pairs = upper_corr.stack() # 筛选绝对值大于阈值的特征对 filtered = corr_pairs[corr_pairs.abs() > threshold] # 转为元组列表返回 return list(filtered.index) # 测试调用 print(get_high_corr_pairs(foo, threshold=0.8)) # 输出结果:[('col_a', 'col_b')]
额外说明
- 如果你的相关系数矩阵已经将变量名作为行索引,没有单独的
vars列,直接将函数内的corr_mat = corr_df.set_index('vars')修改为corr_mat = corr_df即可使用。 - 筛选时使用
abs()可以同时匹配正相关和负相关的场景,符合需求。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

