【发布时间】:2018-07-01 15:28:05
【问题描述】:
我想对 Pandas 中的每一列与所有其他列进行 Spearman 关联。我只需要相关性(数组)的分布,而不需要相关性矩阵。
我知道我可以使用df.corr(method='spearman'),但是我只需要成对相关,而不需要整个相关矩阵或对角线。我认为这可能会加快计算速度,因为我将只计算 ((N^2) - N)/2 相关性,而不是 N^2。
然而,这只是一个假设——因为矩阵是对称的,也许 pandas 已经通过计算相关矩阵的一半然后相应地填充其余部分来工作。
到目前为止,我非常低效的解决方案是:
import pandas as pd
import scipy.stats as ss
# d is a pandas DataFrame
corr_a = []
for i, col1 in enumerate(d.columns):
for col2 in d.columns[i+1:]:
r, _ = ss.spearmanr(d.loc[col1], d.loc[col2])
corr_a += [r]
是否有任何内置或矢量化 API 可以更快地运行?
【问题讨论】:
-
几乎所有 pandas 内置方法都比您尝试使用 Python 循环实现的任何方法都要快。
df.corr()尽可能快。 -
同意@DYZ。如果你查看
corr函数的源代码,他们已经在优化计算了。 -
是的,我的说法很明显。我认为最好的解决方案可能是只裁剪下三角形(例如:stackoverflow.com/a/34418376/41977)。我认为这可能是重复的。
标签: python pandas correlation