python - 如何循环遍历相关矩阵以仅提供高于特定阈值的相关对?和/或提高效率

标签 python performance loops correlation

我有以下代码:

for i in list(corr.columns):
    for j in list(corr.columns):
        if corr.ix[i,j]>0.7 and corr.ix[i,j] != 1:
            print i, ' ',j ,' ', corr.ix[i,j] 

问题是,虽然这有效,但它同时返回 corr[i,j] 和 corr[j,i],就好像它们是不同的相关性一样。 无论如何我可以只循环遍历相关矩阵的“底部三角形”吗?

最佳答案

下面是一种可能性,仍然使用类似于你的循环结构。请注意,通过限制 j 的可能值范围,您可以从循环中消除大部分重复工作。此外,虽然像您一样使用字符串进行索引可能会使某些程序更具可读性/健壮性,但使用整数索引 numpy 二维数组可能会更快(并且更简洁,因为没有 .ix 组件)。以这种方式编制索引还可以让您跳过测试您知道不需要的元素。

# Get some toy data and extract some information from it
import pandas.io.data as pd
X = pd.DataReader('aapl','yahoo')
rows, cols = X.shape
flds = list(X.columns)

# Indexing with numbers on a numpy matrix will probably be faster
corr = X.corr().values

for i in range(cols):
    for j in range(i+1, cols):
        if corr[i,j] > 0.7:
            print flds[i], ' ', flds[j], ' ', corr[i,j]

运行上面的代码会产生如下结果:

Open   High   0.99983447301
Open   Low   0.999763093885
Open   Close   0.999564997906
High   Low   0.999744241894
High   Close   0.999815965479
Low   Close   0.999794304851

关于python - 如何循环遍历相关矩阵以仅提供高于特定阈值的相关对?和/或提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902649/

相关文章:

python - 为多个数组实现 numpy.in1d 的最有效方法

python - 递归和 append 到列表

javascript - 多次循环一个数组,直到完成第二个数组

android - 部分重绘 -> 无效(矩形 矩形)

ruby - 循环中的循环和在深度循环中分配变量

涉及带有属性的 HTML 标签的 Python 网络抓取

python - python中的多面体边缘

python - 在python中有条件的列表中删除数字

SQL SELECT 速度 int vs varchar

javascript - 为什么node.js比apache 2.4慢这么多