Polars是一个用Rust编写的高性能DataFrame库,它利用所有可用的核心,优化查询以最小化不必要的操作,并管理大于RAM的数据集。Polars以其一致的API和严格的模式遵循性,确保了可预测性和可靠性。它提供了C/C++级别的性能,完全控制查询引擎的关键部分,以获得最佳结果。
了解Polars,这是一个在Rust中的高性能DataFrame库。探索Polars利用的Apache Arrow,它为快速数据访问和操作提供了支持。Polars支持延迟优化操作和即时结果,提供了灵活的查询执行方式。揭开Polars的流处理能力,特别是它能够分块处理大型数据集的能力。理解Polars严格的模式,以确保数据完整性和可预测性,最小化运行时错误。
Apache Arrow格式:Polars使用Apache Arrow,这是一种高效的列式内存格式,以实现快速数据访问和操作。这确保了高性能和与其他基于Arrow的系统的无缝互操作性。
延迟与即时执行:它支持延迟执行,推迟操作以进行优化,以及即时执行,立即执行操作。延迟执行优化计算,而即时执行提供即时结果。
流处理:Polars能够处理流数据和分块处理大型数据集。这种方法减少了内存使用,适合实时数据分析。
上下文:Polars上下文定义了数据操作的范围,为数据处理工作流程提供了结构和一致性。主要上下文包括选择、过滤和聚合。
表达式: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成为首选选项。
让看一个例子。
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中的延迟执行推迟操作以进行优化,允许系统在执行之前优化整个查询计划,这可能导致显著的性能提升。另一方面,即时执行立即执行操作,提供即时结果,但没有同样的优化水平。