如何在correlation matrix
中返回高相似性(或最高相关值,或阈值以上的值(?例如,在下面的示例中,A1和A3具有高相关性。
import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO('''Sentence, A1, A2, A3
text, 0.23, 0.54, 39
text, 0.33, 0.7, 36
text, 0.8, 0.41, 29'''), sep=',')
print(df.corr())
结果:
A1 A2 A3
A1 1.000000 -0.732859 -0.991352
A2 -0.732859 1.000000 0.637235
A3 -0.991352 0.637235 1.000000
继续示例并使用numpy:
c = df.corr()
import numpy as np
threshold = .99
np.abs(c.values) > threshold
这给出:
array([[ True, False, True],
[False, True, False],
[ True, False, True]])
您可以通过:获得偏离对角线的重要值的索引
[(i, j) for i,j in zip(*np.where(np.abs(c.values) > threshold)) if i!=j]
这给出:
[(0, 2), (2, 0)]
更新:
利用相关矩阵的对称性,可以得到一个可读字符串列表,其中包含列名:
[f"{c.columns[i]} and {c.columns[j]}" for i, j in zip(*np.where(np.abs(c.values) > threshold)) if i < j]
->
[' A1 and A3']
如果你需要相关性最高的配对,那么你需要堆叠,然后逐堆叠找到相关性最高的对,这就是
import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO('''Sentence, A1, A2, A3
text, 0.23, 0.54, 39
text, 0.33, 0.7, 36
text, 0.8, 0.41, 29'''), sep=',')
df.drop(['Sentence'],1, inplace=True)
print(df.corr())
def get_red_pair(df):
pairs_to_drop = set()
cols = df.columns
for i in range(0, df.shape[1]):
for j in range(0, i+1):
pairs_to_drop.add((cols[i], cols[j]))
return pairs_to_drop
def get_largest_correlations(df, n=5):
au_corr = df.corr().abs().unstack()
labels_to_drop = get_red_pair(df)
au_corr = au_corr.drop(labels=labels_to_drop).sort_values(ascending=False)
return au_corr[0:n]
corr = get_largest_correlations(df)
print(corr)
要只得到第一个,然后到函数,请确保将n作为1传递,因为默认情况下它需要5
如果这不是你想要的,那么很好地提出你的问题可能会帮助
这就产生了
A1 A2 A3
A1 1.000000 -0.732859 -0.991352
A2 -0.732859 1.000000 0.637235
A3 -0.991352 0.637235 1.000000
A1 A3 0.991352
A2 0.732859
A2 A3 0.637235