Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/operations/arithmetic/test_neg.py
6940 views
1
from __future__ import annotations
2
3
from datetime import timedelta
4
from decimal import Decimal as D
5
from typing import TYPE_CHECKING
6
7
import pytest
8
9
import polars as pl
10
from polars.exceptions import InvalidOperationError
11
from polars.testing import assert_frame_equal
12
from polars.testing.asserts.series import assert_series_equal
13
14
if TYPE_CHECKING:
15
from polars._typing import PolarsDataType
16
17
18
@pytest.mark.parametrize(
19
"dtype", [pl.Int8, pl.Int16, pl.Int32, pl.Int64, pl.Float32, pl.Float64]
20
)
21
def test_neg_operator(dtype: PolarsDataType) -> None:
22
lf = pl.LazyFrame({"a": [-1, 0, 1, None]}, schema={"a": dtype})
23
result = lf.select(-pl.col("a"))
24
expected = pl.LazyFrame({"a": [1, 0, -1, None]}, schema={"a": dtype})
25
assert_frame_equal(result, expected)
26
27
28
def test_neg_method() -> None:
29
lf = pl.LazyFrame({"a": [-1, 0, 1, None]})
30
result_op = lf.select(-pl.col("a"))
31
result_method = lf.select(pl.col("a").neg())
32
assert_frame_equal(result_op, result_method)
33
34
35
def test_neg_decimal() -> None:
36
lf = pl.LazyFrame({"a": [D("-1.5"), D("0.0"), D("5.0"), None]})
37
result = lf.select(-pl.col("a"))
38
expected = pl.LazyFrame({"a": [D("1.5"), D("0.0"), D("-5.0"), None]})
39
assert_frame_equal(result, expected)
40
41
42
def test_neg_duration() -> None:
43
lf = pl.LazyFrame({"a": [timedelta(hours=2), timedelta(days=-2), None]})
44
result = lf.select(-pl.col("a"))
45
expected = pl.LazyFrame({"a": [timedelta(hours=-2), timedelta(days=2), None]})
46
assert_frame_equal(result, expected)
47
48
49
def test_neg_overflow_wrapping() -> None:
50
df = pl.DataFrame({"a": [-128]}, schema={"a": pl.Int8})
51
result = df.select(-pl.col("a"))
52
assert_frame_equal(result, df)
53
54
55
def test_neg_unsigned_int() -> None:
56
df = pl.DataFrame({"a": [1, 2, 3]}, schema={"a": pl.UInt8})
57
with pytest.raises(
58
InvalidOperationError, match="`neg` operation not supported for dtype `u8`"
59
):
60
df.select(-pl.col("a"))
61
62
63
def test_neg_non_numeric() -> None:
64
df = pl.DataFrame({"a": ["p", "q", "r"]})
65
with pytest.raises(
66
InvalidOperationError, match="`neg` operation not supported for dtype `str`"
67
):
68
df.select(-pl.col("a"))
69
70
71
def test_neg_series_operator() -> None:
72
s = pl.Series("a", [-1, 0, 1, None])
73
result = -s
74
expected = pl.Series("a", [1, 0, -1, None])
75
assert_series_equal(result, expected)
76
77