def test_index_datetime_eq_b(self) -> None: post = (IndexDate.from_date_range( '2021-01-01', '2021-02-01') == IndexDate.from_date_range('2021-01-01', '2021-02-01')) self.assertEqual(post.tolist(), [ True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True ])
def test_index_date_j(self): index = IndexDate.from_date_range('2017-11-15', '2018-02-15') post = index.loc['2017-12':'2018'] self.assertEqual(len(post), 77) self.assertEqual(post[0], np.datetime64('2017-12-01')) self.assertEqual(post[-1], np.datetime64('2018-02-15'))
def test_frame_iter_tuple_d(self) -> None: f = sf.FrameGO(index=IndexDate.from_date_range('2020-01-01', '2020-01-03')) post = list(f.iter_tuple(constructor=tuple, axis=0)) self.assertEqual(post, []) post = list(f.iter_tuple(axis=1)) self.assertEqual([len(x) for x in post], [0, 0, 0])
def test_index_level_leaf_loc_to_iloc_c(self) -> None: groups = Index(('A', 'B', 'C')) dates = IndexDate.from_date_range('2018-01-01', '2018-01-04') observations = Index(('x', 'y')) lvl2a = IndexLevel(index=observations) lvl2b = IndexLevel(index=observations, offset=2) lvl2c = IndexLevel(index=observations, offset=4) lvl2d = IndexLevel(index=observations, offset=6) lvl2_targets = ArrayGO((lvl2a, lvl2b, lvl2c, lvl2d)) lvl1a = IndexLevel(index=dates, targets=lvl2_targets, offset=0) lvl1b = IndexLevel(index=dates, targets=lvl2_targets, offset=len(lvl1a)) lvl1c = IndexLevel(index=dates, targets=lvl2_targets, offset=len(lvl1a) * 2) lvl0 = IndexLevel(index=groups, targets=ArrayGO((lvl1a, lvl1b, lvl1c))) with self.assertRaises(KeyError): lvl0.leaf_loc_to_iloc(('A')) self.assertEqual(lvl0.leaf_loc_to_iloc(('A', '2018-01-01', 'y')), 1)
def test_index_date_j(self) -> None: index = IndexDate.from_date_range('2017-11-15', '2018-02-15') post = index.loc['2017-12': '2018'] # type: ignore # https://github.com/python/typeshed/pull/3024 self.assertEqual(len(post), 77) #type: ignore self.assertEqual(post[0], np.datetime64('2017-12-01')) #type: ignore self.assertEqual(post[-1], np.datetime64('2018-02-15')) #type: ignore
def test_index_level_leaf_loc_to_iloc_a(self): groups = Index(('A', 'B', 'C')) dates = IndexDate.from_date_range('2018-01-01', '2018-01-04') observations = Index(('x', 'y')) lvl2a = IndexLevel(index=observations) lvl2b = IndexLevel(index=observations, offset=2) lvl2c = IndexLevel(index=observations, offset=4) lvl2d = IndexLevel(index=observations, offset=6) lvl2_targets = ArrayGO((lvl2a, lvl2b, lvl2c, lvl2d)) lvl1a = IndexLevel(index=dates, targets=lvl2_targets, offset=0) lvl1b = IndexLevel(index=dates, targets=lvl2_targets, offset=len(lvl1a)) lvl1c = IndexLevel(index=dates, targets=lvl2_targets, offset=len(lvl1a) * 2) # we need as many targets as len(index) lvl0 = IndexLevel(index=groups, targets=ArrayGO((lvl1a, lvl1b, lvl1c))) self.assertEqual(lvl0.leaf_loc_to_iloc(('B', '2018-01-04', 'y'),), 15) self.assertEqual(lvl0.leaf_loc_to_iloc(('A', '2018-01-01', 'y')), 1)
def test_index_date_f(self) -> None: index = IndexDate.from_date_range('2017-12-15', '2018-01-15') post = index + datetime.timedelta(days=10) self.assertEqual(post[0], np.datetime64('2017-12-25')) self.assertEqual(post[-1], np.datetime64('2018-01-25'))
def test_index_level_index_types_a(self) -> None: idx1 = Index(('A', 'B')) idx2 = IndexDate.from_date_range('2019-01-05', '2019-01-08') idx3 = Index((1, 2)) hidx = IndexHierarchy.from_product(idx1, idx2, idx3) self.assertEqual([it.__name__ for it in hidx._levels.index_types()], ['Index', 'IndexDate', 'Index'])
def test_index_date_a(self) -> None: index = IndexDate.from_date_range('2018-01-01', '2018-03-01') self.assertEqual(index.values[0], np.datetime64('2018-01-01')) self.assertEqual(index.values[-1], np.datetime64('2018-03-01')) self.assertEqual(index.loc['2018-02-22'], np.datetime64('2018-02-22'))
def test_index_date_m(self) -> None: index = IndexDate.from_date_range('2017-11-15', '2018-02-15') # NOTE: this type of selection should possibly not be permitted post = index.loc[['2017', '2018']] self.assertEqual(len(post), 93) #type: ignore self.assertEqual(post[0], np.datetime64('2017-11-15')) #type: ignore self.assertEqual(post[-1], np.datetime64('2018-02-15')) #type: ignore
def test_hierarchy_from_product_a(self): groups = Index(('A', 'B', 'C')) dates = IndexDate.from_date_range('2018-01-01', '2018-01-04') observations = Index(('x', 'y')) ih = IndexHierarchy.from_product(groups, dates, observations)
def test_frame_iter_array_g(self) -> None: f = sf.FrameGO(index=IndexDate.from_date_range('2020-01-01', '2020-01-03')) post = list(f.iter_array(axis=0)) self.assertEqual(post, []) post = list(f.iter_array(axis=1)) self.assertEqual([x.tolist() for x in post], [[], [], []])
def test_index_hierarchy_dtypes_b(self) -> None: idx1 = Index(('A', 'B'), name='a') idx2 = IndexDate.from_date_range('2019-01-05', '2019-01-08', name='b') idx3 = Index((1, 2), name='c') hidx = IndexHierarchy.from_product(idx1, idx2, idx3) self.assertEqual([(x, y.kind) for x, y in hidx.dtypes.to_pairs()], [('a', 'U'), ('b', 'M'), ('c', 'i')])
def test_index_hierarchy_index_types_a(self) -> None: idx1 = Index(('A', 'B')) idx2 = IndexDate.from_date_range('2019-01-05', '2019-01-08') idx3 = Index((1, 2)) hidx = IndexHierarchy.from_product(idx1, idx2, idx3) self.assertEqual([(x, y.__name__) for x, y in hidx.index_types.to_pairs()], [(0, 'Index'), (1, 'IndexDate'), (2, 'Index')])
def test_index_date_threshold_a(self) -> None: index = IndexDate.from_date_range('2019-01-01', '2020-02-28') threshold_day = 15 threshold_month = 2 lag = 2 f = FrameGO(index=index) f['month_day'] = f.index.via_dt.month * 100 + f.index.via_dt.day f['transition'] = f['month_day'] >= (threshold_month * 100 + threshold_day) f['year_shift'] = Series.from_element( lag, index=index).assign[f['transition']](lag - 1) f['year'] = f.index.via_dt.year - f['year_shift'].values self.assertEqual(f['transition'].sum(), 334) self.assertEqual(f['year'].values.tolist(), [ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019 ])
def test_index_date_n(self) -> None: index = IndexDate.from_date_range('2017-11-15', '2018-02-15') # NOTE: this type of selection should possibly not be permitted post = index.loc[['2017-12', '2018-02']] self.assertEqual(len(post), 46) self.assertEqual(post[0], np.datetime64('2017-12-01')) self.assertEqual(post[-1], np.datetime64('2018-02-15')) self.assertEqual(set(post.values.astype('datetime64[M]')), {np.datetime64('2018-02'), np.datetime64('2017-12')})
def test_index_date_loc_to_iloc_a(self): index = IndexDate.from_date_range('2018-01-01', '2018-03-01') self.assertEqual(index.loc_to_iloc(np.datetime64('2018-02-11')), 41) self.assertEqual(index.loc_to_iloc('2018-02-11'), 41) self.assertEqual(index.loc_to_iloc(slice('2018-02-11', '2018-02-24')), slice(41, 55, None))
def test_index_date_loc_to_iloc_b(self) -> None: index = IndexDate.from_date_range('2018-01-01', '2018-03-01') # with self.assertRaises(RuntimeError): # _ = index.loc_to_iloc(['2017-12-01', '2018-01-01', '2018-02-01']) post = index._loc_to_iloc(['2017-12-01', '2018-01-01', '2018-02-01'], partial_selection=True) self.assertEqual(post, [0, 31])
def test_index_level_dtypes_b(self) -> None: idx1 = Index(('A', 'B')) idx2 = IndexDate.from_date_range('2019-01-05', '2019-01-08') idx3 = Index((1, 2)) hidx = IndexHierarchy.from_product(idx1, idx2, idx3) self.assertEqual([dt.kind for dt in hidx._levels.dtype_per_depth()], ['U', 'M', 'i'], )
def test_index_intersection_f(self) -> None: idx1 = IndexDate.from_date_range('2020-01-02', '2020-01-08') idx2 = IndexDate.from_date_range('2020-01-02', '2020-01-08') idx3 = IndexDate.from_date_range('2020-01-03', '2020-01-09') self.assertEqual( idx1.union(idx2).values.tolist(), [ datetime.date(2020, 1, 2), datetime.date(2020, 1, 3), datetime.date(2020, 1, 4), datetime.date(2020, 1, 5), datetime.date(2020, 1, 6), datetime.date(2020, 1, 7), datetime.date(2020, 1, 8) ]) self.assertEqual(id(idx1), id(idx1.union(idx2))) self.assertEqual( idx1.intersection(idx2).values.tolist(), [ datetime.date(2020, 1, 2), datetime.date(2020, 1, 3), datetime.date(2020, 1, 4), datetime.date(2020, 1, 5), datetime.date(2020, 1, 6), datetime.date(2020, 1, 7), datetime.date(2020, 1, 8) ]) self.assertEqual(id(idx1), id(idx1.intersection(idx2))) self.assertEqual(idx1.difference(idx2).values.tolist(), []) self.assertEqual( idx1.intersection(idx3).values.tolist(), [ datetime.date(2020, 1, 3), datetime.date(2020, 1, 4), datetime.date(2020, 1, 5), datetime.date(2020, 1, 6), datetime.date(2020, 1, 7), datetime.date(2020, 1, 8) ])
def test_index_datetime_loc_searchsorted_b(self) -> None: dt64 = np.datetime64 idx = IndexDate.from_date_range('2020-01-01', '2020-01-31') self.assertEqual(idx.loc_searchsorted('2020-01-05').tolist(), datetime.date(2020, 1, 5)) self.assertEqual( idx.loc_searchsorted(['2020-01-05', '2020-01-31'], side_left=False, fill_value=None).tolist(), [datetime.date(2020, 1, 6), None] )
def test_index_datetime_iloc_searchsorted_a(self) -> None: dt64 = np.datetime64 idx = IndexDate.from_date_range('2020-01-01', '2020-01-31') self.assertEqual(idx.iloc_searchsorted(dt64('2020-01-05')), 4) self.assertEqual( idx.iloc_searchsorted([dt64('2020-01-05'), dt64('2020-01-31')]).tolist(), [4, 30]) self.assertEqual( idx.iloc_searchsorted( [dt64('2020-01-05'), dt64('2020-01-31')], side_left=False).tolist(), [5, 31])
def test_index_datetime_loc_to_iloc_a(self) -> None: dt64 = np.datetime64 idx = IndexDate.from_date_range('2020-01-01', '2020-01-31') self.assertEqual(idx.loc_to_iloc(['2020-01-15', '2020-01-29']), [14, 28]) self.assertEqual(idx.loc_to_iloc(idx == dt64('2020-01-13')).tolist(), #type: ignore [union-attr] [12]) self.assertEqual(idx.loc_to_iloc(slice('2020-01-15', '2020-01-29')), slice(14, 29, None)) self.assertEqual(idx.loc_to_iloc('2020-01-29'), 28)
def test_index_date_d(self) -> None: index = IndexDate.from_date_range('2017-12-15', '2018-03-15', 2) # selct by year and year month self.assertAlmostEqualValues(index.loc['2017'].values, #type: ignore np.array(['2017-12-15', '2017-12-17', '2017-12-19', '2017-12-21', '2017-12-23', '2017-12-25', '2017-12-27', '2017-12-29', '2017-12-31'], dtype='datetime64[D]')) self.assertAlmostEqualValues(index.loc['2018-02'].values, #type: ignore np.array(['2018-02-01', '2018-02-03', '2018-02-05', '2018-02-07', '2018-02-09', '2018-02-11', '2018-02-13', '2018-02-15', '2018-02-17', '2018-02-19', '2018-02-21', '2018-02-23', '2018-02-25', '2018-02-27'], dtype='datetime64[D]')) self.assertEqual(index.loc['2018-02-19'], np.datetime64('2018-02-19'))
def test_frame_iter_array_f(self) -> None: f = sf.Frame(np.arange(12).reshape(3,4), index=IndexDate.from_date_range('2020-01-01', '2020-01-03')) post = f.iter_array(axis=0).apply(np.sum, name='foo') self.assertEqual(post.name, 'foo') self.assertEqual( f.iter_array(axis=0).apply(np.sum).to_pairs(), ((0, 12), (1, 15), (2, 18), (3, 21)) ) self.assertEqual( f.iter_array(axis=1).apply(np.sum).to_pairs(), ((np.datetime64('2020-01-01'), 6), (np.datetime64('2020-01-02'), 22), (np.datetime64('2020-01-03'), 38)) )
def test_index_hierarchy_label_widths_at_depth(self) -> None: idx1 = Index(('A', 'B'), name='a') idx2 = IndexDate.from_date_range('2019-01-05', '2019-01-08', name='b') idx3 = Index((1, 2), name='c') hidx = IndexHierarchy.from_product(idx1, idx2, idx3) self.assertEqual(tuple(hidx.label_widths_at_depth(0)), (('A', 8), ('B', 8))) self.assertEqual(tuple(hidx.label_widths_at_depth(1)), ((np.datetime64('2019-01-05'), 2), (np.datetime64('2019-01-06'), 2), (np.datetime64('2019-01-07'), 0), (np.datetime64('2019-01-08'), 2), (np.datetime64('2019-01-05'), 2), (np.datetime64('2019-01-06'), 2), (np.datetime64('2019-01-07'), 0), (np.datetime64('2019-01-08'), 2))) self.assertEqual(tuple(hidx.label_widths_at_depth(2)), ((1, 1), (2, 1), (1, 1), (2, 1), (1, 1), (2, 1), (1, 1), (2, 1), (1, 1), (2, 1), (1, 1), (2, 1), (1, 1), (2, 1), (1, 1), (2, 1)))
def test_hierarchy_loc_to_iloc_a(self): groups = Index(('A', 'B', 'C')) dates = IndexDate.from_date_range('2018-01-01', '2018-01-04') observations = Index(('x', 'y')) lvl2a = IndexLevel(index=observations) lvl2b = IndexLevel(index=observations, offset=2) lvl2c = IndexLevel(index=observations, offset=4) lvl2d = IndexLevel(index=observations, offset=6) lvl2_targets = ArrayGO((lvl2a, lvl2b, lvl2c, lvl2d)) lvl1a = IndexLevel(index=dates, targets=lvl2_targets, offset=0) lvl1b = IndexLevel(index=dates, targets=lvl2_targets, offset=len(lvl1a)) lvl1c = IndexLevel(index=dates, targets=lvl2_targets, offset=len(lvl1a) * 2) # we need as many targets as len(index) lvl0 = IndexLevel(index=groups, targets=ArrayGO((lvl1a, lvl1b, lvl1c))) self.assertEqual(len(lvl2a), 2) self.assertEqual(len(lvl1a), 8) self.assertEqual(len(lvl0), 24) self.assertEqual(list(lvl2a.depths()), [1]) self.assertEqual(list(lvl1a.depths()), [2, 2, 2, 2]) self.assertEqual(list(lvl0.depths()), [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]) ih = IndexHierarchy(lvl0) self.assertEqual(len(ih), 24) post = ih.loc_to_iloc(HLoc[['A', 'B', 'C'], slice('2018-01-01', '2018-01-04'), ['x', 'y']]) # this will break if we recognize this can be a slice self.assertEqual(post, list(range(len(ih)))) post = ih.loc_to_iloc(HLoc[['A', 'B', 'C'], slice('2018-01-01', '2018-01-04'), 'x']) self.assertEqual(post, list(range(0, len(ih), 2))) post = ih.loc_to_iloc(HLoc['C', '2018-01-03', 'y']) self.assertEqual(post, 21) post = ih.loc_to_iloc(HLoc['B', '2018-01-03':, 'y']) self.assertEqual(post, [13, 15]) post = ih.loc_to_iloc(HLoc[['B', 'C'], '2018-01-03']) self.assertEqual(post, [12, 13, 20, 21]) post = ih.loc_to_iloc(HLoc[['A', 'C'], :, 'y']) self.assertEqual(post, [1, 3, 5, 7, 17, 19, 21, 23]) post = ih.loc_to_iloc(HLoc[['A', 'C'], :, 'x']) self.assertEqual(post, [0, 2, 4, 6, 16, 18, 20, 22])
def test_index_date_c(self) -> None: index = IndexDate.from_date_range('2017-12-15', '2018-03-15', 2) self.assertEqual((index == '2017').sum(), 9) self.assertEqual((index == '2018-02').sum(), 14) self.assertEqual((index == '2018').sum(), 37)
def test_index_datetime_iloc_searchsorted_b(self) -> None: dt64 = np.datetime64 idx = IndexDate.from_date_range('2020-01-01', '2020-01-31') self.assertEqual(idx.iloc_searchsorted('2020-01-05'), 4) self.assertEqual(idx.iloc_searchsorted(datetime.date(2020, 1, 5)), 4)
def test_index_date_k(self) -> None: index = IndexDate.from_date_range('2017-11-15', '2018-02-15') post = index.loc[['2017-12-10', '2018-02-06']] self.assertEqual(len(post), 2) #type: ignore self.assertEqual(post[0], np.datetime64('2017-12-10')) #type: ignore self.assertEqual(post[-1], np.datetime64('2018-02-06')) #type: ignore