Skip to content

Commit 13e1125

Browse files
author
tp
committed
New attempt at Grouper.__repr__
1 parent 967512d commit 13e1125

File tree

2 files changed

+12
-35
lines changed

2 files changed

+12
-35
lines changed

pandas/core/groupby.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ class Grouper(object):
234234
>>> df.groupby(Grouper(level='date', freq='60s', axis=1))
235235
"""
236236

237+
_attributes = ['key', 'level', 'freq', 'axis', 'sort']
238+
237239
def __new__(cls, *args, **kwargs):
238240
if kwargs.get('freq') is not None:
239241
from pandas.core.resample import TimeGrouper
@@ -252,11 +254,6 @@ def __init__(self, key=None, level=None, freq=None, axis=0, sort=False):
252254
self.indexer = None
253255
self.binner = None
254256

255-
# _attributes is used in __repr__below
256-
_attributes = collections.OrderedDict(
257-
(k, v) for k, v in zip(signature(__init__).args[1:],
258-
signature(__init__).defaults))
259-
260257
@property
261258
def ax(self):
262259
return self.grouper
@@ -339,10 +336,12 @@ def groups(self):
339336
return self.grouper.groups
340337

341338
def __repr__(self):
339+
grouper_defaults = compat.signature(self.__init__).defaults
342340
sd = self.__dict__
343-
attr = self._attributes
344-
attrs = collections.OrderedDict((k, sd[k]) for k, v in attr.items()
345-
if k in sd and sd[k] != v)
341+
attrs = collections.OrderedDict()
342+
for k, v in zip(self._attributes, grouper_defaults):
343+
if k in sd and sd[k] != v:
344+
attrs[k] = sd[k]
346345
attrs = ", ".join("{}={!r}".format(k, v) for k, v in attrs.items())
347346
cls_name = self.__class__.__name__
348347
return "{}({})".format(cls_name, attrs)

pandas/core/resample.py

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,11 @@ class TimeGrouper(Grouper):
10231023
directly from the associated object
10241024
"""
10251025

1026+
_attributes = ['key', 'level', 'freq', 'axis', 'sort', 'closed', 'label',
1027+
'how', 'nperiods', 'fill_method', 'limit',
1028+
'loffset', 'kind', 'convention', 'base']
1029+
_end_types = {'M', 'A', 'Q', 'BM', 'BA', 'BQ', 'W'}
1030+
10261031
def __init__(self, freq='Min', closed=None, label=None, how='mean',
10271032
nperiods=None, axis=0,
10281033
fill_method=None, limit=None, loffset=None, kind=None,
@@ -1066,14 +1071,6 @@ def __init__(self, freq='Min', closed=None, label=None, how='mean',
10661071

10671072
super(TimeGrouper, self).__init__(freq=freq, axis=axis, **kwargs)
10681073

1069-
# _attributes is used in __repr__below
1070-
_attributes = Grouper._attributes.copy()
1071-
_attributes.update(
1072-
(k, v) for k, v in zip(compat.signature(__init__).args[1:],
1073-
compat.signature(__init__).defaults))
1074-
_attributes.update(sort=True, convention='e')
1075-
_end_types = {'M', 'A', 'Q', 'BM', 'BA', 'BQ', 'W'}
1076-
10771074
def _get_resampler(self, obj, kind=None):
10781075
"""
10791076
return my resampler or raise if we have an invalid axis
@@ -1296,25 +1293,6 @@ def _get_period_bins(self, ax):
12961293

12971294
return binner, bins, labels
12981295

1299-
def __repr__(self):
1300-
defaults = self._attributes.copy()
1301-
end_types = self._end_types
1302-
rule = self.freq.rule_code
1303-
if (rule in end_types or
1304-
('-' in rule and rule[:rule.find('-')] in end_types)):
1305-
defaults.update(closed='right', label='right')
1306-
else:
1307-
defaults.update(closed='left', label='left')
1308-
1309-
sd = self.__dict__
1310-
attrs = collections.OrderedDict((k, sd[k]) for k, v in defaults.items()
1311-
if k in sd and sd[k] != v)
1312-
if 'freq' in attrs:
1313-
attrs['freq'] = attrs['freq'].freqstr
1314-
attrs = ", ".join("{}={!r}".format(k, v) for k, v in attrs.items())
1315-
cls_name = self.__class__.__name__
1316-
return "{}({})".format(cls_name, attrs)
1317-
13181296

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

0 commit comments

Comments
 (0)