Предположим, у меня есть датафрейм pandas с несколькими столбцами, например:

import pandas as pd
iterables = [['a', 'b'], ['1', '2']]
my_index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns=my_index)

Тогда df производит

first  a   b
second 1 2 1 2
0      1 2 3 4
1      5 6 7 8

Теперь, если я хочу самокорреляции df['a'] с самим собой, это просто: df['a'].corr() поймет меня. Обратите внимание, что такая корреляция имеет форму (2, 2).

Я хотел бы рассчитать матрицу корреляции df['a'] с df['b']. Предположительно, код df['a'].corrwith(df['b']) должен дать мне это. Этот код выполняется, но результат имеет форму (2,), которая мне не подходит. Почему матрица самокорреляции, заданная .corr(), должна давать результат, отличный от корреляции, заданной .corrwith()? Мне нужна корреляционная матрица той же формы, что и df['a'].corr(), потому что я хочу построить тепловые карты Seaborn и мне нужна двумерная корреляционная матрица.

Спасибо заранее за ваше время!

1
Adrian Keister 15 Авг 2019 в 19:31

2 ответа

Лучший ответ

Ключом к этой проблеме было признание того, что результатом функции .corr() DataFrame является сам DataFrame pandas. Если мы запустим код в вопросе, а затем используем функцию .loc, мы сможем получить подмножество матрицы корреляции. Результат df.corr()

        first   a           b
        second  1   2       1   2
first   second              
a          1    1.0 1.0     1.0 1.0
           2    1.0 1.0     1.0 1.0
b          1    1.0 1.0     1.0 1.0
           2    1.0 1.0     1.0 1.0

И результат df.corr().loc['a', 'b'] равен

second  1    2
second          
1       1.0  1.0
2       1.0  1.0

Это то, что я хотел.

1
Adrian Keister 21 Авг 2019 в 15:10

Вы хотите использовать функцию corr () из DataFRame, а не из Series.

Это выглядело бы так:

In [1]:
# Create the Dataframe
import pandas as pd
iterables = [['a', 'b'], ['1', '2']]
my_index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns=my_index)
df

Out [1]:
first     a       b
second  1   2   1   2
0       1   2   3   4
1       5   6   7   8
In [2]:
## Get the correlation matrix
df.corr()

Out [2]:
        first     a           b
        second  1   2       1   2
first   second              
a          1    1.0 1.0     1.0 1.0
           2    1.0 1.0     1.0 1.0
b          1    1.0 1.0     1.0 1.0
           2    1.0 1.0     1.0 1.0

РЕДАКТИРОВАТЬ

Документация

* Вы можете выбрать функцию, стоящую за этим методом: {‘Pearson ',‘ Kendall', ‘Spearman '} или вызываемый

Пирсон: стандартный коэффициент корреляции

Кендалл: коэффициент корреляции Кендалла Тау Спирман: ранг корреляции Спирмена

Вызываемый: вызываемый с вводом двух 1d ndarrays *

1
Benoit Drogou 15 Авг 2019 в 17:47