我正在尝试在数据框上运行一个我认为应该是简单的相关函数,但它在我不认为应该的地方返回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()
主题 DataFrame:
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/null值”。由于每列存在重叠值,结果难道不应全部为非NaN吗? 这里和这里有很好的讨论,但都没有回答我的问题。我尝试了这里讨论的
float64
方法,但也失败了。@hellpanderr的评论提出了一个很好的观点,我使用的是0.22.0
附加问题-虽然我不是数学家,但这个结果中B和C之间如何存在1:1的关系?
pandas=0.23.4
gives me[[1.0, nan, 0.9998469895178864], [nan, 1.0, 0.9819805060619657], [0.9998469895178864, 0.9819805060619657, 1.0]]
- hellpanderr> 10
改为> 50
),这样我发布的结果与之前相同。不确定这是否会对你产生影响。 - elPastordf.cov()[['C','B']] / df.std()[['C','B']].product()
手动完成此操作呢? - hellpanderr