Polars 有了新的轻量绘图后端

要点:从 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")
)
在 Polars 中使用 Altair 绘制的折线图。
在 Polars 中使用 Altair 绘制的折线图。

详细信息请参阅:

hvPlot 仍然可用

在本文发表当年的 2 月,我们为 Polars 引入了调用 hvPlot 的绘图命名空间。那么,以 hvPlot 为后端的 Polars 图表会怎样?

答案是:它们仍然可用。更喜欢 hvPlot 后端的用户,只需要作出以下简单修改即可继续使用:

  • 在脚本或 notebook 顶部加入 import hvplot.polars。
  • 将 df.plot 改写为 df.hvplot。

其他一切与 Polars 1.6 之前的版本完全相同。通过计算环境大小,可以看到切换默认绘图后端的效果:采用 Altair 的新后端所需空间接近缩小到原来的五分之一。

后端大小
Polars + Altair114 MB
Polars + HvPlot + PyArrow550 MB

小而轻量的环境有助于有效管理依赖,也更容易部署。此外,不必等待额外库的导入和数据转换,能让使用体验更加顺畅。

结语

将 Polars 的绘图后端切换为 Altair,为需要绘制数据框的用户提供了快速、轻量的体验。

另外,使用 Marimo 和 marimo.ui.altair_chart 的用户也会高兴地发现:Marimo 开发者对这一变化响应非常快,现在也原生支持 Polars!

我们希望,这只是迈向更广泛的数据框无关性的第一步;“我们只支持 pandas”最终会成为过去的问题。


来源:Polars 有了新的轻量绘图后端。作者:Marco Gorelli(Polars 核心开发者;2024年9月4日)。原文版权归原作者或所属机构所有。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容