def test_add_months_and_roll(self, rolling_enum_value, data_key): data = test_data.add_months_data date_tensor = dates.from_tuples([item["date"] for item in data]) periods = dates.periods.PeriodTensor([item["months"] for item in data], dates.PeriodType.MONTH) expected_dates = dates.from_tuples([item[data_key] for item in data]) cal = self.impl( weekend_mask=dates.WeekendMask.SATURDAY_SUNDAY, holidays=test_data.holidays) actual_dates = cal.add_period_and_roll(date_tensor, periods, roll_convention=rolling_enum_value) self.assertAllEqual(expected_dates.ordinal(), actual_dates.ordinal())
def test_add_business_days(self): data = test_data.add_days_data date_tensor = dates.from_tuples([item["date"] for item in data]) days = tf.constant([item["days"] for item in data]) expected_dates = dates.from_tuples([item["shifted_date"] for item in data]) cal = self.impl( weekend_mask=dates.WeekendMask.SATURDAY_SUNDAY, holidays=test_data.holidays) actual_dates = cal.add_business_days( date_tensor, days, roll_convention=dates.BusinessDayConvention.MODIFIED_FOLLOWING) self.assertAllEqual(expected_dates.ordinal(), actual_dates.ordinal())
def test_tensor_wrapper_ops(self): dates1 = dateslib.from_tuples([(2019, 3, 25), (2020, 1, 2), (2019, 1, 2)]) dates2 = dateslib.from_tuples([(2019, 4, 25), (2020, 5, 2), (2018, 1, 2)]) dates = dateslib.DateTensor.stack((dates1, dates2), axis=-1) self.assertEqual((3, 2), dates.shape) self.assertEqual((2, ), dates[0].shape) self.assertEqual((2, 2), dates[1:].shape) self.assertEqual((2, 1), dates[1:, :-1].shape) self.assertEqual((3, 1, 2), dates.expand_dims(axis=1).shape) self.assertEqual((3, 3, 2), dates.broadcast_to((3, 3, 2)).shape)
def test_providing_holidays(self, holidays): cal = dates.HolidayCalendar2( weekend_mask=_SATURDAY_SUNDAY_MASK, holidays=holidays) date_tensor = dates.from_tuples([(2020, 1, 1), (2020, 5, 1), (2020, 12, 25), (2021, 3, 8), (2021, 1, 1)]) self.assertAllEqual([False, True, False, True, False], cal.is_business_day(date_tensor))
def foo(): # Trigger caching of all tables. date_tensor = dates.from_tuples([]) return (cal.is_business_day(date_tensor), cal.roll_to_business_day(date_tensor, conv).ordinal(), cal.business_days_between(date_tensor, date_tensor), cal.add_business_days(date_tensor, 2, conv).ordinal())
def bar(): date_tensor = dates.from_tuples([(2020, 1, 3), (2020, 1, 4), (2021, 12, 24), (2021, 12, 25)]) return (cal.is_business_day(date_tensor), cal.roll_to_business_day(date_tensor, conv).ordinal(), cal.business_days_between(date_tensor, date_tensor), cal.add_business_days(date_tensor, 2, conv).ordinal())
def test_date_subtraction(self): # Subtraction trivially transforms to addition, so we don't test # extensively. dates_from = dateslib.from_tuples([(2020, 3, 15), (2020, 3, 31)]) period = dateslib.periods.PeriodTensor([2, 1], dateslib.PeriodType.MONTH) expected_ordinals = np.array([datetime.date(2020, 1, 15).toordinal(), datetime.date(2020, 2, 29).toordinal()]) self.assertAllEqual(expected_ordinals, (dates_from - period).ordinal())
def test_holidays_intersect_with_weekends(self): holidays = [(2020, 1, 4)] # Saturday. cal = dates.HolidayCalendar( weekend_mask=dates.WeekendMask.SATURDAY_SUNDAY, holidays=holidays) date_tensor = dates.from_tuples([(2020, 1, 3), (2020, 1, 4), (2020, 1, 5), (2020, 1, 6)]) self.assertAllEqual([True, False, False, True], cal.is_business_day(date_tensor))
def test_custom_weekend_mask(self): weekend_mask = [0, 0, 0, 0, 1, 0, 1] # Work Saturdays instead of Fridays. cal = dates.HolidayCalendar2(weekend_mask=weekend_mask) date_tensor = dates.from_tuples([(2020, 1, 2), (2020, 1, 3), (2020, 1, 4), (2020, 1, 5), (2020, 1, 6), (2020, 5, 1), (2020, 5, 2)]) self.assertAllEqual([True, False, True, False, True, False, True], cal.is_business_day(date_tensor))
def test_is_business_day(self): data = test_data.is_business_day_data date_tensor = dates.from_tuples([item[0] for item in data]) expected = [item[1] for item in data] cal = dates.HolidayCalendar2( weekend_mask=_SATURDAY_SUNDAY_MASK, holidays=test_data.holidays) actual = cal.is_business_day(date_tensor) self.assertEqual(tf.bool, actual.dtype) self.assertAllEqual(expected, actual)
def test_no_holidays_specified(self): cal = dates.HolidayCalendar( weekend_mask=dates.WeekendMask.SATURDAY_SUNDAY, start_year=2020, end_year=2021) date_tensor = dates.from_tuples([(2020, 1, 3), (2020, 1, 4), (2021, 12, 24), (2021, 12, 25)]) self.assertAllEqual([True, False, True, False], cal.is_business_day(date_tensor))
def test_providing_holidays(self, holidays, convert_to_date_tensor=False): if convert_to_date_tensor: holidays = dates.convert_to_date_tensor(holidays) cal = self.impl( weekend_mask=dates.WeekendMask.SATURDAY_SUNDAY, holidays=holidays) date_tensor = dates.from_tuples([(2020, 1, 1), (2020, 5, 1), (2020, 12, 25), (2021, 3, 8), (2021, 1, 1)]) self.assertAllEqual([False, True, False, True, False], cal.is_business_day(date_tensor))
def test_add_business_days_raises_on_invalid_input(self): data = test_data.add_days_data # Contains some holidays. date_tensor = dates.from_tuples([item["date"] for item in data]) days = tf.constant([item["days"] for item in data]) cal = dates.HolidayCalendar2( weekend_mask=_SATURDAY_SUNDAY_MASK, holidays=test_data.holidays) with self.assertRaises(tf.errors.InvalidArgumentError): new_dates = cal.add_business_days( date_tensor, days, roll_convention=dates.BusinessDayConvention.NONE) self.evaluate(new_dates.ordinal())
def test_bounded_impl_near_boundaries(self): cal = bounded_holiday_calendar.BoundedHolidayCalendar( weekend_mask=dates.WeekendMask.SATURDAY_SUNDAY, start_year=2017, end_year=2022) def assert_roll_raises(roll_convention, date): with self.assertRaises(tf.errors.InvalidArgumentError): self.evaluate(cal.roll_to_business_day(date, roll_convention).year()) def assert_rolls_to(roll_convention, date, expected_date): rolled = cal.roll_to_business_day(date, roll_convention) self.assertAllEqual(rolled.ordinal(), expected_date.ordinal()) date = dates.from_tuples([(2022, 12, 31)]) # Saturday preceding = dates.from_tuples([(2022, 12, 30)]) with self.subTest("following_upper_bound"): assert_roll_raises(dates.BusinessDayConvention.FOLLOWING, date) with self.subTest("preceding_upper_bound"): assert_rolls_to(dates.BusinessDayConvention.PRECEDING, date, preceding) with self.subTest("modified_following_upper_bound"): assert_rolls_to(dates.BusinessDayConvention.MODIFIED_FOLLOWING, date, preceding) with self.subTest("modified_preceding_upper_bound"): assert_rolls_to(dates.BusinessDayConvention.MODIFIED_PRECEDING, date, preceding) date = dates.from_tuples([(2017, 1, 1)]) # Sunday following = dates.from_tuples([(2017, 1, 2)]) with self.subTest("following_lower_bound"): assert_rolls_to(dates.BusinessDayConvention.FOLLOWING, date, following) with self.subTest("preceding_lower_bound"): assert_roll_raises(dates.BusinessDayConvention.PRECEDING, date) with self.subTest("modified_following_lower_bound"): assert_rolls_to(dates.BusinessDayConvention.MODIFIED_FOLLOWING, date, following) with self.subTest("modified_preceding_lower_bound"): assert_rolls_to(dates.BusinessDayConvention.MODIFIED_PRECEDING, date, following)
def test_validation(self): not_raised = [] for y, m, d in test_data.invalid_dates: try: self.evaluate(dateslib.from_tuples([(y, m, d)]).month()) not_raised.append((y, m, d)) except tf.errors.InvalidArgumentError: pass self.assertEmpty(not_raised) for invalid_ordinal in [-5, 0]: with self.assertRaises(tf.errors.InvalidArgumentError): self.evaluate(dateslib.from_ordinals([invalid_ordinal]).month())
def test_create_from_tuples(self): dates = test_data.test_dates y, m, d, o, _ = unpack_test_dates(dates) date_tensor = dateslib.from_tuples(dates) self.assert_date_tensor_equals(date_tensor, y, m, d, o)
def test_boolean_mask(self): dates = dateslib.from_tuples([(2019, 3, 25), (2020, 1, 2), (2019, 1, 2)]) mask = [True, False, True] expected = dateslib.DateTensor.stack((dates[0], dates[2])) self.assert_date_tensor_equals(expected, dates.boolean_mask(mask))
def test_day_of_year(self): data = test_data.day_of_year_data date_tuples, expected_days_of_year = zip(*data) dates = dateslib.from_tuples(date_tuples) self.assertAllEqual(expected_days_of_year, dates.day_of_year())