Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/operations/test_abs.py
6939 views
1
from __future__ import annotations
2
3
from datetime import date, timedelta
4
from decimal import Decimal as D
5
from typing import TYPE_CHECKING, cast
6
7
import numpy as np
8
import pytest
9
10
import polars as pl
11
from polars.exceptions import InvalidOperationError
12
from polars.testing import assert_frame_equal, assert_series_equal
13
from tests.unit.conftest import FLOAT_DTYPES, SIGNED_INTEGER_DTYPES
14
15
if TYPE_CHECKING:
16
from polars._typing import PolarsDataType
17
18
19
def test_abs() -> None:
20
# ints
21
s = pl.Series([1, -2, 3, -4])
22
assert_series_equal(s.abs(), pl.Series([1, 2, 3, 4]))
23
assert_series_equal(cast(pl.Series, np.abs(s)), pl.Series([1, 2, 3, 4]))
24
25
# floats
26
s = pl.Series([1.0, -2.0, 3, -4.0])
27
assert_series_equal(s.abs(), pl.Series([1.0, 2.0, 3.0, 4.0]))
28
assert_series_equal(cast(pl.Series, np.abs(s)), pl.Series([1.0, 2.0, 3.0, 4.0]))
29
assert_series_equal(
30
pl.select(pl.lit(s).abs()).to_series(), pl.Series([1.0, 2.0, 3.0, 4.0])
31
)
32
33
34
def test_abs_series_duration() -> None:
35
s = pl.Series([timedelta(hours=1), timedelta(hours=-1)])
36
assert s.abs().to_list() == [timedelta(hours=1), timedelta(hours=1)]
37
38
39
def test_abs_expr() -> None:
40
df = pl.DataFrame({"x": [-1, 0, 1]})
41
out = df.select(abs(pl.col("x")))
42
43
assert out["x"].to_list() == [1, 0, 1]
44
45
46
def test_builtin_abs() -> None:
47
s = pl.Series("s", [-1, 0, 1, None])
48
assert abs(s).to_list() == [1, 0, 1, None]
49
50
51
@pytest.mark.parametrize("dtype", [*FLOAT_DTYPES, *SIGNED_INTEGER_DTYPES])
52
def test_abs_builtin(dtype: PolarsDataType) -> None:
53
lf = pl.LazyFrame({"a": [-1, 0, 1, None]}, schema={"a": dtype})
54
result = lf.select(abs(pl.col("a")))
55
expected = pl.LazyFrame({"a": [1, 0, 1, None]}, schema={"a": dtype})
56
assert_frame_equal(result, expected)
57
58
59
def test_abs_method() -> None:
60
lf = pl.LazyFrame({"a": [-1, 0, 1, None]})
61
result_op = lf.select(abs(pl.col("a")))
62
result_method = lf.select(pl.col("a").abs())
63
assert_frame_equal(result_op, result_method)
64
65
66
def test_abs_decimal() -> None:
67
lf = pl.LazyFrame({"a": [D("-1.5"), D("0.0"), D("5.0"), None]})
68
result = lf.select(pl.col("a").abs())
69
expected = pl.LazyFrame({"a": [D("1.5"), D("0.0"), D("5.0"), None]})
70
assert_frame_equal(result, expected)
71
72
73
def test_abs_duration() -> None:
74
lf = pl.LazyFrame({"a": [timedelta(hours=2), timedelta(days=-2), None]})
75
result = lf.select(pl.col("a").abs())
76
expected = pl.LazyFrame({"a": [timedelta(hours=2), timedelta(days=2), None]})
77
assert_frame_equal(result, expected)
78
79
80
def test_abs_overflow_wrapping() -> None:
81
df = pl.DataFrame({"a": [-128]}, schema={"a": pl.Int8})
82
result = df.select(pl.col("a").abs())
83
assert_frame_equal(result, df)
84
85
86
def test_abs_unsigned_int() -> None:
87
df = pl.DataFrame({"a": [1, 2, 3]}, schema={"a": pl.UInt8})
88
result = df.select(pl.col("a").abs())
89
assert_frame_equal(result, df)
90
91
92
def test_abs_non_numeric() -> None:
93
df = pl.DataFrame({"a": ["p", "q", "r"]})
94
with pytest.raises(
95
InvalidOperationError, match="`abs` operation not supported for dtype `str`"
96
):
97
df.select(pl.col("a").abs())
98
99
100
def test_abs_date() -> None:
101
df = pl.DataFrame({"date": [date(1960, 1, 1), date(1970, 1, 1), date(1980, 1, 1)]})
102
103
with pytest.raises(
104
InvalidOperationError, match="`abs` operation not supported for dtype `date`"
105
):
106
df.select(pl.col("date").abs())
107
108
109
def test_abs_series_builtin() -> None:
110
s = pl.Series("a", [-1, 0, 1, None])
111
result = abs(s)
112
expected = pl.Series("a", [1, 0, 1, None])
113
assert_series_equal(result, expected)
114
115