У меня есть следующий фрейм данных pandas Top15
:
Я создаю колонку, которая оценивает количество цитируемых документов на человека:
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')
Я хочу вернуть одно число, но результат таков:
Без фактических данных трудно ответить на этот вопрос, но я предполагаю, что вы ищете что-то подобное:
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
непосредственно к вашему датафрейму, [он вернет все парные корреляции между вашими столбцами] (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html); вот почему вы наблюдаете 1s
на диагонали вашей матрицы (каждый столбец идеально коррелирован с самим собой).
df.corr()
вернет
A B
A 1.000000 0.995862
B 0.995862 1.000000
На графике, который вы показываете, представлен только верхний левый угол корреляционной матрицы (я предполагаю).
Могут быть случаи, когда вы получаете NaN
в вашем решении - посмотрите [это сообщение] (https://stackoverflow.com/q/52466844/1534017) для примера.
Если вы хотите отфильтровать записи выше/ниже определенного порога, вы можете проверить этот вопрос. Если вы хотите построить тепловую карту коэффициентов корреляции, вы можете проверить этот ответ, а если вы столкнетесь с проблемой наложения меток по осям, проверьте следующее сообщение.
Я столкнулся с той же проблемой.
Оказалось, что Citable Documents per Person
- это float, и python как-то пропускает его по умолчанию. Все остальные столбцы моего датафрейма были в формате numpy, поэтому я решил эту проблему, преобразовав столбец в np.float64
.
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Помните, что это именно тот столбец, который вы вычислили сами.
Мое решение будет после преобразования данных числового типа:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
Когда вы называете это:
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Так, Таблицы Данных.СОГГ() функция выполняет парных корреляций, у вас есть четыре пары с двумя переменными. Так что, в принципе, вы получаете значения по диагонали, как автоматической корреляции (корреляция с себя два значения, поскольку у вас есть две переменные), а другие два значения перекрестных корреляций одна против другой и наоборот.
Либо выполнить корреляцию двух серий, чтобы получить одно значение:
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)
или, если вы хотите, чтобы одно значение из одной и той же функции (таблицы данных'ы СОГГ):
single_value = correlation[0][1]
Надеюсь, что это помогает.
Работает это так:
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'])
Если вам нужны корреляции между всеми парами столбцов, вы можете сделать что-то вроде этого:
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')])
Я решил эту проблему путем изменения типа данных. Если вы видите, что 'энергоснабжение на душу населения' - это числовой тип, А 'цитируемых документах на душу населения' - Это тип объекта. Я обратился в столбце плавать, используя тип. У меня была такая же проблема с некоторыми функциями НП: count_nonzero
и сумма
работала значит
и std
и я'т.