From 638255f6c36f132abfa0a0dbeaa851fb67bc4b8b Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Fri, 28 May 2021 18:27:18 +0530 Subject: [PATCH 01/12] ENH: Deprecate non-keyword arguments for interpolate --- doc/source/whatsnew/v1.3.0.rst | 1 + pandas/core/resample.py | 4 ++++ pandas/tests/resample/test_deprecated.py | 16 ++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index 8a3d6cf63d4f1..bdddc295e83c0 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -682,6 +682,7 @@ Deprecations - Deprecated passing arguments as positional (except for ``"codes"``) in :meth:`MultiIndex.codes` (:issue:`41485`) - Deprecated passing arguments as positional in :meth:`Index.set_names` and :meth:`MultiIndex.set_names` (except for ``names``) (:issue:`41485`) - Deprecated passing arguments (apart from ``cond`` and ``other``) as positional in :meth:`DataFrame.mask` and :meth:`Series.mask` (:issue:`41485`) +- Deprecated passing arguments as positional in :meth:`DataFrame.interpolate` (other than ``"method``) (:issue:`41485`) - Deprecated passing arguments as positional in :meth:`DataFrame.clip` and :meth:`Series.clip` (other than ``"upper"`` and ``"lower"``) (:issue:`41485`) - Deprecated special treatment of lists with first element a Categorical in the :class:`DataFrame` constructor; pass as ``pd.DataFrame({col: categorical, ...})`` instead (:issue:`38845`) - Deprecated passing arguments as positional (except for ``"method"``) in :meth:`DataFrame.interpolate` and :meth:`Series.interpolate` (:issue:`41485`) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 8195c18768eec..1d600e555b247 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -35,6 +35,7 @@ Appender, Substitution, doc, + deprecate_nonkeyword_arguments ) from pandas.core.dtypes.generic import ( @@ -832,6 +833,9 @@ def fillna(self, method, limit=None): """ return self._upsample(method, limit=limit) + @deprecate_nonkeyword_arguments( + version=None, allowed_args=["self", "method"] + ) @doc(NDFrame.interpolate, **_shared_docs_kwargs) def interpolate( self, diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index fdb3a7872ad67..c460e59d7dc94 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -278,3 +278,19 @@ def test_resample_base_with_timedeltaindex(): tm.assert_index_equal(without_base.index, exp_without_base) tm.assert_index_equal(with_base.index, exp_with_base) + + +def test_interpolate_posargs_deprecation(): + + df = pd.DataFrame([1.0,np.nan,-2.0,2.0]) + + msg = ( + r"In a future version of pandas all arguments of DataFrame\.interpolate " + r"except for the argument 'method' will be keyword-only" + ) + + with tm.assert_produces_warning(FutureWarning, match=msg): + result = df.interpolate(method='linear', limit_direction='forward', axis=0) + + expected = pd.DataFrame([1.0, -0.5, -2.0, 2.0]) + tm.assert_frame_equal(result, expected) From fc93316a6960fad2599e2fc4e6a99adb681c54aa Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Fri, 28 May 2021 19:22:06 +0530 Subject: [PATCH 02/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/tests/resample/test_deprecated.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index c460e59d7dc94..818e1b62d95c2 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -282,7 +282,7 @@ def test_resample_base_with_timedeltaindex(): def test_interpolate_posargs_deprecation(): - df = pd.DataFrame([1.0,np.nan,-2.0,2.0]) + df = DataFrame([1.0,np.nan,-2.0,2.0]) msg = ( r"In a future version of pandas all arguments of DataFrame\.interpolate " @@ -292,5 +292,5 @@ def test_interpolate_posargs_deprecation(): with tm.assert_produces_warning(FutureWarning, match=msg): result = df.interpolate(method='linear', limit_direction='forward', axis=0) - expected = pd.DataFrame([1.0, -0.5, -2.0, 2.0]) + expected = DataFrame([1.0, -0.5, -2.0, 2.0]) tm.assert_frame_equal(result, expected) From c52686407a51f39a02d58ca73abaef770ec583d5 Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Fri, 28 May 2021 19:28:27 +0530 Subject: [PATCH 03/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/core/resample.py | 2 +- pandas/tests/resample/test_deprecated.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 1d600e555b247..5ec5638e8aabe 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -834,7 +834,7 @@ def fillna(self, method, limit=None): return self._upsample(method, limit=limit) @deprecate_nonkeyword_arguments( - version=None, allowed_args=["self", "method"] + version=None, allowed_args=["self", "methodca"] ) @doc(NDFrame.interpolate, **_shared_docs_kwargs) def interpolate( diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 818e1b62d95c2..5697583203596 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -282,12 +282,12 @@ def test_resample_base_with_timedeltaindex(): def test_interpolate_posargs_deprecation(): - df = DataFrame([1.0,np.nan,-2.0,2.0]) + df = DataFrame([1.0, np.nan, -2.0, 2.0]) msg = ( - r"In a future version of pandas all arguments of DataFrame\.interpolate " - r"except for the argument 'method' will be keyword-only" - ) + r"In a future version of pandas all arguments of DataFrame\.interpolate " + r"except for the argument 'method' will be keyword-only" + ) with tm.assert_produces_warning(FutureWarning, match=msg): result = df.interpolate(method='linear', limit_direction='forward', axis=0) From 99ffd775c3f2e7f93e8a7d91f05fd8173606410e Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Fri, 28 May 2021 19:32:55 +0530 Subject: [PATCH 04/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/core/resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 5ec5638e8aabe..1d600e555b247 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -834,7 +834,7 @@ def fillna(self, method, limit=None): return self._upsample(method, limit=limit) @deprecate_nonkeyword_arguments( - version=None, allowed_args=["self", "methodca"] + version=None, allowed_args=["self", "method"] ) @doc(NDFrame.interpolate, **_shared_docs_kwargs) def interpolate( From 9f1363fa3114be8a0c441b87df9779ee8d254a3a Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Fri, 28 May 2021 20:08:16 +0530 Subject: [PATCH 05/12] ENH: Deprecate non-keyword arguments for interpolate --- doc/source/whatsnew/v1.3.0.rst | 2 +- pandas/tests/resample/test_deprecated.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index bdddc295e83c0..ec1785dbc97b8 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -682,7 +682,7 @@ Deprecations - Deprecated passing arguments as positional (except for ``"codes"``) in :meth:`MultiIndex.codes` (:issue:`41485`) - Deprecated passing arguments as positional in :meth:`Index.set_names` and :meth:`MultiIndex.set_names` (except for ``names``) (:issue:`41485`) - Deprecated passing arguments (apart from ``cond`` and ``other``) as positional in :meth:`DataFrame.mask` and :meth:`Series.mask` (:issue:`41485`) -- Deprecated passing arguments as positional in :meth:`DataFrame.interpolate` (other than ``"method``) (:issue:`41485`) +- Deprecated passing arguments as positional in :meth:`Resampler.interpolate` (other than ``"method``) (:issue:`41485`) - Deprecated passing arguments as positional in :meth:`DataFrame.clip` and :meth:`Series.clip` (other than ``"upper"`` and ``"lower"``) (:issue:`41485`) - Deprecated special treatment of lists with first element a Categorical in the :class:`DataFrame` constructor; pass as ``pd.DataFrame({col: categorical, ...})`` instead (:issue:`38845`) - Deprecated passing arguments as positional (except for ``"method"``) in :meth:`DataFrame.interpolate` and :meth:`Series.interpolate` (:issue:`41485`) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 5697583203596..a25cdbaaa1045 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -282,7 +282,7 @@ def test_resample_base_with_timedeltaindex(): def test_interpolate_posargs_deprecation(): - df = DataFrame([1.0, np.nan, -2.0, 2.0]) + s = pd.Series([0.0, 1.0, np.nan, 3.0]) msg = ( r"In a future version of pandas all arguments of DataFrame\.interpolate " @@ -290,7 +290,7 @@ def test_interpolate_posargs_deprecation(): ) with tm.assert_produces_warning(FutureWarning, match=msg): - result = df.interpolate(method='linear', limit_direction='forward', axis=0) + result = s.interpolate() - expected = DataFrame([1.0, -0.5, -2.0, 2.0]) + expected = DataFrame([0.0, 1.0, 2.0, 3.0]) tm.assert_frame_equal(result, expected) From 4990a158f367663b7bc90359d9036694f230270e Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Fri, 28 May 2021 20:18:41 +0530 Subject: [PATCH 06/12] ENH: Deprecate non-keyword arguments for interpolate --- doc/source/whatsnew/v1.3.0.rst | 2 +- pandas/tests/resample/test_deprecated.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index ec1785dbc97b8..e32df85fb7e3f 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -682,7 +682,7 @@ Deprecations - Deprecated passing arguments as positional (except for ``"codes"``) in :meth:`MultiIndex.codes` (:issue:`41485`) - Deprecated passing arguments as positional in :meth:`Index.set_names` and :meth:`MultiIndex.set_names` (except for ``names``) (:issue:`41485`) - Deprecated passing arguments (apart from ``cond`` and ``other``) as positional in :meth:`DataFrame.mask` and :meth:`Series.mask` (:issue:`41485`) -- Deprecated passing arguments as positional in :meth:`Resampler.interpolate` (other than ``"method``) (:issue:`41485`) +- Deprecated passing arguments as positional in :meth:`Resampler.interpolate` (other than ``"method"``) (:issue:`41485`) - Deprecated passing arguments as positional in :meth:`DataFrame.clip` and :meth:`Series.clip` (other than ``"upper"`` and ``"lower"``) (:issue:`41485`) - Deprecated special treatment of lists with first element a Categorical in the :class:`DataFrame` constructor; pass as ``pd.DataFrame({col: categorical, ...})`` instead (:issue:`38845`) - Deprecated passing arguments as positional (except for ``"method"``) in :meth:`DataFrame.interpolate` and :meth:`Series.interpolate` (:issue:`41485`) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index a25cdbaaa1045..2b34b78585ee1 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -292,5 +292,5 @@ def test_interpolate_posargs_deprecation(): with tm.assert_produces_warning(FutureWarning, match=msg): result = s.interpolate() - expected = DataFrame([0.0, 1.0, 2.0, 3.0]) + expected = pd.Series([0.0, 1.0, 2.0, 3.0]) tm.assert_frame_equal(result, expected) From afa41d07bd9da749923fdd5d57f34616f36689a2 Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Sat, 29 May 2021 00:35:43 +0530 Subject: [PATCH 07/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/core/resample.py | 6 ++---- pandas/tests/resample/test_deprecated.py | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 1d600e555b247..6378432392a04 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -34,8 +34,8 @@ from pandas.util._decorators import ( Appender, Substitution, + deprecate_nonkeyword_arguments, doc, - deprecate_nonkeyword_arguments ) from pandas.core.dtypes.generic import ( @@ -833,9 +833,7 @@ def fillna(self, method, limit=None): """ return self._upsample(method, limit=limit) - @deprecate_nonkeyword_arguments( - version=None, allowed_args=["self", "method"] - ) + @deprecate_nonkeyword_arguments(version=None, allowed_args=["self", "method"]) @doc(NDFrame.interpolate, **_shared_docs_kwargs) def interpolate( self, diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 2b34b78585ee1..92cc638f66ecf 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -2,6 +2,7 @@ datetime, timedelta, ) +from io import StringIO import numpy as np import pytest @@ -282,7 +283,14 @@ def test_resample_base_with_timedeltaindex(): def test_interpolate_posargs_deprecation(): - s = pd.Series([0.0, 1.0, np.nan, 3.0]) + data = StringIO( + """\ + Values + 1992-08-27 07:46:48,1 + 1992-08-27 07:46:59,4""" + ) + s = pd.read_csv(data, squeeze=True) + s.index = pd.to_datetime(s.index) msg = ( r"In a future version of pandas all arguments of DataFrame\.interpolate " @@ -290,7 +298,17 @@ def test_interpolate_posargs_deprecation(): ) with tm.assert_produces_warning(FutureWarning, match=msg): - result = s.interpolate() + result = s.resample("3s").interpolate("linear") + + data_exp = StringIO( + """\ + Values + 1992-08-27 07:46:48,1.0 + 1992-08-27 07:46:51,1.0 + 1992-08-27 07:46:54,1.0 + 1992-08-27 07:46:57,1.0""" + ) - expected = pd.Series([0.0, 1.0, 2.0, 3.0]) + expected = pd.read_csv(data_exp, squeeze=True) + expected.index = pd.to_datetime(expected.index) tm.assert_frame_equal(result, expected) From b99fa40daf722b168f657e3dcc620362f3568c32 Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Sat, 29 May 2021 10:38:49 +0530 Subject: [PATCH 08/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/tests/resample/test_deprecated.py | 35 ++++++++++++------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 92cc638f66ecf..0cd0a44d27688 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -2,7 +2,6 @@ datetime, timedelta, ) -from io import StringIO import numpy as np import pytest @@ -282,15 +281,11 @@ def test_resample_base_with_timedeltaindex(): def test_interpolate_posargs_deprecation(): - - data = StringIO( - """\ - Values - 1992-08-27 07:46:48,1 - 1992-08-27 07:46:59,4""" + # GH 41485 + df = DataFrame({"ds": ["1992-08-27 07:46:48", "1992-08-27 07:46:59"], "y": [1, 4]}) + s = Series( + df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) ) - s = pd.read_csv(data, squeeze=True) - s.index = pd.to_datetime(s.index) msg = ( r"In a future version of pandas all arguments of DataFrame\.interpolate " @@ -300,15 +295,19 @@ def test_interpolate_posargs_deprecation(): with tm.assert_produces_warning(FutureWarning, match=msg): result = s.resample("3s").interpolate("linear") - data_exp = StringIO( - """\ - Values - 1992-08-27 07:46:48,1.0 - 1992-08-27 07:46:51,1.0 - 1992-08-27 07:46:54,1.0 - 1992-08-27 07:46:57,1.0""" + df = DataFrame( + { + "ds": [ + "1992-08-27 07:46:48", + "1992-08-27 07:46:51", + "1992-08-27 07:46:54", + "1992-08-27 07:46:57", + ], + "y": [1.0, 1.0, 1.0, 1.0], + } + ) + expected = Series( + df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) ) - expected = pd.read_csv(data_exp, squeeze=True) - expected.index = pd.to_datetime(expected.index) tm.assert_frame_equal(result, expected) From f6076d251069be605c4452e3bb3ba577781cee83 Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Sun, 30 May 2021 17:44:12 +0530 Subject: [PATCH 09/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/tests/resample/test_deprecated.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 0cd0a44d27688..065539d2c8bbd 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -287,13 +287,7 @@ def test_interpolate_posargs_deprecation(): df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) ) - msg = ( - r"In a future version of pandas all arguments of DataFrame\.interpolate " - r"except for the argument 'method' will be keyword-only" - ) - - with tm.assert_produces_warning(FutureWarning, match=msg): - result = s.resample("3s").interpolate("linear") + result = s.resample("3s").interpolate("linear") df = DataFrame( { @@ -309,5 +303,5 @@ def test_interpolate_posargs_deprecation(): expected = Series( df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) ) - - tm.assert_frame_equal(result, expected) + expected.index.freq = "3s" + tm.assert_series_equal(result, expected) From b47ecc2cec7caf1635f6d9b9ed28223a2584849c Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Wed, 2 Jun 2021 13:30:19 +0530 Subject: [PATCH 10/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/tests/resample/test_deprecated.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 065539d2c8bbd..50c8619ed9b8f 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -287,7 +287,13 @@ def test_interpolate_posargs_deprecation(): df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) ) - result = s.resample("3s").interpolate("linear") + msg = ( + r"In a future version of pandas all arguments of Resampler\.interpolate " + r"except for the argument 'method' will be keyword-only" + ) + + with tm.assert_produces_warning(FutureWarning, match=msg): + result = s.resample("3S").interpolate("linear", 0) df = DataFrame( { From 29549509c55b56a5cb74b7c6877ed880468ce720 Mon Sep 17 00:00:00 2001 From: Anupam-USP Date: Thu, 3 Jun 2021 11:39:27 +0530 Subject: [PATCH 11/12] ENH: Deprecate non-keyword arguments for interpolate --- pandas/tests/resample/test_deprecated.py | 32 ++++++++++-------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 50c8619ed9b8f..586dc1595e87e 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -282,10 +282,8 @@ def test_resample_base_with_timedeltaindex(): def test_interpolate_posargs_deprecation(): # GH 41485 - df = DataFrame({"ds": ["1992-08-27 07:46:48", "1992-08-27 07:46:59"], "y": [1, 4]}) - s = Series( - df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) - ) + idx = pd.to_datetime(["1992-08-27 07:46:48", "1992-08-27 07:46:59"]) + s = Series([1, 4], index=idx) msg = ( r"In a future version of pandas all arguments of Resampler\.interpolate " @@ -293,21 +291,17 @@ def test_interpolate_posargs_deprecation(): ) with tm.assert_produces_warning(FutureWarning, match=msg): - result = s.resample("3S").interpolate("linear", 0) - - df = DataFrame( - { - "ds": [ - "1992-08-27 07:46:48", - "1992-08-27 07:46:51", - "1992-08-27 07:46:54", - "1992-08-27 07:46:57", - ], - "y": [1.0, 1.0, 1.0, 1.0], - } - ) - expected = Series( - df.iloc[:, 1].values.reshape(-1), index=pd.to_datetime(df.iloc[:, 0].values) + result = s.resample("3s").interpolate("linear", 0) + + idx = pd.to_datetime( + [ + "1992-08-27 07:46:48", + "1992-08-27 07:46:51", + "1992-08-27 07:46:54", + "1992-08-27 07:46:57", + ] ) + expected = Series([1.0, 1.0, 1.0, 1.0], index=idx) + expected.index.freq = "3s" tm.assert_series_equal(result, expected) From 7ff25da8b97ab80a24a054aabf801dad5bfdcbea Mon Sep 17 00:00:00 2001 From: Marco Edward Gorelli Date: Fri, 4 Jun 2021 17:15:21 +0100 Subject: [PATCH 12/12] Update pandas/tests/resample/test_deprecated.py --- pandas/tests/resample/test_deprecated.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_deprecated.py b/pandas/tests/resample/test_deprecated.py index 586dc1595e87e..1f99c2888aad5 100644 --- a/pandas/tests/resample/test_deprecated.py +++ b/pandas/tests/resample/test_deprecated.py @@ -303,5 +303,5 @@ def test_interpolate_posargs_deprecation(): ) expected = Series([1.0, 1.0, 1.0, 1.0], index=idx) - expected.index.freq = "3s" + expected.index._data.freq = "3s" tm.assert_series_equal(result, expected)