要点:从 Polars 1.6 开始,你可以原生创建漂亮的图表,无需 pandas、NumPy 或 PyArrow。
背景:“抱歉,我们只支持 pandas”
近来 Polars 越来越受关注。转向 Polars 的用户有时会遇到一个问题:自己喜欢的一些库仍然只支持 pandas。幸运的是,我们最近看到越来越多热门库,例如 scikit-learn 和 Pandera,开始支持 Polars。今天要介绍的 Altair 不仅加入了对 Polars 的原生支持,还把其他重量级依赖——pandas、NumPy 和 PyArrow——全部改成了可选项。
Altair 支持 Polars 的历程
Altair 最早在 2023 年初加入了对 Polars 的支持。当时的思路是:
- Altair 已经支持 pandas。
- Altair 加入对 PyArrow 的支持。如果用户传入的对象既不是 PyArrow 也不是 pandas,就尝试用不同方法将其转换为 PyArrow。
- 完成转换后,数据沿 PyArrow 的处理路径继续执行。
这已经改善了使用体验:让 Polars DataFrame 在 Altair 中“直接可用”,比每次都显式调用 to_pandas 或 to_arrow 更方便。不过,这种方式仍存在一些限制:
- 某些转换为 PyArrow 的方法,对于
Date或List等数据类型并不可靠。 - Polars 用户必须安装 PyArrow 这一依赖。
- 转换为 PyArrow 通常很快,但并非始终如此,尤其是数据中有许多字符串列时。
Altair 开发者希望进一步改善非 pandas 用户的体验,但不想通过专门的 Polars 处理路径使代码库更加复杂。他们希望数据框逻辑只写一次,就能处理多种输入;他们在一个名为 Narwhals 的新库中找到了答案。
Narwhals:面向工具构建者的工具
你很可能从未听说过 Narwhals,因为它面向工具构建者,而不是最终用户。具体来说,它让库维护者支持多种数据框库作为输入,同时不强制依赖其中任何一个。Narwhals 的设计目标是尽可能轻量、尽可能减少额外开销,而且没有必需的依赖。
它的思路是:
- 用 Narwhals API 编写一次数据框逻辑。这套 API 是 Polars API 的一个精简子集。
- 如果用户传入“数据框 X”,所有计算都使用数据框 X 进行,用户得到的也是来自“数据框 X”的对象。
- pandas 用户不必安装 Polars,Polars 用户也不必安装 pandas,其他库同理。
从最终用户的角度看,Narwhals 仿佛不存在:他们像往常一样传入 pandas、Polars、PyArrow 等对象,一切就能正常工作。在底层,工具通过 Narwhals 以不依赖特定数据框实现的方式支持它们,同时不要求安装任何一种。
这能显著减轻库维护者的维护负担。他们大概更愿意花时间思考自己库的独特优势,而不是为各种数据框库 API 之间的细微差异头疼。
新的 Altair 绘图后端实战
下面展示新的绘图后端如何工作:
# Dataset can be found here:
# https://github.com/Mcompetitions/M6-methods/blob/main/assets_m6.csv
(
pl.scan_csv("assets_m6.csv", try_parse_dates=True)
.filter(pl.col("symbol").is_in(["ABBV", "IGF", "XOM"]))
.collect()
.plot.line(x="date", y="price", color="symbol")
)

详细信息请参阅:
hvPlot 仍然可用
在本文发表当年的 2 月,我们为 Polars 引入了调用 hvPlot 的绘图命名空间。那么,以 hvPlot 为后端的 Polars 图表会怎样?
答案是:它们仍然可用。更喜欢 hvPlot 后端的用户,只需要作出以下简单修改即可继续使用:
- 在脚本或 notebook 顶部加入
import hvplot.polars。 - 将
df.plot改写为df.hvplot。
其他一切与 Polars 1.6 之前的版本完全相同。通过计算环境大小,可以看到切换默认绘图后端的效果:采用 Altair 的新后端所需空间接近缩小到原来的五分之一。
| 后端 | 大小 |
|---|---|
| Polars + Altair | 114 MB |
| Polars + HvPlot + PyArrow | 550 MB |
小而轻量的环境有助于有效管理依赖,也更容易部署。此外,不必等待额外库的导入和数据转换,能让使用体验更加顺畅。
结语
将 Polars 的绘图后端切换为 Altair,为需要绘制数据框的用户提供了快速、轻量的体验。
另外,使用 Marimo 和 marimo.ui.altair_chart 的用户也会高兴地发现:Marimo 开发者对这一变化响应非常快,现在也原生支持 Polars!
我们希望,这只是迈向更广泛的数据框无关性的第一步;“我们只支持 pandas”最终会成为过去的问题。
来源:Polars 有了新的轻量绘图后端。作者:Marco Gorelli(Polars 核心开发者;2024年9月4日)。原文版权归原作者或所属机构所有。












暂无评论内容