From bdb6d48e8d21d7ff77be3326de69c4bc0e767324 Mon Sep 17 00:00:00 2001 From: Nikanorova Darya <darya.nikanorova@corp.mail.ru> Date: Wed, 18 Sep 2024 17:52:03 +0300 Subject: [PATCH] Init week 1 seminar --- botify/botify/recommenders/sticky_artist.py | 13 ++++++++++ botify/botify/server.py | 5 ++-- botify/botify/track.py | 28 +++------------------ 3 files changed, 19 insertions(+), 27 deletions(-) create mode 100644 botify/botify/recommenders/sticky_artist.py diff --git a/botify/botify/recommenders/sticky_artist.py b/botify/botify/recommenders/sticky_artist.py new file mode 100644 index 0000000..473ecf9 --- /dev/null +++ b/botify/botify/recommenders/sticky_artist.py @@ -0,0 +1,13 @@ +import random + +from .random import Random +from .recommender import Recommender + + +class StickyArtist(Recommender): + def __init__(self, tracks_redis, artists_redis, catalog): + self.fallback = Random(tracks_redis) + + def recommend_next(self, user: int, prev_track: int, prev_track_time: float) -> int: + # TODO Seminar 1 step 4: implement the recommender + return self.fallback.recommend_next(user, prev_track, prev_track_time) diff --git a/botify/botify/server.py b/botify/botify/server.py index c526036..d5be4db 100644 --- a/botify/botify/server.py +++ b/botify/botify/server.py @@ -22,13 +22,13 @@ app.config.from_file("config.json", load=json.load) api = Api(app) tracks_redis = Redis(app, config_prefix="REDIS_TRACKS") -artists_redis = Redis(app, config_prefix="REDIS_ARTIST") +# TODO Seminar 1 step 1: create a redis db for artists' tracks data_logger = DataLogger(app) catalog = Catalog(app).load(app.config["TRACKS_CATALOG"]) catalog.upload_tracks(tracks_redis.connection) -catalog.upload_artists(artists_redis.connection) +# TODO Seminar 1 step 3: upload artists' tracks to redis parser = reqparse.RequestParser() parser.add_argument("track", type=int, location="json", required=True) @@ -57,6 +57,7 @@ class NextTrack(Resource): start = time.time() args = parser.parse_args() + # TODO Seminar 1 step 5: create and run the A/B experiment treatment = Experiments.AA.assign(user) diff --git a/botify/botify/track.py b/botify/botify/track.py index 1602e48..ffea146 100644 --- a/botify/botify/track.py +++ b/botify/botify/track.py @@ -47,31 +47,9 @@ class Catalog: def upload_artists(self, redis): self.app.logger.info(f"Uploading artists to redis") - sorted_tracks = sorted(self.tracks, key=lambda track: track.artist) - for j, (artist, artist_catalog) in enumerate( - itertools.groupby(sorted_tracks, key=lambda track: track.artist) - ): - artist_tracks = [t.track for t in artist_catalog] - redis.set(artist, self.to_bytes(artist_tracks)) - - self.app.logger.info(f"Uploaded {j + 1} artists") - - def upload_recommendations(self, redis, redis_config_key, key_object='user', key_recommendations='tracks'): - recommendations_file_path = self.app.config[redis_config_key] - self.app.logger.info( - f"Uploading recommendations from {recommendations_file_path} to redis" - ) - j = 0 - with open(recommendations_file_path) as rf: - for line in rf: - recommendations = json.loads(line) - redis.set( - recommendations[key_object], self.to_bytes(recommendations[key_recommendations]) - ) - j += 1 - self.app.logger.info( - f"Uploaded recommendations from {recommendations_file_path} for {j} {key_object}" - ) + # TODO Seminar 1 step 2: implement method to upload artists tracks to redis + uploaded = 0 + self.app.logger.info(f"Uploaded {uploaded} artists") def to_bytes(self, instance): return pickle.dumps(instance) -- GitLab