Path: blob/main/py-polars/tests/unit/series/test_rolling.py
6939 views
from datetime import datetime12import pytest34import polars as pl5from polars.testing.asserts.series import assert_series_equal678@pytest.fixture9def values() -> pl.Series:10return pl.Series([6, 9, 2, 5, 8, 1, 4, 7])111213@pytest.fixture14def by_col() -> pl.Series:15return pl.Series([0, 0, 1, 1, 2, 2, 3, 3])161718@pytest.fixture19def by_col_temporal() -> pl.Series:20return pl.Series(21pl.datetime_range(22datetime(2025, 1, 1), datetime(2025, 1, 2), "1h", eager=True23).head(8)24)252627def test_series_rolling_min_by(values: pl.Series, by_col: pl.Series) -> None:28actual = values.rolling_min_by(by_col, "2i")29expected = pl.Series([6, 6, 2, 2, 1, 1, 1, 1])30assert_series_equal(actual, expected)313233def test_series_rolling_max_by(values: pl.Series, by_col: pl.Series) -> None:34actual = values.rolling_max_by(by_col, "2i")35expected = pl.Series([9, 9, 9, 9, 8, 8, 8, 8])36assert_series_equal(actual, expected)373839def test_series_rolling_sum_by(values: pl.Series, by_col: pl.Series) -> None:40actual = values.rolling_sum_by(by_col, "2i")41expected = pl.Series([15, 15, 22, 22, 16, 16, 20, 20])42assert_series_equal(actual, expected)434445def test_series_rolling_mean_by(values: pl.Series, by_col: pl.Series) -> None:46actual = values.rolling_mean_by(by_col, "2i")47expected = pl.Series([7.5, 7.5, 5.5, 5.5, 4.0, 4.0, 5.0, 5.0])48assert_series_equal(actual, expected)495051def test_series_rolling_median_by(values: pl.Series, by_col: pl.Series) -> None:52actual = values.rolling_median_by(by_col, "2i")53expected = pl.Series([7.5, 7.5, 5.5, 5.5, 3.5, 3.5, 5.5, 5.5])54assert_series_equal(actual, expected)555657def test_series_rolling_std_by(values: pl.Series, by_col: pl.Series) -> None:58actual = values.rolling_std_by(by_col, "2i")59expected = pl.Series([2.12, 2.12, 2.88, 2.88, 3.16, 3.16, 3.16, 3.16])60assert_series_equal(actual, expected, abs_tol=1e-2)616263def test_series_rolling_var_by(values: pl.Series, by_col: pl.Series) -> None:64actual = values.rolling_var_by(by_col, "2i")65expected = pl.Series([4.5, 4.5, 8.33, 8.33, 10.0, 10.0, 10.0, 10.0])66assert_series_equal(actual, expected, abs_tol=1e-2)676869def test_series_rolling_quantile_by(values: pl.Series, by_col: pl.Series) -> None:70actual = values.rolling_quantile_by(by_col, "2i", quantile=0.5)71expected = pl.Series([9.0, 9.0, 6.0, 6.0, 5.0, 5.0, 7.0, 7.0])72assert_series_equal(actual, expected)737475def test_series_rolling_min_by_temporal(76values: pl.Series, by_col_temporal: pl.Series77) -> None:78actual = values.rolling_min_by(by_col_temporal, "2h")79expected = pl.Series([6, 6, 2, 2, 5, 1, 1, 4])80assert_series_equal(actual, expected)818283def test_series_rolling_max_by_temporal(84values: pl.Series, by_col_temporal: pl.Series85) -> None:86actual = values.rolling_max_by(by_col_temporal, "2h")87expected = pl.Series([6, 9, 9, 5, 8, 8, 4, 7])88assert_series_equal(actual, expected)899091def test_series_rolling_sum_by_temporal(92values: pl.Series, by_col_temporal: pl.Series93) -> None:94actual = values.rolling_sum_by(by_col_temporal, "2h")95expected = pl.Series([6, 15, 11, 7, 13, 9, 5, 11])96assert_series_equal(actual, expected)979899def test_series_rolling_mean_by_temporal(100values: pl.Series, by_col_temporal: pl.Series101) -> None:102actual = values.rolling_mean_by(by_col_temporal, "2h")103expected = pl.Series([6.0, 7.5, 5.5, 3.5, 6.5, 4.5, 2.5, 5.5])104assert_series_equal(actual, expected)105106107def test_series_rolling_median_by_temporal(108values: pl.Series, by_col_temporal: pl.Series109) -> None:110actual = values.rolling_median_by(by_col_temporal, "3h")111expected = pl.Series([6.0, 7.5, 6.0, 5.0, 5.0, 5.0, 4.0, 4.0])112assert_series_equal(actual, expected)113114115def test_series_rolling_std_by_temporal(116values: pl.Series, by_col_temporal: pl.Series117) -> None:118actual = values.rolling_std_by(by_col_temporal, "2h")119expected = pl.Series([None, 2.12, 4.94, 2.12, 2.12, 4.94, 2.12, 2.12])120assert_series_equal(actual, expected, abs_tol=1e-2)121122123def test_series_rolling_var_by_temporal(124values: pl.Series, by_col_temporal: pl.Series125) -> None:126actual = values.rolling_var_by(by_col_temporal, "2h")127expected = pl.Series([None, 4.5, 24.5, 4.5, 4.5, 24.5, 4.5, 4.5])128assert_series_equal(actual, expected, abs_tol=1e-2)129130131def test_series_rolling_quantile_by_temporal(132values: pl.Series, by_col_temporal: pl.Series133) -> None:134actual = values.rolling_quantile_by(by_col_temporal, "2h", quantile=0.5)135expected = pl.Series([6.0, 9.0, 9.0, 5.0, 8.0, 8.0, 4.0, 7.0])136assert_series_equal(actual, expected)137138139