def setUp(self):
     """
     Preload an engine, sim_rows and sim_cols for column based recommendations.
     """
     self.engine_nan = SPE(fixtures.DFCRITICS_NAN, SPE.RATING_NAN)
     self.engine_nan.preload(verbose=False)
     self.engine_binary = SPE(fixtures.DFCRITICS_BINARY, SPE.BINARY)
     self.engine_binary.preload(verbose=False)
Example #2
0
 def setUp(self):
     """
     Preload an engine, sim_rows and sim_cols for column based recommendations.
     """
     self.engine_nan = SPE(fixtures.DFCRITICS_NAN, SPE.RATING_NAN)
     self.engine_nan.preload(verbose=False)
     self.engine_binary = SPE(fixtures.DFCRITICS_BINARY, SPE.BINARY)
     self.engine_binary.preload(verbose=False)
class TestPyrecommend(unittest.TestCase):
    def setUp(self):
        """
        Preload an engine, sim_rows and sim_cols for column based recommendations.
        """
        self.engine_nan = SPE(fixtures.DFCRITICS_NAN, SPE.RATING_NAN)
        self.engine_nan.preload(verbose=False)
        self.engine_binary = SPE(fixtures.DFCRITICS_BINARY, SPE.BINARY)
        self.engine_binary.preload(verbose=False)

    # tests
    # helper
    def _test_helper(self, ix, func1, func2, binary=False):
        # A is provided
        A = [sim for sim in func1(ix) if sim[0] > 0.0]
        # B is expected
        B = [sim for sim in func2(ix, binary=binary) if sim[0] > 0.0]
        if binary:
            # if engine is binary, scores will not necessarily be the same
            # but recommendations will be very similar
            if (len(A) == 0) or (len(B) == 0):
                # then one of the engines has not returned any recommendations
                # it could be the case that our engine did not return any recs
                # but in that case we will just assume that it's due to a small DF
                return
            # else we'll test that least 75% of the items match
            _ = set(zip(*A)[1]) and set(zip(*B)[1])
            self.assertTrue(len(_)*2.0 >= (len(A) + len(B))*0.75)
            return
        # rating_nan engine
        for a, b in zip(A, B):
            self.assertAlmostEqual(a[0], b[0], places=5)
    
    # for rating_nan & binary
    # test similarities
    def test_similar_users(self):
        """
        We can predict similar users using RATING_NAN / BINARY.
        """
        user = random.choice(fixtures.DFCRITICS_NAN.index)
        self._test_helper(user, self.engine_nan.similar_users, fixtures.similar_users)
        self._test_helper(user, self.engine_binary.similar_users, fixtures.similar_users, binary=True)
    
    def test_similar_items_nan(self):
        """
        We can predict similar items using RATING_NAN / BINARY.
        """
        item = random.choice(fixtures.DFCRITICS_NAN.transpose().index)
        self._test_helper(item, self.engine_nan.similar_items, fixtures.similar_items)
        self._test_helper(item, self.engine_binary.similar_items, fixtures.similar_items, binary=True)
    
    # test user/item recs by row
    def test_recommend_items(self):
        """
        We can predict recommended items for user, by row, using RATING_NAN / BINARY.
        """
        user = random.choice(fixtures.DFCRITICS_NAN.index)
        self._test_helper(user, self.engine_nan.recommend_items, fixtures.recommend_items)
        self._test_helper(user, self.engine_binary.recommend_items, fixtures.recommend_items, binary=True)
    
    def test_recommend_users(self):
        """
        We can predict recommended users for item, by row, using RATING_NAN / BINARY.
        """
        item = random.choice(fixtures.DFCRITICS_NAN.transpose().index)
        self._test_helper(item, self.engine_nan.recommend_users,  fixtures.recommend_users)
        self._test_helper(item, self.engine_binary.recommend_users, fixtures.recommend_users, binary=True)
    
    # test column based recs
    def test_recommend_items_bycol(self):
        """
        We can predict recommended items for user, by column.
        """
        user = random.choice(fixtures.DFCRITICS_NAN.index)
        self._test_helper(user, 
            functools.partial(self.engine_nan.recommend_items, method=self.engine_nan.ITEM_BASED),
            fixtures.recommend_items_bycol)
        self._test_helper(user, 
            functools.partial(self.engine_binary.recommend_items, method=self.engine_binary.ITEM_BASED),
            fixtures.recommend_items_bycol, binary=True)
    
    def test_recommend_users_bycol(self):
        """
        We can predict recommended users for item, by column.
        """
        item = random.choice(fixtures.DFCRITICS_NAN.transpose().index)
        self._test_helper(item,
            functools.partial(self.engine_nan.recommend_users, method=self.engine_nan.USER_BASED),
            fixtures.recommend_users_bycol)
        self._test_helper(item,
            functools.partial(self.engine_binary.recommend_users, method=self.engine_binary.USER_BASED),
            fixtures.recommend_users_bycol, binary=True)
    
    def tearDown(self):
        pass
Example #4
0
class TestPyrecommend(unittest.TestCase):
    def setUp(self):
        """
        Preload an engine, sim_rows and sim_cols for column based recommendations.
        """
        self.engine_nan = SPE(fixtures.DFCRITICS_NAN, SPE.RATING_NAN)
        self.engine_nan.preload(verbose=False)
        self.engine_binary = SPE(fixtures.DFCRITICS_BINARY, SPE.BINARY)
        self.engine_binary.preload(verbose=False)

    # tests
    # helper
    def _test_helper(self, ix, func1, func2, binary=False):
        # A is provided
        A = [sim for sim in func1(ix) if sim[0] > 0.0]
        # B is expected
        B = [sim for sim in func2(ix, binary=binary) if sim[0] > 0.0]
        if binary:
            # if engine is binary, scores will not necessarily be the same
            # but recommendations will be very similar
            if (len(A) == 0) or (len(B) == 0):
                # then one of the engines has not returned any recommendations
                # it could be the case that our engine did not return any recs
                # but in that case we will just assume that it's due to a small DF
                return
            # else we'll test that least 75% of the items match
            _ = set(zip(*A)[1]) and set(zip(*B)[1])
            self.assertTrue(len(_) * 2.0 >= (len(A) + len(B)) * 0.75)
            return
        # rating_nan engine
        for a, b in zip(A, B):
            self.assertAlmostEqual(a[0], b[0], places=5)

    # for rating_nan & binary
    # test similarities
    def test_similar_users(self):
        """
        We can predict similar users using RATING_NAN / BINARY.
        """
        user = random.choice(fixtures.DFCRITICS_NAN.index)
        self._test_helper(user, self.engine_nan.similar_users,
                          fixtures.similar_users)
        self._test_helper(user,
                          self.engine_binary.similar_users,
                          fixtures.similar_users,
                          binary=True)

    def test_similar_items_nan(self):
        """
        We can predict similar items using RATING_NAN / BINARY.
        """
        item = random.choice(fixtures.DFCRITICS_NAN.transpose().index)
        self._test_helper(item, self.engine_nan.similar_items,
                          fixtures.similar_items)
        self._test_helper(item,
                          self.engine_binary.similar_items,
                          fixtures.similar_items,
                          binary=True)

    # test user/item recs by row
    def test_recommend_items(self):
        """
        We can predict recommended items for user, by row, using RATING_NAN / BINARY.
        """
        user = random.choice(fixtures.DFCRITICS_NAN.index)
        self._test_helper(user, self.engine_nan.recommend_items,
                          fixtures.recommend_items)
        self._test_helper(user,
                          self.engine_binary.recommend_items,
                          fixtures.recommend_items,
                          binary=True)

    def test_recommend_users(self):
        """
        We can predict recommended users for item, by row, using RATING_NAN / BINARY.
        """
        item = random.choice(fixtures.DFCRITICS_NAN.transpose().index)
        self._test_helper(item, self.engine_nan.recommend_users,
                          fixtures.recommend_users)
        self._test_helper(item,
                          self.engine_binary.recommend_users,
                          fixtures.recommend_users,
                          binary=True)

    # test column based recs
    def test_recommend_items_bycol(self):
        """
        We can predict recommended items for user, by column.
        """
        user = random.choice(fixtures.DFCRITICS_NAN.index)
        self._test_helper(
            user,
            functools.partial(self.engine_nan.recommend_items,
                              method=self.engine_nan.ITEM_BASED),
            fixtures.recommend_items_bycol)
        self._test_helper(user,
                          functools.partial(
                              self.engine_binary.recommend_items,
                              method=self.engine_binary.ITEM_BASED),
                          fixtures.recommend_items_bycol,
                          binary=True)

    def test_recommend_users_bycol(self):
        """
        We can predict recommended users for item, by column.
        """
        item = random.choice(fixtures.DFCRITICS_NAN.transpose().index)
        self._test_helper(
            item,
            functools.partial(self.engine_nan.recommend_users,
                              method=self.engine_nan.USER_BASED),
            fixtures.recommend_users_bycol)
        self._test_helper(item,
                          functools.partial(
                              self.engine_binary.recommend_users,
                              method=self.engine_binary.USER_BASED),
                          fixtures.recommend_users_bycol,
                          binary=True)

    def tearDown(self):
        pass