在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
相关产品推荐
相关产品推荐

