在字典中获得特征之间的正相关和负相关

时间:2018-09-27 12:49:39

标签: python pandas

我在要素之间具有df的相关性。

             CRIM        ZN     INDUS      CHAS       NOX        RM       AGE  
CRIM     1.000000 -0.199458  0.404471 -0.055295  0.417521 -0.219940  0.350784   
ZN      -0.199458  1.000000 -0.533828 -0.042697 -0.516604  0.311991 -0.569537   
INDUS    0.404471 -0.533828  1.000000  0.062938  0.763651 -0.391676  0.644779   
CHAS    -0.055295 -0.042697  0.062938  1.000000  0.091203  0.091251  0.086518   
NOX      0.417521 -0.516604  0.763651  0.091203  1.000000 -0.302188  0.731470   
RM      -0.219940  0.311991 -0.391676  0.091251 -0.302188  1.000000 -0.240265   
AGE      0.350784 -0.569537  0.644779  0.086518  0.731470 -0.240265  1.000000   
DIS     -0.377904  0.664408 -0.708027 -0.099176 -0.769230  0.205246 -0.747881

我想要的是一个corr()字典,其中两个要素之间的值是gt(0.5) and ne(1)也是负数corr() lt(0.5)

我尝试过

df.corr()[(df.corr().gt(0.5)) & (df.corr().ne(1))].stack().round(3).to_dict()

这给了我特征corr()gt(0.5)之间的所有正面ne(1),但我还需要字典中强烈否定的corr() le(0.5)

还有什么方法可以获取唯一值?

结果是我需要唯一的值。 ZN - NOXNOX - ZN应该被视为一个。我俩都该听了吗?

3 个答案:

答案 0 :(得分:2)

df.corr()[((df.corr().gt(0.5)) & (df.corr().ne(1))) | ((df.corr().lt(-0.5)) & (df.corr().ne(-1)))].stack().round(3).to_dict()

编辑(更加有效和可读):

df_corr = df.corr()

high_positive_corr = (df_corr.gt(0.5)) & (df_corr.ne(1))
low_negative_corr = (df_corr.lt(-0.5)) & (df_corr.ne(-1))

df_corr[high_positive_corr | low_negative_corr].stack().round(3).to_dict()

所以您不会计算5次相关性

答案 1 :(得分:1)

使用m1正值和m2负值掩码,然后将stackdrop_duplicates用作:

m1 = (df.corr().gt(0.5)) & (df.corr().ne(1))
m2 = (df.corr().lt(-0.5)) & (df.corr().ne(-1))

df.corr()[m1|m2].stack().drop_duplicates().round(3).to_dict()

OR

d = df.corr()
m = ((d>0.5)&(d!=1))|((d<-0.5)&(d!=-1))
d[m].stack().drop_duplicates().round(3).to_dict()

两者都产生输出:

{('CRIM', 'ZN'): -0.199,
 ('CRIM', 'INDUS'): 0.404,
 ('CRIM', 'NOX'): 0.418,
 ('CRIM', 'RM'): -0.22,
 ('CRIM', 'AGE'): 0.351,
 ('ZN', 'INDUS'): -0.534,
 ('ZN', 'NOX'): -0.517,
 ('ZN', 'RM'): 0.312,
 ('ZN', 'AGE'): -0.57,
 ('INDUS', 'NOX'): 0.764,
 ('INDUS', 'RM'): -0.392,
 ('INDUS', 'AGE'): 0.645,
 ('NOX', 'RM'): -0.302,
 ('NOX', 'AGE'): 0.731,
 ('RM', 'AGE'): -0.24}

答案 2 :(得分:1)

根据需要创建遮罩。这将更具可读性。

此外,作为性能提示,您可以将corr存储在变量中,从而避免重复计算

mask_1 = (df.corr().gt(0.5)) & (df.corr().ne(1))
mask_2 = (df.corr().lt(-0.5)) & (df.corr().ne(-1))

mask = mask_1 | mask_2

df.corr()[mask].stack().round(3).to_dict()