示例#1
0
    def test_fit_with_horizon_and_more_rounds(self) -> type(None):
        """
        Test `fit` method with horizon and several evaluational
        rounds.

        :return:
            None
        """
        candidates = {
            MovingAverageForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(1, 3)],
            MovingMedianForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(3, 4)]
        }
        selector = OnTheFlySelector(candidates,
                                    horizon=3,
                                    n_evaluational_rounds=3)

        df = pd.DataFrame(
            [[1, 2], [1, 3], [1, 6], [1, 5], [1, 4], [1, 1], [1, 3], [1, 2],
             [2, 3], [2, 4], [2, 4.5], [2, 4], [2, 8], [2, 7], [2, 5], [2, 4]],
            columns=['key', 'target'])

        selector.fit(df, 'target', ['key'])

        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][1],
                       MovingMedianForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][1].get_params(),
                          {'rolling_kwargs': {
                              'window': 3,
                              'min_periods': 1
                          }})
        self.assertEquals(selector.best_scores_['score'][1], -59 / 9)
        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][2],
                       MovingAverageForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][2].get_params(),
                          {'rolling_kwargs': {
                              'window': 2,
                              'min_periods': 1
                          }})
        self.assertAlmostEqual(selector.best_scores_['score'][2],
                               -6.073784722222222)
示例#2
0
    def test_fit_with_scoring_keys(self) -> type(None):
        """
        Test `fit` method with group-wise selection instead of
        series-wise selection.

        :return:
            None
        """
        candidates = {
            MovingAverageForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(1, 3)],
            MovingMedianForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(3, 4)]
        }
        selector = OnTheFlySelector(candidates)

        df = pd.DataFrame(
            [[1, 1, 2], [1, 1, 3], [1, 1, 6], [1, 1, 5], [1, 2, 3], [1, 2, 4],
             [1, 2, 4.5], [1, 2, 1], [2, 1, 3], [2, 1, 2], [2, 1, -1],
             [2, 1, 7], [2, 2, 0], [2, 2, 3], [2, 2, 2], [2, 2, 5]],
            columns=['group', 'object', 'target'])

        selector.fit(df, 'target', ['group', 'object'], scoring_keys=['group'])

        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][1],
                       MovingAverageForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][1].get_params(),
                          {'rolling_kwargs': {
                              'window': 2,
                              'min_periods': 1
                          }})
        self.assertEquals(selector.best_scores_['score'][1], -5.40625)
        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][2],
                       MovingMedianForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][2].get_params(),
                          {'rolling_kwargs': {
                              'window': 3,
                              'min_periods': 1
                          }})
        self.assertEquals(selector.best_scores_['score'][2], -17)
示例#3
0
    def test_predict(self) -> type(None):
        """
        Test `predict` method.

        :return:
            None
        """
        selector = OnTheFlySelector(horizon=2)
        selector.best_scores_ = pd.DataFrame(
            [[-1, MovingAverageForecaster({
                'window': 2
            }).fit(None)],
             [-2, MovingMedianForecaster({
                 'window': 4
             }).fit(None)]],
            columns=['score', 'forecaster'],
            index=[1, 2])
        selector.best_scores_.index.name = 'key'
        selector.name_of_target_ = 'target'
        selector.scoring_keys_ = ['key']
        selector.series_keys_ = ['key']
        selector.evaluation_fn_ = None

        df = pd.DataFrame(
            [[1, 2], [1, 3], [1, 6], [1, 5], [2, 3], [2, 4], [2, 4.5], [2, 1]],
            columns=['key', 'target'])
        result = selector.predict(df)

        true_answer = pd.DataFrame([[1, 5.5], [1, 5.25], [2, 3.5], [2, 3.75]],
                                   columns=['key', 'prediction'],
                                   index=[0, 1, 0, 1])
        self.assertTrue(result.equals(true_answer))
示例#4
0
    def test_fit_with_evaluational_interval(self) -> type(None):
        """
        Test `fit` method with selection based on results for
        several steps.

        :return:
            None
        """
        candidates = {
            MovingAverageForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(1, 3)],
            MovingMedianForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(3, 4)]
        }
        selector = OnTheFlySelector(candidates, n_evaluational_rounds=3)

        df = pd.DataFrame([[1, 2], [1, 3], [1, 6], [1, 5], [1, 4], [1, 3],
                           [2, 3], [2, 4], [2, 4.5], [2, 1], [2, 7], [2, 2]],
                          columns=['key', 'target'])

        selector.fit(df, 'target', ['key'])

        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][1],
                       MovingAverageForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][1].get_params(),
                          {'rolling_kwargs': {
                              'window': 1,
                              'min_periods': 1
                          }})
        self.assertEqual(selector.best_scores_['score'][1], -1)
        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][2],
                       MovingMedianForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][2].get_params(),
                          {'rolling_kwargs': {
                              'window': 3,
                              'min_periods': 1
                          }})
        self.assertAlmostEqual(selector.best_scores_['score'][2], -8.083333333)
示例#5
0
    def test_fit(self) -> type(None):
        """
        Test `fit` method.

        :return:
            None
        """
        candidates = {
            MovingAverageForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(1, 3)],
            MovingMedianForecaster(): [{
                'rolling_kwargs': {
                    'window': w,
                    'min_periods': 1
                }
            } for w in range(3, 4)]
        }
        selector = OnTheFlySelector(candidates)

        df = pd.DataFrame(
            [[1, 2], [1, 3], [1, 6], [1, 5], [2, 3], [2, 4], [2, 4.5], [2, 1]],
            columns=['key', 'target'])

        selector.fit(df, 'target', ['key'])

        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][1],
                       MovingAverageForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][1].get_params(),
                          {'rolling_kwargs': {
                              'window': 2,
                              'min_periods': 1
                          }})
        self.assertEquals(selector.best_scores_['score'][1], -0.25)
        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][2],
                       MovingMedianForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][2].get_params(),
                          {'rolling_kwargs': {
                              'window': 3,
                              'min_periods': 1
                          }})
        self.assertEquals(selector.best_scores_['score'][2], -9)
示例#6
0
    def test_that_fit_warns_on_series_of_unequal_length(self) -> type(None):
        """
        Test that fit to a series of different length results in
        `RuntimeWarning`.

        :return:
            None
        """
        selector = OnTheFlySelector()
        with warnings.catch_warnings(record=True) as caught_warnings:
            df = pd.DataFrame(
                [[1, 2], [1, 3], [1, 6], [2, 8], [2, 7], [2, 5], [2, 4]],
                columns=['key', 'target'])

            selector.fit(df, 'target', ['key'])

            self.assertTrue(len(caught_warnings) == 1)
            self.assertTrue(
                issubclass(caught_warnings[-1].category, RuntimeWarning))
示例#7
0
    def test_fit_with_default_candidates(self) -> type(None):
        """
        Test `fit` method with default set of candidates.

        :return:
            None
        """
        selector = OnTheFlySelector()

        df = pd.DataFrame(
            [[1, 2], [1, 3], [1, 6], [1, 5], [1, 8], [1, 3], [1, 4], [1, 2],
             [1, 5], [1, 7], [1, 5.5], [2, 3], [2, 4], [2, 4.5], [2, 1],
             [2, 0], [2, 0], [2, 9], [2, 4], [2, 8], [2, 5], [2, 3]],
            columns=['key', 'target'])

        selector.fit(df, 'target', ['key'])

        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][1],
                       ExponentialMovingAverageForecaster))
        self.assertEquals(
            selector.best_scores_['forecaster'][1].get_params(), {
                'ewm_kwargs': {
                    'halflife': 1.0,
                    'min_periods': 1
                },
                'n_steps_to_use': 10
            })
        self.assertAlmostEqual(selector.best_scores_['score'][1], -0.001978206)
        self.assertTrue(
            isinstance(selector.best_scores_['forecaster'][2],
                       MovingAverageForecaster))
        self.assertEquals(selector.best_scores_['forecaster'][2].get_params(),
                          {'rolling_kwargs': {
                              'window': 10,
                              'min_periods': 1
                          }})
        self.assertAlmostEqual(selector.best_scores_['score'][2], -0.7225)