From c18253f0701c501c35f95249593741fa17bff43f Mon Sep 17 00:00:00 2001 From: Kevin Islas Date: Tue, 3 Jul 2018 23:58:47 -1000 Subject: [PATCH 1/4] Error message when interpolating with non-numeric index column #21662 --- pandas/core/generic.py | 7 +++++++ pandas/tests/generic/test_generic.py | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 26c23b84a9c04..cd2a07c6e8f02 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -6024,6 +6024,13 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, raise NotImplementedError("Interpolation with NaNs in the index " "has not been implemented. Try filling " "those NaNs before interpolating.") + + if not np.issubdtype(index.dtype, np.number): + raise TypeError("Index column must be numeric when using any " + "interpolation method other than linear. Try " + "setting a numeric index column before " + "interpolating") + data = _maybe_transposed_self._data new_data = data.interpolate(method=method, axis=ax, index=index, values=_maybe_transposed_self, limit=limit, diff --git a/pandas/tests/generic/test_generic.py b/pandas/tests/generic/test_generic.py index 533bff0384ad9..3c14138dd3cdb 100644 --- a/pandas/tests/generic/test_generic.py +++ b/pandas/tests/generic/test_generic.py @@ -1008,3 +1008,16 @@ def test_pipe_panel(self): with pytest.raises(ValueError): result = wp.pipe((f, 'y'), x=1, y=1) + + def test_interpolate(self): + #Using a numeric index column + df = DataFrame([0, 1, np.nan, 3], index=[1, 2, 3, 4]) + series = Series(df[0]) + assert series.interpolate( + method="quadratic").equals(series.interpolate(method="linear")) + + #Using a non-numeric index column + df = DataFrame([0, 1, np.nan, 3], index=["A", "B", "C", "D"]) + series = Series(df[0]) + with pytest.raises(TypeError): + result = series.interpolate(method="quadratic") From 6a904534c9145415a25198a2875d2b019e93d218 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 6 Jul 2018 11:45:46 -0500 Subject: [PATCH 2/4] Adding whatsnew entry --- doc/source/whatsnew/v0.24.0.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/source/whatsnew/v0.24.0.txt b/doc/source/whatsnew/v0.24.0.txt index 3a8c81b5e9281..100d2a406c577 100644 --- a/doc/source/whatsnew/v0.24.0.txt +++ b/doc/source/whatsnew/v0.24.0.txt @@ -243,6 +243,10 @@ Documentation Changes Bug Fixes ~~~~~~~~~ +**Data-type specific** + +- Bug in :meth:`Series.interpolate()` where appropiate error was not raised when interpolating with a non-numeric index column (:issue:`21662`) + Categorical ^^^^^^^^^^^ From adcbfd36c4d791ad7dddb0d1774ff4badd409d5d Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 6 Jul 2018 12:10:47 -0500 Subject: [PATCH 3/4] Solving PEP8 issues --- pandas/tests/generic/test_generic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/tests/generic/test_generic.py b/pandas/tests/generic/test_generic.py index 3c14138dd3cdb..9e4c5002b955e 100644 --- a/pandas/tests/generic/test_generic.py +++ b/pandas/tests/generic/test_generic.py @@ -1010,13 +1010,13 @@ def test_pipe_panel(self): result = wp.pipe((f, 'y'), x=1, y=1) def test_interpolate(self): - #Using a numeric index column + # Using a numeric index column df = DataFrame([0, 1, np.nan, 3], index=[1, 2, 3, 4]) series = Series(df[0]) assert series.interpolate( method="quadratic").equals(series.interpolate(method="linear")) - - #Using a non-numeric index column + + # Using a non-numeric index column df = DataFrame([0, 1, np.nan, 3], index=["A", "B", "C", "D"]) series = Series(df[0]) with pytest.raises(TypeError): From 14e7fd73c4d9650f25f763405b3f536ff99cd0dc Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 6 Jul 2018 13:16:21 -0500 Subject: [PATCH 4/4] Adding requested changes, thanks for the review! @jreback --- pandas/core/generic.py | 6 +++--- pandas/tests/generic/test_generic.py | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index cd2a07c6e8f02..80fffd259c6ab 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -6025,11 +6025,11 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, "has not been implemented. Try filling " "those NaNs before interpolating.") - if not np.issubdtype(index.dtype, np.number): - raise TypeError("Index column must be numeric when using any " + if not is_numeric_dtype(index): + raise ValueError("Index column must be numeric when using any " "interpolation method other than linear. Try " "setting a numeric index column before " - "interpolating") + "interpolating.") data = _maybe_transposed_self._data new_data = data.interpolate(method=method, axis=ax, index=index, diff --git a/pandas/tests/generic/test_generic.py b/pandas/tests/generic/test_generic.py index 9e4c5002b955e..a41b680f8648a 100644 --- a/pandas/tests/generic/test_generic.py +++ b/pandas/tests/generic/test_generic.py @@ -1010,6 +1010,7 @@ def test_pipe_panel(self): result = wp.pipe((f, 'y'), x=1, y=1) def test_interpolate(self): + # GH 21662 # Using a numeric index column df = DataFrame([0, 1, np.nan, 3], index=[1, 2, 3, 4]) series = Series(df[0]) @@ -1019,5 +1020,8 @@ def test_interpolate(self): # Using a non-numeric index column df = DataFrame([0, 1, np.nan, 3], index=["A", "B", "C", "D"]) series = Series(df[0]) - with pytest.raises(TypeError): + with pytest.raises(ValueError, match="Index column must be numeric " + "when using any interpolation method other than linear. Try " + "setting a numeric index column before interpolating."): + result = series.interpolate(method="quadratic")