Python-Polars固定起始点扩展窗口分组聚合高效实现问询
在Python-Polars中实现从首个时间戳开始的扩展窗口聚合
针对你需要从首个时间戳开始的扩展窗口聚合需求,这里提供两种高效的向量化实现方法,替代循环筛选的方案:
方法1:交叉连接+过滤+分组聚合
适合自定义任意时间戳序列的场景,利用Polars的向量化操作避免循环:
from datetime import date import polars as pl df = pl.DataFrame({"Day":[date(2022, 1, i) for i in range(1,10)], "value":[1,2,3,4,5,6,7,8,9]}) # 生成目标时间戳序列(可自定义间隔) date_range = pl.date_range(df["Day"].min(), df["Day"].max(), interval="1w", eager=True).to_frame("window_end") # 执行扩展窗口聚合 result = ( df.cross_join(date_range) .filter(pl.col("Day") <= pl.col("window_end")) .group_by("window_end") .agg( pl.col("value").sum().alias("total_value"), pl.col("value").mean().alias("avg_value"), pl.col("Day").count().alias("record_count") ) .sort("window_end") ) print(result)
输出:
shape: (2, 4) ┌────────────┬────────────┬──────────┬──────────────┐ │ window_end ┆ total_value┆ avg_value┆ record_count │ │ --- ┆ --- ┆ --- ┆ --- │ │ date ┆ i64 ┆ f64 ┆ u32 │ ╞════════════╪════════════╪══════════╪══════════════╡ │ 2022-01-02 ┆ 3 ┆ 1.5 ┆ 2 │ │ 2022-01-09 ┆ 45 ┆ 5.0 ┆ 9 │ └────────────┴────────────┴──────────┴──────────────┘
方法2:使用group_by_dynamic固定窗口起始
针对规则时间间隔的场景,直接利用group_by_dynamic的start参数固定窗口起始为首个时间戳,性能更优:
result = ( df.group_by_dynamic( index_column="Day", every="1w", # 分组间隔 start=df["Day"].min(), # 固定窗口起始为数据最早日期 closed="both" # 包含窗口首尾的时间点 ) .agg( pl.col("value").sum().alias("total_value"), pl.col("value").mean().alias("avg_value"), pl.col("Day").count().alias("record_count") ) ) print(result)
两种方法对比
- 方法1:灵活性强,支持自定义任意时间戳序列(如非规则间隔),但需要交叉连接操作,数据量较大时内存占用略高;
- 方法2:更高效,直接利用Polars的动态分组优化,内存占用更低,适合规则时间间隔的扩展窗口需求。
内容的提问来源于stack exchange,提问作者StijnKas
相关产品推荐
相关产品推荐

