Path: blob/main/py-polars/tests/unit/series/test_scatter.py
6939 views
from datetime import date, datetime1from typing import Any23import numpy as np4import pytest56import polars as pl7from polars.exceptions import ComputeError, InvalidOperationError, OutOfBoundsError8from polars.testing import assert_series_equal91011@pytest.mark.parametrize(12"input",13[14(),15[],16pl.Series(),17pl.Series(dtype=pl.Int8),18np.array([]),19],20)21def test_scatter_noop(input: Any) -> None:22s = pl.Series("s", [1, 2, 3])23s.scatter(input, 8)24assert s.to_list() == [1, 2, 3]252627def test_scatter() -> None:28s = pl.Series("s", [1, 2, 3])2930# set new values, one index at a time31s.scatter(0, 8)32s.scatter([1], None)33assert s.to_list() == [8, None, 3]3435# set new value at multiple indexes in one go36s.scatter([0, 2], None)37assert s.to_list() == [None, None, None]3839# try with different series dtype40s = pl.Series("s", ["a", "b", "c"])41s.scatter((1, 2), "x")42assert s.to_list() == ["a", "x", "x"]43assert s.scatter([0, 2], 0.12345).to_list() == ["0.12345", "x", "0.12345"]4445# set multiple values46s = pl.Series(["z", "z", "z"])47assert s.scatter([0, 1], ["a", "b"]).to_list() == ["a", "b", "z"]48s = pl.Series([True, False, True])49assert s.scatter([0, 1], [False, True]).to_list() == [False, True, True]5051# set negative indices52a = pl.Series("r", range(5))53a[-2] = None54a[-5] = None55assert a.to_list() == [None, 1, 2, None, 4]5657a = pl.Series("x", [1, 2])58with pytest.raises(OutOfBoundsError):59a[-100] = None60assert_series_equal(a, pl.Series("x", [1, 2]))616263def test_index_with_None_errors_16905() -> None:64s = pl.Series("s", [1, 2, 3])65with pytest.raises(ComputeError, match="index values should not be null"):66s[[1, None]] = 567# The error doesn't trash the series, as it used to:68assert_series_equal(s, pl.Series("s", [1, 2, 3]))697071def test_object_dtype_16905() -> None:72obj = object()73s = pl.Series("s", [obj, 27], dtype=pl.Object)74# This operation is not semantically wrong, it might be supported in the75# future, but for now it isn't.76with pytest.raises(InvalidOperationError):77s[0] = 578# The error doesn't trash the series, as it used to:79assert s.dtype.is_object()80assert s.name == "s"81assert s.to_list() == [obj, 27]828384def test_scatter_datetime() -> None:85s = pl.Series("dt", [None, datetime(2024, 1, 31)])86result = s.scatter(0, datetime(2022, 2, 2))87expected = pl.Series("dt", [datetime(2022, 2, 2), datetime(2024, 1, 31)])88assert_series_equal(result, expected)899091def test_scatter_logical_all_null() -> None:92s = pl.Series("dt", [None, None], dtype=pl.Date)93result = s.scatter(0, date(2022, 2, 2))94expected = pl.Series("dt", [date(2022, 2, 2), None])95assert_series_equal(result, expected)969798def test_scatter_categorical_21175() -> None:99s = pl.Series(["a", "b", "c"], dtype=pl.Categorical)100assert_series_equal(101s.scatter(0, "b"), pl.Series(["b", "b", "c"], dtype=pl.Categorical)102)103v = pl.Series(["v"], dtype=pl.Categorical)104assert_series_equal(105s.scatter([0, 2], v), pl.Series(["v", "b", "v"], dtype=pl.Categorical)106)107108with pytest.raises(InvalidOperationError):109s.scatter(1, 2)110111112def test_scatter_enum() -> None:113e = pl.Enum(["a", "b", "c", "v"])114s = pl.Series(["a", "b", "c"], dtype=e)115assert_series_equal(s.scatter(0, "b"), pl.Series(["b", "b", "c"], dtype=e))116v = pl.Series(["v"], dtype=pl.Categorical)117assert_series_equal(s.scatter([0, 2], v), pl.Series(["v", "b", "v"], dtype=e))118119with pytest.raises(InvalidOperationError):120s.scatter(1, "d")121122with pytest.raises(InvalidOperationError):123s.scatter(1, 2)124125126