From be2a1c8b927bc25e33fd004fa9cb7573de913298 Mon Sep 17 00:00:00 2001 From: Matthew Roeschke Date: Wed, 13 Jul 2022 17:11:38 -0700 Subject: [PATCH 1/3] ENH/TST: Add BaseUnaryOpsTests tests for ArrowExtensionArray --- pandas/core/arrays/arrow/array.py | 12 ++++++++++++ pandas/tests/extension/test_arrow.py | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 92aedbb836b38..b837389fd1c84 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -235,6 +235,18 @@ def __arrow_array__(self, type=None): """Convert myself to a pyarrow ChunkedArray.""" return self._data + def __invert__(self: ArrowExtensionArrayT) -> ArrowExtensionArrayT: + 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..251da65398cb7 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -1210,6 +1210,19 @@ def test_EA_types(self, engine, data, request): super().test_EA_types(engine, data) +class TestBaseUnaryOps(base.BaseUnaryOpsTests): + 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): From d7ee972d44115bcb41d17400244cb95a5392ccdc Mon Sep 17 00:00:00 2001 From: Matthew Roeschke Date: Thu, 14 Jul 2022 12:09:48 -0700 Subject: [PATCH 2/3] Add notimeplemented error for pa<2.0 --- pandas/core/arrays/arrow/array.py | 2 ++ pandas/tests/extension/test_arrow.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index b837389fd1c84..69cd2a44dfed4 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -236,6 +236,8 @@ def __arrow_array__(self, type=None): 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: diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 251da65398cb7..609c9182bc280 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -1220,6 +1220,13 @@ def test_invert(self, data, request): reason=f"pyarrow.compute.invert does support {pa_dtype}", ) ) + elif pa_version_under2p0: + request.node.add_marker( + pytest.mark.xfail( + raises=NotImplementedError, + reason="pyarrow.compute.invert not supported in pyarrow<2.0", + ) + ) super().test_invert(data) From 7f9153084cb8ba04c33d5d9c5618ae36038b2016 Mon Sep 17 00:00:00 2001 From: Matthew Roeschke Date: Thu, 14 Jul 2022 13:50:07 -0700 Subject: [PATCH 3/3] Top level xfail --- pandas/tests/extension/test_arrow.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 609c9182bc280..c6e9bed030567 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -1211,6 +1211,11 @@ def test_EA_types(self, engine, data, request): 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): @@ -1220,13 +1225,6 @@ def test_invert(self, data, request): reason=f"pyarrow.compute.invert does support {pa_dtype}", ) ) - elif pa_version_under2p0: - request.node.add_marker( - pytest.mark.xfail( - raises=NotImplementedError, - reason="pyarrow.compute.invert not supported in pyarrow<2.0", - ) - ) super().test_invert(data)