Nechba's picture
Update app.py
a3ddd02 verified
import streamlit as st
import pandas as pd
from utils import *
# Assuming data is loaded and matrices are prepared as discussed
def load_data():
ratings = pd.read_csv('./collaborative_books_df.csv', index_col=0)
books = pd.read_csv('./collaborative_book_metadata.csv', index_col=0)
# book_titles=pd.read_csv('./data/book_titles.csv', index_col=0)
# book_titles = book_titles.reset_index()
# Merge data
ratings = ratings.merge(books, on='book_id')
book_titles = dict(zip(ratings['book_id'], ratings['title_x']))
return ratings, books,book_titles
def initialize_session_state():
if "ratings" not in st.session_state:
st.session_state.ratings, st.session_state.books, st.session_state.book_titles = load_data()
st.session_state.X, st.session_state.user_mapper, st.session_state.book_mapper, st.session_state.user_inv_mapper, st.session_state.book_inv_mapper = create_matrix(st.session_state.ratings)
st.session_state.book_id_mapping = pd.Series( st.session_state.books.book_id.values, index= st.session_state.books.title).to_dict()
initialize_session_state()
# Streamlit interface for book recommendation
st.title('Book Recommender System')
# User inputs
title_input = st.selectbox('Select or type a book title', st.session_state.books['title'].unique())
k_input = st.number_input('How many recommendations do you want?', min_value=1, max_value=20, value=5)
if st.button('Find Similar Books'):
if title_input in st.session_state.book_id_mapping:
book_id = st.session_state.book_id_mapping[title_input]
distances, similar_ids = find_similar_books(book_id, st.session_state.X, k=k_input,book_mapper= st.session_state.book_mapper,book_inv_mapper= st.session_state.book_inv_mapper)
similar_books = pd.DataFrame({
'Book Title': [ st.session_state.book_titles[ids] for ids in similar_ids],
'Distance': distances[0][1:]
})
st.write(f"Books similar to {title_input}:")
st.dataframe(similar_books.sort_values(by='Distance', ascending=True))
else:
st.error("Book title not found. Please check the spelling or try another title.")