예제 #1
0
    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))
예제 #2
0
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)