Example #1
0
 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
     ])
Example #2
0
    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'))
Example #3
0
    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
Example #6
0
    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'))
Example #8
0
 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
Example #11
0
    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)
Example #12
0
    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')])
Example #15
0
    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')})
Example #17
0
    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))
Example #18
0
    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'],
                )
Example #20
0
    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]
                )
Example #22
0
    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'))
Example #25
0
    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)))
Example #27
0
    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