def test_get_similar_users(self): user_id_21 = db_user.create(21, "twenty_one") user_id_22 = db_user.create(22, "twenty_two") user_id_23 = db_user.create(23, "twenty_three") similar_users_21 = {"twenty_two": 0.4, "twenty_three": 0.7} similar_users_22 = {"twenty_one": 0.4} similar_users_23 = {"twenty_one": 0.7} similar_users = { "twenty_one": similar_users_21, "twenty_two": similar_users_22, "twenty_three": similar_users_23, } import_user_similarities(similar_users) self.assertDictEqual( similar_users_21, db_user.get_similar_users(user_id_21).similar_users) self.assertDictEqual( similar_users_22, db_user.get_similar_users(user_id_22).similar_users) self.assertDictEqual( similar_users_23, db_user.get_similar_users(user_id_23).similar_users)
def test_get_similar_users(self): user_id_21 = db_user.create(21, "twenty_one") user_id_22 = db_user.create(22, "twenty_two") user_id_23 = db_user.create(23, "twenty_three") similar_users_21 = { str(user_id_22): [0.4, .01], str(user_id_23): [0.7, 0.001] } similar_users_22 = {str(user_id_21): [0.4, .01]} similar_users_23 = {str(user_id_21): [0.7, .02]} similar_users = { str(user_id_21): similar_users_21, str(user_id_22): similar_users_22, str(user_id_23): similar_users_23, } import_user_similarities(similar_users) self.assertDictEqual( { "twenty_two": 0.4, "twenty_three": 0.7 }, db_user.get_similar_users(user_id_21).similar_users) self.assertDictEqual( {"twenty_one": 0.4}, db_user.get_similar_users(user_id_22).similar_users) self.assertDictEqual( {"twenty_one": 0.7}, db_user.get_similar_users(user_id_23).similar_users)
def get_similar_to_user(user_name, other_user_name): """ Get the similarity of the user and the other user, based on their listening history. Returns a single dict: { "user_name": "other_user", "similarity": 0.1938480256 } :param user_name: the MusicBrainz ID of the the one user :param other_user_name: the MusicBrainz ID of the other user whose similar users are :statuscode 200: Yay, you have data! :resheader Content-Type: *application/json* :statuscode 404: The requested user was not found. """ user = db_user.get_by_mb_id(user_name) if not user: raise APINotFound("User %s not found" % user_name) similar_users = db_user.get_similar_users(user['id']) try: return jsonify({ 'payload': { "user_name": other_user_name, "similarity": similar_users.similar_users[other_user_name] } }) except KeyError: raise APINotFound("Similar-to user not found")
def get_similar_users(user_name): """ Get list of users who have similar music tastes (based on their listen history) for a given user. Returns an array of dicts like these: { "user_name": "hwnrwx", "similarity": 0.1938480256 } :param user_name: the MusicBrainz ID of the user whose similar users are being requested. :statuscode 200: Yay, you have data! :resheader Content-Type: *application/json* :statuscode 404: The requested user was not found. """ user = db_user.get_by_mb_id(user_name) if not user: raise APINotFound("User %s not found" % user_name) similar_users = db_user.get_similar_users(user['id']) response = [] for user_name in similar_users.similar_users: response.append({ 'user_name': user_name, 'similarity': similar_users.similar_users[user_name] }) return jsonify({ 'payload': sorted(response, key=itemgetter('similarity'), reverse=True) })