pandasspark计算相关性系数速度对比

Posted stitchsun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandasspark计算相关性系数速度对比相关的知识,希望对你有一定的参考价值。

pandas、spark计算相关性系数速度对比

相关性计算有三种算法:pearson、spearman,kenall。

在pandas库中,对一个Dataframe,可以直接计算这三个算法的相关系数correlation,方法为:data.corr()

底层是依赖scipy库的算法。

为了提升计算速度,使用spark平台来加速执行。

比较了pandas,spark并发scipy算法,spark mllib库的计算速度。

总体来说,spark mllib速度最快,其次是spark并发,pandas速度最慢。

corr执行速度测试结果

时间单位:秒

数据大小 corr算法 pandas spark + scipy spark mllib 备注
1000*3600 pearsonr 203 170 37 pyspark
1000*3600 pearsonr 203 50 没有计算 spark scipy计算一半
1000*3600 pearsonr 203 125 37 client模式
1000*3600 pearsonr 202 157 38 client模式
1000*3600 spearmanr 1386 6418 37 client模式
1000*3600 spearmanr 1327 6392 38 client模式
1000*3600 kendall 4326 398 无此算法 client模式
1000*3600 kendall 4239 346 无此算法 client模式
1000*1000 spearmanr 127 294 12 client 模式
1000*1000 spearmanr 98 513 5.55 client 模式
1000*360 spearmanr 13 150 没有计算 160秒,列表推导式 res = [st.spearmanr(data.iloc[:, i], data.iloc[:, j])[0] for i in range(N) for j in range(N)]
1000*360 kendall 40 45 无此算法 116秒,列表推导式 res = [st.kendall(data.iloc[:, i], data.iloc[:, j])[0] for i in range(N) for j in range(N)]

说明:spearmanr 算法在spark scipy组合下执行速度较慢,需要再对比分析,感觉存在问题的。


三种算法脚本如下:

pandas 脚本


import numpy as np
import pandas as pd
import time

C = 1000
N = 3600

data = pd.DataFrame(np.random.randn(C * N).reshape(C, -1))


print("============================ {}".format(data.shape))
print("start pandas corr ---{} ".format(time.time()))
start = time.time()
# {‘pearson‘, ‘kendall‘, ‘spearman‘}
res = data.corr(method=‘pearson‘)
end_1 = time.time()

res = data.corr(method=‘spearman‘)
end_2 = time.time()

res = data.corr(method=‘kendall‘)
end_3 = time.time()

print("pandas pearson count {} total cost : {}".format(len(res), end_1 - start))
print("pandas spearman count {} total cost : {}".format(len(res), end_2 - end_1))
print("pandas kendall count {} total cost : {}".format(len(res), end_3 - end_2))

spark scipy脚本

from pyspark import SparkContext
sc = SparkContext()
import numpy as np
import pandas as pd
from scipy import stats as st
import time

# t1 = st.kendalltau(x, y)
# t2 = st.spearmanr(x, y)
# t3 = st.pearsonr(x, y)

C = 1000
N = 3600

data = pd.DataFrame(np.random.randn(C * N).reshape(C, -1))


def pearsonr(n):
    x = data.iloc[:, n]
    res = [st.pearsonr(x, data.iloc[:, i])[0] for i in range(data.shape[1])]
    return res


def spearmanr(n):
    x = data.iloc[:, n]
    res = [st.spearmanr(x, data.iloc[:, i])[0] for i in range(data.shape[1])]
    return res


def kendalltau(n):
    x = data.iloc[:, n]
    res = [st.kendalltau(x, data.iloc[:, i])[0] for i in range(data.shape[1])]
    return res


start = time.time()
res = sc.parallelize(np.arange(N)).map(lambda x: pearsonr(x)).collect()
# res = sc.parallelize(np.arange(N)).map(lambda x: spearmanr(x)).collect()
# res = sc.parallelize(np.arange(N)).map(lambda x: kendalltau(x)).collect()
end = time.time()

print("pearsonr count {} total cost : {}".format(len(res), end - start))
print("spearmanr count {} total cost : {}".format(len(res), end - start))
print("kendalltau count {} total cost : {}".format(len(res), end - start))


# 纯python算法
s = time.time()
res = [st.spearmanr(data.iloc[:, i], data.iloc[:, j])[0] for i in range(N) for j in range(N)]
end = time.time()
print(end-s)

start = time.time()
dd = sc.parallelize(res).map(lambda x: st.spearmanr(data.iloc[:, x[0]], data.iloc[:, x[1]])).collect()
end = time.time()
print(end-start)

start = time.time()
dd = sc.parallelize(res).map(lambda x: st.kendalltau(data.iloc[:, x[0]], data.iloc[:, x[1]])).collect()
end = time.time()
print(end-start)

spark mllib脚本

from pyspark import SparkContext
sc = SparkContext()
from pyspark.mllib.stat import Statistics
import time
import numpy as np

L = 1000
N = 3600
t = [np.random.randn(N) for i in range(L)]

data = sc.parallelize(t)

start = time.time()
res = Statistics.corr(data, method="pearson")  # spearman  pearson
end = time.time()
print("pearson : ", end-start)


start = time.time()
res = Statistics.corr(data, method="spearman")  # spearman  pearson
end = time.time()
print("spearman: ", end-start)

以上是关于pandasspark计算相关性系数速度对比的主要内容,如果未能解决你的问题,请参考以下文章

皮尔森相关性系数的计算python代码(热力图版)

皮尔森相关性系数的计算python代码

皮尔森相关性系数的计算python代码

计算矩阵的 Matthew 相关系数需要很长时间

R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关系数拟合回归模型使用两个回归模型的残差计算偏相关性系数

如何计算两变量的相关系数r?