pandas、spark计算相关性系数速度对比
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)
pandas、spark计算相关性系数速度对比的更多相关文章
- 相关性系数及其python实现
参考文献: 1.python 皮尔森相关系数 https://www.cnblogs.com/lxnz/p/7098954.html 2.统计学之三大相关性系数(pearson.spearman.ke ...
- 统计学三大相关性系数:pearson,spearman,kendall
目录 person correlation coefficient(皮尔森相关性系数-r) spearman correlation coefficient(斯皮尔曼相关性系数-p) kendall ...
- Spark计算模型
[TOC] Spark计算模型 Spark程序模型 一个经典的示例模型 SparkContext中的textFile函数从HDFS读取日志文件,输出变量file var file = sc.textF ...
- spark计算两个DataFrame的差集、交集、合集
spark 计算两个dataframe 的差集.交集.合集,只选择某一列来对比比较好.新建两个 dataframe : import org.apache.spark.{SparkConf, Spar ...
- 【原创 Hadoop&Spark 动手实践 7】Spark 计算引擎剖析与动手实践
[原创 Hadoop&Spark 动手实践 7]Spark计算引擎剖析与动手实践 目标: 1. 理解Spark计算引擎的理论知识 2. 动手实践更深入的理解Spark计算引擎的细节 3. 通过 ...
- 【Spark深入学习 -13】Spark计算引擎剖析
----本节内容------- 1.遗留问题解答 2.Spark核心概念 2.1 RDD及RDD操作 2.2 Transformation和Action 2.3 Spark程序架构 2.4 Spark ...
- Java进行spark计算
首先在Linux环境安装spark: 可以从如下地址下载最新版本的spark: https://spark.apache.org/downloads.html 这个下载下来后是个tgz的压缩包,解压后 ...
- 【Python学习笔记】使用Python计算皮尔逊相关系数
源代码不记得是哪里获取的了,侵删.此处博客仅作为自己笔记学习. def multipl(a,b): sumofab=0.0 for i in range(len(a)): temp=a[i]*b[i] ...
- Pandas统计计算和描述
Pandas统计计算和描述 示例代码: import numpy as np import pandas as pd df_obj = pd.DataFrame(np.random.randn(5,4 ...
- 相关性系数缺点与证明 k阶矩
相关性系数 https://baike.baidu.com/item/相关系数/3109424?fr=aladdin 缺点 需要指出的是,相关系数有一个明显的缺点,即它接近于1的程度与数据组数n相关, ...
随机推荐
- 力扣597(MySQL)-好友申请Ⅰ:总体通过率(简单)
题目: 此表没有主键,它可能包含重复项.该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求的日期. 此表没有主键,它可能包含重复项.该表包含发送请求的用户的 ID ,接受请求的用户的 ...
- 全链路灰度新功能:MSE 上线配置标签推送
简介: 本文介绍了全链路灰度场景给配置管理带来的问题,介绍了 MSE 针对这一场景的解决方案,并通过实践的方式展示了配置标签推送的使用流程.后续,MSE 还会针对配置治理做更多的探索,帮助用户更好地解 ...
- 客户端单元测试实践——C++篇
简介: 我们团队在手淘中主要负责BehaviX模块,代码主要是一些逻辑功能,很少涉及到UI,为了减少双端不一致问题.提高性能,我们采用了将核心代码C++化的策略.由于团队项目偏底层,测试同学难以完全覆 ...
- 在kubernetes集群中使用虚拟节点创建1万Pod-支持在线教育业务
使用虚拟节点提升k8s集群容量和弹性 在kubernetes集群中添加虚拟节点的方式已被非常多的客户普遍使用,基于虚拟节点可以极大提升集群的Pod容量和弹性,灵活动态的按需创建ECI Pod,免去集群 ...
- 15M安装包就能玩《原神》,带你了解云游戏背后的技术秘密
简介:对于大多数玩家来说,云游戏已经不是一个陌生的概念,它经常和秒玩.不吃设备.大屏临场感.上手门槛低.真香等字眼一起出现在评论留言区.的确,对于既想尝试高品质游戏大作又不想一直卷装备的玩家来说,云游 ...
- 人人都是 Serverless 架构师 | 现代化 Web 应用开发实战
简介:本篇实战将介绍如何以超低成本构建动态的 Web 站点,并且实现灵活扩展,限流等效果,最后再跟大家聊一聊"现代应用"的相关概念. 相信很多同学都有过想要拥有自己的 Web 站 ...
- 如何避免出现SQL注入漏洞
简介: 本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因.并以几个常见漏洞存在形式,提醒技术同学注意相关问题.最后会根据原理,提供解决或缓解方案. 作者 | 阿里云安全 ...
- [Go] golang 两个数组 list 的合并方式
s := append([]int{1, 2}, []int{3, 4}...) Tool:在线Golang代码运行 Cool:在线 AI 编程助手 https://stackoverflow.com ...
- dotnet 如何将 Microsoft.Maui.Graphics 对接到 UNO 框架
本文将和大家介绍如何将 Microsoft.Maui.Graphics 对接到 UNO 框架里面.一旦完成 Microsoft.Maui.Graphics 对接,即可让 UNO 框架复用现有的许多绘制 ...
- 羽夏壳世界—— PE 解析的实现
写在前面 此系列是本人一个字一个字码出来的,包括代码实现和效果截图. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后 ...