diff --git a/pandas/core/arrays/boolean.py b/pandas/core/arrays/boolean.py index bd4bdc5ecb46f..184ea32237797 100644 --- a/pandas/core/arrays/boolean.py +++ b/pandas/core/arrays/boolean.py @@ -736,6 +736,9 @@ def boolean_arithmetic_method(self, other): name = f"__{op_name}__" return set_function_name(boolean_arithmetic_method, name, cls) + def __neg__(self): + return self.__invert__() + BooleanArray._add_logical_ops() BooleanArray._add_comparison_ops() diff --git a/pandas/core/arrays/masked.py b/pandas/core/arrays/masked.py index 1237dea5c1a64..8d0601aac624f 100644 --- a/pandas/core/arrays/masked.py +++ b/pandas/core/arrays/masked.py @@ -125,6 +125,12 @@ def __len__(self) -> int: def __invert__(self: BaseMaskedArrayT) -> BaseMaskedArrayT: return type(self)(~self._data, self._mask) + def __neg__(self: BaseMaskedArrayT) -> BaseMaskedArrayT: + return type(self)(-self._data, self._mask) + + def __pos__(self: BaseMaskedArrayT) -> BaseMaskedArrayT: + return type(self)(+self._data, self._mask) + def to_numpy( self, dtype=None, copy: bool = False, na_value: Scalar = lib.no_default ) -> np.ndarray: diff --git a/pandas/tests/extension/base/ops.py b/pandas/tests/extension/base/ops.py index c93603398977e..bbcace9e3e096 100644 --- a/pandas/tests/extension/base/ops.py +++ b/pandas/tests/extension/base/ops.py @@ -186,3 +186,15 @@ def test_invert(self, data): result = ~s expected = pd.Series(~data, name="name") self.assert_series_equal(result, expected) + + def test_neg(self, data): + s = pd.Series(data, name="name") + result = -s + expected = pd.Series(-data, name="name") + self.assert_series_equal(result, expected) + + def test_pos(self, data): + s = pd.Series(data, name="name") + result = +s + expected = pd.Series(+data, name="name") + self.assert_series_equal(result, expected) diff --git a/pandas/tests/extension/test_integer.py b/pandas/tests/extension/test_integer.py index 725533765ca2c..71b3c159169c1 100644 --- a/pandas/tests/extension/test_integer.py +++ b/pandas/tests/extension/test_integer.py @@ -181,6 +181,10 @@ def _compare_other(self, s, data, op_name, other): self.check_opname(s, op_name, other) +class TestUnaryOps(base.BaseUnaryOpsTests): + pass + + class TestInterface(base.BaseInterfaceTests): pass