|
|
|
|
公众号矩阵

使用PyPolars,让Pandas快三倍

本文介绍如何使用PyPolars库加快Pandas工作流程。

作者:布加迪来源:51CTO|2021-09-08 08:00

【51CTO.com快译】Pandas是数据科学家处理数据的最重要的Python软件包之一。Pandas库主要用于数据探索和可视化,它随带大量的内置函数。Pandas无法处理大型数据集,因为它无法在CPU的所有核心上扩展或分布进程。

为了加快计算速度,您可以使用CPU的所有核心,并加快工作流程。有各种开源库,包括Dask、Vaex、Modin、Pandarallel和PyPolars等,它们可以在CPU的多个核心上并行处理计算。我们在本文中将讨论PyPolars库的实现和用法,并将其性能与Pandas库进行比较。

PyPolars是什么?

PyPolars是一个类似Pandas的开源Python数据框库。PyPolars利用CPU的所有可用核心,因此处理计算比Pandas更快。PyPolars有一个类似Pandas的API。它是用Rust和Python包装器编写的。

理想情况下,当数据对于Pandas而言太大、对于Spark而言太小时,使用 PyPolars。

PyPolars如何工作?

PyPolars库有两个API,一个是Eager API,另一个是Lazy API。Eager API与Pandas的API非常相似,执行完成后立即获得结果,这类似Pandas。Lazy API与Spark非常相似,一执行查询,就形成地图或方案。然后在CPU的所有核心上并行执行。

图1. PyPolars API

PyPolars基本上是连接到Polars库的Python绑定。PyPolars库好用的地方是,其API与Pandas相似,这使开发人员更容易使用。

安装:

可以使用以下命令从PyPl安装 PyPolars:

  1. pip install py-polars 

并使用以下命令导入库:

  1. iport pypolars as pl 

基准时间约束:

为了演示,我使用了一个含有2500万个实例的大型数据集(~6.4Gb)。

图2. Pandas和Py-Polars基本操作的基准时间数

针对使用Pandas和PyPolars库的一些基本操作的上述基准时间数,我们可以观察到 PyPolars几乎比Pandas快2到3倍。

现在我们知道PyPolars有一个与Pandas非常相似的API,但仍没有涵盖Pandas的所有函数。比如说,PyPolars中就没有.describe()函数,相反我们可以使用df_pypolars.to_pandas().describe()。

用法:

  1. import pandas as pd 
  2. import numpy as np 
  3. import pypolars as pl 
  4. import time 
  5. WARNING! 
  6. py-polars was renamed to polars, please install polars! 
  7. https://pypi.org/project/polars/ 
  8.  
  9. path = "data.csv" 

读取数据:

  1. s = time.time() 
  2. df_pandas = pd.read_csv(path) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Loading Time = {}".format(pd_time)) 
  6. C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071: DtypeWarning: Columns (2,7,14) have mixed types.Specify dtype option on import or set low_memory=False
  7.   has_raised = await self.run_ast_nodes(code_ast.body, cell_name, 
  8. Pandas Loading Time = 217.1734380722046 
  9.  
  10. s = time.time() 
  11. df_pypolars = pl.read_csv(path) 
  12. e = time.time() 
  13. pl_time = e - s  
  14. print("PyPolars Loading Time = {}".format(pl_time)) 
  15. PyPolars Loading Time = 114.0408570766449 

shape:

  1. s = time.time() 
  2. print(df_pandas.shape) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Shape Time = {}".format(pd_time)) 
  6. (25366521, 19) 
  7. Pandas Shape Time = 0.0 
  8.  
  9. s = time.time() 
  10. print(df_pypolars.shape) 
  11. e = time.time() 
  12. pl_time = e - s  
  13. print("PyPolars Shape Time = {}".format(pl_time)) 
  14. (25366521, 19) 
  15. PyPolars Shape Time = 0.0010192394256591797 

过滤:

  1. s = time.time() 
  2. temp = df_pandas[df_pandas['PAID_AMT']>500] 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Filter Time = {}".format(pd_time)) 
  6. Pandas Filter Time = 0.8010377883911133 
  7.  
  8. s = time.time() 
  9. temp = df_pypolars[df_pypolars['PAID_AMT']>500] 
  10. e = time.time() 
  11. pl_time = e - s  
  12. print("PyPolars Filter Time = {}".format(pl_time)) 
  13. PyPolars Filter Time = 0.7790462970733643 

Groupby:

  1. s = time.time() 
  2. temp = df_pandas.groupby(by="MARKET_SEGMENT").agg({'PAID_AMT':np.sum'QTY_DISPENSED':np.mean}) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas GroupBy Time = {}".format(pd_time)) 
  6. Pandas GroupBy Time = 3.5932095050811768 
  7.  
  8. s = time.time() 
  9. temp = df_pypolars.groupby(by="MARKET_SEGMENT").agg({'PAID_AMT':np.sum'QTY_DISPENSED':np.mean}) 
  10. e = time.time() 
  11. pd_time = e - s 
  12. print("PyPolars GroupBy Time = {}".format(pd_time)) 
  13. PyPolars GroupBy Time = 1.2332513110957213 

运用函数:

  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas['PAID_AMT'].apply(round) 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas Loading Time = {}".format(pd_time)) 
  8. Pandas Loading Time = 13.081078290939331 
  9. Wall time: 13.1 s 
  10.  
  11. s = time.time() 
  12. temp = df_pypolars['PAID_AMT'].apply(round) 
  13. e = time.time() 
  14. pd_time = e - s 
  15. print("PyPolars Loading Time = {}".format(pd_time)) 
  16. PyPolars Loading Time = 6.03610580444336 

值计算:

  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas['MARKET_SEGMENT'].value_counts() 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas ValueCounts Time = {}".format(pd_time)) 
  8. Pandas ValueCounts Time = 2.8194501399993896 
  9. Wall time: 2.82 s 
  10.  
  11. %%time 
  12.  
  13. s = time.time() 
  14. temp = df_pypolars['MARKET_SEGMENT'].value_counts() 
  15. e = time.time() 
  16. pd_time = e - s 
  17. print("PyPolars ValueCounts Time = {}".format(pd_time)) 
  18. PyPolars ValueCounts Time = 1.7622406482696533 
  19. Wall time: 1.76 s 

描述:

  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas.describe() 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas Describe Time = {}".format(pd_time)) 
  8. Pandas Describe Time = 15.48347520828247 
  9. Wall time: 15.5 s 
  10.  
  11. %%time 
  12.  
  13. s = time.time() 
  14. temp = df_pypolars[temp_cols].to_pandas().describe() 
  15. e = time.time() 
  16. pd_time = e - s 
  17. print("PyPolars Describe Time = {}".format(pd_time)) 
  18. PyPolars Describe Time = 44.31892013549805 
  19. Wall time: 44.3 s 

去重:

  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas['MARKET_SEGMENT'].unique() 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas Unique Time = {}".format(pd_time)) 
  8. Pandas Unique Time = 2.1443397998809814 
  9. Wall time: 2.15 s 
  10.  
  11. %%time 
  12.  
  13. s = time.time() 
  14. temp = df_pypolars['MARKET_SEGMENT'].unique() 
  15. e = time.time() 
  16. pd_time = e - s 
  17. print("PyPolars Unique Time = {}".format(pd_time)) 
  18. PyPolars Unique Time = 1.0320448875427246 
  19. Wall time: 1.03 s 

保存数据:

  1. s = time.time() 
  2. df_pandas.to_csv("delete_1May.csv"index=False
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Saving Time = {}".format(pd_time)) 
  6. Pandas Saving Time = 779.0419402122498 
  7.  
  8. s = time.time() 
  9. df_pypolars.to_csv("delete_1May.csv"
  10. e = time.time() 
  11. pd_time = e - s 
  12. print("PyPolars Saving Time = {}".format(pd_time)) 
  13. PyPolars Saving Time = 439.16817021369934 

结论

我们在本文中简要介绍了PyPolars库,包括它的实现、用法以及在一些基本操作中将其基准时间数与Pandas相比较的结果。请注意,PyPolars的工作方式与Pandas非常相似, PyPolars是一种节省内存的库,因为它支持的内存是不可变内存。

可以阅读说明文档详细了解该库。还有其他各种开源库来并行处理Pandas操作,并加快进程。

参考资料:

Polars说明文档和GitHub存储库:https://github.com/ritchie46/polars

[1] Polars Documentation and GitHub repository: https://github.com/ritchie46/polars

原文标题:Make Pandas 3 Times Faster with PyPolars,作者:Satyam Kumar

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

【编辑推荐】

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区
  2. 你需要了解的五个DevSecOps开源项目
  3. 数据中心转向绿色能源为新设施供电
  4. 数据清理中存在的问题及对策
  5. 拆解高频面试题:你是如何理解单向数据流的?
  6. 大数据能给企业带来什么?这些你得知道!
【责任编辑:华轩 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

带你轻松入门 RabbitMQ

带你轻松入门 RabbitMQ

轻松入门RabbitMQ
共4章 | loong576

44人订阅学习

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

14人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

42人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微