Я пытаюсь запустить то, что, по моему мнению, должно быть простой корреляционной функцией на фрейме данных, но оно возвращает 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?