From 3714ff56a191806a5c6bb3eed5c809eefe033105 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Tue, 31 Dec 2024 18:18:19 -0500 Subject: [PATCH 1/4] TST(string dtype): Resolve xfail for interpolate --- pandas/core/arrays/arrow/array.py | 2 +- pandas/tests/frame/methods/test_interpolate.py | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index afa219f611992..4d9c8eb3a41b6 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -2160,7 +2160,7 @@ def interpolate( """ # NB: we return type(self) even if copy=False if not self.dtype._is_numeric: - raise ValueError("Values must be numeric.") + raise TypeError(f"Cannot interpolate with {self.dtype} dtype") if ( not pa_version_under13p0 diff --git a/pandas/tests/frame/methods/test_interpolate.py b/pandas/tests/frame/methods/test_interpolate.py index b8a34d5eaa226..2cf9bf6e4688a 100644 --- a/pandas/tests/frame/methods/test_interpolate.py +++ b/pandas/tests/frame/methods/test_interpolate.py @@ -64,11 +64,7 @@ def test_interpolate_inplace(self, frame_or_series, request): assert np.shares_memory(orig, obj.values) assert orig.squeeze()[1] == 1.5 - # TODO(infer_string) raise proper TypeError in case of string dtype - @pytest.mark.xfail( - using_string_dtype(), reason="interpolate doesn't work for string" - ) - def test_interp_basic(self): + def test_interp_basic(self, using_infer_string): df = DataFrame( { "A": [1, 2, np.nan, 4], @@ -77,7 +73,8 @@ def test_interp_basic(self): "D": list("abcd"), } ) - msg = "DataFrame cannot interpolate with object dtype" + dtype = "str" if using_infer_string else "object" + msg = f"[Cc]annot interpolate with {dtype} dtype" with pytest.raises(TypeError, match=msg): df.interpolate() @@ -88,7 +85,8 @@ def test_interp_basic(self): # check we DID operate inplace assert np.shares_memory(df["C"]._values, cvalues) - assert np.shares_memory(df["D"]._values, dvalues) + if not using_infer_string: + assert np.shares_memory(df["D"]._values, dvalues) @pytest.mark.xfail( using_string_dtype(), reason="interpolate doesn't work for string" From 33fceb16666417ee4291d418008a01a348964900 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Tue, 31 Dec 2024 18:24:25 -0500 Subject: [PATCH 2/4] Adjust arrow tests --- pandas/tests/extension/test_arrow.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 6dd1f3f15bc15..c5f5a65b77eea 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -3451,7 +3451,9 @@ def test_string_to_datetime_parsing_cast(): ) def test_interpolate_not_numeric(data): if not data.dtype._is_numeric: - with pytest.raises(ValueError, match="Values must be numeric."): + ser = pd.Series(data) + msg = re.escape(f"Cannot interpolate with {ser.dtype} dtype") + with pytest.raises(TypeError, match=msg): pd.Series(data).interpolate() From 2641aee6762fe4a6d2374679a21d68e95da05e8f Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Wed, 1 Jan 2025 16:30:58 -0500 Subject: [PATCH 3/4] Fixup for NumPyExtensionArray --- pandas/core/arrays/numpy_.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandas/core/arrays/numpy_.py b/pandas/core/arrays/numpy_.py index 9f7238a97d808..07fa6254d87f3 100644 --- a/pandas/core/arrays/numpy_.py +++ b/pandas/core/arrays/numpy_.py @@ -287,6 +287,9 @@ def interpolate( See NDFrame.interpolate.__doc__. """ # NB: we return type(self) even if copy=False + if not self.dtype._is_numeric: + raise TypeError(f"Cannot interpolate with {self.dtype} dtype") + if not copy: out_data = self._ndarray else: From 7c862d6e9d9b05c1b6acdf68977f614df0c620b8 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Thu, 2 Jan 2025 16:09:41 -0500 Subject: [PATCH 4/4] Use tm.shares_memory --- pandas/tests/frame/methods/test_interpolate.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pandas/tests/frame/methods/test_interpolate.py b/pandas/tests/frame/methods/test_interpolate.py index 2cf9bf6e4688a..09d1cc9a479b2 100644 --- a/pandas/tests/frame/methods/test_interpolate.py +++ b/pandas/tests/frame/methods/test_interpolate.py @@ -84,9 +84,8 @@ def test_interp_basic(self, using_infer_string): df.interpolate(inplace=True) # check we DID operate inplace - assert np.shares_memory(df["C"]._values, cvalues) - if not using_infer_string: - assert np.shares_memory(df["D"]._values, dvalues) + assert tm.shares_memory(df["C"]._values, cvalues) + assert tm.shares_memory(df["D"]._values, dvalues) @pytest.mark.xfail( using_string_dtype(), reason="interpolate doesn't work for string"