diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 92aedbb836b38..69cd2a44dfed4 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -235,6 +235,20 @@ def __arrow_array__(self, type=None): """Convert myself to a pyarrow ChunkedArray.""" return self._data + def __invert__(self: ArrowExtensionArrayT) -> ArrowExtensionArrayT: + if pa_version_under2p0: + raise NotImplementedError("__invert__ not implement for pyarrow < 2.0") + return type(self)(pc.invert(self._data)) + + def __neg__(self: ArrowExtensionArrayT) -> ArrowExtensionArrayT: + return type(self)(pc.negate_checked(self._data)) + + def __pos__(self: ArrowExtensionArrayT) -> ArrowExtensionArrayT: + return type(self)(self._data) + + def __abs__(self: ArrowExtensionArrayT) -> ArrowExtensionArrayT: + return type(self)(pc.abs_checked(self._data)) + def _cmp_method(self, other, op): from pandas.arrays import BooleanArray diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 7e0792a6010a7..c6e9bed030567 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -1210,6 +1210,24 @@ def test_EA_types(self, engine, data, request): super().test_EA_types(engine, data) +class TestBaseUnaryOps(base.BaseUnaryOpsTests): + @pytest.mark.xfail( + pa_version_under2p0, + raises=NotImplementedError, + reason="pyarrow.compute.invert not supported in pyarrow<2.0", + ) + def test_invert(self, data, request): + pa_dtype = data.dtype.pyarrow_dtype + if not pa.types.is_boolean(pa_dtype): + request.node.add_marker( + pytest.mark.xfail( + raises=pa.ArrowNotImplementedError, + reason=f"pyarrow.compute.invert does support {pa_dtype}", + ) + ) + super().test_invert(data) + + class TestBaseMethods(base.BaseMethodsTests): @pytest.mark.parametrize("dropna", [True, False]) def test_value_counts(self, all_data, dropna, request):