58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
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)
|