You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Polars中如何完美复刻Pandas的expanding功能?

Polars实现累积最小值(对应Pandas expanding.min())的最优方案

在Polars中,实现从第0行到当前行的累积最小值,最优方案是使用**cum_min()**方法——这是官方提供的稳定、高效的原生API,完美匹配需求且支持惰性DataFrame。

示例代码

首先定义示例数据:

import polars as pl

data = {
    "prices": [100, 99, 101, 98, 103, 109, 102, 78, 101],
}
df = pl.DataFrame(data)

立即执行模式(Eager DataFrame)

result = df.with_columns(
    cumulative_min=pl.col("prices").cum_min()
)
print(result)

输出结果:

shape: (9, 2)
┌────────┬───────────────┐
│ prices ┆ cumulative_min│
│ ---    ┆ ---           │
│ i64    ┆ i64           │
╞════════╪═══════════════╡
│ 100    ┆ 100           │
│ 99     ┆ 99            │
│ 101    ┆ 99            │
│ 98     ┆ 98            │
│ 103    ┆ 98            │
│ 109    ┆ 98            │
│ 102    ┆ 98            │
│ 78     ┆ 78            │
│ 101    ┆ 78            │
└────────┴───────────────┘

惰性模式(Lazy DataFrame)

完全支持延迟计算,无需提前知晓数据集行数:

lazy_df = pl.LazyFrame(data)
lazy_result = lazy_df.with_columns(
    cumulative_min=pl.col("prices").cum_min()
).collect()
print(lazy_result)

输出结果与立即执行模式一致。

方案优势

  • 稳定可靠:cum_min()是Polars官方稳定API,无文档标注的“不稳定”风险
  • 性能优异:底层为矢量化优化实现,远优于通用的cumulative_eval方案
  • 适配惰性计算:不依赖数据集行数,完美支持LazyFrame的延迟计算逻辑,适合处理大规模数据

对比原有方案的问题

  • rolling_min(window_size=df.height):需要提前获取DataFrame行数,无法适配惰性模式,且逻辑上属于“滚动窗口”的hack用法,并非原生累积计算
  • cumulative_eval(pl.element().min()):属于通用累积计算接口,性能不如专门的cum_min(),且文档明确标注为不稳定特性

内容的提问来源于stack exchange,提问作者FredMaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:02:37