def test_score_with_nans_ignore(self):
        obs = deepcopy(self.observations)
        obs[0]['feautre_a'] = np.nan

        to_be_scored = {
            'feature_a': np.nan,
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        actually_scored = {'feature_b': 'b_val_1', 'feature_c': 'c_val_1'}

        # score observation with nan value
        self.cbrw = CBRW(ignore_unknown=True)
        self.cbrw.add_observations(self.observations)
        self.cbrw.fit()
        score = self.cbrw.score(to_be_scored)
        actual_score = self.cbrw.score(actually_scored)
        self.assertFalse(isnan(score[0]))
        self.assertEqual(score, actual_score)

        # fit includes observation with nan value
        self.cbrw = CBRW(ignore_unknown=True)
        self.cbrw.add_observations(obs)
        self.cbrw.fit()
        score = self.cbrw.score(to_be_scored)
        actual_score = self.cbrw.score(actually_scored)
        self.assertFalse(isnan(score[0]))
        self.assertEqual(score, actual_score)
    def test_value_scores_unknown_features_ignore(self):
        self.cbrw = CBRW(ignore_unknown=True)
        self.cbrw.add_observations(self.observations)
        self.cbrw.fit()

        # score observation where all features but not all
        # values have been previously observed
        to_be_scored = {
            'feature_a': 'a_val_x',
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        actually_scored = {'feature_b': 'b_val_1', 'feature_c': 'c_val_1'}
        value_scores = self.cbrw.value_scores(to_be_scored)[0]
        actual_value_scores = self.cbrw.value_scores(actually_scored)[0]
        self.assertTrue(all(not isnan(vs) for vs in value_scores.values()))
        self.assertEqual(value_scores['feature_a'], 0)
        self.assertEqual(value_scores['feature_b'],
                         actual_value_scores['feature_b'])
        self.assertEqual(value_scores['feature_c'],
                         actual_value_scores['feature_c'])

        # score observation where a feature has not
        # been previously observed
        to_be_scored = {
            'feature_x': 'x_val_x',
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        actually_scored = {'feature_b': 'b_val_1', 'feature_c': 'c_val_1'}
        value_scores = self.cbrw.value_scores(to_be_scored)[0]
        actual_value_scores = self.cbrw.value_scores(actually_scored)[0]
        self.assertTrue(all(not isnan(vs) for vs in value_scores.values()))
        self.assertEqual(value_scores['feature_x'], 0)
        self.assertEqual(value_scores['feature_b'],
                         actual_value_scores['feature_b'])
        self.assertEqual(value_scores['feature_c'],
                         actual_value_scores['feature_c'])

        # score observation where no features have
        # previously been observed
        to_be_scored = {
            'feature_x': 'x_val_x',
            'feature_y': 'y_val_1',
            'feature_z': 'z_val_1'
        }
        value_scores = self.cbrw.value_scores(to_be_scored)[0]
        self.assertTrue(all(not isnan(vs) for vs in value_scores.values()))
        self.assertTrue(all(vs == 0 for vs in value_scores.values()))
    def test_value_scores_with_nans_ignore(self):
        obs = deepcopy(self.observations)
        obs[0]['feautre_a'] = np.nan

        to_be_scored = {
            'feature_a': np.nan,
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        actually_scored = {'feature_b': 'b_val_1', 'feature_c': 'c_val_1'}

        # score observation with nan value
        self.cbrw = CBRW(ignore_unknown=True)
        self.cbrw.add_observations(self.observations)
        self.cbrw.fit()
        value_scores = self.cbrw.value_scores(to_be_scored)[0]
        actual_value_scores = self.cbrw.value_scores(actually_scored)[0]
        self.assertTrue(all(not isnan(vs) for vs in value_scores.values()))
        self.assertEqual(value_scores['feature_a'], 0)
        self.assertEqual(value_scores['feature_b'],
                         actual_value_scores['feature_b'])
        self.assertEqual(value_scores['feature_c'],
                         actual_value_scores['feature_c'])

        # fit includes observation with nan value
        self.cbrw = CBRW(ignore_unknown=True)
        self.cbrw.add_observations(obs)
        self.cbrw.fit()
        value_scores = self.cbrw.value_scores(to_be_scored)[0]
        actual_value_scores = self.cbrw.value_scores(actually_scored)[0]
        self.assertTrue(all(not isnan(vs) for vs in value_scores.values()))
        self.assertEqual(value_scores['feature_a'], 0)
        self.assertEqual(value_scores['feature_b'],
                         actual_value_scores['feature_b'])
        self.assertEqual(value_scores['feature_c'],
                         actual_value_scores['feature_c'])
    def test_score_unknown_features_ignore(self):
        self.cbrw = CBRW(ignore_unknown=True)
        self.cbrw.add_observations(self.observations)
        self.cbrw.fit()

        # score observation where all features but not all
        # values have been previously observed
        to_be_scored = {
            'feature_a': 'a_val_x',
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        actually_scored = {
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        score = self.cbrw.score(to_be_scored)
        actual_score = self.cbrw.score(actually_scored)
        self.assertFalse(isnan(score[0]))
        self.assertEqual(score, actual_score)

        # score observation where a feature has not
        # been previously observed
        to_be_scored = {
            'feature_x': 'x_val_x',
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        actually_scored = {
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }
        score = self.cbrw.score(to_be_scored)
        actual_score = self.cbrw.score(actually_scored)
        self.assertFalse(isnan(score[0]))
        self.assertEqual(score, actual_score)
        
        # score observation where all features not
        # previously observed
        to_be_scored = {
            'feature_x': 'x_val_x',
            'feature_y': 'y_val_1',
            'feature_z': 'z_val_1'
        }
        score = self.cbrw.score(to_be_scored)
        self.assertFalse(isnan(score[0]))
        self.assertEqual(score[0], 0)
    def test_value_scores_with_nans_default(self):
        obs = deepcopy(self.observations)
        obs[0]['feautre_a'] = np.nan

        to_be_scored = {
            'feature_a': np.nan,
            'feature_b': 'b_val_1',
            'feature_c': 'c_val_1'
        }

        # score observation with nan value
        self.cbrw.fit()
        value_scores = self.cbrw.value_scores(to_be_scored)
        self.assertTrue(isnan(value_scores[0]['feature_a']))

        # fit includes observation with nan value
        self.cbrw = CBRW()
        self.cbrw.add_observations(obs)
        self.cbrw.fit()
        value_scores = self.cbrw.value_scores(to_be_scored)
        self.assertTrue(isnan(value_scores[0]['feature_a']))
 def test_fit_no_data(self):
     self.cbrw = CBRW()
     with self.assertRaises(CBRWFitError):
         self.cbrw.fit()
 def setUp(self):
     self.cbrw = CBRW()
     self.cbrw.add_observations(self.observations)