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

Polars中如何生成后续X行滚动窗口的最大、最小及平均值?

解决Polars中计算后续X个元素统计值的问题

要实现计算某列后续X个元素的最大值、最小值和平均值,无需用shift加滚动的方式(会导致前X行空值),可以用以下两种更直接的方法:

方法一:使用滚动窗口的偏移参数

Polars的rolling_*函数支持通过start和end参数定义窗口相对于当前行的偏移范围。要计算当前行之后的20个元素,窗口范围设置为从当前行的下一行(偏移+1)到当前行+20行,代码示例:

import polars as pl

# 假设df是你的DataFrame,包含price列
df = df.with_columns(
    # 后续20个元素的最大值
    pl.col("price").rolling_max(window_size=20, start=1, end=20).alias("next_20_max"),
    # 后续20个元素的最小值
    pl.col("price").rolling_min(window_size=20, start=1, end=20).alias("next_20_min"),
    # 后续20个元素的平均值
    pl.col("price").rolling_mean(window_size=20, start=1, end=20).alias("next_20_mean")
)
  • 如果希望只有当后续元素数量达到20个时才返回结果(不足则为null),可以添加min_periods=20参数。
  • 这种方法无需翻转数据,执行效率更高,逻辑也更直观。

方法二:翻转DataFrame实现反向滚动

通过翻转DataFrame,将"后续元素"转换为"前序元素",计算常规滚动统计后再翻转回来,代码示例:

# 翻转后计算前向滚动统计,再翻转回原顺序
reversed_df = df.reverse().with_columns(
    pl.col("price").rolling_max(window_size=20, min_periods=20).alias("next_20_max"),
    pl.col("price").rolling_min(window_size=20, min_periods=20).alias("next_20_min"),
    pl.col("price").rolling_mean(window_size=20, min_periods=20).alias("next_20_mean")
).reverse()

# 将统计列合并到原DataFrame
df = df.with_columns(reversed_df.select(pl.exclude("price")))

这种方法适合理解滚动逻辑,缺点是需要两次翻转数据,大数据集下效率略低于方法一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:55:14