使用 Polars 进行高性能数据处理:KDnuggets 速查表

💡 原文英文,约500词,阅读约需2分钟。
📝

内容提要

Polars 是基于 Rust 和 Apache Arrow 的 DataFrame 库,其速度源于表达式模型:查询引擎自动规划并多核执行。scan_csv 支持延迟读取,collect 时才执行并优化;流式引擎可处理超内存数据。over 实现窗口聚合,需区分 null 与 NaN。速查表涵盖 select、filter、group_by、join、str/dt 命名空间及 sink_parquet 等核心功能。

🔎

延伸解读

表达式模型:性能提升的关键

Polars 的速度并非单纯来自 Rust,而是源于表达式模型。用户将操作描述为表达式,查询引擎自动规划执行,利用多核并行并跳过不必要的列。这种设计让优化器能进行谓词下推等优化,从而大幅提升效率。理解这一点有助于写出更高效的代码。

延迟执行与流式处理

scan_csv 与 collect 的配合体现了延迟执行:scan_csv 只读取表头,后续操作只是意图描述,直到 collect 才真正执行并优化。对于超出内存的数据集,collect(engine="streaming") 可以分块处理,避免内存不足。这为处理大规模数据提供了可行方案。

窗口函数 over 的便捷性

over 是窗口函数,按组聚合但为每行返回结果,无需先 groupby 再 join。例如计算每个区域在其总量中的占比,或组内排名,都可以直接通过表达式完成。这简化了常见分析任务,减少了代码复杂度。

null 与 NaN 的区分

在 Polars 中,null 表示缺失值,而 NaN 是实际的浮点数。两者状态不同,处理方法也不同。混淆它们可能导致错误结果,因此需要明确区分。这是初学者常犯的错误,值得特别注意。

Q&A

Polars 为什么比 Pandas 快?

Polars 的速度主要来自其表达式模型:用户将操作描述为表达式,查询引擎自动规划并利用所有可用核心执行,同时跳过不必要的列。它基于 Rust 和 Apache Arrow 内存格式,但速度更多源于模型而非语言本身。

scan_csv 和 read_csv 有什么区别?

read_csv 会立即将文件读入内存,而 scan_csv 只读取表头并延迟执行。后续操作只是描述意图,直到调用 collect 才会执行,这给了优化器机会将过滤条件下推到文件本身,并只读取管道实际使用的列。

Polars 如何处理大于内存的数据集?

可以使用 collect(engine="streaming") 以流式方式分块处理数据,而不是一次性加载全部数据,从而支持超出内存大小的文件。

Polars 中的 over 是做什么的?

over 是一个窗口函数,它对每个分组执行聚合,但为每一行返回一个值。例如计算每个区域在其自身总计中的份额,或在类别内排名,无需使用 groupby 再 join 的繁琐操作。

Polars 中 null 和 NaN 有什么区别?

在 Polars 中,null 表示缺失值,而 NaN 是一个实际的浮点数值。它们是不同的状态,有各自的方法,不能混为一谈。

Polars 速查表涵盖了哪些核心功能?

速查表涵盖了核心动词 select、filter、with_columns;分组与重塑 group_by、agg、pivot、unpivot;条件逻辑 when/then/otherwise;连接包括 semi 和 anti 变体;.str 和 .dt 命名空间;输出方面有 sink_parquet 可直接从惰性帧写入而不物化;还有 to_pandas 和 to_arrow 用于与 Pandas 和 Arrow 互操作。

🏷️

标签

➡️

继续阅读