Используйте.corr для получения корреляции между двумя столбцами
У меня есть следующий панда Top15
: Top15
: ![enter 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]()
Ответы
Ответ 1
Без фактических данных трудно ответить на вопрос, но я думаю, вы ищете что-то вроде этого:
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
На графике, который вы показываете, представлен только верхний левый angular матрицы корреляции (я полагаю).
Могут быть случаи, когда вы получаете NaN
в своем решении - посмотрите этот пост для примера.
Если вы хотите отфильтровать записи выше/ниже определенного порога, вы можете проверить этот вопрос.
Если вы хотите построить тепловую карту коэффициентов корреляции, вы можете проверить этот ответ, а если вы столкнетесь с проблемой с перекрывающимися метками осей, проверьте следующий пост.
Ответ 2
Я столкнулся с той же проблемой.
Похоже, что Citable Documents per Person
был float, и python каким-то образом пропускает его по умолчанию. Все остальные столбцы моего фреймворка были в numpy-форматах, поэтому я решил это, преобразов столбец в np.float64
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Помните, что именно этот столбец вы сами подсчитали
Ответ 3
Мое решение было бы после преобразования данных в числовой тип:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
Ответ 4
Когда вы вызываете это:
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 corr):
single_value = correlation[0][1]
Надеюсь это поможет.
Ответ 5
Если вам нужны корреляции между всеми парами столбцов, вы можете сделать что-то вроде этого:
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')])
Ответ 6
Это работает так:
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'])
Ответ 7
Я решил эту проблему, изменив тип данных. Если вы видите, что "Энергопотребление на душу населения" является числовым, а "Citable docs per Capita" - это тип объекта. Я преобразовал столбец в float, используя астип. У меня была та же проблема с некоторыми функциями np: count_nonzero
и sum
работала, а mean
и std
нет.