Skip to content

Commit 26b461b

Browse files
ab320012jreback
authored andcommitted
added support for nearest upsample + comments on returns for upsampled functions (#17498)
1 parent 138be88 commit 26b461b

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

doc/source/api.rst

+1
Original file line numberDiff line numberDiff line change
@@ -2025,6 +2025,7 @@ Upsampling
20252025
Resampler.backfill
20262026
Resampler.bfill
20272027
Resampler.pad
2028+
Resampler.nearest
20282029
Resampler.fillna
20292030
Resampler.asfreq
20302031
Resampler.interpolate

doc/source/whatsnew/v0.21.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ New features
2828
and :class:`~pandas.ExcelWriter` to work properly with the file system path protocol (:issue:`13823`)
2929
- Added ``skipna`` parameter to :func:`~pandas.api.types.infer_dtype` to
3030
support type inference in the presence of missing values (:issue:`17059`).
31+
- :class:`~pandas.Resampler.nearest` is added to support nearest-neighbor upsampling (:issue:`17496`).
3132

3233
.. _whatsnew_0210.enhancements.infer_objects:
3334

pandas/core/resample.py

+30
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,10 @@ def pad(self, limit=None):
455455
limit : integer, optional
456456
limit of how many values to fill
457457
458+
Returns
459+
-------
460+
an upsampled Series
461+
458462
See Also
459463
--------
460464
Series.fillna
@@ -463,6 +467,28 @@ def pad(self, limit=None):
463467
return self._upsample('pad', limit=limit)
464468
ffill = pad
465469

470+
def nearest(self, limit=None):
471+
"""
472+
Fill values with nearest neighbor starting from center
473+
474+
Parameters
475+
----------
476+
limit : integer, optional
477+
limit of how many values to fill
478+
479+
.. versionadded:: 0.21.0
480+
481+
Returns
482+
-------
483+
an upsampled Series
484+
485+
See Also
486+
--------
487+
Series.fillna
488+
DataFrame.fillna
489+
"""
490+
return self._upsample('nearest', limit=limit)
491+
466492
def backfill(self, limit=None):
467493
"""
468494
Backward fill the values
@@ -472,6 +498,10 @@ def backfill(self, limit=None):
472498
limit : integer, optional
473499
limit of how many values to fill
474500
501+
Returns
502+
-------
503+
an upsampled Series
504+
475505
See Also
476506
--------
477507
Series.fillna

pandas/tests/test_resample.py

+27-1
Original file line numberDiff line numberDiff line change
@@ -1329,6 +1329,14 @@ def test_upsample_with_limit(self):
13291329
expected = ts.reindex(result.index, method='ffill', limit=2)
13301330
assert_series_equal(result, expected)
13311331

1332+
def test_nearest_upsample_with_limit(self):
1333+
rng = date_range('1/1/2000', periods=3, freq='5t')
1334+
ts = Series(np.random.randn(len(rng)), rng)
1335+
1336+
result = ts.resample('t').nearest(limit=2)
1337+
expected = ts.reindex(result.index, method='nearest', limit=2)
1338+
assert_series_equal(result, expected)
1339+
13321340
def test_resample_ohlc(self):
13331341
s = self.series
13341342

@@ -2934,6 +2942,24 @@ def test_getitem_multiple(self):
29342942
result = r['buyer'].count()
29352943
assert_series_equal(result, expected)
29362944

2945+
def test_nearest(self):
2946+
2947+
# GH 17496
2948+
# Resample nearest
2949+
index = pd.date_range('1/1/2000', periods=3, freq='T')
2950+
result = pd.Series(range(3), index=index).resample('20s').nearest()
2951+
2952+
expected = pd.Series(
2953+
np.array([0, 0, 1, 1, 1, 2, 2]),
2954+
index=pd.DatetimeIndex(
2955+
['2000-01-01 00:00:00', '2000-01-01 00:00:20',
2956+
'2000-01-01 00:00:40', '2000-01-01 00:01:00',
2957+
'2000-01-01 00:01:20', '2000-01-01 00:01:40',
2958+
'2000-01-01 00:02:00'],
2959+
dtype='datetime64[ns]',
2960+
freq='20S'))
2961+
assert_series_equal(result, expected)
2962+
29372963
def test_methods(self):
29382964
g = self.frame.groupby('A')
29392965
r = g.resample('2s')
@@ -2960,7 +2986,7 @@ def test_methods(self):
29602986
expected = g.B.apply(lambda x: getattr(x.resample('2s'), f)())
29612987
assert_series_equal(result, expected)
29622988

2963-
for f in ['backfill', 'ffill', 'asfreq']:
2989+
for f in ['nearest', 'backfill', 'ffill', 'asfreq']:
29642990
result = getattr(r, f)()
29652991
expected = g.apply(lambda x: getattr(x.resample('2s'), f)())
29662992
assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)