def test_hierarchy_frame_a(self): OD = OrderedDict tree = OD([ ('I', OD([ ('A', (1,)), ('B', (1, 2)) ]) ), ('II', OD([ ('A', (1,)), ('B', (1, 2)) ]) ), ]) ih = IndexHierarchy.from_tree(tree) data = np.arange(6*6).reshape(6, 6) f1 = Frame(data, index=ih, columns=ih) # self.assertEqual(len(f.to_pairs(0)), 8) f2 = f1.assign.loc[('I', 'B', 2), ('II', 'A', 1)](200) post = f2.to_pairs(0) self.assertEqual(post, ((('I', 'A', 1), ((('I', 'A', 1), 0), (('I', 'B', 1), 6), (('I', 'B', 2), 12), (('II', 'A', 1), 18), (('II', 'B', 1), 24), (('II', 'B', 2), 30))), (('I', 'B', 1), ((('I', 'A', 1), 1), (('I', 'B', 1), 7), (('I', 'B', 2), 13), (('II', 'A', 1), 19), (('II', 'B', 1), 25), (('II', 'B', 2), 31))), (('I', 'B', 2), ((('I', 'A', 1), 2), (('I', 'B', 1), 8), (('I', 'B', 2), 14), (('II', 'A', 1), 20), (('II', 'B', 1), 26), (('II', 'B', 2), 32))), (('II', 'A', 1), ((('I', 'A', 1), 3), (('I', 'B', 1), 9), (('I', 'B', 2), 200), (('II', 'A', 1), 21), (('II', 'B', 1), 27), (('II', 'B', 2), 33))), (('II', 'B', 1), ((('I', 'A', 1), 4), (('I', 'B', 1), 10), (('I', 'B', 2), 16), (('II', 'A', 1), 22), (('II', 'B', 1), 28), (('II', 'B', 2), 34))), (('II', 'B', 2), ((('I', 'A', 1), 5), (('I', 'B', 1), 11), (('I', 'B', 2), 17), (('II', 'A', 1), 23), (('II', 'B', 1), 29), (('II', 'B', 2), 35)))) ) f3 = f1.assign.loc[('I', 'B', 2):, HLoc[:, :, 2]](200) self.assertEqual(f3.to_pairs(0), ((('I', 'A', 1), ((('I', 'A', 1), 0), (('I', 'B', 1), 6), (('I', 'B', 2), 12), (('II', 'A', 1), 18), (('II', 'B', 1), 24), (('II', 'B', 2), 30))), (('I', 'B', 1), ((('I', 'A', 1), 1), (('I', 'B', 1), 7), (('I', 'B', 2), 13), (('II', 'A', 1), 19), (('II', 'B', 1), 25), (('II', 'B', 2), 31))), (('I', 'B', 2), ((('I', 'A', 1), 2), (('I', 'B', 1), 8), (('I', 'B', 2), 200), (('II', 'A', 1), 200), (('II', 'B', 1), 200), (('II', 'B', 2), 200))), (('II', 'A', 1), ((('I', 'A', 1), 3), (('I', 'B', 1), 9), (('I', 'B', 2), 15), (('II', 'A', 1), 21), (('II', 'B', 1), 27), (('II', 'B', 2), 33))), (('II', 'B', 1), ((('I', 'A', 1), 4), (('I', 'B', 1), 10), (('I', 'B', 2), 16), (('II', 'A', 1), 22), (('II', 'B', 1), 28), (('II', 'B', 2), 34))), (('II', 'B', 2), ((('I', 'A', 1), 5), (('I', 'B', 1), 11), (('I', 'B', 2), 200), (('II', 'A', 1), 200), (('II', 'B', 1), 200), (('II', 'B', 2), 200)))) )
def test_hierarchy_from_tree_a(self): OD = OrderedDict tree = OD([('A', (1, 2, 3, 4)), ('B', (1, 2))]) ih = IndexHierarchy.from_tree(tree) self.assertEqual(ih.to_frame().to_pairs(0), ((0, ((0, 'A'), (1, 'A'), (2, 'A'), (3, 'A'), (4, 'B'), (5, 'B'))), (1, ((0, 1), (1, 2), (2, 3), (3, 4), (4, 1), (5, 2)))) )
def test_hierarchy_keys_a(self): OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2))])), ('II', OD([('A', (1, 2)), ('B', (1, 2))])), ]) ih = IndexHierarchy.from_tree(tree) # NOTE: for now, __iter__ return arrays, so we have convert to a tuple self.assertEqual([tuple(k) in ih.keys() for k in ih], [True, True, True, True, True, True, True, True])
def test_hierarchy_iter_a(self): OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2))])), ('II', OD([('A', (1, 2)), ('B', (1, 2))])), ]) ih = IndexHierarchy.from_tree(tree) # this iterates over numpy arrays, which can be used with contains self.assertEqual([k in ih for k in ih], [True, True, True, True, True, True, True, True])
def test_hierarchy_loc_a(self): OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2))])), ('II', OD([('A', (1, 2)), ('B', (1, 2))])), ]) ih = IndexHierarchy.from_tree(tree) s = Series(range(8), index=ih) self.assertEqual(s.loc[HLoc['I']].values.tolist(), [0, 1, 2, 3]) self.assertEqual(s.loc[HLoc[:, 'A']].values.tolist(), [0, 1, 4, 5])
def test_hierarchy_display_a(self): OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2))])), ('II', OD([('A', (1, 2)), ('B', (1, 2))])), ]) ih = IndexHierarchy.from_tree(tree) post = ih.display() self.assertEqual(len(post), 10) s = Series(range(8), index=ih) post = s.display() self.assertEqual(len(post), 11)
def test_hierarchy_loc_to_iloc_c(self): OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2, 3)), ('C', (2, 3))])), ('II', OD([('A', (1, 2, 3)), ('B', (1, ))])), ]) ih = IndexHierarchy.from_tree(tree) # TODO: add additional validaton post = ih.loc[('I', 'B', 2):('II', 'A', 2)] self.assertTrue(len(post), 6) post = ih.loc[[('I', 'B', 2), ('II', 'A', 2)]] self.assertTrue(len(post), 2)
def test_hierarchy_loc_to_iloc_b(self): OD = OrderedDict tree = OD([ ('I', OD([ ('A', (1, 2)), ('B', (1, 2, 3)), ('C', (2, 3)) ]) ), ('II', OD([ ('A', (1, 2, 3)), ('B', (1,)) ]) ), ]) ih = IndexHierarchy.from_tree(tree) post = ih.loc_to_iloc(HLoc['I', 'B', 1]) self.assertEqual(post, 2) post = ih.loc_to_iloc(HLoc['I', 'B', 3]) self.assertEqual(post, 4) post = ih.loc_to_iloc(HLoc['II', 'A', 3]) self.assertEqual(post, 9) post = ih.loc_to_iloc(HLoc['II', 'A']) self.assertEqual(post, slice(7, 10)) post = ih.loc_to_iloc(HLoc['I', 'C']) self.assertEqual(post, slice(5, 7)) post = ih.loc_to_iloc(HLoc['I', ['A', 'C']]) self.assertEqual(post, [0, 1, 5, 6]) post = ih.loc_to_iloc(HLoc[:, 'A', :]) self.assertEqual(post, [0, 1, 7, 8, 9]) post = ih.loc_to_iloc(HLoc[:, 'C', 3]) self.assertEqual(post, 6) post = ih.loc_to_iloc(HLoc[:, :, 3]) self.assertEqual(post, [4, 6, 9]) post = ih.loc_to_iloc(HLoc[:, :, 1]) self.assertEqual(post, [0, 2, 7, 10])
def test_hierarchy_loc_to_iloc_c(self) -> None: OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2, 3)), ('C', (2, 3))])), ('II', OD([('A', (1, 2, 3)), ('B', (1, ))])), ]) ih = IndexHierarchy.from_tree(tree) # TODO: add additional validaton post = ih.loc[('I', 'B', 2):( 'II', 'A', 2)] # type: ignore # https://github.com/python/typeshed/pull/3024 self.assertTrue(len(post), 6) post = ih.loc[[('I', 'B', 2), ('II', 'A', 2)]] self.assertTrue(len(post), 2)
def test_hierarchy_from_tree_b(self): OD = OrderedDict tree = OD([ ('I', OD([('A', (1, 2)), ('B', (1, 2, 3)), ('C', (2, 3))])), ('II', OD([('A', (1, 2, 3)), ('B', (1, ))])), ]) ih = IndexHierarchy.from_tree(tree) self.assertEqual(ih.to_frame().to_pairs(0), ((0, ((0, 'I'), (1, 'I'), (2, 'I'), (3, 'I'), (4, 'I'), (5, 'I'), (6, 'I'), (7, 'II'), (8, 'II'), (9, 'II'), (10, 'II'))), (1, ((0, 'A'), (1, 'A'), (2, 'B'), (3, 'B'), (4, 'B'), (5, 'C'), (6, 'C'), (7, 'A'), (8, 'A'), (9, 'A'), (10, 'B'))), (2, ((0, 1), (1, 2), (2, 1), (3, 2), (4, 3), (5, 2), (6, 3), (7, 1), (8, 2), (9, 3), (10, 1)))))
def add_level(self, level: tp.Hashable) -> 'IndexHierarchy': '''Return an IndexHierarhcy with an added root level. ''' from static_frame import IndexHierarchy return IndexHierarchy.from_tree({level: self.values})