快速入门

安装

采用 pip install 即可安装 Polars

$ pip install polars

所有的二进制包都是基于 Python v3.6+ 构建的。

实例

下面的例子中我们读入并解析一个 CSV 文件,过滤后紧跟一个 groupby 分组求和操作(该例子仅在Python中演示,因为对于Rust而言,即时执行的API并不推荐):

import polars as pl

df = pl.read_csv("https://j.mp/iriscsv")
print(df.filter(pl.col("sepal_length") > 5)
      .groupby("species")
      .agg(pl.all().sum())
)

上面的代码输出如下:

shape: (3, 5)
╭──────────────┬──────────────────┬─────────────────┬──────────────────┬─────────────────╮
│ species      ┆ sepal_length_sum ┆ sepal_width_sum ┆ petal_length_sum ┆ petal_width_sum │
│ ---          ┆ ---              ┆ ---             ┆ ---              ┆ ---             │
│ str          ┆ f64              ┆ f64             ┆ f64              ┆ f64             │
╞══════════════╪══════════════════╪═════════════════╪══════════════════╪═════════════════╡
│ "virginica"  ┆ 324.5            ┆ 146.2           ┆ 273.1            ┆ 99.6            │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ "versicolor" ┆ 281.9            ┆ 131.8           ┆ 202.9            ┆ 63.3            │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ "setosa"     ┆ 116.9            ┆ 81.7            ┆ 33.2             ┆ 6.1             │
╰──────────────┴──────────────────┴─────────────────┴──────────────────┴─────────────────╯

如上所示, Polars 可以格式化输出,包括作为表头的列名和数据类型。

延迟执行示例

上面的例子我们也可以采用延迟执行方式执行:

import polars as pl

print(
    pl.read_csv("https://j.mp/iriscsv")
    .lazy()
    .filter(pl.col("sepal_length") > 5)
    .groupby("species")
    .agg(pl.all().sum())
    .collect()
)

如果数据文件保存在本地,我们还可以使用 scan_csv 来实现延迟执行查询。

参考

Python API 可以参考:Fix Me.

延迟执行 API

延迟执行 API 会构建一个查询计划。在调用 LazyFrame.collect() 或者 LazyFrame.fetch() 之前,Polars 不会执行任何操作。这种方式可以让 Polars 了解查询的所有操作,并依据这些操作进行优化并选择最佳的算法执行。

从即时执行变更为延迟执行非常简单,只需要在已有调用基础上添加 .lazy().collect() 即可。

正如之前看到的例子一样:

import polars as pl

print(
    pl.read_csv("https://j.mp/iriscsv")
    .lazy()
    .filter(pl.col("sepal_length") > 5)
    .groupby("species")
    .agg(pl.all().sum())
    .collect()
)