如何计算Spearman在两个数据集之间的排名相关性

时间:2016-12-09 08:36:21

标签: python correlation

如果我们有:

X = pd.DataFrame({"A":[34,12,78,84,26], "B":[54,87,35,25,82], "C":[56,78,0,14,13], "D":[0,23,72,56,14], "E":[78,12,31,0,34]})
Y = pd.DataFrame({"A":[45,24,65,65,65], "B":[45,87,65,52,12], "C":[98,52,32,32,12], "D":[0,23,1,365,53], "E":[24,12,65,3,65]})

我们如何计算两个数据集之间的 Spearman秩相关(但不在每个数据集中),以便最终我们有一个5x5矩阵? 像这样:

    A  B  C  D  E
A   .  .  .  .  .
B   .  .  .  .  .
C   .  .  .  .  .
D   .  .  .  .  .
E   .  .  .  .  .

2 个答案:

答案 0 :(得分:3)

使用pandas'concatcorr功能,您可以将所有内容整合到一个DataFrame中,将其转换为单行内容:

import pandas as pd

X = pd.DataFrame({"A":[34,12,78,84,26], "B":[54,87,35,25,82], "C":[56,78,0,14,13], "D":[0,23,72,56,14], "E":[78,12,31,0,34]})
Y = pd.DataFrame({"A1":[45,24,65,65,65], "B1":[45,87,65,52,12], "C1":[98,52,32,32,12], "D1":[0,23,1,365,53], "E1":[24,12,65,3,65]})

pd.concat([X,Y], axis=1).corr(method="spearman").iloc[5:,:5]

请注意,在我的示例中,我给第二组列添加了一个不同的名称,以使它们更容易区分。使用pandas的索引功能,您可以提出一种更复杂的方法,从关联表中选择所需的行/列而不是我的.iloc[5:,:5],但在这种情况下它可以正常工作。

编辑添加结果:

enter image description here

答案 1 :(得分:0)

这应该可以做到!可能会缩短,但是:

import pandas as pd
import numpy as np
from scipy.stats import linregress


X = pd.DataFrame({"A":[34,12,78,84,26], "B":[54,87,35,25,82], "C":[56,78,0,14,13], "D":[0,23,72,56,14], "E":[78,12,31,0,34]})
Y = pd.DataFrame({"A":[45,24,65,65,65], "B":[45,87,65,52,12], "C":[98,52,32,32,12], "D":[0,23,1,365,53], "E":[24,12,65,3,65]})

row = 0
col = 0
m = np.zeros( (len(X), len(Y) ))
for key_x, val_x in X.iteritems():
    for key_y, val_y in Y.iteritems():
        if( col == 5 ):
            col = 0 
        m[row][col] = linregress(val_x, val_y).rvalue
        col += 1
    row += 1

print m

要计算相关性,我使用的是linregress,但还有其他替代方法,例如:

  • numpy.corrcoef
  • pandas.DataFrame.corr

也可能是其他一些人;)