From 7a05ee84a19164cd83a33346008a2a8cfa8365b5 Mon Sep 17 00:00:00 2001 From: jreback Date: Sat, 15 Mar 2014 14:25:14 -0400 Subject: [PATCH] PLAT: platform sorting issue surfaced with time_grouper --- pandas/core/groupby.py | 10 ++++++---- pandas/core/index.py | 5 ++++- pandas/tseries/resample.py | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pandas/core/groupby.py b/pandas/core/groupby.py index 7bf20d71cb301..683c07b70d0f2 100644 --- a/pandas/core/groupby.py +++ b/pandas/core/groupby.py @@ -169,7 +169,7 @@ def __new__(cls, *args, **kwargs): cls = TimeGrouper return super(Grouper, cls).__new__(cls) - def __init__(self, key=None, level=None, freq=None, axis=None, sort=True): + def __init__(self, key=None, level=None, freq=None, axis=None, sort=False): self.key=key self.level=level self.freq=freq @@ -201,7 +201,7 @@ def get_grouper(self, obj): self.set_grouper(obj) return self.binner, self.grouper, self.obj - def set_grouper(self, obj): + def set_grouper(self, obj, sort=False): """ given an object and the specifcations, setup the internal grouper for this particular specification @@ -243,7 +243,7 @@ def set_grouper(self, obj): raise ValueError("The grouper level {0} is not valid".format(level)) # possibly sort - if not ax.is_monotonic: + if (self.sort or sort) and not ax.is_monotonic: indexer = self.indexer = ax.argsort(kind='quicksort') ax = ax.take(indexer) obj = obj.take(indexer, axis=self.axis, convert=False, is_copy=False) @@ -1608,6 +1608,7 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None, self.grouper = _convert_grouper(index, grouper) self.index = index self.sort = sort + self.obj = obj # right place for this? if isinstance(grouper, (Series, Index)) and name is None: @@ -1684,7 +1685,8 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None, elif isinstance(self.grouper, Grouper): # get the new grouper - grouper = self.grouper.get_binner_for_grouping(obj) + grouper = self.grouper.get_binner_for_grouping(self.obj) + self.obj = self.grouper.obj self.grouper = grouper if self.name is None: self.name = grouper.name diff --git a/pandas/core/index.py b/pandas/core/index.py index 0343475be377e..3eab4d0339082 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -883,7 +883,10 @@ def argsort(self, *args, **kwargs): """ See docstring for ndarray.argsort """ - return self.view(np.ndarray).argsort(*args, **kwargs) + result = self.asi8 + if result is None: + result = self.view(np.ndarray) + return result.argsort(*args, **kwargs) def __add__(self, other): if isinstance(other, Index): diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index 8ab7063eada17..b29f67b40894b 100644 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -70,13 +70,13 @@ def __init__(self, freq='Min', closed=None, label=None, how='mean', self.limit = limit self.base = base - # by definition we always sort + # always sort time groupers kwargs['sort'] = True super(TimeGrouper, self).__init__(freq=freq, axis=axis, **kwargs) def resample(self, obj): - self.set_grouper(obj) + self.set_grouper(obj, sort=True) ax = self.grouper if isinstance(ax, DatetimeIndex):