У мене є наступні панди датафрейму 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'])
Який обчислює кореляцію між вашими двома стовпчиками "Цитовані документи на душу населення" та "Енергозабезпеченість на душу населення".
Для прикладу:
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
На графіку, який ви показуєте, представлено лише верхній лівий кут кореляційної матриці (я так припускаю).
Можуть бути випадки, коли ви отримуєте NaN
у вашому розв'язку - перевірте цей пост для прикладу.
Якщо Ви хочете відфільтрувати записи вище/нижче певного порогу, Ви можете перевірити це питання. Якщо Ви хочете побудувати теплову карту коефіцієнтів кореляції, Ви можете перевірити цю відповідь, а якщо Ви зіткнулися з проблемою перекриття осей-підписів, перевірте наступну публікацію.
Я зіткнувся з такою ж проблемою.
Виявилося, що Cited Documents per Person
був плаваючою величиною, і python якось пропускав його за замовчуванням. Всі інші стовпці мого датафрейму були в numpy-форматах, тому я вирішив проблему перетворенням стовпця в np.float64
.
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Запам'ятайте, що це саме той стовпець, який ви обчислили самостійно
Якщо ви хочете отримати кореляції між усіма парами стовпців, то можна зробити щось подібне:
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')])