Pandas corr () возвращает NaN слишком часто - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь запустить то, что, по моему мнению, должно быть простой корреляционной функцией на фрейме данных, но оно возвращает NaN в тех местах, где я не верю в это.

Код:

# setup
import pandas as pd
import io

csv = io.StringIO(u'''
id  date    num
A   2018-08-01  99
A   2018-08-02  50
A   2018-08-03  100
A   2018-08-04  100
A   2018-08-05  100
B   2018-07-31  500
B   2018-08-01  100
B   2018-08-02  100
B   2018-08-03  0
B   2018-08-05  100
B   2018-08-06  500
B   2018-08-07  500
B   2018-08-08  100
C   2018-08-01  100
C   2018-08-02  50
C   2018-08-03  100
C   2018-08-06  300
''')

df = pd.read_csv(csv, sep = '\t')

# Format manipulation
df = df[df['num'] > 50]
df = df.pivot(index = 'date', columns = 'id', values = 'num')
df = pd.DataFrame(df.to_records())

# Main correlation calculations
print df.iloc[:, 1:].corr()

Фрейм данных объекта:

       A      B      C
0    NaN  500.0    NaN
1   99.0  100.0  100.0
2    NaN  100.0    NaN
3  100.0    NaN  100.0
4  100.0    NaN    NaN
5  100.0  100.0    NaN
6    NaN  500.0  300.0
7    NaN  500.0    NaN
8    NaN  100.0    NaN

corr () Результат:

    A    B    C
A  1.0  NaN  NaN
B  NaN  1.0  1.0
C  NaN  1.0  1.0

В соответствии с (ограниченной) документацией на функцию, она должна исключать "NA / нулевые значения".Поскольку для каждого столбца есть перекрывающиеся значения, не должен ли результат быть не-NaN?

Есть хорошие обсуждения здесь и здесь , но никто не ответил на мой вопрос,Я попробовал идею float64, обсуждаемую здесь , но она также не удалась. Комментарий

@ hellpanderr поднял хорошую мысль, я использую 0.22.0

Бонусный вопрос - я не математик, но как в этом результате корреляция 1: 1 между B и C?

1 Ответ

0 голосов
/ 24 сентября 2018

Результат выглядит как артефакт данных, с которыми вы работаете.Когда вы пишете, NA s игнорируются, поэтому все сводится к следующему:

df[['B', 'C']].dropna()

       B      C
1  100.0  100.0
6  500.0  300.0

Таким образом, для каждого столбца осталось только два значения для расчета, что должно привести к корреляциикоэффициенты 1:

df[['B', 'C']].dropna().corr()

     B    C
B  1.0  1.0
C  1.0  1.0

Итак, откуда же взялись NA s для оставшихся комбинаций?

df[['A', 'B']].dropna()

       A      B
1   99.0  100.0
5  100.0  100.0


df[['A', 'C']].dropna()

       A      C
1   99.0  100.0
3  100.0  100.0

Итак, и здесь вы заканчиваететолько с двумя значениями в столбце.Разница заключается в том, что столбцы B и C содержат только одно значение (100), которое дает стандартное отклонение 0:

df[['A', 'C']].dropna().std()

A    0.707107
C    0.000000

Когда рассчитывается коэффициент корреляции, вы делитена стандартное отклонение, которое приводит к NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...