def test_gaussian_date_generator(self): """ Confirm that the generated dates are distributed according to a Gaussian. We doe this assertion 10 times. """ expected_mean = datetime(2014, 6, 1) expected_sigma_in_days = 100 gg = gaussian_date_generator(expected_mean, expected_sigma_in_days) for _ in range(10): distribution = [next(gg) for _ in range(100000)] seconds = [convert_datetime_to_seconds(d) for d in distribution] actual_mean = self.mean(seconds) diff = actual_mean - convert_datetime_to_seconds(expected_mean) diff_in_days = seconds_to_days(diff) one_day = 1 # assert stuff self.assertLessEqual(diff_in_days, one_day) actual_sigma = self.standard_deviation(seconds) diff = abs(actual_sigma - days_to_seconds(expected_sigma_in_days)) self.assertLessEqual(diff, days_to_seconds(1))
def gaussian_date_generator(mean, sigma_in_days): """ Yields a generator for datetime objects where the dates are distributed according to a Gaussian, with standard deviation sigma. The distribution of dates is generated by first generating a distribution of numbers (in seconds) using the gaussian_generator defined above and then transforming those numbers back to dates. """ mean_in_seconds = convert_datetime_to_seconds(mean) sigma_in_seconds = days_to_seconds(sigma_in_days) gg = gaussian_generator(mean_in_seconds, sigma_in_seconds) while True: seconds = next(gg) yield datetime.fromtimestamp(seconds)