Skip to content

Commit f4d8052

Browse files
discortvictor
authored and
victor
committed
ENH: add quantile method to resample (pandas-dev#22304)
1 parent 7d99eda commit f4d8052

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

doc/source/api.rst

+1
Original file line numberDiff line numberDiff line change
@@ -2352,6 +2352,7 @@ Computations / Descriptive Stats
23522352
Resampler.std
23532353
Resampler.sum
23542354
Resampler.var
2355+
Resampler.quantile
23552356

23562357
Style
23572358
-----

doc/source/whatsnew/v0.24.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ Other Enhancements
183183
- :class:`Series` and :class:`DataFrame` now support :class:`Iterable` in constructor (:issue:`2193`)
184184
- :class:`DatetimeIndex` gained :attr:`DatetimeIndex.timetz` attribute. Returns local time with timezone information. (:issue:`21358`)
185185
- :class:`Resampler` now is iterable like :class:`GroupBy` (:issue:`15314`).
186+
- :ref:`Series.resample` and :ref:`DataFrame.resample` have gained the :meth:`Resampler.quantile` (:issue:`15023`).
186187

187188
.. _whatsnew_0240.api_breaking:
188189

pandas/core/groupby/groupby.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,12 @@ def var(self, ddof=1, *args, **kwargs):
11681168
"""
11691169
nv.validate_groupby_func('var', args, kwargs)
11701170
if ddof == 1:
1171-
return self._cython_agg_general('var', **kwargs)
1171+
try:
1172+
return self._cython_agg_general('var', **kwargs)
1173+
except Exception:
1174+
f = lambda x: x.var(ddof=ddof, **kwargs)
1175+
with _group_selection_context(self):
1176+
return self._python_agg_general(f)
11721177
else:
11731178
f = lambda x: x.var(ddof=ddof, **kwargs)
11741179
with _group_selection_context(self):

pandas/core/resample.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,24 @@ def size(self):
769769
result = pd.Series([], index=result.index, dtype='int64')
770770
return result
771771

772+
def quantile(self, q=0.5, **kwargs):
773+
"""
774+
Return value at the given quantile.
775+
776+
.. versionadded:: 0.24.0
777+
778+
Parameters
779+
----------
780+
q : float or array-like, default 0.5 (50% quantile)
781+
782+
See Also
783+
--------
784+
Series.quantile
785+
DataFrame.quantile
786+
DataFrameGroupBy.quantile
787+
"""
788+
return self._downsample('quantile', q=q, **kwargs)
789+
772790

773791
# downsample methods
774792
for method in ['sum', 'prod']:
@@ -1063,7 +1081,8 @@ def _downsample(self, how, **kwargs):
10631081

10641082
if is_subperiod(ax.freq, self.freq):
10651083
# Downsampling
1066-
return self._groupby_and_aggregate(how, grouper=self.grouper)
1084+
return self._groupby_and_aggregate(how, grouper=self.grouper,
1085+
**kwargs)
10671086
elif is_superperiod(ax.freq, self.freq):
10681087
if how == 'ohlc':
10691088
# GH #13083

pandas/tests/test_resample.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141

4242
# The various methods we support
4343
downsample_methods = ['min', 'max', 'first', 'last', 'sum', 'mean', 'sem',
44-
'median', 'prod', 'var', 'ohlc']
44+
'median', 'prod', 'var', 'ohlc', 'quantile']
4545
upsample_methods = ['count', 'size']
4646
series_methods = ['nunique']
4747
resample_methods = downsample_methods + upsample_methods + series_methods
@@ -782,6 +782,15 @@ def test_resampler_is_iterable(self):
782782
assert rk == gk
783783
assert_series_equal(rv, gv)
784784

785+
def test_resample_quantile(self):
786+
# GH 15023
787+
s = self.create_series()
788+
q = 0.75
789+
freq = 'H'
790+
result = s.resample(freq).quantile(q)
791+
expected = s.resample(freq).agg(lambda x: x.quantile(q))
792+
tm.assert_series_equal(result, expected)
793+
785794

786795
class TestDatetimeIndex(Base):
787796
_index_factory = lambda x: date_range

0 commit comments

Comments
 (0)