Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/operations/rolling/test_map.py
6940 views
1
from __future__ import annotations
2
3
from typing import TYPE_CHECKING
4
5
import numpy as np
6
import pytest
7
8
import polars as pl
9
from polars.testing import assert_series_equal
10
from tests.unit.conftest import FLOAT_DTYPES, INTEGER_DTYPES
11
12
if TYPE_CHECKING:
13
from polars._typing import PolarsDataType
14
15
16
@pytest.mark.parametrize(
17
("input", "output"),
18
[
19
([1, 5], [1, 6]),
20
([1], [1]),
21
],
22
)
23
def test_rolling_map_window_size_9160(input: list[int], output: list[int]) -> None:
24
s = pl.Series(input)
25
result = s.rolling_map(lambda x: sum(x), window_size=2, min_samples=1)
26
expected = pl.Series(output)
27
assert_series_equal(result, expected)
28
29
30
def testing_rolling_map_window_size_with_nulls() -> None:
31
s = pl.Series([0, 1, None, 3, 4, 5])
32
result = s.rolling_map(lambda x: sum(x), window_size=3, min_samples=3)
33
expected = pl.Series([None, None, None, None, None, 12])
34
assert_series_equal(result, expected)
35
36
37
def test_rolling_map_clear_reuse_series_state_10681() -> None:
38
df = pl.DataFrame(
39
{
40
"a": [1, 1, 1, 1, 2, 2, 2, 2],
41
"b": [0.0, 1.0, 11.0, 7.0, 4.0, 2.0, 3.0, 8.0],
42
}
43
)
44
45
result = df.select(
46
pl.col("b")
47
.rolling_map(lambda s: s.min(), window_size=3, min_samples=2)
48
.over("a")
49
.alias("min")
50
)
51
52
expected = pl.Series("min", [None, 0.0, 0.0, 1.0, None, 2.0, 2.0, 2.0])
53
assert_series_equal(result.to_series(), expected)
54
55
56
def test_rolling_map_np_nansum() -> None:
57
s = pl.Series("a", [11.0, 2.0, 9.0, float("nan"), 8.0])
58
59
result = s.rolling_map(np.nansum, 3)
60
61
expected = pl.Series("a", [None, None, 22.0, 11.0, 17.0])
62
assert_series_equal(result, expected)
63
64
65
@pytest.mark.parametrize("dtype", [pl.Float32, pl.Float64])
66
def test_rolling_map_std(dtype: PolarsDataType) -> None:
67
s = pl.Series("A", [1.0, 2.0, 9.0, 2.0, 13.0], dtype=dtype)
68
result = s.rolling_map(function=lambda s: s.std(), window_size=3)
69
70
expected = pl.Series("A", [None, None, 4.358899, 4.041452, 5.567764], dtype=dtype)
71
assert_series_equal(result, expected)
72
73
74
@pytest.mark.parametrize("dtype", [pl.Float32, pl.Float64])
75
def test_rolling_map_std_weights(dtype: PolarsDataType) -> None:
76
s = pl.Series("A", [1.0, 2.0, 9.0, 2.0, 13.0], dtype=dtype)
77
78
result = s.rolling_map(
79
function=lambda s: s.std(), window_size=3, weights=[1.0, 2.0, 3.0]
80
)
81
82
expected = pl.Series("A", [None, None, 14.224392, 8.326664, 18.929694], dtype=dtype)
83
assert_series_equal(result, expected)
84
85
86
@pytest.mark.parametrize("dtype", INTEGER_DTYPES)
87
def test_rolling_map_sum_int(dtype: PolarsDataType) -> None:
88
s = pl.Series("A", [1, 2, 9, 2, 13], dtype=dtype)
89
90
result = s.rolling_map(function=lambda s: s.sum(), window_size=3)
91
92
expected = pl.Series("A", [None, None, 12, 13, 24], dtype=dtype)
93
assert_series_equal(result, expected)
94
95
q = (
96
s.to_frame()
97
.lazy()
98
.select(pl.col("A").rolling_map(function=lambda s: s.sum(), window_size=3))
99
)
100
assert q.collect_schema() == q.collect().schema
101
102
103
@pytest.mark.parametrize("dtype", INTEGER_DTYPES)
104
def test_rolling_map_sum_int_cast_to_float(dtype: PolarsDataType) -> None:
105
s = pl.Series("A", [1, 2, 9, None, 13], dtype=dtype)
106
107
result = s.rolling_map(
108
function=lambda s: s.sum(), window_size=3, weights=[1.0, 2.0, 3.0]
109
)
110
111
expected = pl.Series("A", [None, None, 32.0, None, None], dtype=pl.Float64)
112
assert_series_equal(result, expected)
113
114
q = (
115
s.to_frame()
116
.lazy()
117
.select(
118
pl.col("A").rolling_map(
119
function=lambda s: s.sum(), window_size=3, weights=[1.0, 2.0, 3.0]
120
)
121
)
122
)
123
assert q.collect_schema() == q.collect().schema
124
125
126
@pytest.mark.parametrize("dtype", FLOAT_DTYPES)
127
def test_rolling_map_sum_float(dtype: PolarsDataType) -> None:
128
s = pl.Series("A", [1, 2, 9, 2, 13], dtype=dtype)
129
130
result = s.rolling_map(function=lambda s: s.sum(), window_size=3)
131
132
expected = pl.Series("A", [None, None, 12.0, 13.0, 24.0], dtype=dtype)
133
assert_series_equal(result, expected)
134
135
q = (
136
s.to_frame()
137
.lazy()
138
.select(pl.col("A").rolling_map(function=lambda s: s.sum(), window_size=3))
139
)
140
assert q.collect_schema() == q.collect().schema
141
142
143
@pytest.mark.parametrize("dtype", FLOAT_DTYPES)
144
def test_rolling_map_sum_float_weights(dtype: PolarsDataType) -> None:
145
s = pl.Series("A", [1, 2, 9, 2, 13], dtype=dtype)
146
147
result = s.rolling_map(
148
function=lambda s: s.sum(), window_size=3, weights=[1.0, 2.0, 3.0]
149
)
150
151
expected = pl.Series("A", [None, None, 32.0, 26.0, 52.0], dtype=dtype)
152
assert_series_equal(result, expected)
153
154
q = (
155
s.to_frame()
156
.lazy()
157
.select(
158
pl.col("A").rolling_map(
159
function=lambda s: s.sum(), window_size=3, weights=[1.0, 2.0, 3.0]
160
)
161
)
162
)
163
assert q.collect_schema() == q.collect().schema
164
165
166
def test_rolling_map_rolling_sum() -> None:
167
s = pl.Series("A", list(range(5)), dtype=pl.Float64)
168
169
result = s.rolling_map(
170
function=lambda s: s.sum(),
171
window_size=3,
172
weights=[1.0, 2.1, 3.2],
173
min_samples=2,
174
center=True,
175
)
176
177
expected = s.rolling_sum(
178
window_size=3, weights=[1.0, 2.1, 3.2], min_samples=2, center=True
179
)
180
assert_series_equal(result, expected)
181
182
183
def test_rolling_map_rolling_std() -> None:
184
s = pl.Series("A", list(range(6)), dtype=pl.Float64)
185
186
result = s.rolling_map(
187
function=lambda s: s.std(),
188
window_size=4,
189
min_samples=3,
190
center=False,
191
)
192
193
expected = s.rolling_std(window_size=4, min_samples=3, center=False)
194
assert_series_equal(result, expected)
195
196