Skip to content

Commit d9fba8e

Browse files
committed
Merge pull request #10383 from cancan101/interp_kwargs
Allow passing other arguments to interpolation functions
2 parents 383865f + 55d07c0 commit d9fba8e

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

doc/source/whatsnew/v0.17.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Other API Changes
4444
^^^^^^^^^^^^^^^^^
4545
- Enable writing Excel files in :ref:`memory <_io.excel_writing_buffer>` using StringIO/BytesIO (:issue:`7074`)
4646
- Enable serialization of lists and dicts to strings in ExcelWriter (:issue:`8188`)
47+
- Allow passing `kwargs` to the interpolation methods (:issue:`10378`).
4748

4849
.. _whatsnew_0170.deprecations:
4950

pandas/core/common.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,8 @@ def backfill_2d(values, limit=None, mask=None, dtype=None):
15881588
return values
15891589

15901590

1591-
def _clean_interp_method(method, order=None):
1591+
def _clean_interp_method(method, **kwargs):
1592+
order = kwargs.get('order')
15921593
valid = ['linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear',
15931594
'quadratic', 'cubic', 'barycentric', 'polynomial',
15941595
'krogh', 'piecewise_polynomial',
@@ -1603,7 +1604,7 @@ def _clean_interp_method(method, order=None):
16031604

16041605

16051606
def interpolate_1d(xvalues, yvalues, method='linear', limit=None,
1606-
fill_value=None, bounds_error=False, order=None):
1607+
fill_value=None, bounds_error=False, order=None, **kwargs):
16071608
"""
16081609
Logic for the 1-d interpolation. The result should be 1-d, inputs
16091610
xvalues and yvalues will each be 1-d arrays of the same length.
@@ -1682,18 +1683,17 @@ def _interp_limit(invalid, limit):
16821683
'piecewise_polynomial', 'pchip']
16831684
if method in sp_methods:
16841685
new_x = new_x[firstIndex:]
1685-
xvalues = xvalues[firstIndex:]
16861686

16871687
result[firstIndex:][invalid] = _interpolate_scipy_wrapper(
16881688
valid_x, valid_y, new_x, method=method, fill_value=fill_value,
1689-
bounds_error=bounds_error, order=order)
1689+
bounds_error=bounds_error, order=order, **kwargs)
16901690
if limit:
16911691
result[violate_limit] = np.nan
16921692
return result
16931693

16941694

16951695
def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None,
1696-
bounds_error=False, order=None):
1696+
bounds_error=False, order=None, **kwargs):
16971697
"""
16981698
passed off to scipy.interpolate.interp1d. method is scipy's kind.
16991699
Returns an array interpolated at new_x. Add any new methods to
@@ -1734,7 +1734,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None,
17341734
bounds_error=bounds_error)
17351735
new_y = terp(new_x)
17361736
elif method == 'spline':
1737-
terp = interpolate.UnivariateSpline(x, y, k=order)
1737+
terp = interpolate.UnivariateSpline(x, y, k=order, **kwargs)
17381738
new_y = terp(new_x)
17391739
else:
17401740
# GH 7295: need to be able to write for some reason
@@ -1746,7 +1746,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None,
17461746
if not new_x.flags.writeable:
17471747
new_x = new_x.copy()
17481748
method = alt_methods[method]
1749-
new_y = method(x, y, new_x)
1749+
new_y = method(x, y, new_x, **kwargs)
17501750
return new_y
17511751

17521752

pandas/core/generic.py

+1
Original file line numberDiff line numberDiff line change
@@ -2896,6 +2896,7 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False,
28962896
Update the NDFrame in place if possible.
28972897
downcast : optional, 'infer' or None, defaults to None
28982898
Downcast dtypes if possible.
2899+
kwargs : keyword arguments to pass on to the interpolating function.
28992900
29002901
Returns
29012902
-------

pandas/tests/test_generic.py

+17
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,23 @@ def test_spline(self):
13731373
expected = Series([1., 2., 3., 4., 5., 6., 7.])
13741374
assert_series_equal(result, expected)
13751375

1376+
def test_spline_extrapolate(self):
1377+
tm.skip_if_no_package('scipy', '0.15', 'setting ext on scipy.interpolate.UnivariateSpline')
1378+
s = Series([1, 2, 3, 4, np.nan, 6, np.nan])
1379+
result3 = s.interpolate(method='spline', order=1, ext=3)
1380+
expected3 = Series([1., 2., 3., 4., 5., 6., 6.])
1381+
assert_series_equal(result3, expected3)
1382+
1383+
result1 = s.interpolate(method='spline', order=1, ext=0)
1384+
expected1 = Series([1., 2., 3., 4., 5., 6., 7.])
1385+
assert_series_equal(result1, expected1)
1386+
1387+
def test_spline_smooth(self):
1388+
tm._skip_if_no_scipy()
1389+
s = Series([1, 2, np.nan, 4, 5.1, np.nan, 7])
1390+
self.assertNotEqual(s.interpolate(method='spline', order=3, s=0)[5],
1391+
s.interpolate(method='spline', order=3)[5])
1392+
13761393
def test_metadata_propagation_indiv(self):
13771394

13781395
# groupby

0 commit comments

Comments
 (0)