elozano's picture
first version
8d0b477
raw
history blame
1.99 kB
import numpy as np
import pandas as pd
import streamlit as st
from utils import get_index, get_movie_info
MAX_OVERVIEW_LENGTH = 280
IMAGE_WIDTH = 170
@st.cache()
def init() -> None:
movies = pd.read_csv("movies.csv")
st.session_state["movies"] = movies
st.session_state["titles"] = movies["original_title"].values
st.session_state["sim_matrix"] = np.load("sim.npy")
def run() -> None:
st.title("Movie Recommender")
with st.form("search"):
title = st.selectbox("Recommend movies based on:", st.session_state["titles"])
num_recommendations = st.number_input(
"Number of recommendations:", min_value=1, max_value=20, value=6
)
search = st.form_submit_button("Search")
if search:
recommend(title, num_recommendations)
def recommend(based_on: str, num_recommendations: int) -> None:
movie_index = get_index(based_on)
similarities = list(enumerate(st.session_state["sim_matrix"][movie_index]))
similarities.pop(movie_index)
sorted_similarities = sorted(similarities, key=lambda x: x[1], reverse=True)
recommendations = sorted_similarities[:num_recommendations]
st.markdown("---")
for idx, _ in recommendations:
show_movie_info(idx)
def show_movie_info(movie_index: str) -> None:
info = get_movie_info(movie_index)
im_col, info_col = st.columns([2, 4])
im_col.image(
f"https://a.ltrbxd.com/resized/{info['image_url']}.jpg", width=IMAGE_WIDTH
)
info_col.markdown(
f"### {info['original_title']} ({info['release_date'].split('-')[0]})"
)
info_col.markdown(f"*{int(info['runtime'])} min*")
short_overview = (
f"{info['overview'][:MAX_OVERVIEW_LENGTH]} ..."
if len(info["overview"]) > MAX_OVERVIEW_LENGTH
else info["overview"]
)
info_col.markdown(short_overview)
info_col.caption(", ".join(eval(info["genres"])))
st.markdown("---")
if __name__ == "__main__":
init()
run()