Polars:Rust中的高性能DataFrame库

Polars是一个用Rust编写的高性能DataFrame库,它利用所有可用的核心,优化查询以最小化不必要的操作,并管理大于RAM的数据集。Polars以其一致的API和严格的模式遵循性,确保了可预测性和可靠性。它提供了C/C++级别的性能,完全控制查询引擎的关键部分,以获得最佳结果。

概述

了解Polars,这是一个在Rust中的高性能DataFrame库。探索Polars利用的Apache Arrow,它为快速数据访问和操作提供了支持。Polars支持延迟优化操作和即时结果,提供了灵活的查询执行方式。揭开Polars的流处理能力,特别是它能够分块处理大型数据集的能力。理解Polars严格的模式,以确保数据完整性和可预测性,最小化运行时错误。

Polars的关键概念

Apache Arrow格式:Polars使用Apache Arrow,这是一种高效的列式内存格式,以实现快速数据访问和操作。这确保了高性能和与其他基于Arrow的系统的无缝互操作性。

延迟与即时执行:它支持延迟执行,推迟操作以进行优化,以及即时执行,立即执行操作。延迟执行优化计算,而即时执行提供即时结果。

流处理:Polars能够处理流数据和分块处理大型数据集。这种方法减少了内存使用,适合实时数据分析

上下文:Polars上下文定义了数据操作的范围,为数据处理工作流程提供了结构和一致性。主要上下文包括选择、过滤和聚合。

表达式:Polars中的表达式代表数据操作,如算术、聚合和过滤。它们允许高效构建复杂的数据处理和其流水线。

严格模式遵循:它执行严格的模式,要求在执行查询之前知道数据类型。这确保了数据完整性,减少了运行时错误。

Python Polars表达式

使用‘pip install polars’安装Polars。可以像在Pandas中一样读取数据并描述它。

import polars as pl df = pl.read_csv('iris.csv') df.head() # 这将显示形状,列的数据类型和前五行 df.describe() # 这将显示列的基本描述性统计

接下来,可以使用基本操作选择不同的列。

df.select(pl.sum('sepal_length').alias('sum_sepal_length'), pl.mean('sepal_width').alias('mean_sepal_width'), pl.max('species').alias('max_species'))

# 返回一个数据框,包含给定的列名和对它们执行的操作。

还可以使用polars.selectors进行选择。

import polars.selectors as cs df.select(cs.float()) # 返回所有浮点数据类型的列 # 也可以搜索带有子字符串或正则表达式的列 df.select(cs.contains('width')) # 返回名称中包含'width'的列

现在可以使用条件语句。

df.select(pl.col('sepal_width'), pl.when(pl.col("sepal_width") > 2) .then(pl.lit(True)) .otherwise(pl.lit(False)) .alias("conditional"))

# 这返回一个额外的列,当sepal_width > 2时,值为布尔值true。

可以在字符串中检查、提取或替换模式。

df_1 = pl.DataFrame({"id": [1, 2], "text": ["123abc", "abc456"]}) df_1.with_columns( pl.col("text").str.replace(r"abc\b", "ABC"), pl.col("text").str.replace_all("a", "-", literal=True).alias("text_replace_all"), )

# 替换一个单词末尾的abc(\b)为ABC,并将所有出现的a替换为-。

过滤列

df.filter(pl.col('species') == 'setosa', pl.col('sepal_width') > 2)

# 返回只有setosa物种的数据,并且sepal_width > 2。

在这个高性能的DataFrame库中进行分组。

df.group_by('species').agg(pl.len(), pl.mean('petal_width'), pl.sum('petal_length'))

上述返回按物种的数量和petal_width的平均值,按物种的petal_length的总和。

连接

除了典型的内连接、外连接和左连接,polars还有‘semi’和‘anti’。让看看‘semi’连接。

df_cars = pl.DataFrame( { "id": ["a", "b", "c"], "make": ["ford", "toyota", "bmw"], } ) df_repairs = pl.DataFrame( { "id": ["c", "c"], "cost": [100, 200], } ) # 现在一个内连接产生多个行,每个车都有多个修理工作 df_cars.join(df_repairs, on="id", how="semi")

# 这为每个进行过修理工作的车产生一个单独的行。

‘anti’连接产生一个DataFrame,显示df_cars中所有ID不在df_repairs DataFrame中的车。

可以用简单的语法连接数据框。

df_horizontal_concat = pl.concat( [ df_h1, df_h2, ], how="horizontal", ) # 这返回一个更宽的数据框 df_horizontal_concat = pl.concat( [ df_h1, df_h2, ], how="vertical", ) # 这返回一个更长的数据框

延迟API

上述示例显示了即时API立即执行查询。另一方面,延迟API在应用各种优化后评估查询,使延迟API成为首选选项。

让看一个例子。

q = ( pl.scan_csv("iris.csv") .filter(pl.col("sepal_length") > 5) .group_by("species") .agg(pl.col("sepal_width").mean()) )

# 没有优化的查询图 - 安装graphviz

q.show_graph(optimized=False)

从下往上读。每个框是查询计划的一个阶段。Sigma代表SELECTION,表示基于过滤条件的选择。Pi代表PROJECTION,表示选择一列子集。

在这里,选择了所有五个列,在读取CSV文件时没有进行选择。然后,按列过滤并依次聚合。

现在,看看优化后的查询计划与q.show_graph(optimized=True)

在这里,只选择了5个中的3个列,因为后续查询只对它们进行。即使在它们中,也根据过滤条件选择数据。现在不加载任何其他数据。现在,可以聚合选定的数据。因此,这种方法要快得多,需要的内存也少得多。

现在可以收集结果了。如果整个数据集不适合内存,可以分批处理数据。

q.collect() # 以分批方式处理 q.collect(streaming=True)

Polars越来越受欢迎,许多库如scikit-learn、seaborn、plotly等都支持Polars。

Polars提供了一个强大的、高性能的DataFrame库,用于速度、效率和可扩展性。具有Apache Arrow集成、延迟和即时执行、流数据处理和严格模式遵循等功能,Polars作为数据专业人员的多功能工具脱颖而出。它一致的API和使用Rust确保了最优性能,使其成为现代数据分析工作流程中的重要工具。

Q1. Python Polars是什么,它与其他DataFrame库如Pandas有何不同?

A. Polars是一个为速度和效率而设计的高性能DataFrame库。与Pandas不同,Polars利用了机器上所有可用的核心,优化查询以最小化不必要的操作,并且可以管理大于RAM的数据集。此外,这个高性能的数据框是用Rust编写的,提供C/C++级别的性能。

Q2. 使用Apache Arrow与Polars结合的关键好处是什么?

A. Polars使用Apache Arrow,这是一种高效的列式内存格式,可以快速访问和操作数据。这种集成确保了高性能和与其他基于Arrow的系统的无缝互操作性,使其成为高效处理大型数据集的理想选择。

Q3. Polars中延迟执行和即时执行的区别是什么?

A. Polars中的延迟执行推迟操作以进行优化,允许系统在执行之前优化整个查询计划,这可能导致显著的性能提升。另一方面,即时执行立即执行操作,提供即时结果,但没有同样的优化水平。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485