如何计算 python pandas 数据框中行之间的相关性
how to calculate correlation between rows in python pandas data frame
我有一个大数据框,我需要有效地计算数据框行和给定值列表之间的相关性。例如:
dfa= DataFrame(np.zeros((1,4)) ,columns=['a','b','c','d'])
dfa.ix[0] = [2,6,8,12]
a b c d
2.0 6.0 8.0 12.0
dfb= DataFrame([[2,6,8,12],[1,3,4,6],[-1,-3,-4,-6]], columns=['a','b','c','d'])
a b c d
0 2 6 8 12
1 1 3 4 6
2 -1 -3 -4 -6
我希望得到:
0 1
1 0.5
2 -0.5
我尝试了很多版本,例如:
dfb.T.corrwith(dfa.T, axis=0)
但我得到的是很多 Nan 的
首先,请注意最后两个相关性是 1 和 -1,而不是您预期的 0.5 和 -0.5。
解决方案
dfb.corrwith(dfa.iloc[0], axis=1)
结果
0 1.0
1 1.0
2 -1.0
dtype: float64
我认为你试图得到的数字实际上不是相关系数。第一行和第二行之间的相关性是 1 而不是 0.5。相关性是变量之间线性关系的量度。这里的两个列表与皮尔逊系数 1 密切相关。如果您将 row0 [2,6,8,12] 与 row1 [1,3,4,6] 作图,它们都位于一条线上。同时,如果您想找到行之间的相关性,这应该可行:
注意:正确的相关性是 [1,1,-1]
pd.DataFrame(dfb.transpose()).corr()
这是一个使用 NumPy 工具的相关定义,旨在提高 corr2_coeff_rowwise
-
的性能
pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
样本运行-
In [74]: dfa
Out[74]:
a b c d
0 2.0 6.0 8.0 12.0
In [75]: dfb
Out[75]:
a b c d
0 2 6 8 12
1 1 3 4 6
2 -1 -3 -4 -6
In [76]: pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
Out[76]:
0 1.0
1 1.0
2 -1.0
dtype: float64
运行时测试
案例 #1:dfb
和 4
列中的大量行 -
In [77]: dfa = pd.DataFrame(np.random.randint(1,100,(1,4)))
In [78]: dfb = pd.DataFrame(np.random.randint(1,100,(30000,4)))
# @sera's soln
In [79]: %timeit dfb.corrwith(dfa.iloc[0], axis=1)
1 loop, best of 3: 4.09 s per loop
In [80]: %timeit pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
1000 loops, best of 3: 1.53 ms per loop
案例 #2:dfb
和 400
列中的适当行数 -
In [83]: dfa = pd.DataFrame(np.random.randint(1,100,(1,400)))
In [85]: dfb = pd.DataFrame(np.random.randint(1,100,(300,400)))
In [86]: %timeit dfb.corrwith(dfa.iloc[0], axis=1)
10 loops, best of 3: 44.8 ms per loop
In [87]: %timeit pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
1000 loops, best of 3: 635 µs per loop
我有一个大数据框,我需要有效地计算数据框行和给定值列表之间的相关性。例如:
dfa= DataFrame(np.zeros((1,4)) ,columns=['a','b','c','d'])
dfa.ix[0] = [2,6,8,12]
a b c d
2.0 6.0 8.0 12.0
dfb= DataFrame([[2,6,8,12],[1,3,4,6],[-1,-3,-4,-6]], columns=['a','b','c','d'])
a b c d
0 2 6 8 12
1 1 3 4 6
2 -1 -3 -4 -6
我希望得到:
0 1
1 0.5
2 -0.5
我尝试了很多版本,例如:
dfb.T.corrwith(dfa.T, axis=0)
但我得到的是很多 Nan 的
首先,请注意最后两个相关性是 1 和 -1,而不是您预期的 0.5 和 -0.5。
解决方案
dfb.corrwith(dfa.iloc[0], axis=1)
结果
0 1.0
1 1.0
2 -1.0
dtype: float64
我认为你试图得到的数字实际上不是相关系数。第一行和第二行之间的相关性是 1 而不是 0.5。相关性是变量之间线性关系的量度。这里的两个列表与皮尔逊系数 1 密切相关。如果您将 row0 [2,6,8,12] 与 row1 [1,3,4,6] 作图,它们都位于一条线上。同时,如果您想找到行之间的相关性,这应该可行:
注意:正确的相关性是 [1,1,-1]
pd.DataFrame(dfb.transpose()).corr()
这是一个使用 NumPy 工具的相关定义,旨在提高 corr2_coeff_rowwise
-
pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
样本运行-
In [74]: dfa
Out[74]:
a b c d
0 2.0 6.0 8.0 12.0
In [75]: dfb
Out[75]:
a b c d
0 2 6 8 12
1 1 3 4 6
2 -1 -3 -4 -6
In [76]: pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
Out[76]:
0 1.0
1 1.0
2 -1.0
dtype: float64
运行时测试
案例 #1:dfb
和 4
列中的大量行 -
In [77]: dfa = pd.DataFrame(np.random.randint(1,100,(1,4)))
In [78]: dfb = pd.DataFrame(np.random.randint(1,100,(30000,4)))
# @sera's soln
In [79]: %timeit dfb.corrwith(dfa.iloc[0], axis=1)
1 loop, best of 3: 4.09 s per loop
In [80]: %timeit pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
1000 loops, best of 3: 1.53 ms per loop
案例 #2:dfb
和 400
列中的适当行数 -
In [83]: dfa = pd.DataFrame(np.random.randint(1,100,(1,400)))
In [85]: dfb = pd.DataFrame(np.random.randint(1,100,(300,400)))
In [86]: %timeit dfb.corrwith(dfa.iloc[0], axis=1)
10 loops, best of 3: 44.8 ms per loop
In [87]: %timeit pd.Series(corr2_coeff_rowwise(dfa.values,dfb.values))
1000 loops, best of 3: 635 µs per loop