Path: blob/main/py-polars/tests/unit/functions/test_ewm_by.py
6939 views
from __future__ import annotations12from datetime import date34import hypothesis.strategies as st5import pytest6from hypothesis import given78import polars as pl9from polars.testing import assert_frame_equal10from polars.testing.parametric import column, dataframes111213@given(14data=st.data(),15half_life=st.integers(min_value=1, max_value=1000),16)17def test_ewm_by(data: st.DataObject, half_life: int) -> None:18# For evenly spaced times, ewm_by and ewm should be equivalent19df = data.draw(20dataframes(21[22column(23"values",24strategy=st.floats(min_value=-100, max_value=100),25dtype=pl.Float64,26),27],28min_size=1,29)30)31result = df.with_row_index().select(32pl.col("values").ewm_mean_by(by="index", half_life=f"{half_life}i")33)34expected = df.select(35pl.col("values").ewm_mean(half_life=half_life, ignore_nulls=False, adjust=False)36)37assert_frame_equal(result, expected)38result = (39df.with_row_index()40.sort("values")41.with_columns(42pl.col("values").ewm_mean_by(by="index", half_life=f"{half_life}i")43)44.sort("index")45.select("values")46)47assert_frame_equal(result, expected)484950@pytest.mark.parametrize("length", [1, 3])51def test_length_mismatch_22084(length: int) -> None:52s = pl.Series([0, None])53by = pl.Series([date(2020, 1, 5)] * length)54with pytest.raises(pl.exceptions.ShapeError):55s.ewm_mean_by(by, half_life="4d")565758