当前位置: 首页 > 科技观察

使用PyPolars让Pandas快三倍_0

时间:2023-03-20 01:50:54 科技观察

Pandas是数据科学家处理数据最重要的Python包之一。Pandas库主要用于数据探索和可视化,自带大量内置函数。Pandas无法处理大型数据集,因为它无法在CPU的所有内核之间扩展或分配进程。为了加快计算速度,您可以使用CPU的所有内核并加快工作流程。有各种开源库,包括Dask、Vaex、Modin、Pandarallel和PyPolars,它们可以在CPU的多个内核上并行处理计算。在本文中,我们将讨论PyPolars库的实现和使用,并将其性能与Pandas库进行比较。什么是PyPolar?PyPolars是一个类似Pandas的开源Python数据框架库。PyPolars利用CPU的所有可用内核,因此处理计算的速度比Pandas快。PyPolars有一个类似Pandas的API。它是用Rust和Python包装器编写的。理想情况下,当数据对Pandas来说太大而对Spark来说太小时,使用PyPolars。PyPolars是如何工作的?PyPolars库有两个API,一个是EagerAPI,另一个是LazyAPI。EagerAPI和PandasAPI非常相似,执行完成后立即得到结果,这一点和Pandas相似。LazyAPI与Spark非常相似,一旦执行查询,就会形成一个映射或方案。然后它在CPU的所有内核上并行执行。图1.PyPolarsAPIPyPolars基本上是Polars库的Python绑定。PyPolars库的好处在于它的API类似于Pandas,这使得开发人员更容易使用。安装:PyPolars可以从PyPl安装:pipinstallpy-polars并导入库:iportpypolarsaspl基准时间约束:为了演示,我使用了一个包含2500万个实例的大型数据集(~6.4Gb)。图2.Pandas和Py-Polars中基本操作的基准时间数字对于上述使用Pandas和PyPolars库的一些基本操作的基准时间数字,我们可以观察到PyPolars几乎比Pandas快2到3倍。现在我们知道PyPolars有一个与Pandas非常相似的API,但它仍然没有涵盖Pandas的所有功能。例如,PyPolars中没有.describe()函数,我们可以使用df_pypolars.to_pandas().describe()代替。使用方法:importpandasaspdimportnumpyasnpimportpypolarsasplimporttimeWARNING!py-polarswasrenamedtopolars,pleaseinstallpolars!https://pypi.org/project/polars/path="data.csv"读取数据:s=time.time()df_pandas=pd.read_csv(path)e=time.time()pd_time=e-sprint("PandasLoadingTime={}".format(pd_time))C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071:DtypeWarning:Columns(2、7、14)有混合类型。在导入器上指定dtype选项setlow_memory=False.has_raised=awaitself.run_ast_nodes(code_ast.body,cell_name,PandasLoadingTime=217.1734380722046s=time.time()df_pypolars=pl.read_csv(路径)e=time.time()pl_time=e-sprint("PyPolarsLoadingTime={}".format(pl_time))PyPolarsLoadingTime=114.0408570766449shape:s=time.time()print(df_pandas.shape)e=time.time()pd_time=e-sprint("PandasShapeTime={}".format(pd_time))(25366521,19)PandasShapeTime=0.0s=time.time()print(df_pypolars.shape)e=time.time()pl_time=e-sprint("PyPolarsShapeTime={}".format(pl_time))(25366521,19)PyPolarsShapeTime=0.0010192394256591797过滤:s=time.time()temp=df_pandas[df_pandas['PAID_AMT']>500]e=time.time()pd_time=e-sprint("PandasFilterTime={}".format(pd_time))PandasFilterTime=0.8010377883911133s=time.time()temp=df_pypolars[df_pypolars['PAID_AMT']>500]e=time.time()pl_time=e-sprint("PyPolarsFilterTime={}".format(pl_time))PyPolarsFilterTime=0.7790462970733643Groupby:s=time.time()temp=df_pandas.groupby(by="MARKET_SEGMENT").agg({'PAID_AMT':np.sum,'QTY_DISPENSED':np.mean})e=time.time()pd_time=e-sprint("PandasGroupByTime={}".format(pd_time))PandasGroupByTime=3.5932095050811768s=time.time()temp=df_pypolars.groupby(by="MARKET_SEGMENT").agg({'PAID_AMT':np.sum,'QTY_DISPENSED':np.mean})e=time.time()pd_time=e-sprint("PyPolarsGroupByTime={}".format(pd_time))PyPolarsGroupByTime=1.2332513110957213运费数:%%times=time.time()temp=df_pandas['PAID_AMT'].apply(round)e=time.time()pd_time=e-sprint("PandasLoadingTime={}".format(pd_time))PandasLoadingTime=13.081078290939331Walltime:13.1ss=time.time()temp=df_pypolars['PAID_AMT'].apply(round)e=time.time()pd_time=e-sprint("PyPolarsLoadingTime={}".format(pd_time))PyPolarsLoadingTime=6.03610580444336计算:%%times=time.time()temp=df_pandas['MARKET_SEGMENT'].value_counts()e=time.time()pd_time=e-sprint("PandasValueCountsTime={}".format(pd_time))PandasValueCountsTime=2.8194501399993896Walltime:2.82s%%times=time.time()temp=df_pypolars['MARKET_SEGMENT'].value_counts()e=time.time()pd_time=e-sprint("PyPolarsValueCountsTime={}".format(pd_time))PyPolarsValueCountsTime=1.7622406482696533Walltime:1.76s描述:%%times=time.time()temp=df_pandas.describe()e=time.time()pd_time=e-sprint("PandasDescribeTime={}".format(pd_time))PandasDescribeTime=15.48347520828247Walltime:15.5s%%times=time.time()temp=df_pypolars[temp_cols].to_pandas().describe()e=time.time()pd_time=e-sprint("PyPolarsDescribeTime={}".format(pd_time))PyPolarsDescribeTime=44.31892013549805Walltime:44.3s去重:%%times=time.time()temp=df_pandas['MARKET_SEGMENT'].unique()e=time.time()pd_time=e-sprint("PandasUniqueTime={}".format(pd_time))PandasUniqueTime=2.1443397998809814Walltime:2.15s%%times=时间。time()temp=df_pypolars['MARKET_SEGMENT'].unique()e=time.time()pd_time=e-sprint("PyPolarsUniqueTime={}".format(pd_time))PyPolarsUniqueTime=1.0320448875427246Walltime:1.03s保存数据:s=time.time()df_pandas.to_csv("delete_1May.csv",index=False)e=time.time()pd_time=e-sprint("PandasSavingTime={}".format(pd_time))PandasSavingTime=779.0419402122498s=time.time()df_pypolars.to_csv("delete_1May.csv")e=time.time()pd_time=e-sprint("PyPolarsSavingTime={}".format(pd_time))PyPolarsSavingTime=439.16817021369934结论我们在这篇文章中简要介绍介绍PyPolars库,包括其实现、使用和结果,将其基准时间数字与Pandas进行一些基本操作的比较请注意,PyPolars的工作方式与Pandas非常相似,PyPolars是一个内存高效的库,因为它支持的内存是不可变内存。您可以阅读文档以了解有关该库的更多信息。还有各种其他开源库可以并行化Pandas操作并加快流程。参考资料:Polars文档和GitHub仓库:https://github.com/ritchie46/polars[1]Polars文档和GitHub仓库:https://github.com/ritchie46/polars原标题:MakePandasFaster3TimeswithPyPolars,作者:萨蒂亚姆·库马尔