Beispiel #1
0
 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())
Beispiel #2
0
 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))
Beispiel #12
0
 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())
Beispiel #14
0
  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())
Beispiel #16
0
 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())