124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
from decimal import Decimal
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
import pandas as pd
|
|
import pandas._testing as tm
|
|
|
|
|
|
class TestDataFrameUnaryOperators:
|
|
# __pos__, __neg__, __inv__
|
|
|
|
@pytest.mark.parametrize(
|
|
"df,expected",
|
|
[
|
|
(pd.DataFrame({"a": [-1, 1]}), pd.DataFrame({"a": [1, -1]})),
|
|
(pd.DataFrame({"a": [False, True]}), pd.DataFrame({"a": [True, False]})),
|
|
(
|
|
pd.DataFrame({"a": pd.Series(pd.to_timedelta([-1, 1]))}),
|
|
pd.DataFrame({"a": pd.Series(pd.to_timedelta([1, -1]))}),
|
|
),
|
|
],
|
|
)
|
|
def test_neg_numeric(self, df, expected):
|
|
tm.assert_frame_equal(-df, expected)
|
|
tm.assert_series_equal(-df["a"], expected["a"])
|
|
|
|
@pytest.mark.parametrize(
|
|
"df, expected",
|
|
[
|
|
(np.array([1, 2], dtype=object), np.array([-1, -2], dtype=object)),
|
|
([Decimal("1.0"), Decimal("2.0")], [Decimal("-1.0"), Decimal("-2.0")]),
|
|
],
|
|
)
|
|
def test_neg_object(self, df, expected):
|
|
# GH#21380
|
|
df = pd.DataFrame({"a": df})
|
|
expected = pd.DataFrame({"a": expected})
|
|
tm.assert_frame_equal(-df, expected)
|
|
tm.assert_series_equal(-df["a"], expected["a"])
|
|
|
|
@pytest.mark.parametrize(
|
|
"df",
|
|
[
|
|
pd.DataFrame({"a": ["a", "b"]}),
|
|
pd.DataFrame({"a": pd.to_datetime(["2017-01-22", "1970-01-01"])}),
|
|
],
|
|
)
|
|
def test_neg_raises(self, df):
|
|
msg = (
|
|
"bad operand type for unary -: 'str'|"
|
|
r"Unary negative expects numeric dtype, not datetime64\[ns\]"
|
|
)
|
|
with pytest.raises(TypeError, match=msg):
|
|
(-df)
|
|
with pytest.raises(TypeError, match=msg):
|
|
(-df["a"])
|
|
|
|
def test_invert(self, float_frame):
|
|
df = float_frame
|
|
|
|
tm.assert_frame_equal(-(df < 0), ~(df < 0))
|
|
|
|
def test_invert_mixed(self):
|
|
shape = (10, 5)
|
|
df = pd.concat(
|
|
[
|
|
pd.DataFrame(np.zeros(shape, dtype="bool")),
|
|
pd.DataFrame(np.zeros(shape, dtype=int)),
|
|
],
|
|
axis=1,
|
|
ignore_index=True,
|
|
)
|
|
result = ~df
|
|
expected = pd.concat(
|
|
[
|
|
pd.DataFrame(np.ones(shape, dtype="bool")),
|
|
pd.DataFrame(-np.ones(shape, dtype=int)),
|
|
],
|
|
axis=1,
|
|
ignore_index=True,
|
|
)
|
|
tm.assert_frame_equal(result, expected)
|
|
|
|
@pytest.mark.parametrize(
|
|
"df",
|
|
[
|
|
pd.DataFrame({"a": [-1, 1]}),
|
|
pd.DataFrame({"a": [False, True]}),
|
|
pd.DataFrame({"a": pd.Series(pd.to_timedelta([-1, 1]))}),
|
|
],
|
|
)
|
|
def test_pos_numeric(self, df):
|
|
# GH#16073
|
|
tm.assert_frame_equal(+df, df)
|
|
tm.assert_series_equal(+df["a"], df["a"])
|
|
|
|
@pytest.mark.parametrize(
|
|
"df",
|
|
[
|
|
# numpy changing behavior in the future
|
|
pytest.param(
|
|
pd.DataFrame({"a": ["a", "b"]}),
|
|
marks=[pytest.mark.filterwarnings("ignore")],
|
|
),
|
|
pd.DataFrame({"a": np.array([-1, 2], dtype=object)}),
|
|
pd.DataFrame({"a": [Decimal("-1.0"), Decimal("2.0")]}),
|
|
],
|
|
)
|
|
def test_pos_object(self, df):
|
|
# GH#21380
|
|
tm.assert_frame_equal(+df, df)
|
|
tm.assert_series_equal(+df["a"], df["a"])
|
|
|
|
@pytest.mark.parametrize(
|
|
"df", [pd.DataFrame({"a": pd.to_datetime(["2017-01-22", "1970-01-01"])})]
|
|
)
|
|
def test_pos_raises(self, df):
|
|
msg = "Unary plus expects .* dtype, not datetime64\\[ns\\]"
|
|
with pytest.raises(TypeError, match=msg):
|
|
(+df)
|
|
with pytest.raises(TypeError, match=msg):
|
|
(+df["a"])
|