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 # Initialize sample user-item rating data 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) # Initialize session state for storing user ratings if 'movie_ratings' not in st.session_state: st.session_state.movie_ratings = {'Die Hard': [], 'Mad Max': [], 'The Shawshank Redemption': [], 'Forrest Gump': [], 'Superbad': [], 'Step Brothers': [], 'Inception': [], 'Interstellar': []} def update_ratings(movie, rating): st.session_state.movie_ratings[movie].append(rating) # UI Elements st.title("🌟 Personalized Entertainment Recommendations") # Input for user genre preference user_genre = st.selectbox( "Choose your favorite genre", ["Action 🎬", "Drama 🎭", "Comedy 😂", "Sci-Fi 🚀"] ) # Define genre mapping genre_mapping = { "Action 🎬": 1, "Drama 🎭": 2, "Comedy 😂": 3, "Sci-Fi 🚀": 4 } # Example mapping of genre to item_id recommendations = { 1: ["Die Hard", "Mad Max"], 2: ["The Shawshank Redemption", "Forrest Gump"], 3: ["Superbad", "Step Brothers"], 4: ["Inception", "Interstellar"] } # Provide recommendation based on collaborative filtering selected_genre_id = genre_mapping[user_genre] # Predict ratings for the selected genre items predicted_ratings = [(id, algo.predict(5, id).est) for id in [1, 2, 3, 4] if id == selected_genre_id] # Sort recommendations by predicted ratings predicted_ratings.sort(key=lambda x: x[1], reverse=True) st.subheader("🎯 Recommendations for you:") # Collect average scores all_movies = [] for item_id, rating in predicted_ratings: for rec in recommendations[item_id]: current_ratings = st.session_state.movie_ratings[rec] avg_score = np.mean(current_ratings) if current_ratings else rating st.write(f"{rec} - Average Score: {avg_score:.2f} ⭐") # Rating slider from 1 to 10 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() # Rerun to immediately reflect the rating submission all_movies.append((rec, avg_score)) # Sort movies by average score in descending order sorted_movies = sorted(all_movies, key=lambda x: x[1], reverse=True) # Display scoreboard st.subheader("🏆 Scoreboard:") for movie, avg_score in sorted_movies: st.write(f"{movie}: {avg_score:.2f} ⭐") # Display current session state (for debugging purposes) # st.write("Session State (User Ratings):", st.session_state.movie_ratings)