def aggregate(dataset, timeline, aggregator=None, **aggregator_param): # nothing to aggregate if dataset and/or timeline are/is empty if dataset.isEmpty() or timeline.isEmpty(): return PYODataset.Empty() # params will be passed to the aggregator function # it is meant to contain the user-provided parameters # and additional parameters (such as the current timerange) params = {} for p, param in enumerate(aggregator_param): params[param] = aggregator_param[param] nTimeranges = timeline.getNumberOfTimeranges() datas = [None] * nTimeranges number = np.zeros((nTimeranges, ), dtype=np.int32) for t, timerange in enumerate(timeline): subdataset = sub(dataset, timerange) # try and aggregate subdataset: # some aggregator may fail in case of empty dataset # some other may return something try: if aggregator == None: datas[t] = np.copy(subdataset.data) else: params['timerange'] = timerange datas[t] = aggregator(subdataset, **params) number[t] = datas[t].shape[0] except Exception, e: raise e datas[t] = None number[t] = 0
def __init__(self, data, number, timeline): super(PYODataset, self).__init__() if data == None or data.shape == (0,) or number == None or timeline == None or number.shape[0] != timeline.getNumberOfTimeranges(): self._data = np.array(()) self._number = np.array((), dtype=np.int32) self._position = np.array((), dtype=np.int32) self._timeline = PYOTimeline.Empty() return self._data = data self._timeline = timeline stored, dimension = self._data.shape self._number = np.array(np.copy(number), dtype=np.int32) self._position = np.copy(self._number) self._position[1:] = self._number[:-1].cumsum() self._position[0] = 0