【问题标题】:How to select the pairs of features that have correlation higher than a threshold in pandas?如何在熊猫中选择相关性高于阈值的特征对?
【发布时间】:2021-09-08 12:24:23
【问题描述】:

我有一个correlation matrix,它是一个pandas 数据框,如下所示:

import pandas as pd
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]})

我想获得所有唯一“对”,其绝对值具有高于某个threshold 的相关性并排除自相关

所以,如果阈值是0.8,我应该得到这样的东西:

[('col_a', 'col_b')]

有什么想法可以做到吗?

【问题讨论】:

  • 你想拥有独一无二的对吗?和自相关?
  • 是否可能改变预期输出?因为接受的解决方案不匹配。
  • 好的,然后超级。编码愉快。
  • 是的,我现在看到你的编辑了 :)
  • 已删除解决方案,最好以后不要更改问题,因为答案不匹配。如果像这里一样快速变化,最好发布新问题。

标签: python python-3.x pandas


【解决方案1】:

您可以将 'vars' 设置为索引,stack 并使用输出进行切片:

pairs = foo.set_index('vars').stack()
pairs[pairs.abs().gt(0.8)]

输出:

vars        
col_a  col_a    1.0
       col_b    0.9
col_b  col_a    0.9
       col_b    1.0
col_c  col_c    1.0
col_d  col_d    1.0

作为列表:

pairs = foo.set_index('vars').stack()
list(pairs[pairs.gt(0.8)].index)
[('col_a', 'col_a'), ('col_a', 'col_b'), ('col_b', 'col_a'), ('col_b', 'col_b'), ('col_c', 'col_c'), ('col_d', 'col_d')]

如果您只想获得唯一的对(例如,B vs A == A vs B)并放弃自相关(例如,A vs A),使用此替代方法。

np.triu 允许只保留相关矩阵中的一个三角形,k 参数允许移动对角线(k=0 保留对角线,k=1 删除对角线,因此如果你想保持自相关,使用k=0)

import numpy as np
foo = foo.set_index('vars')
pairs = foo.where(np.triu(foo, k=1).astype(bool)).stack()
list(pairs[pairs.abs().gt(0.8)].index)

输出:

[('col_a', 'col_b')]

【讨论】:

  • 对于没有自相关的解决方案,需要在导入numpy后添加foo = foo.set_index('vars')或将foo替换为foo.set_index('vars')
  • 是的,谢谢@quant,我显然忘记粘贴了 ;)
【解决方案2】:

您可以使用循环。试试看。 首先,删除 vars 列并获取相关性。

foo = foo.drop('vars', axis = 1).corr()

然后使用此循环获取条件之间的相关性。 0.8和0.99(避免自己)

a = []
b = []
for i in foo.columns:
    for ii in range(len(foo.columns)):
        if (foo[i].iloc[ii] > 0.8) and (foo[i].iloc[ii] < 0.99):
            a.append(i)
            b.append(foo[i].iloc[ii])

您可以通过 a 和 b 列表查看功能和校正。

那么如果你想形象化;

df = (foo > 0.95 ) & (foo < 1) 
df.applymap(lambda x: True if x else np.nan).dropna(how = 'all', axis = 1).dropna(how = 'all').fillna('-')

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2018-11-19
    • 2019-08-27
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2020-11-17
    • 2019-02-16
    相关资源
    最近更新 更多