如果我们有:
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 . . . . .
答案 0 :(得分:3)
使用pandas'concat
和corr
功能,您可以将所有内容整合到一个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]
,但在这种情况下它可以正常工作。
编辑添加结果:
答案 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
也可能是其他一些人;)