Python Polars中rolling_product需求及rolling_sum的Git位置查询
Polars 滚动乘积实现与 rolling_sum 源码位置
一、高性能滚动乘积实现
直接用rolling_apply自定义乘积会因Python层循环导致性能极差,推荐借助对数求和+指数还原的方式复用原生rolling_sum,性能与原生窗口函数一致:
代码示例
import polars as pl def rolling_prod(df: pl.DataFrame, col: str, window_size: int) -> pl.DataFrame: return df.with_columns( pl.col(col) .log() .rolling_sum(window_size=window_size) .exp() .alias(f"{col}_rolling_prod") ) # 测试用例 df = pl.DataFrame({"val": [2, 3, 4, 5, 6]}) print(rolling_prod(df, "val", 3))
特殊值处理
如果列包含0或负数,需额外处理:
- 0:可通过条件判断标记后单独处理,避免对数报错
- 负数:提取符号的滚动计数(奇偶性决定最终符号),对绝对值执行上述对数乘积逻辑,最后还原符号
二、原生 rolling_product 状态
截至Polars v0.20+版本,官方未提供原生rolling_product函数,上述方法是当前最优的高性能替代方案。
三、rolling_sum 源码位置
Polars核心窗口函数基于Rust实现,Python仅为绑定层:
- Rust核心逻辑:
polars/polars-core/src/series/rolling/mod.rs - 求和具体实现:同目录下的
functions.rs文件中 - Python接口定义:
polars/polars-python/src/functions/rolling.py
内容的提问来源于stack exchange,提问作者user21703458
相关产品推荐
相关产品推荐

