使用pandas和scipy进行数据帧spearman关联之间的差异

时间:2015-07-15 15:11:23

标签: python pandas scipy

我有一个相当大的矩阵(4780,5460)并使用“pandas.DataFrame.corr”和“scipy.stats.spearmanr”计算行之间的spearman相关性。每个函数返回非常不同的相关系数,现在我不确定哪个是“正确的”,或者如果我的数据集更适合不同的实现。

一些上下文化:我想要测试相关性的向量(行)不一定具有所有相同的点,某些列中有NaN而其他列中没有。

df.T.corr(method='spearman')
(r, p) = spearmanr(df.T)
df2 = pd.DataFrame(index=df.index, columns=df.columns, data=r)

In[47]: df['320840_93602.563']
Out[47]: 
320840_93602.563                    1.000000
3254_642.148.peg.3256               0.565812
13752_42938.1206                    0.877192
319002_93602.870                    0.225530
328_642.148.peg.330                 0.658269
                                      ...   
12566_42938.19                      0.818395
321125_93602.2882                   0.535577
319185_93602.1135                   0.678397
29724_39.3584                       0.770453
321030_93602.1962                   0.738722
Name: 320840_93602.563, dtype: float64

In[32]: df2['320840_93602.563']
Out[32]: 
320840_93602.563                    1.000000
3254_642.148.peg.3256               0.444675
13752_42938.1206                    0.286933
319002_93602.870                    0.225530
328_642.148.peg.330                 0.606619
                                      ...   
12566_42938.19                      0.212265
321125_93602.2882                   0.587409
319185_93602.1135                   0.696172
29724_39.3584                       0.097753
321030_93602.1962                   0.163417
Name: 320840_93602.563, dtype: float64

1 个答案:

答案 0 :(得分:4)

scipy.stats.spearmanr不是为处理nan而设计的,其nan值的行为未定义。 [更新scipy.stats.spearmanr现在有参数nan_policy。]

对于没有nan s的数据,函数似乎同意:

In [92]: np.random.seed(123)

In [93]: df = pd.DataFrame(np.random.randn(5, 5))

In [94]: df.T.corr(method='spearman')
Out[94]: 
     0    1    2    3    4
0  1.0 -0.8  0.8  0.7  0.1
1 -0.8  1.0 -0.7 -0.7 -0.1
2  0.8 -0.7  1.0  0.8 -0.1
3  0.7 -0.7  0.8  1.0  0.5
4  0.1 -0.1 -0.1  0.5  1.0

In [95]: rho, p = spearmanr(df.values.T)

In [96]: rho
Out[96]: 
array([[ 1. , -0.8,  0.8,  0.7,  0.1],
       [-0.8,  1. , -0.7, -0.7, -0.1],
       [ 0.8, -0.7,  1. ,  0.8, -0.1],
       [ 0.7, -0.7,  0.8,  1. ,  0.5],
       [ 0.1, -0.1, -0.1,  0.5,  1. ]])