Python 2.7 数据帧距离相关(dcor)的并行计算
我有一个包含50行和22000列的熊猫数据帧,我想计算每对列之间的距离相关性(dcor包)。我创建的代码(通过串行处理和部分数据)是: 要在完整数据帧上执行此代码,我需要21小时 由于我的服务器有40个处理器,我想把时间缩短40分钟,在大约30分钟内得到结果,但是我不知道如何重写并行处理的代码 我如何重写代码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
非常感谢您的帮助。我是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)