问题描述
我试图在数据帧上运行我认为应该是一个简单的相关函数,但它在我认为不应该的地方返回 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/null 值”。 由于每一列都有重叠的值,结果不应该都是非 NaN 吗?
 
     和有很好的讨论,但都没有回答我的问题。 
    我已经尝试过讨论的float64想法,但也失败了。
@hellpanderr 的评论提出了一个好观点,我使用的是 0.22.0
额外问题 - 我不是数学家,但在这个结果中 B 和 C 之间如何存在 1:1 的相关性?
1楼
    结果似乎是您使用的数据的人工制品。 
    在你写的时候, NA被忽略了,所以它基本上归结为:
df[['B', 'C']].dropna()
       B      C
1  100.0  100.0
6  500.0  300.0
因此,每列只剩下两个值用于计算,因此应该 :
df[['B', 'C']].dropna().corr()
     B    C
B  1.0  1.0
C  1.0  1.0
 
    那么,剩余组合的NA来自哪里?
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 。