Skip to content

Commit

Permalink
Revised to show recent feedbacked movies in the original dataset
Browse files Browse the repository at this point in the history
  • Loading branch information
myui committed Dec 8, 2024
1 parent 7518e13 commit 25e0c74
Showing 1 changed file with 64 additions and 9 deletions.
73 changes: 64 additions & 9 deletions examples/streamlit/movielens_dashboard.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import os
import streamlit as st
import pandas as pd
Expand All @@ -11,6 +12,7 @@
DATASET_URL = "http://files.grouplens.org/datasets/movielens/ml-100k/"
RATINGS_FILE = DATASET_URL + "u.data"
ITEMS_FILE = DATASET_URL + "u.item"
USER_FILE = DATASET_URL + "u.user"

# Caching functions
@st.cache_data
Expand All @@ -33,6 +35,13 @@ def load_movielens_100k():

return ratings_df, items_df, merged_df

@st.cache_data
def load_user_data():
"""Load the user demographic data from the MovieLens 100K dataset."""
col_user = ['user_id', 'age', 'gender', 'occupation', 'zip_code']
user_df = pd.read_csv(USER_FILE, sep='|', names=col_user, encoding='latin-1')
return user_df

@st.cache_data
def load_movie_posters():
"""Load movie posters from an external source."""
Expand Down Expand Up @@ -100,8 +109,9 @@ def handle_feedback():
selected_index = feedback_options.index(st.session_state[feedback_id])
if selected_index == 0:
st.session_state.feedback["liked"].append(title)
elif selected_index == 1 and title not in st.session_state.feedback["disliked"]:
elif selected_index == 1:
st.session_state.feedback["disliked"].append(title)
st.session_state.feedback["date"].append(feedback_date)

st.radio("Feedback", options=feedback_options, key=feedback_id, index=None, horizontal=True, on_change=handle_feedback)

Expand All @@ -111,16 +121,23 @@ def handle_feedback():

# Load data
ratings_df, items_df, merged_df = load_movielens_100k()
user_df = load_user_data()
poster_dict = load_movie_posters()

# User input
user_id = st.sidebar.number_input("Enter User ID", min_value=1, value=1)
if "last_user_id" not in st.session_state:
st.session_state.last_user_id = user_id
# Initialize session state
if user_id != st.session_state.last_user_id:
st.session_state.feedback = {"liked": [], "disliked": [], "date": []}
st.session_state.last_user_id = user_id
elif "feedback" not in st.session_state:
st.session_state.feedback = {"liked": [], "disliked": [], "date": []}
top_n = st.sidebar.slider("Number of Recommendations", min_value=1, max_value=10, value=5)
recent_feedback_n = st.sidebar.slider("Recent Feedback Items (N)", min_value=1, max_value=20, value=5)

# Initialize session state
if "feedback" not in st.session_state:
st.session_state.feedback = {"liked": [], "disliked": []}
feedback_date = st.sidebar.date_input("Feedback date", datetime.date(1998, 4, 23))

# Tabs for navigation
tab1, tab2, tab3 = st.tabs(["Recommendations", "Recently Feedbacked Movies", "Search Movies"])
Expand All @@ -134,20 +151,58 @@ def handle_feedback():
display_movie(row["movie_title"], row["movie_id"], poster_dict)

with tab2:
st.write("### Recently Feedbacked Movies")
st.write("### User Information and Recently Feedbacked Movies")

# Fetch user details
user_info = user_df[user_df["user_id"] == user_id]
if not user_info.empty:
cols = st.columns(4) # Create four columns for horizontal layout
cols[0].write(f"**User ID:** {user_id}")
cols[1].write(f"**Gender:** {user_info.iloc[0]['gender']}")
cols[2].write(f"**Age:** {user_info.iloc[0]['age']}")
cols[3].write(f"**Occupation:** {user_info.iloc[0]['occupation']}")
else:
st.write(f"User ID {user_id} not found in the dataset.")

st.divider()

# Get recently rated movies
user_ratings = ratings_df[ratings_df["user_id"] == user_id]
if not user_ratings.empty:
user_ratings = user_ratings.sort_values(by="unix_timestamp", ascending=False)
recent_ratings = user_ratings.merge(items_df[["movie_id", "movie_title"]], on="movie_id").head(recent_feedback_n)

# Format data for display
recent_ratings["date_rated"] = pd.to_datetime(recent_ratings["unix_timestamp"], unit="s").dt.date
recent_ratings_table = recent_ratings[["movie_title", "rating", "date_rated"]].rename(
columns={
"movie_title": "Movie Title",
"rating": "Rating",
"date_rated": "Date Rated",
}
)

st.write(f"#### Last {recent_feedback_n} Rated Movies")
st.dataframe(recent_ratings_table, use_container_width=True)
else:
st.write("No ratings found for this user.")

st.divider()

liked_movies = st.session_state.feedback["liked"][-recent_feedback_n:]
disliked_movies = st.session_state.feedback["disliked"][-recent_feedback_n:]
feedback_dates = st.session_state.feedback["date"][-recent_feedback_n:]

if liked_movies or disliked_movies:
if liked_movies:
st.write("#### Liked Movies")
for movie in liked_movies:
st.write(f"👍 {movie}")
for movie, date in zip(liked_movies, feedback_dates):
st.write(f"👍 {movie} at 🗓️ {date})")

if disliked_movies:
st.write("#### Disliked Movies")
for movie in disliked_movies:
st.write(f"👎 {movie}")
for movie, date in zip(disliked_movies, feedback_dates):
st.write(f"👎 {movie} at 🗓️ {date}")
else:
st.write("No feedback given yet.")

Expand Down

0 comments on commit 25e0c74

Please sign in to comment.