【问题标题】:Pandas array of pairwise correlations between columns列之间成对相关性的 Pandas 数组
【发布时间】: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


【解决方案1】:

pandas 解决方案实际上比我想象的要容易:

import numpy as np
import pandas as pd

# d is a pandas DataFrame
d = d.corr(method='spearman')
d = d.where(np.triu(np.ones(d.shape)).astype(np.bool))
np.fill_diagonal(d.values, np.nan)
d = d.stack().reset_index()
corr = d.iloc[:, 2]

如果您可以提供一种仅计算一半相关矩阵的方法,请随意编辑(我的原始矩阵是高维矩阵,因此该解决方案的计算成本可能会爆炸)。

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 2023-03-27
    • 2017-01-11
    • 2018-01-11
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多