def _resample_periods(self, obj): axlabels = obj._get_axis(self.axis) if len(axlabels) == 0: new_index = PeriodIndex(data=[], freq=self.freq) return obj.reindex(new_index) else: start = axlabels[0].asfreq(self.freq, how=self.convention) end = axlabels[-1].asfreq(self.freq, how='end') new_index = period_range(start, end, freq=self.freq) # Start vs. end of period memb = axlabels.asfreq(self.freq, how=self.convention) if is_subperiod(axlabels.freq, self.freq) or self.how is not None: # Downsampling rng = np.arange(memb.values[0], memb.values[-1] + 1) bins = memb.searchsorted(rng, side='right') grouper = BinGrouper(bins, new_index) grouped = obj.groupby(grouper, axis=self.axis) return grouped.aggregate(self._agg_method) elif is_superperiod(axlabels.freq, self.freq): # Get the fill indexer indexer = memb.get_indexer(new_index, method=self.fill_method, limit=self.limit) return _take_new_index(obj, indexer, new_index, axis=self.axis) else: raise ValueError('Frequency %s cannot be resampled to %s' % (axlabels.freq, self.freq))
def _get_binner(self): """ create the BinGrouper, assume that self.set_grouper(obj) has already been called """ binner, bins, binlabels = self._get_binner_for_time() bin_grouper = BinGrouper(bins, binlabels) return binner, bin_grouper
def _get_time_grouper(self, obj): axis = obj._get_axis(self.axis) if self.kind is None or self.kind == 'timestamp': binner, bins, binlabels = self._get_time_bins(axis) else: binner, bins, binlabels = self._get_time_period_bins(axis) grouper = BinGrouper(bins, binlabels) return binner, grouper
def _get_time_grouper(self, obj): obj = self._ensure_sortedness(obj) ax = obj._get_axis(self.axis) if self.kind is None or self.kind == 'timestamp': binner, bins, binlabels = self._get_time_bins(ax) else: binner, bins, binlabels = self._get_time_period_bins(ax) grouper = BinGrouper(bins, binlabels) return binner, grouper, obj
def _get_binner_for_resample(self): # create the BinGrouper # assume that self.set_grouper(obj) has already been called ax = self.ax if self.kind is None or self.kind == 'timestamp': self.binner, bins, binlabels = self._get_time_bins(ax) else: self.binner, bins, binlabels = self._get_time_period_bins(ax) self.grouper = BinGrouper(bins, binlabels) return self.binner, self.grouper, self.obj
def anchor_downsample(obj, freq, axis=None): """ Point of this is to fix the freq to regular intervals like 9:30, 9:45, 10:00 and not 9:13, 9:28: 9:43 """ if axis is None: axis = 0 if isinstance(obj, Panel): axis = 1 index = obj._get_axis(axis) ind = get_anchor_index(index, freq) bins = lib.generate_bins_dt64(index.asi8, ind.asi8, closed='right') labels = ind[1:] grouper = BinGrouper(bins, labels) return obj.groupby(grouper)
def _downsample(self, how, **kwargs): """ Downsample the cython defined function Parameters ---------- how : string / cython mapped function **kwargs : kw args passed to how function """ # we may need to actually resample as if we are timestamps if self.kind == 'timestamp': return super(PeriodIndexResampler, self)._downsample(how, **kwargs) how = self._is_cython_func(how) or how ax = self.ax new_index = self._get_new_index() # Start vs. end of period memb = ax.asfreq(self.freq, how=self.convention) if is_subperiod(ax.freq, self.freq): # Downsampling if len(new_index) == 0: bins = [] else: i8 = memb.asi8 rng = np.arange(i8[0], i8[-1] + 1) bins = memb.searchsorted(rng, side='right') grouper = BinGrouper(bins, new_index) return self._groupby_and_aggregate(how, grouper=grouper) elif is_superperiod(ax.freq, self.freq): return self.asfreq() elif ax.freq == self.freq: return self.asfreq() raise IncompatibleFrequency( 'Frequency {} cannot be resampled to {}, as they are not ' 'sub or super periods'.format(ax.freq, self.freq))
def _downsample(self, how, **kwargs): """ Downsample the cython defined function Parameters ---------- how : string / cython mapped function **kwargs : kw args passed to how function """ # we may need to actually resample as if we are timestamps if self.kind == 'timestamp': return super(PeriodIndexResampler, self)._downsample(how, **kwargs) how = self._is_cython_func(how) or how ax = self.ax new_index = self._get_new_index() if len(new_index) == 0: return self._wrap_result(self._selected_obj.reindex(new_index)) # Start vs. end of period memb = ax.asfreq(self.freq, how=self.convention) if is_subperiod(ax.freq, self.freq): # Downsampling rng = np.arange(memb.values[0], memb.values[-1] + 1) bins = memb.searchsorted(rng, side='right') grouper = BinGrouper(bins, new_index) return self._groupby_and_aggregate(how, grouper=grouper) elif is_superperiod(ax.freq, self.freq): return self.asfreq() elif ax.freq == self.freq: return self.asfreq() raise ValueError('Frequency {axfreq} cannot be ' 'resampled to {freq}'.format( axfreq=ax.freq, freq=self.freq))