From d88a8719ddff779f12a42adb3a824ad7bd961930 Mon Sep 17 00:00:00 2001 From: Jason Wolosonovich Date: Tue, 26 Apr 2016 21:25:47 -0700 Subject: [PATCH 1/8] BUG: COMPAT:0.18 added scipy version check GH12887 added scipy version check to _interpolate_scipy_wrapper to handle deprecation of 'piecewise_polynomial' method for scipy > 0.17 CLN: added 'from_derivatives' to 'replace' docs in pandas.core.generic GH12887 added 'from_derivatives' to 'replace._shared_docs' and noted deprecation of 'piecewise_polynomial' method DOC: referenced compatibility fix in 'whatsnew' docs --- doc/source/whatsnew/v0.18.1.txt | 1 + pandas/core/generic.py | 7 ++++++- pandas/core/missing.py | 23 ++++++++++++++++------- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/doc/source/whatsnew/v0.18.1.txt b/doc/source/whatsnew/v0.18.1.txt index 3345cb3d29926..5c1c53e0e9171 100644 --- a/doc/source/whatsnew/v0.18.1.txt +++ b/doc/source/whatsnew/v0.18.1.txt @@ -656,3 +656,4 @@ Bug Fixes - Bug in ``to_numeric`` with ``Index`` returns ``np.ndarray``, rather than ``Index`` (:issue:`12777`) - Bug in ``to_numeric`` with datetime-like may raise ``TypeError`` (:issue:`12777`) - Bug in ``to_numeric`` with scalar raises ``ValueError`` (:issue:`12777`) +- Compat with SciPy > 0.17 for deprecated 'piecewise_polynomial' interpolation method (:issue:`12887`) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index b1b38d659b55c..d256b6bd14b3a 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -3452,7 +3452,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, ---------- method : {'linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', - 'polynomial', 'spline' 'piecewise_polynomial', 'pchip', + 'polynomial', 'spline' 'from_derivatives', 'pchip', 'akima'} * 'linear': ignore the index and treat the values as equally @@ -3473,9 +3473,14 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, the scipy documentation for more on their behavior `here `__ # noqa `and here `__ # noqa + * 'from_derivatives' refers to BPoly.from_derivatives which + replaces 'piecewise_polynomial' interpolation method for + scipy versions > 0.17 .. versionadded:: 0.18.1 Added support for the 'akima' method + Replaced interpolate method 'piecewise_polynomial' with + 'from_derivatives' for scipy > 0.17 axis : {0, 1}, default 0 * 0: fill column-by-column diff --git a/pandas/core/missing.py b/pandas/core/missing.py index 634a04bbc2cdb..51ee17adfacea 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -223,13 +223,22 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, raise ImportError('{0} interpolation requires Scipy'.format(method)) new_x = np.asarray(new_x) - - # ignores some kwargs that could be passed along. - alt_methods = { - 'barycentric': interpolate.barycentric_interpolate, - 'krogh': interpolate.krogh_interpolate, - 'piecewise_polynomial': interpolate.piecewise_polynomial_interpolate, - } + import scipy + if scipy.__version__ <= '0.17': + # ignores some kwargs that could be passed along. + alt_methods = { + 'barycentric': interpolate.barycentric_interpolate, + 'krogh': interpolate.krogh_interpolate, + 'piecewise_polynomial': + interpolate.piecewise_polynomial_interpolate, + } + else: + # ignores some kwargs that could be passed along. + alt_methods = { + 'barycentric': interpolate.barycentric_interpolate, + 'krogh': interpolate.krogh_interpolate, + 'from_derivatives': interpolate.BPoly.from_derivatives, + } if getattr(x, 'is_all_dates', False): # GH 5975, scipy.interp1d can't hande datetime64s From b43978e3326c11ab22af164ff9f988657cc2fdc1 Mon Sep 17 00:00:00 2001 From: Jason Wolosonovich Date: Wed, 27 Apr 2016 23:27:32 -0700 Subject: [PATCH 2/8] CLN: refactored 'from_derivatives' additions in pandas/core/missing.py GH12887 --- pandas/core/missing.py | 43 +++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/pandas/core/missing.py b/pandas/core/missing.py index 51ee17adfacea..c67fc788cf6fa 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -3,6 +3,7 @@ """ import numpy as np +from distutils.version import LooseVersion import pandas.core.common as com import pandas.algos as algos @@ -82,16 +83,24 @@ def clean_fill_method(method, allow_nearest=False): def clean_interp_method(method, **kwargs): + import scipy + scipy_version = scipy.__version__ order = kwargs.get('order') valid = ['linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial', 'krogh', - 'piecewise_polynomial', 'pchip', 'akima', 'spline'] + 'piecewise_polynomial', 'pchip', 'akima', 'spline', + 'from_derivatives'] if method in ('spline', 'polynomial') and order is None: raise ValueError("You must specify the order of the spline or " "polynomial.") if method not in valid: raise ValueError("method must be one of {0}." "Got '{1}' instead.".format(valid, method)) + # compat GH12887 + if method == 'piecewise_polynomial' and LooseVersion(scipy_version) > \ + LooseVersion('0.17'): + raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " + "Use 'from_derivatives' instead".format(method)) return method @@ -216,6 +225,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, the list in _clean_interp_method """ try: + import scipy from scipy import interpolate # TODO: Why is DatetimeIndex being imported here? from pandas import DatetimeIndex # noqa @@ -223,22 +233,14 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, raise ImportError('{0} interpolation requires Scipy'.format(method)) new_x = np.asarray(new_x) - import scipy - if scipy.__version__ <= '0.17': - # ignores some kwargs that could be passed along. - alt_methods = { - 'barycentric': interpolate.barycentric_interpolate, - 'krogh': interpolate.krogh_interpolate, - 'piecewise_polynomial': - interpolate.piecewise_polynomial_interpolate, - } - else: - # ignores some kwargs that could be passed along. - alt_methods = { - 'barycentric': interpolate.barycentric_interpolate, - 'krogh': interpolate.krogh_interpolate, - 'from_derivatives': interpolate.BPoly.from_derivatives, - } + scipy_version = scipy.__version__ # for version check; GH12887 + + # ignores some kwargs that could be passed along. + alt_methods = { + 'barycentric': interpolate.barycentric_interpolate, + 'krogh': interpolate.krogh_interpolate, + 'from_derivatives': interpolate.BPoly.from_derivatives, + } if getattr(x, 'is_all_dates', False): # GH 5975, scipy.interp1d can't hande datetime64s @@ -257,6 +259,13 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, except ImportError: raise ImportError("Your version of Scipy does not support " "Akima interpolation.") + elif method == 'piecewise_polynomial': # GH12887 + if LooseVersion(scipy_version) > LooseVersion('0.17'): + raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " + "Use 'from_derivatives' instead".format(method)) + else: + alt_methods['piecewise_polynomial'] = \ + interpolate.piecewise_polynomial_interpolate interp1d_methods = ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'polynomial'] From 471a65b9c0b847a27a954aa0f22b40b040ce4d64 Mon Sep 17 00:00:00 2001 From: Jason Wolosonovich Date: Wed, 27 Apr 2016 23:30:19 -0700 Subject: [PATCH 3/8] CLN: updated expected behavior of 'from_derivatives' in 'generic' docs GH12887 --- pandas/core/generic.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index d256b6bd14b3a..b372e0b79ae99 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -3452,8 +3452,8 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, ---------- method : {'linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', - 'polynomial', 'spline' 'from_derivatives', 'pchip', - 'akima'} + 'polynomial', 'spline', 'piecewise_polynomial', + 'from_derivatives', 'pchip', 'akima'} * 'linear': ignore the index and treat the values as equally spaced. This is the only method supported on MultiIndexes. @@ -3474,13 +3474,13 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, `here `__ # noqa `and here `__ # noqa * 'from_derivatives' refers to BPoly.from_derivatives which - replaces 'piecewise_polynomial' interpolation method for - scipy versions > 0.17 + replaces 'piecewise_polynomial' interpolation method in scipy 0.18 .. versionadded:: 0.18.1 Added support for the 'akima' method - Replaced interpolate method 'piecewise_polynomial' with - 'from_derivatives' for scipy > 0.17 + Added interpolate method 'from_derivatives' which replaces + 'piecewise_polynomial' in scipy 0.18; backwards-compatible with + scipy < 0.18 axis : {0, 1}, default 0 * 0: fill column-by-column From a9ad6dffff5e2886bfb4ef7989aaf0bf95c5a09b Mon Sep 17 00:00:00 2001 From: Jason Wolosonovich Date: Sun, 1 May 2016 12:03:46 -0700 Subject: [PATCH 4/8] CLN: cleaned up whatsnew --- doc/source/whatsnew/v0.18.1.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v0.18.1.txt b/doc/source/whatsnew/v0.18.1.txt index 5c1c53e0e9171..4b1326ab5d97e 100644 --- a/doc/source/whatsnew/v0.18.1.txt +++ b/doc/source/whatsnew/v0.18.1.txt @@ -656,4 +656,5 @@ Bug Fixes - Bug in ``to_numeric`` with ``Index`` returns ``np.ndarray``, rather than ``Index`` (:issue:`12777`) - Bug in ``to_numeric`` with datetime-like may raise ``TypeError`` (:issue:`12777`) - Bug in ``to_numeric`` with scalar raises ``ValueError`` (:issue:`12777`) +- ``pd.read_excel()`` now accepts column names associated with keyword argument ``names``(:issue:`12870`) - Compat with SciPy > 0.17 for deprecated 'piecewise_polynomial' interpolation method (:issue:`12887`) From 3d83dd609c73dcbcd6333ec2e0e8fa7c810a7e6b Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 1 May 2016 12:26:37 -0400 Subject: [PATCH 5/8] wip --- doc/source/whatsnew/v0.18.1.txt | 3 +-- pandas/core/missing.py | 24 +++++++++--------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/doc/source/whatsnew/v0.18.1.txt b/doc/source/whatsnew/v0.18.1.txt index 4b1326ab5d97e..0ca6683f310d2 100644 --- a/doc/source/whatsnew/v0.18.1.txt +++ b/doc/source/whatsnew/v0.18.1.txt @@ -512,6 +512,7 @@ Other API changes - Provide a proper ``__name__`` and ``__qualname__`` attributes for generic functions (:issue:`12021`) - ``pd.concat(ignore_index=True)`` now uses ``RangeIndex`` as default (:issue:`12695`) - ``pd.merge()`` and ``DataFrame.join()`` will show a ``UserWarning`` when merging/joining a single- with a multi-leveled dataframe (:issue:`9455`, :issue:`12219`) +- Compat with SciPy > 0.17 for deprecated ``piecewise_polynomial`` interpolation method (:issue:`12887`) .. _whatsnew_0181.deprecations: @@ -656,5 +657,3 @@ Bug Fixes - Bug in ``to_numeric`` with ``Index`` returns ``np.ndarray``, rather than ``Index`` (:issue:`12777`) - Bug in ``to_numeric`` with datetime-like may raise ``TypeError`` (:issue:`12777`) - Bug in ``to_numeric`` with scalar raises ``ValueError`` (:issue:`12777`) -- ``pd.read_excel()`` now accepts column names associated with keyword argument ``names``(:issue:`12870`) -- Compat with SciPy > 0.17 for deprecated 'piecewise_polynomial' interpolation method (:issue:`12887`) diff --git a/pandas/core/missing.py b/pandas/core/missing.py index c67fc788cf6fa..0bf112dcb0c58 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -83,8 +83,6 @@ def clean_fill_method(method, allow_nearest=False): def clean_interp_method(method, **kwargs): - import scipy - scipy_version = scipy.__version__ order = kwargs.get('order') valid = ['linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial', 'krogh', @@ -96,11 +94,7 @@ def clean_interp_method(method, **kwargs): if method not in valid: raise ValueError("method must be one of {0}." "Got '{1}' instead.".format(valid, method)) - # compat GH12887 - if method == 'piecewise_polynomial' and LooseVersion(scipy_version) > \ - LooseVersion('0.17'): - raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " - "Use 'from_derivatives' instead".format(method)) + return method @@ -200,7 +194,8 @@ def _interp_limit(invalid, fw_limit, bw_limit): sp_methods = ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', 'spline', 'polynomial', - 'piecewise_polynomial', 'pchip', 'akima'] + 'from_derivatives', 'piecewise_polynomial', 'pchip', 'akima'] + if method in sp_methods: inds = np.asarray(xvalues) # hack for DatetimeIndex, #1646 @@ -233,7 +228,6 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, raise ImportError('{0} interpolation requires Scipy'.format(method)) new_x = np.asarray(new_x) - scipy_version = scipy.__version__ # for version check; GH12887 # ignores some kwargs that could be passed along. alt_methods = { @@ -259,13 +253,13 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, except ImportError: raise ImportError("Your version of Scipy does not support " "Akima interpolation.") - elif method == 'piecewise_polynomial': # GH12887 - if LooseVersion(scipy_version) > LooseVersion('0.17'): - raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " - "Use 'from_derivatives' instead".format(method)) + elif method == 'piecewise_polynomial': + """ return the method for compat with scipy version """ + if LooseVersion(scipy.__version__) <= LooseVersion('0.17'): + f = 'piecewise_polynomial_interpolate' else: - alt_methods['piecewise_polynomial'] = \ - interpolate.piecewise_polynomial_interpolate + f = 'from_derivatives' + alt_methods['piecewise_polynomial'] = getattr(interpolate, f) interp1d_methods = ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'polynomial'] From 2dde40cfc602a7c446cdc6cae998137c7d401c53 Mon Sep 17 00:00:00 2001 From: Jason Wolosonovich Date: Tue, 26 Apr 2016 21:25:47 -0700 Subject: [PATCH 6/8] BUG: COMPAT:0.18 added scipy version check GH12887 added scipy version check to _interpolate_scipy_wrapper to handle deprecation of 'piecewise_polynomial' method for scipy > 0.17 CLN: added 'from_derivatives' to 'replace' docs in pandas.core.generic GH12887 added 'from_derivatives' to 'replace._shared_docs' and noted deprecation of 'piecewise_polynomial' method DOC: referenced compatibility fix in 'whatsnew' docs --- doc/source/whatsnew/v0.18.1.txt | 2 ++ pandas/core/generic.py | 9 +++++++-- pandas/core/missing.py | 22 ++++++++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/doc/source/whatsnew/v0.18.1.txt b/doc/source/whatsnew/v0.18.1.txt index 1a79601bee384..6fa3304a42b31 100644 --- a/doc/source/whatsnew/v0.18.1.txt +++ b/doc/source/whatsnew/v0.18.1.txt @@ -656,3 +656,5 @@ Bug Fixes - Bug in ``to_numeric`` with ``Index`` returns ``np.ndarray``, rather than ``Index`` (:issue:`12777`) - Bug in ``to_numeric`` with datetime-like may raise ``TypeError`` (:issue:`12777`) - Bug in ``to_numeric`` with scalar raises ``ValueError`` (:issue:`12777`) +- ``pd.read_excel()`` now accepts column names associated with keyword argument ``names``(:issue:`12870`) +- Compat with SciPy > 0.17 for deprecated 'piecewise_polynomial' interpolation method (:issue:`12887`) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index b1b38d659b55c..b372e0b79ae99 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -3452,8 +3452,8 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, ---------- method : {'linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', - 'polynomial', 'spline' 'piecewise_polynomial', 'pchip', - 'akima'} + 'polynomial', 'spline', 'piecewise_polynomial', + 'from_derivatives', 'pchip', 'akima'} * 'linear': ignore the index and treat the values as equally spaced. This is the only method supported on MultiIndexes. @@ -3473,9 +3473,14 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, the scipy documentation for more on their behavior `here `__ # noqa `and here `__ # noqa + * 'from_derivatives' refers to BPoly.from_derivatives which + replaces 'piecewise_polynomial' interpolation method in scipy 0.18 .. versionadded:: 0.18.1 Added support for the 'akima' method + Added interpolate method 'from_derivatives' which replaces + 'piecewise_polynomial' in scipy 0.18; backwards-compatible with + scipy < 0.18 axis : {0, 1}, default 0 * 0: fill column-by-column diff --git a/pandas/core/missing.py b/pandas/core/missing.py index 634a04bbc2cdb..c67fc788cf6fa 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -3,6 +3,7 @@ """ import numpy as np +from distutils.version import LooseVersion import pandas.core.common as com import pandas.algos as algos @@ -82,16 +83,24 @@ def clean_fill_method(method, allow_nearest=False): def clean_interp_method(method, **kwargs): + import scipy + scipy_version = scipy.__version__ order = kwargs.get('order') valid = ['linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial', 'krogh', - 'piecewise_polynomial', 'pchip', 'akima', 'spline'] + 'piecewise_polynomial', 'pchip', 'akima', 'spline', + 'from_derivatives'] if method in ('spline', 'polynomial') and order is None: raise ValueError("You must specify the order of the spline or " "polynomial.") if method not in valid: raise ValueError("method must be one of {0}." "Got '{1}' instead.".format(valid, method)) + # compat GH12887 + if method == 'piecewise_polynomial' and LooseVersion(scipy_version) > \ + LooseVersion('0.17'): + raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " + "Use 'from_derivatives' instead".format(method)) return method @@ -216,6 +225,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, the list in _clean_interp_method """ try: + import scipy from scipy import interpolate # TODO: Why is DatetimeIndex being imported here? from pandas import DatetimeIndex # noqa @@ -223,12 +233,13 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, raise ImportError('{0} interpolation requires Scipy'.format(method)) new_x = np.asarray(new_x) + scipy_version = scipy.__version__ # for version check; GH12887 # ignores some kwargs that could be passed along. alt_methods = { 'barycentric': interpolate.barycentric_interpolate, 'krogh': interpolate.krogh_interpolate, - 'piecewise_polynomial': interpolate.piecewise_polynomial_interpolate, + 'from_derivatives': interpolate.BPoly.from_derivatives, } if getattr(x, 'is_all_dates', False): @@ -248,6 +259,13 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, except ImportError: raise ImportError("Your version of Scipy does not support " "Akima interpolation.") + elif method == 'piecewise_polynomial': # GH12887 + if LooseVersion(scipy_version) > LooseVersion('0.17'): + raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " + "Use 'from_derivatives' instead".format(method)) + else: + alt_methods['piecewise_polynomial'] = \ + interpolate.piecewise_polynomial_interpolate interp1d_methods = ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'polynomial'] From 95279d9d6125f9768a4326b677173248fa5f0702 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 1 May 2016 12:26:37 -0400 Subject: [PATCH 7/8] wip --- doc/source/whatsnew/v0.18.1.txt | 3 +- pandas/core/missing.py | 77 ++++++++++++++++++++++------- pandas/tests/series/test_missing.py | 30 +++++++++++ 3 files changed, 90 insertions(+), 20 deletions(-) diff --git a/doc/source/whatsnew/v0.18.1.txt b/doc/source/whatsnew/v0.18.1.txt index 6fa3304a42b31..21d8746abdd0f 100644 --- a/doc/source/whatsnew/v0.18.1.txt +++ b/doc/source/whatsnew/v0.18.1.txt @@ -512,6 +512,7 @@ Other API changes - Provide a proper ``__name__`` and ``__qualname__`` attributes for generic functions (:issue:`12021`) - ``pd.concat(ignore_index=True)`` now uses ``RangeIndex`` as default (:issue:`12695`) - ``pd.merge()`` and ``DataFrame.join()`` will show a ``UserWarning`` when merging/joining a single- with a multi-leveled dataframe (:issue:`9455`, :issue:`12219`) +- Compat with SciPy > 0.17 for deprecated ``piecewise_polynomial`` interpolation method (:issue:`12887`) .. _whatsnew_0181.deprecations: @@ -656,5 +657,3 @@ Bug Fixes - Bug in ``to_numeric`` with ``Index`` returns ``np.ndarray``, rather than ``Index`` (:issue:`12777`) - Bug in ``to_numeric`` with datetime-like may raise ``TypeError`` (:issue:`12777`) - Bug in ``to_numeric`` with scalar raises ``ValueError`` (:issue:`12777`) -- ``pd.read_excel()`` now accepts column names associated with keyword argument ``names``(:issue:`12870`) -- Compat with SciPy > 0.17 for deprecated 'piecewise_polynomial' interpolation method (:issue:`12887`) diff --git a/pandas/core/missing.py b/pandas/core/missing.py index c67fc788cf6fa..911fcaf529f98 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -83,8 +83,6 @@ def clean_fill_method(method, allow_nearest=False): def clean_interp_method(method, **kwargs): - import scipy - scipy_version = scipy.__version__ order = kwargs.get('order') valid = ['linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial', 'krogh', @@ -96,11 +94,7 @@ def clean_interp_method(method, **kwargs): if method not in valid: raise ValueError("method must be one of {0}." "Got '{1}' instead.".format(valid, method)) - # compat GH12887 - if method == 'piecewise_polynomial' and LooseVersion(scipy_version) > \ - LooseVersion('0.17'): - raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " - "Use 'from_derivatives' instead".format(method)) + return method @@ -200,7 +194,8 @@ def _interp_limit(invalid, fw_limit, bw_limit): sp_methods = ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', 'spline', 'polynomial', - 'piecewise_polynomial', 'pchip', 'akima'] + 'from_derivatives', 'piecewise_polynomial', 'pchip', 'akima'] + if method in sp_methods: inds = np.asarray(xvalues) # hack for DatetimeIndex, #1646 @@ -225,7 +220,6 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, the list in _clean_interp_method """ try: - import scipy from scipy import interpolate # TODO: Why is DatetimeIndex being imported here? from pandas import DatetimeIndex # noqa @@ -233,13 +227,13 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, raise ImportError('{0} interpolation requires Scipy'.format(method)) new_x = np.asarray(new_x) - scipy_version = scipy.__version__ # for version check; GH12887 # ignores some kwargs that could be passed along. alt_methods = { 'barycentric': interpolate.barycentric_interpolate, 'krogh': interpolate.krogh_interpolate, - 'from_derivatives': interpolate.BPoly.from_derivatives, + 'from_derivatives': _from_derivatives, + 'piecewise_polynomial': _from_derivatives, } if getattr(x, 'is_all_dates', False): @@ -259,13 +253,6 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, except ImportError: raise ImportError("Your version of Scipy does not support " "Akima interpolation.") - elif method == 'piecewise_polynomial': # GH12887 - if LooseVersion(scipy_version) > LooseVersion('0.17'): - raise ValueError("Method '{0}' is deprecated for Scipy > 0.17. " - "Use 'from_derivatives' instead".format(method)) - else: - alt_methods['piecewise_polynomial'] = \ - interpolate.piecewise_polynomial_interpolate interp1d_methods = ['nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'polynomial'] @@ -295,6 +282,60 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, return new_y +def _from_derivatives(xi, yi, x, order=None, der=0, extrapolate=False): + """ + Convenience function for interpolate.BPoly.from_derivatives + + Construct a piecewise polynomial in the Bernstein basis, compatible + with the specified values and derivatives at breakpoints. + + Parameters + ---------- + xi : array_like + sorted 1D array of x-coordinates + yi : array_like or list of array-likes + yi[i][j] is the j-th derivative known at xi[i] + orders : None or int or array_like of ints. Default: None. + Specifies the degree of local polynomials. If not None, some + derivatives are ignored. + der : int or list + How many derivatives to extract; None for all potentially nonzero + derivatives (that is a number equal to the number of points), or a + list of derivatives to extract. This numberincludes the function + value as 0th derivative. + extrapolate : bool, optional + Whether to extrapolate to ouf-of-bounds points based on first and last + intervals, or to return NaNs. Default: True. + + See Also + -------- + scipy.interpolate.BPoly.from_derivatives + + Returns + ------- + y : scalar or array_like + The result, of length R or length M or M by R, + + """ + import scipy + from scipy import interpolate + + if LooseVersion(scipy.__version__) < '0.18.0': + try: + method = interpolate.piecewise_polynomial_interpolate + return method(xi, yi.reshape(-1, 1), x, + orders=order, der=der) + except AttributeError: + pass + + # return the method for compat with scipy version & backwards compat + method = interpolate.BPoly.from_derivatives + m = method(xi, yi.reshape(-1, 1), + orders=order, extrapolate=extrapolate) + + return m(x) + + def _akima_interpolate(xi, yi, x, der=0, axis=0): """ Convenience function for akima interpolation. diff --git a/pandas/tests/series/test_missing.py b/pandas/tests/series/test_missing.py index eb144df0192ec..dec4f878d7d56 100644 --- a/pandas/tests/series/test_missing.py +++ b/pandas/tests/series/test_missing.py @@ -533,6 +533,36 @@ def test_interpolate_akima(self): interp_s = ser.reindex(new_index).interpolate(method='akima') assert_series_equal(interp_s[1:3], expected) + def test_interpolate_piecewise_polynomial(self): + tm._skip_if_no_scipy() + + ser = Series([10, 11, 12, 13]) + + expected = Series([11.00, 11.25, 11.50, 11.75, + 12.00, 12.25, 12.50, 12.75, 13.00], + index=Index([1.0, 1.25, 1.5, 1.75, + 2.0, 2.25, 2.5, 2.75, 3.0])) + # interpolate at new_index + new_index = ser.index.union(Index([1.25, 1.5, 1.75, 2.25, 2.5, 2.75])) + interp_s = ser.reindex(new_index).interpolate( + method='piecewise_polynomial') + assert_series_equal(interp_s[1:3], expected) + + def test_interpolate_from_derivatives(self): + tm._skip_if_no_scipy() + + ser = Series([10, 11, 12, 13]) + + expected = Series([11.00, 11.25, 11.50, 11.75, + 12.00, 12.25, 12.50, 12.75, 13.00], + index=Index([1.0, 1.25, 1.5, 1.75, + 2.0, 2.25, 2.5, 2.75, 3.0])) + # interpolate at new_index + new_index = ser.index.union(Index([1.25, 1.5, 1.75, 2.25, 2.5, 2.75])) + interp_s = ser.reindex(new_index).interpolate( + method='from_derivatives') + assert_series_equal(interp_s[1:3], expected) + def test_interpolate_corners(self): s = Series([np.nan, np.nan]) assert_series_equal(s.interpolate(), s) From 19d6e2cfbe431142784296c16973de2ba2e45277 Mon Sep 17 00:00:00 2001 From: Jason Wolosonovich Date: Mon, 2 May 2016 16:38:39 -0700 Subject: [PATCH 8/8] CLN: adjusted 'pandas/core/missing' to reflect new branch --- pandas/core/missing.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandas/core/missing.py b/pandas/core/missing.py index e25a9f0cbab23..1b92c2a2d3b79 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -233,12 +233,8 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, alt_methods = { 'barycentric': interpolate.barycentric_interpolate, 'krogh': interpolate.krogh_interpolate, -<<<<<<< HEAD - 'from_derivatives': interpolate.BPoly.from_derivatives, -======= 'from_derivatives': _from_derivatives, 'piecewise_polynomial': _from_derivatives, ->>>>>>> 95279d9d6125f9768a4326b677173248fa5f0702 } if getattr(x, 'is_all_dates', False):