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

基于Polars的时间序列路径依赖事件结果计算及优化问询

优化Polars事件结果计算(避免高资源消耗)

现有数据结构

我们有一个包含3个事件的Polars DataFrame,字段定义如下:

  • timestamp:实际时间戳
  • threshold:事件周期内value需达到或超过的阈值
  • value:各时间戳对应的数值(允许重复)
  • event:二进制列,标识该时间戳是否生成事件
  • start_ts:事件起始时间戳(例如start_ts=1表示事件始于timestamp=1结束时、timestamp=2开始时)
  • end_ts:事件结束时间戳
  • event_id:事件唯一标识符
  • event_span:事件覆盖的时间戳数量

需求

需要新增两个计算字段:

  1. event_outcome:二进制值,标记事件周期内value是否达到对应threshold
  2. event_outcome_timestamp:事件周期内value首次达到threshold的时间戳

附加说明

  • 事件0覆盖时间戳范围[2,3,4,5,6],事件1覆盖[6,7,8],事件2无覆盖范围
  • 事件不会超出现有数据范围(end_ts ≤ 最大timestamp)

当前痛点

现有实现需要生成事件全路径值,在事件重叠场景下资源消耗极高,寻求更优方案。


优化实现方案

核心思路是利用Polars的窗口函数和条件连接,避免展开所有事件-时间戳组合,大幅降低内存占用。

步骤1:预处理时间戳数据

先提取所有有效时间戳的value和timestamp,为后续匹配做准备:

import polars as pl

# 假设原始DataFrame名为df
timestamp_data = df.select("timestamp", "value").unique()

步骤2:计算每个事件的结果

通过join_asof高效匹配事件时间范围内的时间戳,再分组聚合得到结果:

result_df = (
    df
    # 过滤出事件行,非事件行后续统一处理
    .filter(pl.col("event") == 1)
    # 用asof join匹配事件时间范围内的所有时间戳
    .join_asof(
        timestamp_data,
        left_on="start_ts",
        right_on="timestamp",
        direction="forward"
    )
    .filter(pl.col("timestamp") <= pl.col("end_ts"))
    # 按event_id分组,计算事件结果
    .group_by("event_id")
    .agg(
        # 标记事件是否达标
        pl.when(pl.col("value") >= pl.col("threshold")).any().alias("event_outcome"),
        # 取首次达标的时间戳,未达标则为None
        pl.when(pl.col("value") >= pl.col("threshold"))
          .select("timestamp")
          .min()
          .alias("event_outcome_timestamp")
    )
    # 合并回原始DataFrame
    .join(df, on="event_id", how="right")
    # 处理无覆盖范围的事件
    .with_columns(
        pl.when(pl.col("event_span") == 0)
          .then(0)
          .otherwise(pl.col("event_outcome"))
          .alias("event_outcome"),
        pl.when(pl.col("event_span") == 0)
          .then(None)
          .otherwise(pl.col("event_outcome_timestamp"))
          .alias("event_outcome_timestamp")
    )
    # 恢复原始列顺序(可选)
    .select(df.columns + ["event_outcome", "event_outcome_timestamp"])
)

方案优势

  1. 避免全路径展开:通过join_asof仅匹配事件时间范围内的时间戳,而非生成所有可能的组合,内存占用大幅降低
  2. 高效聚合:利用Polars的分组聚合能力,直接计算每个事件的结果,无需冗余中间表
  3. 边界处理完善:自动处理无覆盖范围的事件(event_span=0),确保结果完整性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:53:24