版本 0.19
重大变更
聚合函数不再支持水平计算
这影响了像sum、min和max这样的聚合函数。这些函数被重载以支持垂直和水平计算。最近,发布了新的专门用于水平计算的功能,并且水平计算已被弃用。
通过使用水平变体恢复旧行为,例如 sum_horizontal。
示例
之前:
>>> df = pl.DataFrame({'a': [1, 2], 'b': [11, 12]})
>>> df.select(pl.sum('a', 'b')) # horizontal computation
shape: (2, 1)
┌─────┐
│ sum │
│ --- │
│ i64 │
╞═════╡
│ 12 │
│ 14 │
└─────┘
之后:
>>> df = pl.DataFrame({'a': [1, 2], 'b': [11, 12]})
>>> df.select(pl.sum('a', 'b')) # vertical computation
shape: (1, 2)
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 3 ┆ 23 │
└─────┴─────┘
更新到 all / any
all 现在默认会忽略空值,而不是将它们视为 False。
对于any和all,drop_nulls参数已更名为ignore_nulls,并且现在仅为关键字参数。此外,修复了在某些情况下将此参数设置为False时错误地导致None输出的问题。
要恢复旧的行为,请将ignore_nulls设置为False并检查None输出。
示例
之前:
>>> pl.Series([True, None]).all()
False
之后:
>>> pl.Series([True, None]).all()
True
许多方法的错误类型改进
改进我们的错误信息是一个持续的努力。我们对Python代码库进行了一次全面检查,并对错误信息和错误类型进行了许多改进。最值得注意的是,许多ValueError被更改为TypeError。
如果你的代码依赖于处理Polars异常,你可能需要进行一些调整。
示例
之前:
>>> pl.Series(values=15)
...
ValueError: Series constructor called with unsupported type; got 'int'
之后:
>>> pl.Series(values=15)
...
TypeError: Series constructor called with unsupported type 'int' for the `values` parameter
表达式输入解析的更新
像select和with_columns这样的方法接受一个或多个表达式。但它们也接受字符串、整数、列表和其他我们尝试解释为表达式的输入。我们更新了内部逻辑,以更一致地解析输入。
示例
之前:
>>> pl.DataFrame({'a': [1, 2]}).with_columns(None)
shape: (2, 1)
┌─────┐
│ a │
│ --- │
│ i64 │
╞═════╡
│ 1 │
│ 2 │
└─────┘
之后:
>>> pl.DataFrame({'a': [1, 2]}).with_columns(None)
shape: (2, 2)
┌─────┬─────────┐
│ a ┆ literal │
│ --- ┆ --- │
│ i64 ┆ null │
╞═════╪═════════╡
│ 1 ┆ null │
│ 2 ┆ null │
└─────┴─────────┘
shuffle / sample 现在使用内部 Polars 种子
如果你使用了内置的Python random.seed 函数来控制Polars表达式的随机性,这将不再有效。相反,请使用新的 set_random_seed 函数。
示例
之前:
import random
random.seed(1)
之后:
import polars as pl
pl.set_random_seed(1)
弃用
创建一个一致且直观的API是困难的;为每个函数、方法和参数找到合适的名称可能是最困难的部分。新版本带来了几个命名更改,当你升级到0.19时,很可能会遇到弃用警告。
如果你想现在升级而不必担心弃用警告,可以在代码中添加以下片段:
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
groupby 重命名为 group_by
这不是我们轻易做出的改变,因为它将影响我们几乎所有的用户。但“group by”实际上是两个不同的词,我们的命名策略规定这些词应该用下划线分隔。
很可能,一个简单的搜索和替换就足以处理这个更新:
- 搜索:
.groupby( - 替换:
.group_by(
apply 重命名为 map_*
apply 可能是我们 API 中最被误用的部分。许多 Polars 用户来自 pandas,在 pandas 中
apply 有着完全不同的含义。
我们现在将所有用户定义的功能整合在map名称下。这导致了以下的重命名:
| Before | After |
|---|---|
Series/Expr.apply |
map_elements |
Series/Expr.rolling_apply |
rolling_map |
DataFrame.apply |
map_rows |
GroupBy.apply |
map_groups |
apply |
map_groups |
map |
map_batches |