大家好,Pandas是数据科学中必不可少的Python库,但其最大的缺点是对大型数据集的操作速度较慢。Polars是一种旨在更快地处理数据的Pandas替代方案。
本文将简要介绍Polars Python包,并将其与流行的数据科学库Pandas在语法和速度方面进行比较。
Polars简介
根据Polars的用户指南,其目标是“提供一个利用计算机上所有可用核心的闪电般快速的DataFrame库。”
与Polars不同,Pandas不会在计算机核心之间进行原生的并行处理。其他工具如Dask是建立在Pandas库的基础上尝试进行并行处理。相反,Polars是专为并行化而设计的,并从头开始搭建。虽然它是用Rust编写的,但Polars有一个Python包,这使得它成为Pandas的潜在替代方案。
Polars有两种不同的API:急切API和惰性API。
急切的执行方式类似于Pandas。这意味着直接运行代码,并立即返回结果。
另一方面,惰性执行是在你需要结果时才运行。由于它避免了运行不必要的代码,因此惰性执行可以比急切执行更高效。
对于惰性执行,必须使用.lazy()
方法开始操作。然后可以为你想做的任何事情编写要执行的代码。最后需要运行.collect()
方法来显示结果。
df.lazy()
.with_columns([(pl.col("col") * 10).alias("new_col")])
#...
.collect()
如果你不运行.collect()
方法,则不会立即执行操作。相反,你将看到执行图。
基准测试设置
本基准测试设置使用了一个虚构的数据集,其中包含每种数据类型的一列。为了减少时间上的噪声以便进行比较,该虚构数据集包含400万行,几乎有1GB大小,正如所建议的那样。
在下文中,我们将使用%%timeit -n32 -r4
对执行进行计时。
使用Polars
要设置Polars,只需使用pip
安装它。
pip install polars
之后,可以像使用Pandas一样导入Polars Python包。
import polars as pl
import pandas as pd
Pandas和Polars比较
Pandas和Polars(急切API)在语法方面看起来很相似,因为它们具有共享的主要搭建模块:Series和DataFrames。
此外,Polars中的许多表达式也与Pandas表达式相似:
# 适用于Pandas和Polars的示例表达式
df.head() # 获取前n行的数据
df.tail() # 获取最后n行的数据
df.unique() # 获取此表达式的唯一值。
但是,根据Polars用户指南,“如果你的Polars代码看起来像是Pandas代码,它可能会运行,但很可能比它应该运行的速度慢。”
-
读取数据
在Polars中读取CSV文件会感觉很熟悉,因为可以像在Pandas中一样使用.read_csv()
方法:
# Pandas
pd.read_csv('example.csv')
# Polars
pl.read_csv('example.csv')
在Pandas和Polars中读取样本数据集的结果执行时间如下所示:
对于我们的样本数据集,使用Pandas读取数据比使用Polars慢8倍左右。
-
选择和过滤数据
Pandas和Polars之间的第一个主要区别是Polars不使用索引。相反,每行都以其在DataFrame中的整数位置为索引。
虽然相同的Pandas代码也可以在Polars中运行,但这并不是最佳实践。在Polars中,应该使用.select()
方法来选择数据。
# Pandas
df[['col1', 'col2']]
# 上述代码也可以在Polars中运行,
# 但在Polars中的正确方式是:
df.select(pl.col(['col1', 'col2']))
在Pandas和Polars中选择数据的执行时间结果显示如下:
对于我们的样本数据集,使用Pandas选择数据比使用Polars慢15倍左右(约为70.3微秒)。
下面比较了在文档中建议的Polars操作语法(使用.select()
,左侧)和Pandas语法(使用df[['col1','col2']]
,右侧)。令人意外的是,Pandas语法比建议的.select()
方法快得多。
在Pandas中,你可以使用.query()
方法过滤数据,但在Polars中需要使用.filter()
方法。
# Pandas
df.query('col1 > 5')
# Polars
df.filter(pl.col('col') > 5)
在Pandas和Polars中过滤数据的执行时间结果显示如下:
对于我们的样本数据集,使用Pandas和Polars过滤数据的时间大致相同。
与Pandas不同,Polars可以在.select()
和.filter()
中并行运行操作。
-
创建新列
在Polars中创建新列也与在Pandas中使用的方式有所不同。在Polars中,需要使用.with_column()
或.with_columns()
方法,具体取决于你要创建多少列。
# Pandas
df_pd["new_col"] = df_pd["col"] * 10
# Polars
df.with_columns([(pl.col("col") * 10).alias("new_col")])
# 多列的Polars
# df.with_columns([(pl.col("col") * 10).alias("new_col"), ...])
在Pandas和Polars中创建一个新列的结果执行时间如下:
对于我们的样本数据集,在Polars中创建新列需要比Pandas长两倍左右的时间。
-
分组和聚合
在Pandas和Polars中,分组和聚合在语法上略有不同,但两者都使用.groupby()
和.agg()
方法。
# Pandas
df_pd.groupby('col1')['col2'].agg('mean')
# Polars
# df.groupby('col1').agg([pl.col('col2').mean()]) # 建议使用的Polars方法
df.groupby('col1').agg([pl.mean('col2')]) # 简短的语法
在Pandas和Polars中对数据进行分组和聚合的执行时间如下:
对于我们的样本数据集,使用Pandas聚合数据需要比使用Polars长两倍左右的时间。
总结
Polars相对于Pandas的主要优势是速度。如果你需要在大型数据集上进行大量数据处理,那么你肯定应该尝试Polars。
但是,正如本文所示,如果要从Pandas切换到Polars,则需要学习新的Polars语法。此外,你已经看到,对于相同的操作,Polars代码通常要比Pandas代码长。并且,Polars并没有涵盖Pandas的所有功能,例如用于数据探索等。
因此,如果你需要使用Pandas提供的所有功能,则可能需要继续使用Pandas,Polars的代码通常比Pandas的代码长。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: iOS 缩放等级 Set the Zoom Level of an MKMapView
Set the Zoom Level of an MKMapView http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/ If you have ever built a …