Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/series/test_scatter.py
6939 views
1
from datetime import date, datetime
2
from typing import Any
3
4
import numpy as np
5
import pytest
6
7
import polars as pl
8
from polars.exceptions import ComputeError, InvalidOperationError, OutOfBoundsError
9
from polars.testing import assert_series_equal
10
11
12
@pytest.mark.parametrize(
13
"input",
14
[
15
(),
16
[],
17
pl.Series(),
18
pl.Series(dtype=pl.Int8),
19
np.array([]),
20
],
21
)
22
def test_scatter_noop(input: Any) -> None:
23
s = pl.Series("s", [1, 2, 3])
24
s.scatter(input, 8)
25
assert s.to_list() == [1, 2, 3]
26
27
28
def test_scatter() -> None:
29
s = pl.Series("s", [1, 2, 3])
30
31
# set new values, one index at a time
32
s.scatter(0, 8)
33
s.scatter([1], None)
34
assert s.to_list() == [8, None, 3]
35
36
# set new value at multiple indexes in one go
37
s.scatter([0, 2], None)
38
assert s.to_list() == [None, None, None]
39
40
# try with different series dtype
41
s = pl.Series("s", ["a", "b", "c"])
42
s.scatter((1, 2), "x")
43
assert s.to_list() == ["a", "x", "x"]
44
assert s.scatter([0, 2], 0.12345).to_list() == ["0.12345", "x", "0.12345"]
45
46
# set multiple values
47
s = pl.Series(["z", "z", "z"])
48
assert s.scatter([0, 1], ["a", "b"]).to_list() == ["a", "b", "z"]
49
s = pl.Series([True, False, True])
50
assert s.scatter([0, 1], [False, True]).to_list() == [False, True, True]
51
52
# set negative indices
53
a = pl.Series("r", range(5))
54
a[-2] = None
55
a[-5] = None
56
assert a.to_list() == [None, 1, 2, None, 4]
57
58
a = pl.Series("x", [1, 2])
59
with pytest.raises(OutOfBoundsError):
60
a[-100] = None
61
assert_series_equal(a, pl.Series("x", [1, 2]))
62
63
64
def test_index_with_None_errors_16905() -> None:
65
s = pl.Series("s", [1, 2, 3])
66
with pytest.raises(ComputeError, match="index values should not be null"):
67
s[[1, None]] = 5
68
# The error doesn't trash the series, as it used to:
69
assert_series_equal(s, pl.Series("s", [1, 2, 3]))
70
71
72
def test_object_dtype_16905() -> None:
73
obj = object()
74
s = pl.Series("s", [obj, 27], dtype=pl.Object)
75
# This operation is not semantically wrong, it might be supported in the
76
# future, but for now it isn't.
77
with pytest.raises(InvalidOperationError):
78
s[0] = 5
79
# The error doesn't trash the series, as it used to:
80
assert s.dtype.is_object()
81
assert s.name == "s"
82
assert s.to_list() == [obj, 27]
83
84
85
def test_scatter_datetime() -> None:
86
s = pl.Series("dt", [None, datetime(2024, 1, 31)])
87
result = s.scatter(0, datetime(2022, 2, 2))
88
expected = pl.Series("dt", [datetime(2022, 2, 2), datetime(2024, 1, 31)])
89
assert_series_equal(result, expected)
90
91
92
def test_scatter_logical_all_null() -> None:
93
s = pl.Series("dt", [None, None], dtype=pl.Date)
94
result = s.scatter(0, date(2022, 2, 2))
95
expected = pl.Series("dt", [date(2022, 2, 2), None])
96
assert_series_equal(result, expected)
97
98
99
def test_scatter_categorical_21175() -> None:
100
s = pl.Series(["a", "b", "c"], dtype=pl.Categorical)
101
assert_series_equal(
102
s.scatter(0, "b"), pl.Series(["b", "b", "c"], dtype=pl.Categorical)
103
)
104
v = pl.Series(["v"], dtype=pl.Categorical)
105
assert_series_equal(
106
s.scatter([0, 2], v), pl.Series(["v", "b", "v"], dtype=pl.Categorical)
107
)
108
109
with pytest.raises(InvalidOperationError):
110
s.scatter(1, 2)
111
112
113
def test_scatter_enum() -> None:
114
e = pl.Enum(["a", "b", "c", "v"])
115
s = pl.Series(["a", "b", "c"], dtype=e)
116
assert_series_equal(s.scatter(0, "b"), pl.Series(["b", "b", "c"], dtype=e))
117
v = pl.Series(["v"], dtype=pl.Categorical)
118
assert_series_equal(s.scatter([0, 2], v), pl.Series(["v", "b", "v"], dtype=e))
119
120
with pytest.raises(InvalidOperationError):
121
s.scatter(1, "d")
122
123
with pytest.raises(InvalidOperationError):
124
s.scatter(1, 2)
125
126