Python 2.7 数据帧距离相关(dcor)的并行计算

Python 2.7 数据帧距离相关(dcor)的并行计算,python-2.7,pandas,dataframe,parallel-processing,Python 2.7,Pandas,Dataframe,Parallel Processing,我有一个包含50行和22000列的熊猫数据帧,我想计算每对列之间的距离相关性(dcor包)。我创建的代码(通过串行处理和部分数据)是: 要在完整数据帧上执行此代码,我需要21小时 由于我的服务器有40个处理器,我想把时间缩短40分钟,在大约30分钟内得到结果,但是我不知道如何重写并行处理的代码 我如何重写代码 非常感谢您的帮助。我是dcor软件包的创建者。这种方法的一个问题是,每列的成对距离矩阵在每次迭代中计算,而不是只计算一次。如果您有足够的内存,可以事先计算这些矩阵,然后计算距离相关性: i

我有一个包含50行和22000列的熊猫数据帧,我想计算每对列之间的距离相关性(dcor包)。我创建的代码(通过串行处理和部分数据)是:

要在完整数据帧上执行此代码,我需要21小时

由于我的服务器有40个处理器,我想把时间缩短40分钟,在大约30分钟内得到结果,但是我不知道如何重写并行处理的代码

我如何重写代码


非常感谢您的帮助。

我是dcor软件包的创建者。这种方法的一个问题是,每列的成对距离矩阵在每次迭代中计算,而不是只计算一次。如果您有足够的内存,可以事先计算这些矩阵,然后计算距离相关性:

import pandas as pd
import dcor
import numpy as np
from scipy.spatial.distance import pdist, squareform

DF = pd.DataFrame({'X':[0.72,-0.25,-1.2,-3],'Y':[-0.128,0.2,2,5.6],'Z':[15,-0.425,-0.3,-5]})

DCOR_REZ=pd.DataFrame(index=['X','Y','Z'],columns=['X','Y','Z'])
col_names=DCOR_REZ.columns.tolist()
k=0

dict_centered_matrices = {}

def compute_matrix(i):
    v1=DF.loc[:,i].as_matrix()

    v1_dist = squareform(pdist(v1[:, np.newaxis]))
    return (i, dcor.double_centered(v1_dist))

dict_centered_matrices = dict(map(compute_matrix, col_names))

for i in col_names:

    v1_centered = dict_centered_matrices[i]

    for j in col_names[k:]:

        v2_centered = dict_centered_matrices[j]

        rez=np.sqrt(
               dcor.average_product(v1_centered, v2_centered)/np.sqrt(
                                 dcor.average_product(v1_centered, v1_centered)*
                                 dcor.average_product(v2_centered, v2_centered)))

        DCOR_REZ.at[i,j]=rez
        DCOR_REZ.at[j,i]=rez

    k=k+1

print(DCOR_REZ)

这将使您的代码更快,但会消耗更多内存。我会考虑为这个案例添加便利功能,因为它看起来很普通。您还可以尝试使用多处理模块并行化代码,并用池实例的map方法替换map函数。

自从dcor版本0.5以来,我添加了一个具有此明确目的的方法。当满足正确的条件时(基本上,当在随机变量和非随机向量之间计算距离协方差/相关性时,默认情况下),它将使用可用的核并行计算。很抱歉延迟执行此操作。

您是否可以添加一个示例,演示如何在这种情况下应用
rowwise
(每对列之间的距离相关性)?本文档仅显示了两个不同数组的示例。如果能看到一个示例,说明如何使用
dcor.independence.distance\u convariance\u test
(即如何传递参数
指数
num\u重采样
)以
rowwise
计算所述距离相关性的pvalue,那将是一件好事
import pandas as pd
import dcor
import numpy as np
from scipy.spatial.distance import pdist, squareform

DF = pd.DataFrame({'X':[0.72,-0.25,-1.2,-3],'Y':[-0.128,0.2,2,5.6],'Z':[15,-0.425,-0.3,-5]})

DCOR_REZ=pd.DataFrame(index=['X','Y','Z'],columns=['X','Y','Z'])
col_names=DCOR_REZ.columns.tolist()
k=0

dict_centered_matrices = {}

def compute_matrix(i):
    v1=DF.loc[:,i].as_matrix()

    v1_dist = squareform(pdist(v1[:, np.newaxis]))
    return (i, dcor.double_centered(v1_dist))

dict_centered_matrices = dict(map(compute_matrix, col_names))

for i in col_names:

    v1_centered = dict_centered_matrices[i]

    for j in col_names[k:]:

        v2_centered = dict_centered_matrices[j]

        rez=np.sqrt(
               dcor.average_product(v1_centered, v2_centered)/np.sqrt(
                                 dcor.average_product(v1_centered, v1_centered)*
                                 dcor.average_product(v2_centered, v2_centered)))

        DCOR_REZ.at[i,j]=rez
        DCOR_REZ.at[j,i]=rez

    k=k+1

print(DCOR_REZ)