it-roy-ru.com

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

У меня есть следующий pandas dataframe Top15enter image description here

Я создаю столбец, который оценивает количество цитируемых документов на человека:

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

Я хочу знать корреляцию между количеством ценных документов на душу населения и энергопотреблением на душу населения. Поэтому я использую метод .corr() (корреляция Пирсона):

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Я хочу вернуть одно число, но результат: enter image description here

81
tong zhu

Без фактических данных трудно ответить на вопрос, но я думаю, вы ищете что-то вроде этого:

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])

Это вычисляет корреляцию между вашими двумя столбцами 'Citable docs per Capita' и 'Energy Supply per Capita'.

Чтобы привести пример:

import pandas as pd

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

   A  B
0  0  0
1  1  2
2  2  4
3  3  6

Затем

df['A'].corr(df['B'])

дает 1, как и ожидалось.

Теперь, если вы измените значение, например,.

df.loc[2, 'B'] = 4.5

   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

команда 

df['A'].corr(df['B'])

возвращается

0.99586

что все еще близко к 1, как и ожидалось.

Если вы примените .corr непосредственно к вашему фрейму данных, он вернет все попарные корреляции между вашими столбцами; вот почему вы затем наблюдаете 1s по диагонали вашей матрицы (каждый столбец идеально соотносится с самим собой).

df.corr()

поэтому вернусь

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

На графике, который вы показываете, представлен только верхний левый угол матрицы корреляции (я полагаю).

Могут быть случаи, когда вы получаете NaNs в своем решении - проверьте этот пост для примера.

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

122
Cleb

Я столкнулся с той же проблемой . Похоже, Citable Documents per Person был float, и Python как-то пропускает его по умолчанию. Все остальные столбцы моего dataframe были в numpy-форматах, поэтому я решил это, преобразовав столбец в np.float64

Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

Помните, что это именно тот столбец, который вы рассчитали сами

6
Gary

Это работает так:

Top15['Citable docs per Capita']=np.float64(Top15['Citable docs per Capita'])

Top15['Energy Supply per Capita']=np.float64(Top15['Energy Supply per Capita'])

Top15['Energy Supply per Capita'].corr(Top15['Citable docs per Capita'])
1
Orca

Если вы хотите корреляции между всеми парами столбцов, вы можете сделать что-то вроде этого:

import pandas as pd
import numpy as np

def get_corrs(df):
    col_correlations = df.corr()
    col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
    cor_pairs = col_correlations.stack()
    return cor_pairs.to_dict()

my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])
1
mgoldwasser

Я решил эту проблему, изменив тип данных. Если вы видите, что «Энергоснабжение на душу населения» является числовым типом, а «Полезные документы на душу населения» - это тип объекта. Я преобразовал колонку, чтобы плавать, используя astype. У меня была такая же проблема с некоторыми функциями np: count_nonzero и sum работали, а mean и std не работали.

0
BID

Когда вы звоните это:

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Поскольку функция DataFrame.corr () выполняет парные корреляции, у вас есть четыре пары из двух переменных. Таким образом, в основном вы получаете диагональные значения в виде автокорреляции (корреляция с самим собой, два значения, поскольку у вас есть две переменные), а два других значения - как взаимные корреляции одного против другого и наоборот. 

Выполните корреляцию между двумя сериями, чтобы получить одно значение:

from scipy.stats.stats import pearsonr
docs_col = Top15['Citable docs per Capita'].values
energy_col = Top15['Energy Supply per Capita'].values
corr , _ = pearsonr(docs_col, energy_col)

или , если вам нужно одно значение из одной и той же функции (код DataFrame):

single_value = correlation[0][1] 

Надеюсь это поможет.

0
aumpen

Мое решение будет после преобразования данных в числовой тип:

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
0
ibozkurt79