import pandas as pd from typing import Optional from .generic_recommender import GenericRecommender class Recommender(GenericRecommender): def __init__(self, dataset_metadata, model, top_n: int = 10): super(Recommender, self).__init__(dataset_metadata, model, top_n) def get_predictions( self, user_id: int, target_item_id: list, ): predictions = self.model.predict(user_id, target_item_id) return predictions def recommend(self, user_id: int, target_item_id: list): """ Generate recommendations on specific itemId and userId :param user_id: list, user Ids :param target_item_id: list, item Ids :param rated_items: list, of rated interactions. :return: data.frame [userId, itemId, rank], recommendations ranking for the specified pairs of userId and itemId. """ predictions = self.get_predictions(user_id, target_item_id) return self.rank_prediction(user_id, target_item_id, predictions) def recommend_user( self, user_id: Optional[int] = None, user_ratings: Optional[pd.DataFrame] = None ): """ Get recommendations for a user. :param user_id: int, a user Id :param user_ratings: list, interactions on the user :return: dataframe [userId, itemId, rank], recommendations ranking for the specified userId. """ if user_ratings is None: if user_id is None: raise ValueError("Either 'user_id' or 'user_ratings' must be provided.") user_ratings = self.get_rated(user_id=user_id) if user_ratings is None: return pd.DataFrame( columns=["userId", "itemId", "rank"] ) # Return empty recommendations if user_id is None: raise ValueError( "Could not determine user_id from the provided user_ratings." ) unrated_item_id = self.get_unrated(user_ratings["itemId"]) return self.recommend(user_id=user_id, target_item_id=unrated_item_id)