def test_filter_regions(self): """ [recommendation.filter.Region] Test a region filter on recommendation """ rfilter = SimpleRegionFilter() recommendation = [random.random() for _ in range(len(ITEMS))] app_rec = [ Item.get_item_by_id(aid + 1).external_id for aid, _ in sorted( enumerate(recommendation), key=lambda x: x[1], reverse=True) ] for u in USERS: user = User.get_user_by_external_id(u["external_id"]) with self.assertNumQueries(0): result = rfilter(user, np.array(recommendation[:])) new_rec = [ Item.get_item_by_id(aid + 1).external_id for aid, _ in sorted( enumerate(result), key=lambda x: x[1], reverse=True) ] n = len(u["last_apps_region"]) if n == 0: assert new_rec == app_rec, \ "Recommendation is not the same when not apps to filter(%s != %s)" % (new_rec, app_rec) else: for item in u["last_apps_region"]: assert item in new_rec[0-n:], \ "Item %s for user %s is not in the last in recommendation %s. Items filtered %s." % \ (item, user, new_rec, list(u["last_apps_region"]))
def test_diversity_on_recommendation_25(self): """ [recommendation.api.GetRecommendation] Test diversity for size 25 recommendation (at least 2/3 of user genres) """ size = 25 response = \ self.client.get("/api/v2/recommend/%d/" "00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961/" % size) user_id = User.get_user_id_by_external_id("00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961") user_genres = ItemGenre.genre_in( Item.get_item_by_id(item_id) for item_id in User.get_user_items(user_id) ) recommendation_genres = ItemGenre.genre_in( Item.get_item_by_external_id(item_eid) for item_eid in json.loads(response.content)["recommendations"] ) less, more = (user_genres, recommendation_genres) if len(user_genres) < len(recommendation_genres) else \ (recommendation_genres, user_genres) measure = 0 for genre in less: if genre in more: measure += 1 assert measure > len(less)*2./3., \ "Not sufficient genres in recommendation" \ "(user: %d, recommendation: %d, similarity: %d)" % (len(user_genres), len(recommendation_genres), measure)
def test_user_genres_in_recommendation_size_25(self): """ [recommendation.api.GetRecommendation] At least 19 of the top genres in the size 25 recommendation """ get_cache("default").clear() LogEntry.objects.all().delete() size = 25 response = \ self.client.get("/api/v2/recommend/%d/" "00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961/" % size) user_id = User.get_user_id_by_external_id("00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961") user_genres = sorted(ItemGenre.genre_in( Item.get_item_by_id(item_id) for item_id in User.get_user_items(user_id) ).items(), key=lambda x: x[1], reverse=True) recommendation_genres = ItemGenre.genre_in( Item.get_item_by_external_id(item_eid) for item_eid in json.loads(response.content)["recommendations"] ) measure = [] for no, (genre, _) in enumerate(user_genres[:int(size)], start=1): if genre not in recommendation_genres: measure.append(no) assert len(measure) < 6, "Major genres failing by index: %s." \ "\nUser %s" \ "\nRecommendation %s" % ( measure, user_genres, [ItemGenre.genre_in([Item.get_item_by_external_id(item)]) for item in json.loads(response.content)["recommendations"]])
def test_filter_regions(self): """ [recommendation.filter.Region] Test a region filter on recommendation """ rfilter = SimpleRegionFilter() recommendation = [random.random() for _ in range(len(ITEMS))] app_rec = [Item.get_item_by_id(aid+1).external_id for aid, _ in sorted(enumerate(recommendation), key=lambda x: x[1], reverse=True)] for u in USERS: user = User.get_user_by_external_id(u["external_id"]) with self.assertNumQueries(0): result = rfilter(user, np.array(recommendation[:])) new_rec = [Item.get_item_by_id(aid+1).external_id for aid, _ in sorted(enumerate(result), key=lambda x: x[1], reverse=True)] n = len(u["last_apps_region"]) if n == 0: assert new_rec == app_rec, \ "Recommendation is not the same when not apps to filter(%s != %s)" % (new_rec, app_rec) else: for item in u["last_apps_region"]: assert item in new_rec[0-n:], \ "Item %s for user %s is not in the last in recommendation %s. Items filtered %s." % \ (item, user, new_rec, list(u["last_apps_region"]))
def get_item_locales(item_id): return set([ pk[0] for pk in Item.get_item_by_id( item_id).locales.all().values_list("locale_id") ])
def get_item_locales(item_id): return set([pk[0] for pk in Item.get_item_by_id(item_id).locales.all().values_list("locale_id")])