У меня есть следующий фреймворк 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')
Я хочу вернуть одно число, но результат такой:
python
pandas
correlation
Тонг Чжу
источник
источник
.corr
непосредственно к вашему фрейму данных, он вернет все парные корреляции; вот почему вы затем наблюдаете единицы на диагонали вашей матрицы (каждый столбец идеально коррелирует с самим собой). Смотрите мою правку ниже.Ответы:
Без фактических данных сложно ответить на вопрос, но я думаю, вы ищете что-то вроде этого:
Это вычисляет корреляцию между вашими двумя столбцами
'Citable docs per Capita'
и'Energy Supply per Capita'
.Чтобы привести пример:
затем
дает,
1
как ожидалось.Теперь, если вы измените значение, например
команда
возвращается
который, как и ожидалось, все еще близок к 1.
Если вы примените
.corr
непосредственно к фрейму данных, он вернет все попарные корреляции между вашими столбцами ; поэтому вы затем наблюдаете1s
по диагонали своей матрицы (каждый столбец идеально коррелирует с самим собой).поэтому вернется
На графике, который вы показываете, представлен только верхний левый угол корреляционной матрицы (я полагаю).
Могут быть случаи, когда вы получаете
NaN
s в своем решении - посмотрите этот пост для примера.Если вы хотите отфильтровать записи выше / ниже определенного порога, вы можете проверить этот вопрос . Если вы хотите построить тепловую карту коэффициентов корреляции, вы можете проверить этот ответ, и если вы затем столкнетесь с проблемой с перекрывающимися метками осей, проверьте следующий пост .
источник
df.loc[1, :].corr(df.loc[2, :])
, тоже будет работать нормально. Для всего dataframe, вы можете просто перенести:df.T.corr()
.1
в вашем случае вместо0.99586
?Я столкнулся с той же проблемой. Оказалось, что
Citable Documents per Person
это поплавок, и python как-то его пропускает по умолчанию. Все остальные столбцы моего фрейма данных были в формате numpy, поэтому я решил это, преобразовав столбец вnp.float64
Помните, что это именно тот столбец, который вы рассчитали самостоятельно.
источник
Мое решение будет после преобразования данных в числовой тип:
источник
Если вам нужны корреляции между всеми парами столбцов, вы можете сделать что-то вроде этого:
источник
Когда вы вызываете это:
Поскольку функция DataFrame.corr () выполняет парные корреляции, у вас есть четыре пары из двух переменных. Итак, в основном вы получаете диагональные значения как автокорреляцию (корреляцию с самим собой, два значения, поскольку у вас есть две переменные), а другие два значения как взаимные корреляции одного с другим и наоборот.
Либо выполните корреляцию между двумя сериями, чтобы получить одно значение:
или, если вам нужно одно значение из той же функции (Corr DataFrame):
Надеюсь это поможет.
источник
Это работает так:
источник
Я решил эту проблему, изменив тип данных. Если вы видите, что «Энергоснабжение на душу населения» - это числовой тип, а «Цитируемые документы на душу населения» - это тип объекта. Я преобразовал столбец в float, используя astype. У меня была такая же проблема с некоторыми функциями np:
count_nonzero
иsum
работал пока,mean
иstd
нет.источник
изменение "Citable docs per Capita" на числовое до корреляции решит проблему.
источник