def test_pad(self): old = Index([1, 5, 10]) new = Index(range(12)) filler = lib.pad_object(old, new, old.indexMap, new.indexMap) expect_filler = [-1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2] self.assert_(np.array_equal(filler, expect_filler)) # corner case old = Index([5, 10]) new = Index(range(5)) filler = lib.pad_object(old, new, old.indexMap, new.indexMap) expect_filler = [-1, -1, -1, -1, -1] self.assert_(np.array_equal(filler, expect_filler))
def test_pad_backfill_object_segfault(): from datetime import datetime old = np.array([], dtype='O') new = np.array([datetime(2010, 12, 31)], dtype='O') result = lib.pad_object(old, new) expected = np.array([-1], dtype='i4') assert(np.array_equal(result, expected)) result = lib.pad_object(new, old) expected = np.array([], dtype='i4') assert(np.array_equal(result, expected)) result = lib.backfill_object(old, new) expected = np.array([-1], dtype='i4') assert(np.array_equal(result, expected)) result = lib.backfill_object(new, old) expected = np.array([], dtype='i4') assert(np.array_equal(result, expected))
def get_indexer(self, target, method=None): """ Compute indexer and mask for new index given the current index. The indexer should be then used as an input to ndarray.take to align the current data to the new index. The mask determines whether labels are found or not in the current index Parameters ---------- target : MultiIndex or Index (of tuples) method : {'pad', 'ffill', 'backfill', 'bfill'} pad / ffill: propagate LAST valid observation forward to next valid backfill / bfill: use NEXT valid observation to fill gap Notes ----- This is a low-level method and probably should be used at your own risk Examples -------- >>> indexer, mask = index.get_indexer(new_index) >>> new_values = cur_values.take(indexer) >>> new_values[-mask] = np.nan Returns ------- (indexer, mask) : (ndarray, ndarray) """ method = self._get_method(method) if isinstance(target, MultiIndex): target_index = target.get_tuple_index() else: if len(target) > 0: val = target[0] if not isinstance(val, tuple) or len(val) != self.nlevels: raise ValueError("can only pass MultiIndex or " "array of tuples") target_index = target self_index = self.get_tuple_index() if method == "pad": indexer = lib.pad_object(self_index, target_index, self_index.indexMap, target.indexMap) elif method == "backfill": indexer = lib.backfill_object(self_index, target_index, self_index.indexMap, target.indexMap) else: indexer = lib.merge_indexer_object(target_index, self_index.indexMap) return indexer
def test_pad_backfill_object_segfault(): from datetime import datetime old = np.array([], dtype='O') new = np.array([datetime(2010, 12, 31)], dtype='O') result = lib.pad_object(old, new, lib.map_indices_object(old), lib.map_indices_object(new)) expected = np.array([-1], dtype='i4') assert (np.array_equal(result, expected)) result = lib.pad_object(new, old, lib.map_indices_object(new), lib.map_indices_object(old)) expected = np.array([], dtype='i4') assert (np.array_equal(result, expected)) result = lib.backfill_object(old, new, lib.map_indices_object(old), lib.map_indices_object(new)) expected = np.array([-1], dtype='i4') assert (np.array_equal(result, expected)) result = lib.backfill_object(new, old, lib.map_indices_object(new), lib.map_indices_object(old)) expected = np.array([], dtype='i4') assert (np.array_equal(result, expected))
def get_indexer(self, target, method=None): """ Compute indexer and mask for new index given the current index. The indexer should be then used as an input to ndarray.take to align the current data to the new index. The mask determines whether labels are found or not in the current index Parameters ---------- target : Index method : {'pad', 'ffill', 'backfill', 'bfill'} pad / ffill: propagate LAST valid observation forward to next valid backfill / bfill: use NEXT valid observation to fill gap Notes ----- This is a low-level method and probably should be used at your own risk Examples -------- >>> indexer, mask = index.get_indexer(new_index) >>> new_values = cur_values.take(indexer) >>> new_values[-mask] = np.nan Returns ------- (indexer, mask) : (ndarray, ndarray) """ method = self._get_method(method) target = _ensure_index(target) if self.dtype != target.dtype: target = Index(target, dtype=object) if method == 'pad': indexer = lib.pad_object(self, target, self.indexMap, target.indexMap) elif method == 'backfill': indexer = lib.backfill_object(self, target, self.indexMap, target.indexMap) elif method is None: indexer = lib.merge_indexer_object(target, self.indexMap) else: raise ValueError('unrecognized method: %s' % method) return indexer