Перечислить самых высоких пар корреляции от большой корреляционной матрицы у панд?

Как Вы находите главные корреляции в корреляционной матрице с Пандами? Существует много ответов о том, как сделать это с R (Покажите корреляции заказанным списком, не большим матричным или Эффективным способом получить очень коррелированых пар от большого набора данных в Python или R), но я задаюсь вопросом, как сделать это с пандами? В моем случае матрица 4460x4460, так не может сделать этого визуально.

62
задан 23 May 2017 в 15:18

9 ответов

Можно использовать DataFrame.values, чтобы получить numpy массив данных и затем использовать функции NumPy такой в качестве argsort() для получения самых коррелированых пар.

, Но если Вы хотите сделать это у панд, Вы можете unstack и order DataFrame:

import pandas as pd
import numpy as np

shape = (50, 4460)

data = np.random.normal(size=shape)

data[:, 1000] += data[:, 2000]

df = pd.DataFrame(data)

c = df.corr().abs()

s = c.unstack()
so = s.sort_values(kind="quicksort")

print so[-4470:-4460]

Вот вывод:

2192  1522    0.636198
1522  2192    0.636198
3677  2027    0.641817
2027  3677    0.641817
242   130     0.646760
130   242     0.646760
1171  2733    0.670048
2733  1171    0.670048
1000  2000    0.742340
2000  1000    0.742340
dtype: float64
70
ответ дан 31 October 2019 в 13:43

Небольшое количество решения для строк без избыточных пар переменных:

corr_matrix = df.corr().abs()

#the matrix is symmetric so we need to extract upper triangle matrix without diagonal (k = 1)
sol = (corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
                 .stack()
                 .sort_values(ascending=False))
#first element of sol series is the pair with the bigest correlation
22
ответ дан 31 October 2019 в 13:43

ответ @HYRY прекрасен. Просто основываясь на том ответе путем добавления немного большего количества логики для предотвращения дубликата и сам корреляции и надлежащая сортировка:

import pandas as pd
d = {'x1': [1, 4, 4, 5, 6], 
     'x2': [0, 0, 8, 2, 4], 
     'x3': [2, 8, 8, 10, 12], 
     'x4': [-1, -4, -4, -4, -5]}
df = pd.DataFrame(data = d)
print("Data Frame")
print(df)
print()

print("Correlation Matrix")
print(df.corr())
print()

def get_redundant_pairs(df):
    '''Get diagonal and lower triangular pairs of correlation matrix'''
    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_top_abs_correlations(df, n=5):
    au_corr = df.corr().abs().unstack()
    labels_to_drop = get_redundant_pairs(df)
    au_corr = au_corr.drop(labels=labels_to_drop).sort_values(ascending=False)
    return au_corr[0:n]

print("Top Absolute Correlations")
print(get_top_abs_correlations(df, 3))

, Который дает следующий вывод:

Data Frame
   x1  x2  x3  x4
0   1   0   2  -1
1   4   0   8  -4
2   4   8   8  -4
3   5   2  10  -4
4   6   4  12  -5

Correlation Matrix
          x1        x2        x3        x4
x1  1.000000  0.399298  1.000000 -0.969248
x2  0.399298  1.000000  0.399298 -0.472866
x3  1.000000  0.399298  1.000000 -0.969248
x4 -0.969248 -0.472866 -0.969248  1.000000

Top Absolute Correlations
x1  x3    1.000000
x3  x4    0.969248
x1  x4    0.969248
dtype: float64
30
ответ дан 31 October 2019 в 13:43

Сочетая некоторые функции @HYRY и ответов @arun, можно распечатать главные корреляции для кадра данных df в однострочном использовании:

df.corr().unstack().sort_values().drop_duplicates()

Примечание: одна оборотная сторона - то, если у Вас есть 1,0 корреляции, которые являются не одна переменная к себе, drop_duplicates(), дополнение удалило бы их

7
ответ дан 31 October 2019 в 13:43

Используйте itertools.combinations, чтобы получить все уникальные корреляции от панд собственная корреляционная матрица .corr(), генерировать список списков и подать его назад в DataFrame для использования .sort_values '. Набор ascending = True для отображения самых низких корреляций на вершине

corrank берет DataFrame в качестве аргумента, потому что это требует .corr().

  def corrank(X):
        import itertools
        df = pd.DataFrame([[(i,j),X.corr().loc[i,j]] for i,j in list(itertools.combinations(X.corr(), 2))],columns=['pairs','corr'])    
        print(df.sort_values(by='corr',ascending=False))

  corrank(X) # prints a descending list of correlation pair (Max on top)
2
ответ дан 31 October 2019 в 13:43

Используйте код ниже для просмотра корреляций в порядке по убыванию.

# See the correlations in descending order

corr = df.corr() # df is the pandas dataframe
c1 = corr.abs().unstack()
c1.sort_values(ascending = False)
2
ответ дан 31 October 2019 в 13:43

Партия хороших ответов здесь. Самым легким путем я нашел, была комбинация некоторых ответов выше.

corr = corr.where(np.triu(np.ones(corr.shape), k=1).astype(np.bool))
corr = corr.unstack().transpose()\
    .sort_values(by='column', ascending=False)\
    .dropna()
1
ответ дан 31 October 2019 в 13:43

Я не хотел к unstack или сверхусложнил эту проблему, так как я просто хотел отбросить некоторые очень коррелированые функции как часть фазы выбора функции.

, Таким образом, я закончил со следующим упрощенным решением:

# map features to their absolute correlation values
corr = features.corr().abs()

# set equality (self correlation) as zero
corr[corr == 1] = 0

# of each feature, find the max correlation
# and sort the resulting array in ascending order
corr_cols = corr.max().sort_values(ascending=False)

# display the highly correlated features
display(corr_cols[corr_cols > 0.8])

В этом случае, если Вы хотите отбросить коррелируемые функции, можно отобразиться через фильтрованный corr_cols массив и удалить нечетно индексированный (или даже индексированный).

0
ответ дан 31 October 2019 в 13:43

Я пробовал некоторые решения здесь, но затем я на самом деле придумал свой собственный. Я надеюсь, что это могло бы быть полезно для следующего, таким образом, я совместно использую его здесь:

def sort_correlation_matrix(correlation_matrix):
    cor = correlation_matrix.abs()
    top_col = cor[cor.columns[0]][1:]
    top_col = top_col.sort_values(ascending=False)
    ordered_columns = [cor.columns[0]] + top_col.index.tolist()
    return correlation_matrix[ordered_columns].reindex(ordered_columns)
0
ответ дан 31 October 2019 в 13:43

Другие вопросы по тегам:

Похожие вопросы: