получить как положительную, так и отрицательную корреляцию между чертами в диктовке - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть 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 - NOX и NOX - ZN должны рассматриваться как единое целое.Я получаю и то и другое?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018
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 раз

0 голосов
/ 27 сентября 2018

Создайте маску с необходимым вам условием.Это будет более читабельным.

Кроме того, в качестве подсказки производительности вы можете сохранить значение 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()
0 голосов
/ 27 сентября 2018

Используйте m1 положительные значения и m2 маски отрицательных значений, затем stack и drop_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()

ИЛИ

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...