корреляция по столбцам между всеми парами столбцов двух фреймов данных - PullRequest
0 голосов
/ 29 мая 2020

Привет, я создал функцию для проверки корреляции между двумя переменными, кто-нибудь знает, как я могу создать из этого новый фрейм данных?

In [1]:from scipy.stats import pearsonr
for colY in Y.columns:
    for colX in X.columns:
    #print('Pearson Correlation')
        corr, _ = pearsonr(numerical_cols_target[colX], numerical_cols_target[colY])
        alpha = 0.05
        print('Pearson Correlation', (alpha, corr))
        if corr <= alpha:
            print(colX +' and ' +colY+ ' two ariables are not correlated ')
        else:
            print(colX +' and ' +colY+ ' two variables are highly correlated ')
        print('\n')
    print('\n')

вот пример вывода функции корреляции:

Out [1]: 
Pearson Correlation (0.05, -0.1620045985125294)
banana and orange are not correlated 

Pearson Correlation (0.05, 0.2267582070839226)
apple and orange are highly correlated
```

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Я бы не использовал два цикла for. В зависимости от размера вашего набора данных это будет очень медленно.

Pandas предоставляет функцию корреляции, которая может пригодиться здесь:

import pandas as pd

df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})

использование corr () даст вам парные корреляции затем и также возвращает новый фрейм данных :

df.corr()

Для получения дополнительной информации вы можете проверить руководство: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html

0 голосов
/ 29 мая 2020

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

import collections
corr_df = pd.DataFrame(columns=['col_X', 'col_Y', 'corr', 'is_correlated'])
d = collections.deque(X.columns)
Y_cols = Y.columns
alpha = 0.05
for i in range(len(d)):
  d.rotate(i)
  X = X[d]
  corr = Y.corrwith(X, axis=0)
  corr_df = corr_df.append(pd.DataFrame({'col_X':list(d)[:len(Y_cols)], 'col_Y':Y.columns, 'corr':corr[:len(Y_cols)], 'is_correlated':corr[:len(Y_cols)]>alpha}))
print(corr_df.reset_index())

образец ввода и вывода:

X:
   A  B   C
0  2  2  10
1  4  0   2
2  8  0   1
3  0  0   8

Y:
   B   C
0  2  10
1  0   2
2  0   1
3  0   8


correlation(X, Y):

  col_X col_Y  corr is_correlated
0     A     B   1.0          True
1     B     C   1.0          True
2     C     B   1.0          True
3     A     C   1.0          True
4     A     B   1.0          True
5     B     C   1.0          True
0 голосов
/ 29 мая 2020

Вы можете просто сделать следующее.

df = pd.DataFrame(index=X.columns, columns=Y.columns)

#In your loop
df[colY][colX] = corr

Тогда ваш l oop будет

for colY in Y.columns:
    for colX in X.columns:
    #print('Pearson Correlation')
        corr, _ = pearsonr(numerical_cols_target[colX], numerical_cols_target[colY])
        alpha = 0.05
        print('Pearson Correlation', (alpha, corr))
        df[colY][colX] = corr
        if corr <= alpha:
            print(colX +' and ' +colY+ ' two ariables are not correlated ')
        else:
            print(colX +' and ' +colY+ ' two variables are highly correlated ')
        print('\n')
    print('\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...