ZetCode

Polars 窗口函数

最后修改时间:2025年3月1日

Polars 是一个快速、高效的 Python DataFrame 库。窗口函数用于在滑动或扩展的窗口内分析数据。本教程将通过实际示例介绍如何在 Polars 中使用窗口函数。

窗口函数可用于时间序列分析、移动平均线和累积计算。Polars 提供了 rollingover 等方法来处理这些任务。

滚动窗口:移动平均

此示例显示如何使用滚动窗口计算移动平均。

rolling_window.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)
df = df.with_column(
    pl.col('Values').rolling_mean(window_size=3).alias('MovingAvg')
)

print(df)

rolling_mean(window_size=3) 计算“Values”列的 3 天移动平均。这对于平滑时间序列数据非常有用。

滚动窗口:最小值和最大值

此示例演示了如何计算滚动最小值和最大值。

rolling_min_max.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)
df = df.with_columns([
    pl.col('Values').rolling_min(window_size=3).alias('RollingMin'),
    pl.col('Values').rolling_max(window_size=3).alias('RollingMax')
])

print(df)

rolling_min(window_size=3)rolling_max(window_size=3) 分别计算滚动最小值和最大值。这对于识别趋势非常有用。

扩展窗口:累积总和

此示例显示如何使用扩展窗口计算累积总和。

expanding_sum.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)
df = df.with_column(
    pl.col('Values').cumsum().alias('CumulativeSum')
)

print(df)

cumsum 计算“Values”列的累积总和。这对于跟踪累积总量非常有用。

扩展窗口:累积平均

此示例演示如何使用扩展窗口计算累积平均。

expanding_avg.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)
df = df.with_column(
    pl.col('Values').cummean().alias('CumulativeAvg')
)

print(df)

cummean 计算“Values”列的累积平均。这对于分析随时间变化的趋势非常有用。

带自定义函数的滚动窗口

此示例显示如何将自定义函数应用于滚动窗口。

rolling_custom.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)

def custom_agg(x):
    return x.max() - x.min()

df = df.with_column(
    pl.col('Values').rolling_apply(window_size=3, function=custom_agg).alias('RollingRange')
)

print(df)

rolling_apply(window_size=3, function=custom_agg) 应用自定义函数来计算每个滚动窗口内的范围(最大值 - 最小值)。这对于自定义计算非常有用。

带中心对齐的滚动窗口

此示例演示了如何使用带中心对齐的滚动窗口。

rolling_center.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)
df = df.with_column(
    pl.col('Values').rolling_mean(window_size=3, center=True).alias('RollingAvgCenter')
)

print(df)

rolling_mean(window_size=3, center=True) 计算以每个点为中心的滚动平均值。这对于对称分析非常有用。

带最小周期的滚动窗口

此示例显示如何使用带最小周期的滚动窗口。

rolling_min_periods.py
import polars as pl

data = {
    'Date': pl.date_range(start='2023-01-01', end='2023-01-10', interval='1d'),
    'Values': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}

df = pl.DataFrame(data)
df = df.with_column(
    pl.col('Values').rolling_mean(window_size=3, min_periods=1).alias('RollingAvgMinPeriods')
)

print(df)

rolling_mean(window_size=3, min_periods=1) 即使可用值少于 3 个,也会计算滚动平均值。这对于处理边缘情况非常有用。

窗口函数最佳实践

来源

Polars 滚动文档

在本文中,我们探讨了如何在 Polars 中使用窗口函数。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十年以上的经验。

所有 Polars 教程列表。