Path: blob/main/py-polars/tests/unit/operations/test_abs.py
6939 views
from __future__ import annotations12from datetime import date, timedelta3from decimal import Decimal as D4from typing import TYPE_CHECKING, cast56import numpy as np7import pytest89import polars as pl10from polars.exceptions import InvalidOperationError11from polars.testing import assert_frame_equal, assert_series_equal12from tests.unit.conftest import FLOAT_DTYPES, SIGNED_INTEGER_DTYPES1314if TYPE_CHECKING:15from polars._typing import PolarsDataType161718def test_abs() -> None:19# ints20s = pl.Series([1, -2, 3, -4])21assert_series_equal(s.abs(), pl.Series([1, 2, 3, 4]))22assert_series_equal(cast(pl.Series, np.abs(s)), pl.Series([1, 2, 3, 4]))2324# floats25s = pl.Series([1.0, -2.0, 3, -4.0])26assert_series_equal(s.abs(), pl.Series([1.0, 2.0, 3.0, 4.0]))27assert_series_equal(cast(pl.Series, np.abs(s)), pl.Series([1.0, 2.0, 3.0, 4.0]))28assert_series_equal(29pl.select(pl.lit(s).abs()).to_series(), pl.Series([1.0, 2.0, 3.0, 4.0])30)313233def test_abs_series_duration() -> None:34s = pl.Series([timedelta(hours=1), timedelta(hours=-1)])35assert s.abs().to_list() == [timedelta(hours=1), timedelta(hours=1)]363738def test_abs_expr() -> None:39df = pl.DataFrame({"x": [-1, 0, 1]})40out = df.select(abs(pl.col("x")))4142assert out["x"].to_list() == [1, 0, 1]434445def test_builtin_abs() -> None:46s = pl.Series("s", [-1, 0, 1, None])47assert abs(s).to_list() == [1, 0, 1, None]484950@pytest.mark.parametrize("dtype", [*FLOAT_DTYPES, *SIGNED_INTEGER_DTYPES])51def test_abs_builtin(dtype: PolarsDataType) -> None:52lf = pl.LazyFrame({"a": [-1, 0, 1, None]}, schema={"a": dtype})53result = lf.select(abs(pl.col("a")))54expected = pl.LazyFrame({"a": [1, 0, 1, None]}, schema={"a": dtype})55assert_frame_equal(result, expected)565758def test_abs_method() -> None:59lf = pl.LazyFrame({"a": [-1, 0, 1, None]})60result_op = lf.select(abs(pl.col("a")))61result_method = lf.select(pl.col("a").abs())62assert_frame_equal(result_op, result_method)636465def test_abs_decimal() -> None:66lf = pl.LazyFrame({"a": [D("-1.5"), D("0.0"), D("5.0"), None]})67result = lf.select(pl.col("a").abs())68expected = pl.LazyFrame({"a": [D("1.5"), D("0.0"), D("5.0"), None]})69assert_frame_equal(result, expected)707172def test_abs_duration() -> None:73lf = pl.LazyFrame({"a": [timedelta(hours=2), timedelta(days=-2), None]})74result = lf.select(pl.col("a").abs())75expected = pl.LazyFrame({"a": [timedelta(hours=2), timedelta(days=2), None]})76assert_frame_equal(result, expected)777879def test_abs_overflow_wrapping() -> None:80df = pl.DataFrame({"a": [-128]}, schema={"a": pl.Int8})81result = df.select(pl.col("a").abs())82assert_frame_equal(result, df)838485def test_abs_unsigned_int() -> None:86df = pl.DataFrame({"a": [1, 2, 3]}, schema={"a": pl.UInt8})87result = df.select(pl.col("a").abs())88assert_frame_equal(result, df)899091def test_abs_non_numeric() -> None:92df = pl.DataFrame({"a": ["p", "q", "r"]})93with pytest.raises(94InvalidOperationError, match="`abs` operation not supported for dtype `str`"95):96df.select(pl.col("a").abs())979899def test_abs_date() -> None:100df = pl.DataFrame({"date": [date(1960, 1, 1), date(1970, 1, 1), date(1980, 1, 1)]})101102with pytest.raises(103InvalidOperationError, match="`abs` operation not supported for dtype `date`"104):105df.select(pl.col("date").abs())106107108def test_abs_series_builtin() -> None:109s = pl.Series("a", [-1, 0, 1, None])110result = abs(s)111expected = pl.Series("a", [1, 0, 1, None])112assert_series_equal(result, expected)113114115