def test_scores(self): ids = [5299, 1843, 2464, 7661, 5369] scores = AddonRecommendation.scores(ids) q = AddonRecommendation.objects.filter(addon__in=ids) for addon, recs in itertools.groupby(q, lambda x: x.addon_id): for rec in recs: eq_(scores[addon][rec.other_addon_id], rec.score)
def build_recs(cls, addon_ids): """Get the top ranking add-ons according to recommendation scores.""" scores = AddonRecommendation.scores(addon_ids) d = collections.defaultdict(int) for others in scores.values(): for addon, score in others.items(): d[addon] += score addons = sorted(d.items(), key=lambda x: x[1], reverse=True) return [addon for addon, score in addons if addon not in addon_ids]
def build_recs(cls, addon_ids): """Get the top ranking add-ons according to recommendation scores.""" scores = AddonRecommendation.scores(addon_ids) d = collections.defaultdict(int) for others in scores.values(): for addon, score in others.items(): d[addon] += score addons = [(score, addon) for addon, score in d.items()] return [addon for _, addon in sorted(addons)]
def expected_recs(self): scores, ranked = [], {} # Get all the add-on => rank pairs. for x in AddonRecommendation.scores(self.ids).values(): scores.extend(x.items()) # Sum up any dupes. groups = itertools.groupby(sorted(scores), key=lambda x: x[0]) for addon, pairs in groups: ranked[addon] = sum(x[1] for x in pairs) addons = sorted(ranked.items(), key=lambda x: x[1], reverse=True) return [x[0] for x in addons if x[0] not in self.ids]