Pandas 2.0 vs Polars:速度的全面对比

news2024/11/19 20:25:20

前几天的文章,我们已经简单的介绍过Pandas 和Polars的速度对比。刚刚发布的Pandas 2.0速度得到了显著的提升。但是本次测试发现NumPy数组上的一些基本操作仍然更快。并且Polars 0.17.0,也在上周发布,并且也提到了性能的改善,所以我们这里做一个更详细的关于速度方面的评测。

本文将比较Pandas 2.0(使用Numpy和Pyarrow作为后端)和Polars 0.17.0的速度。并且介绍使用Polars库复现一些简单到复杂的Pandas代码,这样也算是对Polars的一个简单介绍。另外测试将在4 cpu和32 GB RAM上进行。

安装

可以通过pip命令进行安装

 pipinstallpolars==0.17.0# Latest version
 
 pipinstallpandas==2.0.0  # Latest pandas version

我们需要使用下面的库:

 importpandasaspd
 importpolarsaspl
 importnumpyasnp
 importtime

为了评估性能,我们将使用一个由3000万行和15列组成的合成数据集。该数据集由8个分类特征和7个数字特征组成,是人工生成的。数据集的链接在最后会提供。

下面显示了该数据集的一个示例

读取数据集

比较两个库读取parquet文件的时间。我使用了下面的代码,并使用%%time来获取代码执行的时间。

 train_pd=pd.read_parquet('./train.parquet') #Pandas dataframe
 
 train_pl=pl.read_parquet('./train.parquet') #Polars dataframe

可以看到Polars和Pandas 2.0在速度方面表现相似(因为都是arrow)但是Pandas(使用Numpy后端)需要两倍的时间来完成这个任务(这可能是因为有类型转换的原因,因为最终要把类型转成np的类型)。

聚合操作

下面的代码,该代码计算聚合(最小值、最大值、平均值)。

 # pandas query
 train_pd[nums].agg(['min','max','mean','median','std')
 train[cats].agg(['nunique'])
 
 # Polars query
 train_pl.with_columns([
     pl.col(nums).min().suffix('_min'),
     pl.col(nums).max().suffix('_max'),
     pl.col(nums).mean().suffix('_mean'),
     pl.col(nums).median().suffix('_median'),
     pl.col(nums).std().suffix('_std'),
     pl.col(cats).nunique().suffix('_unique'),
 ])

对于简单的聚合,Pandas在语法和性能方面会更好,但是差距并不大。

筛选操作

选择操作涉及根据条件进行查询和提取,例如下面代码

查询1:当nums_8小于10时,统计唯一值。

 # Polars filter and select
 train_pl.filter(pl.col("num_8") <=10).select(pl.col(cats).n_unique()) 
 
 # Pandas filter and select
 train_pd[train_pd['num_8']<=10][cats].nunique()

查询2:当cat_1 = 1时,计算所有数值列的平均值。

 # Polars filter and select
 train_pl.filter(pl.col("cat_1") ==1).select(pl.col(nums).mean())
 
 # Pandas filter and select
 train_pd[train_pd['cat_1']==1][nums].mean()

两个查询的结果如下:

在性能方面,Polars的数值filter速度要快2-5倍,而Pandas需要编写的代码更少。Pandas在处理字符串(分类特征)时速度较慢,这个我们在以前的文章中已经提到过,并且使用df.query函数在语法上更简洁,并且在大数据量的情况下会更快,这个如果有人有兴趣,我们再单独总结。

分组操作

分组操作是机器学习中用于创建聚合特征的基本操作之一,我在下面的通过user进行分组后,进行聚合来测试性能

函数1:统计cat_1的聚合特征

函数2:num_7的均值特征

函数3:所有数值列的平均聚合特征

函数4:计算分类列的聚合特性

 nums=['num_7','num_8', 'num_9', 'num_10', 'num_11', 'num_12', 'num_13', 'num_14','num_15']
 cats=['cat_1', 'cat_2', 'cat_3', 'cat_4', 'cat_5', 'cat_6']
 
 # Pandas Functions
 Function_1=train_pd.groupby(['user'])['cat_1'].agg('count')   #Function 1
 Function_2=train_pd.groupby(['user'])['num_7'].agg('mean')    #Function 2
 Function_3=train_pd.groupby(['user'])[nums].agg('mean')       #Function 3
 Function_4=train_pd.groupby(['user'])[cats].agg('count')      #Function 4
 
 
 # Polars Functions
 Function_1=train_pl.groupby('user').agg(pl.col('cat_1').count()) #Function 1
 Function_2=train_pl.groupby('user').agg(pl.col('num_7').mean())  #Function 2
 Function_3=train_pl.groupby('user').agg(pl.col(nums).mean())     #Function 3
 Function_4=train_pl.groupby('user').agg(pl.col(cats).count())    #Function 4

可以看到Polars非常快。但是Pyarrow后端的Pandas 2.0在所有情况下都明显比Polars和Pandas 2.0 (numpy后端)慢。

我们将分组变量的数量从1增加到5,看看结果:

 # PANDAS: TESTING GROUPING SPEED ON 5 COLUMNS
 forcatin ['user', 'cat_1', 'cat_2', 'cat_3', 'cat_4']:
   cols+=[cat]
   st=time.time()
   temp=train_pd.groupby(cols)['num_7'].agg('mean')
   en=time.time()
   print(cat,':',en-st)
 
 
 # POLARS: TESTING GROUPING SPEED ON 5 COLUMNS
 forcatin ['user', 'cat_1', 'cat_2', 'cat_3', 'cat_4']:
   cols+=[cat]
   st=time.time()
   temp=train_pl.groupby(cols).agg(pl.col('num_7').mean())
   en=time.time()
   print(cat,':',en-st)
   deltemp

下图中没有显示Pyarrow的Pandas 2.0,因为求值需要1000多秒。

对于group操作来说Polars是首选,但是Pandas在分组时默认删除空值,而Polars库则不会,这是一个小小的差异,在使用时需要注意。

排序操作

下面的代码,可以基于一个或多个列(升序或降序)快速对数据进行排序。

 cols=['user','num_8'] # columns to be used for sorting
 
 #Sorting in Polars
 train_pl.sort(cols,descending=False)
 
 # Sorting in Pandas
 train_pd.sort_values(by=cols,ascending=True)

从上图可以看出,对于排序和分组等复杂情况,Polars仍然是最快的库。Pandas对数据进行简单排序需要几分钟的时间,但在polar中,复杂的排序函数可以在不超过15秒的时间内计算出来。

总结

本文对Pandas和polar之间性能差异做了一个对比总结。Pandas在语法上更有吸引力(因为用的多习惯了),而Polars在处理更大的数据时提供了更好的吞吐量。

但是由于Polars是一个较新的库,从Pandas过渡到其他库具是有挑战性的。通过了解这两种强大工具之间的差异,我们可以根据自己的特定需求选择最佳选项,并实现更高效和有效的数据分析。

本文的数据下载:

https://avoid.overfit.cn/post/9d617b39040441e39433fc906cafefc9

作者:Priyanshu Chaudhary

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apple苹果开发者Certificates, Identifiers Profiles创建

1.创建Profile: 登陆Apple开发者账号,进入开发者后台,选择Profiles 然后点击Generate a Profile生成一个配置 选择配置类型 点击继续 选择APP ID 创建APP ID 注册一个新的APP id 选择应用类型,然后点击继续

两种事件处理模式:reactor/proactor

&#xff01;&#xff01;同步通常是reactor&#xff0c;异步通常是proactor reactor 要求主线程&#xff08;I/O处理单元&#xff09;只负责监听文件描述符上是否有事件发生&#xff0c;有的话就立即将该事件通知工作线程&#xff08;逻辑单元&#xff09;&#xff0c;将 so…

SpringBoot——单元测试实践总结

文章目录单元测试概念作用黑白盒黑盒测试白盒测试逻辑覆盖1、语句覆盖2、判定覆盖3、条件覆盖4、条件/判定覆盖5、条件组合覆盖6、路径覆盖SpringBoot工程单测介绍pom依赖注意&#xff1a;Idea结构创建路径创建类和方法Controller层单测被测代码测试代码Service层单测被测代码测…

springboot集成hadoop3.2.4HDFS

前言 记录springboot集成hadoop3.2.4版本&#xff0c;并且调用HDFS的相关接口&#xff0c;这里就不展示springboot工程的建立了&#xff0c;这个你们自己去建工程很多教程。 一、springboot配置文件修改 1.1 pom文件修改 <!-- hadoop依赖 --><dependency><gro…

【从零开始学Skynet】基础篇(八):简易留言板

这一篇我们要把网络编程和数据库操作结合起来&#xff0c;实现一个简单的留言板功能。 1、功能需求 如下图所示&#xff0c;客户端发送“set XXX”命令时&#xff0c;程序会把留 言“XXX”存入数据库&#xff0c;发送“get”命令时&#xff0c;程序会把整个留言板返回给客户端。…

怎么把视频转成mp3音频,下面有四个方法

你有没有遇到过这种情况&#xff0c;看了一部电影或者纪录片&#xff0c;里面的背景音乐或者对白让你很感动&#xff0c;但是我们只需要其中的音频部分&#xff0c;比如在手机上收听音乐或者创作自己的音频内容。这时候我们可以先把视频保存下来&#xff0c;然后通过视频转音频…

光耦继电器工作原理及优点概述

光耦继电器是一种电子元器件&#xff0c;也是固态继电器的一种&#xff0c;其主要作用是隔离输入与输出电路&#xff0c;用于保护或者控制电路的正常工作。 光耦继电器工作原理是利用光电转换器将外界信号转化为光信号&#xff0c;通过光纤传输到另一端&#xff0c;再由另一端的…

【C生万物】 数组篇

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 这个专栏好久没更新了&#xff0c;今日诗兴大发&#xff0c;打算尽快完成这个专栏&#xff0c;这期讲数组。 目录 Part1:一维数组 1.创建 2.初始化 3.使用 4.在内存中的存储 Part2:二…

安卓开发学习记录(续)

文章目录十一、综合训练&#xff08;购物车功能&#xff09;十二、内容提供者Provider十一、综合训练&#xff08;购物车功能&#xff09; 实现功能&#xff1a; 手机商品页面展示&#xff0c;加入购物车功能&#xff0c;商品详情页面&#xff0c;清空购物车&#xff0c;删除购…

C++算法初级9——递归

C算法初级9——递归 文章目录C算法初级9——递归递归求阶乘递归求斐波那契数列递归&#xff0c;简单地来说&#xff0c;就是一个函数自己调用自己。函数f()就好像是工厂中生产零件的模板&#xff0c;每次我们调用函数f()的时候&#xff0c;都会依照模板生产一个新的零件&#x…

项目4:后台管理的开发和使用(前端)

项目4&#xff1a;后台管理的开发和使用&#xff08;前端&#xff09; 1.npm包管理器的基本学习 2.利用现成后台管理系统开发 3.后台管理系统的路由配置 4.后台管理系统的地址访问配置 5.前后端联调 6.完善积分等级的前端系统 7.对前端系统的全面分析&#xff08;Vue组件…

跳槽进阿里了,其实也没那么难...

对于很多没有学历优势的人来说&#xff0c;面试大厂是非常困难的&#xff0c;这对我而言&#xff0c;也是一样&#xff0c;出身于二本&#xff0c;原本以为就三点一线的生活度过一生&#xff0c;直到生活上的变故&#xff0c;才让我有了新的想法和目标&#xff0c;因此我这个二…

【C++ -模块一 常量变量、关键字、数据类型】

C 模块一C框架代码&#xff1a;第一个C程序&#xff0c;打印hello C &#xff01;代码注释&#xff1a;一 变量和常量&#xff1a;1.1变量变量创建语法&#xff1a;1.2 常量&#xff1a;不能被修改的数据&#xff08;1&#xff09; #define定义的宏常量&#xff1a;一般写在文件…

排序(3)之交换排序

目录 前言 交换排序 1.冒泡排序 1.1冒泡排序的实现 1.2 特性总结 2.快速排序 2.1hoare版本 2.2 挖坑法 2.3 前后指针版本 3.快速排序的优化 3.1 三数取中法 3.2 小区间优化 4.快速排序的非递归实现 前言 今天小编给大家带来交换排序的内容&#xff0c;对于交换排序…

C-关键字(下)

文章目录循环控制switch-case-break-defaultdo-while-forgetchar()break-continuegotovoidvoid*returnconstconst修饰变量const修饰数组const修饰指针指针补充const 修饰返回值volatilestruct柔型数组union联合体联合体空间开辟问题利用联合体的性质,判断机器是大端还是小端enu…

力扣javascript刷题343——动态规划之整数拆分

这几天有在开始投暑期实习的简历&#xff0c;可能确实是投的太晚了&#xff0c;好多厂都没有hc了&#xff0c;阿里简历面都没过&#xff08;感觉是kpi面试&#xff09;&#xff0c;被深深打击到了呜呜呜&#xff0c;花了两天整理情绪&#xff0c;重新出发&#xff0c;下篇文章针…

mysql 索引详解

mysql 索引索引分类1. 普通索引和唯一索引2. 单列索引和组合索引3. 全文索引4&#xff0e;空间索引操作使用索引1. 在已有表中添加索引2. 删除索引索引是一个单独存储在磁盘上的数据库结构&#xff0c;使用索引可以快速找出在某个或多个列中有一特定值的行&#xff0c;提高查询…

【C语言 -结构体 结构体声明、定义、初始化、结构体成员访问、结构体传参】

C语言 - 结构体声明、定义、初始化、结构体成员访问、结构体传参一 结构体类型的声明&#xff1a;声明格式&#xff1a;二 结构体的定义并初始化2.1用结构体创建&#xff08;定义&#xff09;结构体变量&#xff08;对象&#xff09;的两种方式&#xff1a;&#xff08;1&#…

WebRTC 系列(三、点对点通话,H5、Android、iOS)

WebRTC 系列&#xff08;二、本地 demo&#xff0c;H5、Android、iOS&#xff09; 上一篇博客中&#xff0c;我已经展示了各端的本地 demo&#xff0c;大家应该知道 WebRTC 怎么用了。在本地 demo 中是用了一个 RemotePeerConnection 来模拟远端&#xff0c;可能理解起来还有点…

HTTP协议:当下最主流的应用层协议之一,你确定不了解一下吗?

一.HTTP协议的含义http是什么&#xff1f;超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。‘超’可以理解为除了文本之外的图片&#xff0c;音频和视频&#xff0c;和一些其他…