Skip to content

Commit da051ce

Browse files
author
tp
committed
Added repr string for Grouper and TimeGrouper
1 parent 458c1dc commit da051ce

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

pandas/core/groupby.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,17 @@ def _set_grouper(self, obj, sort=False):
333333
def groups(self):
334334
return self.grouper.groups
335335

336+
_attributes = dict(key=None, level=None, freq=None, axis=0,
337+
sort=False)
338+
339+
def __repr__(self):
340+
defaults = self._attributes
341+
attrs = {k: v for k, v in self.__dict__.items()
342+
if k in defaults and v != defaults[k]}
343+
attrs = ", ".join("{}={!r}".format(k, v) for k, v in attrs.items())
344+
cls_name = self.__class__.__name__
345+
return "{}({})".format(cls_name, attrs)
346+
336347

337348
class GroupByPlot(PandasObject):
338349
"""

pandas/core/resample.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ def __init__(self, freq='Min', closed=None, label=None, how='mean',
10281028
convention=None, base=0, **kwargs):
10291029
freq = to_offset(freq)
10301030

1031-
end_types = set(['M', 'A', 'Q', 'BM', 'BA', 'BQ', 'W'])
1031+
self._end_types = end_types = {'M', 'A', 'Q', 'BM', 'BA', 'BQ', 'W'}
10321032
rule = freq.rule_code
10331033
if (rule in end_types or
10341034
('-' in rule and rule[:rule.find('-')] in end_types)):
@@ -1286,6 +1286,29 @@ def _get_period_bins(self, ax):
12861286

12871287
return binner, bins, labels
12881288

1289+
# _attributes is used in __repr__below
1290+
_attributes = Grouper._attributes.copy()
1291+
_attributes.update(freq='Min', how='mean', nperiods=None, axis=0,
1292+
fill_method=None, limit=None, loffset=None,
1293+
kind=None, convention='e', base=0, sort=True)
1294+
1295+
def __repr__(self):
1296+
defaults = self._attributes.copy()
1297+
end_types = self._end_types
1298+
rule = self.freq.rule_code
1299+
if (rule in end_types or
1300+
('-' in rule and rule[:rule.find('-')] in end_types)):
1301+
defaults.update(closed='right', label='right')
1302+
else:
1303+
defaults.update(closed='left', label='left')
1304+
1305+
attrs = {k: v for k, v in self.__dict__.items()
1306+
if k in defaults and v != defaults[k]}
1307+
attrs['freq'] = attrs['freq'].freqstr
1308+
attrs = ", ".join("{}={!r}".format(k, v) for k, v in attrs.items())
1309+
cls_name = self.__class__.__name__
1310+
return "{}({})".format(cls_name, attrs)
1311+
12891312

12901313
def _take_new_index(obj, indexer, new_index, axis=0):
12911314
from pandas.core.api import Series, DataFrame

pandas/tests/groupby/test_groupby.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,17 @@ def test_grouper_index_types(self):
130130
df.index = list(reversed(df.index.tolist()))
131131
df.groupby(list('abcde')).apply(lambda x: x)
132132

133+
def test_grouper_repr(self):
134+
# Added in GH17727
135+
result = repr(pd.Grouper(key='A'))
136+
assert result == "Grouper(key='A')"
137+
138+
result = repr(pd.Grouper(key='key', freq='50Min', label='right'))
139+
cls_name_result, attrib_result = result.split('(', maxsplit=1)
140+
attrib_result = set(attrib_result.rstrip(')').split(', '))
141+
assert cls_name_result == 'TimeGrouper'
142+
assert attrib_result == {"freq='50T'", "key='key'", "label='right'"}
143+
133144
def test_grouper_multilevel_freq(self):
134145

135146
# GH 7885

pandas/tests/test_resample.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3157,6 +3157,14 @@ def setup_method(self, method):
31573157
self.ts = Series(np.random.randn(1000),
31583158
index=date_range('1/1/2000', periods=1000))
31593159

3160+
def test_timegrouper_repr(self):
3161+
# Added in GH17727
3162+
result = repr(TimeGrouper(key='key', freq='50Min', label='right'))
3163+
cls_name_result, attrib_result = result.split('(')
3164+
attrib_result = set(attrib_result.rstrip(')').split(', '))
3165+
assert cls_name_result == 'TimeGrouper'
3166+
assert attrib_result == {"freq='50T'", "key='key'", "label='right'"}
3167+
31603168
def test_apply(self):
31613169
with tm.assert_produces_warning(FutureWarning,
31623170
check_stacklevel=False):

0 commit comments

Comments
 (0)