def test_index_level_append_a(self) -> None: category = IndexGO(('I', 'II')) groups = IndexGO(('A', 'B')) observations = IndexGO(('x', 'y')) lvl2a = IndexLevelGO(index=observations) lvl2b = IndexLevelGO(index=observations, offset=2) lvl2_targets = ArrayGO((lvl2a, lvl2b)) # must defensively copy index assert id(lvl2a.index) != id(lvl2b.index) lvl1a = IndexLevelGO(index=groups, targets=lvl2_targets, offset=0) # must create new index levels for each lower node lvl2c = IndexLevelGO(index=observations) lvl2d = IndexLevelGO(index=observations, offset=2) lvl2_targets = ArrayGO((lvl2c, lvl2d)) # must defensively copy index assert id(lvl2c.index) != id(lvl2d.index) lvl1b = IndexLevelGO(index=groups, targets=lvl2_targets, offset=len(lvl1a)) # we need as many targets as len(index) lvl0 = IndexLevelGO(index=category, targets=ArrayGO((lvl1a, lvl1b))) with self.assertRaises(RuntimeError): # RuntimeError: level for extension does not have necessary levels. lvl0.extend(lvl1b) lvl0.append(('II', 'B', 'z')) # depth not found is 2 self.assertEqual( [lvl0.loc_to_iloc(tuple(x)) for x in lvl0.values], list(range(9))) lvl0.append(('II', 'C', 'a')) # depth not found is 1 self.assertEqual( [lvl0.loc_to_iloc(tuple(x)) for x in lvl0.values], list(range(10))) lvl0.append(('III', 'A', 'a')) # 0 self.assertEqual( [lvl0.loc_to_iloc(tuple(x)) for x in lvl0.values], list(range(11))) self.assertEqual( lvl0.values.tolist(), [['I', 'A', 'x'], ['I', 'A', 'y'], ['I', 'B', 'x'], ['I', 'B', 'y'], ['II', 'A', 'x'], ['II', 'A', 'y'], ['II', 'B', 'x'], ['II', 'B', 'y'], ['II', 'B', 'z'], ['II', 'C', 'a'], ['III', 'A', 'a']])
def test_level_append_a(self): category = IndexGO(('I', 'II')) groups = IndexGO(('A', 'B')) observations = IndexGO(('x', 'y')) lvl2a = IndexLevelGO(index=observations) lvl2b = IndexLevelGO(index=observations, offset=2) lvl2_targets = ArrayGO((lvl2a, lvl2b)) # must defensively copy index assert id(lvl2a.index) != id(lvl2b.index) lvl1a = IndexLevelGO(index=groups, targets=lvl2_targets, offset=0) # must create new index levels for each lower node lvl2c = IndexLevelGO(index=observations) lvl2d = IndexLevelGO(index=observations, offset=2) lvl2_targets = ArrayGO((lvl2c, lvl2d)) # must defensively copy index assert id(lvl2c.index) != id(lvl2d.index) lvl1b = IndexLevelGO(index=groups, targets=lvl2_targets, offset=len(lvl1a)) # we need as many targets as len(index) lvl0 = IndexLevelGO(index=category, targets=ArrayGO((lvl1a, lvl1b))) lvl0.append(('II', 'B', 'z')) # depth not found is 2 self.assertEqual( [lvl0.loc_to_iloc(tuple(x)) for x in lvl0.get_labels()], list(range(9))) lvl0.append(('II', 'C', 'a')) # depth not found is 1 self.assertEqual( [lvl0.loc_to_iloc(tuple(x)) for x in lvl0.get_labels()], list(range(10))) lvl0.append(('III', 'A', 'a')) # 0 self.assertEqual( [lvl0.loc_to_iloc(tuple(x)) for x in lvl0.get_labels()], list(range(11))) self.assertEqual( lvl0.get_labels().tolist(), [['I', 'A', 'x'], ['I', 'A', 'y'], ['I', 'B', 'x'], ['I', 'B', 'y'], ['II', 'A', 'x'], ['II', 'A', 'y'], ['II', 'B', 'x'], ['II', 'B', 'y'], ['II', 'B', 'z'], ['II', 'C', 'a'], ['III', 'A', 'a']])