|
import streamlit as st |
|
from surprise import Dataset, Reader, SVD |
|
from surprise.model_selection import train_test_split |
|
import pandas as pd |
|
import numpy as np |
|
import json |
|
import os |
|
|
|
|
|
RATINGS_FILE = 'movie_ratings.json' |
|
|
|
|
|
data = { |
|
'user_id': [1, 1, 1, 2, 2, 3, 3, 4, 4], |
|
'item_id': [1, 2, 3, 1, 4, 2, 3, 1, 4], |
|
'rating': [5, 3, 4, 4, 5, 5, 2, 4, 4] |
|
} |
|
df = pd.DataFrame(data) |
|
reader = Reader(rating_scale=(1, 5)) |
|
dataset = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader) |
|
trainset, testset = train_test_split(dataset, test_size=0.25) |
|
|
|
algo = SVD() |
|
algo.fit(trainset) |
|
|
|
|
|
def load_ratings(): |
|
if os.path.exists(RATINGS_FILE): |
|
with open(RATINGS_FILE, 'r') as file: |
|
return json.load(file) |
|
else: |
|
return {movie: [] for movie in ['Die Hard', 'Mad Max', 'The Shawshank Redemption', 'Forrest Gump', |
|
'Superbad', 'Step Brothers', 'Inception', 'Interstellar']} |
|
|
|
|
|
def save_ratings(ratings): |
|
with open(RATINGS_FILE, 'w') as file: |
|
json.dump(ratings, file) |
|
|
|
|
|
movie_ratings = load_ratings() |
|
|
|
def update_ratings(movie, rating): |
|
movie_ratings[movie].append(rating) |
|
save_ratings(movie_ratings) |
|
|
|
|
|
st.title("π Personalized Entertainment Recommendations") |
|
|
|
|
|
user_genre = st.selectbox( |
|
"Choose your favorite genre", |
|
["Action π¬", "Drama π", "Comedy π", "Sci-Fi π"] |
|
) |
|
|
|
|
|
genre_mapping = { |
|
"Action π¬": 1, |
|
"Drama π": 2, |
|
"Comedy π": 3, |
|
"Sci-Fi π": 4 |
|
} |
|
|
|
|
|
recommendations = { |
|
1: ["Die Hard", "Mad Max"], |
|
2: ["The Shawshank Redemption", "Forrest Gump"], |
|
3: ["Superbad", "Step Brothers"], |
|
4: ["Inception", "Interstellar"] |
|
} |
|
|
|
|
|
selected_genre_id = genre_mapping[user_genre] |
|
|
|
|
|
predicted_ratings = [(id, algo.predict(5, id).est) for id in [1, 2, 3, 4] if id == selected_genre_id] |
|
|
|
|
|
predicted_ratings.sort(key=lambda x: x[1], reverse=True) |
|
|
|
st.subheader("π― Recommendations for you:") |
|
|
|
|
|
all_movies = [] |
|
for item_id, rating in predicted_ratings: |
|
for rec in recommendations[item_id]: |
|
current_ratings = movie_ratings[rec] |
|
avg_score = np.mean(current_ratings) if current_ratings else rating |
|
vote_count = len(current_ratings) |
|
|
|
st.write(f"{rec} - Average Score: {avg_score:.2f} β (Votes: {vote_count})") |
|
|
|
|
|
user_rating = st.slider(f"Rate {rec}", 1, 10, 5, key=f"slider_{rec}") |
|
if st.button(f"Submit Rating for {rec}", key=f"button_{rec}"): |
|
update_ratings(rec, user_rating) |
|
st.experimental_rerun() |
|
|
|
all_movies.append((rec, avg_score, vote_count)) |
|
|
|
|
|
sorted_movies = sorted(all_movies, key=lambda x: x[1], reverse=True) |
|
|
|
|
|
st.subheader("π Scoreboard:") |
|
for movie, avg_score, vote_count in sorted_movies: |
|
st.write(f"{movie}: {avg_score:.2f} β (Votes: {vote_count})") |
|
|
|
|
|
|