from surprise import SVDpp from surprise import Dataset from surprise import Reader import streamlit as st import pandas as pd import pickle def predict(): with open('./model.pkl', 'rb') as f: model = pickle.load(f) titles = pd.read_csv('./amazon-books-titles.csv') predictions = [] for row in titles.iterrows(): predictions.append({'title': row[1]['title'], 'rating': model.predict(x, row[1]['asin']).est}) sorted_predictions = sorted(predictions, key=lambda p: -p['rating']) st.write(pd.DataFrame(sorted_predictions)) def train_model(): books = pd.read_csv('./amazon-books.zip') titles = pd.read_csv('./amazon-books-titles.csv') current_user_book_ids = titles[titles['title'].isin([t.strip() for t in y])]['asin'].values current_user_ratings = pd.DataFrame({ 'reviewerID': [x] * len(current_user_book_ids), 'asin': current_user_book_ids, 'overall': [5] * len(current_user_book_ids) }) st.write(current_user_ratings) books = books.append(current_user_ratings) data = Dataset.load_from_df(books[['reviewerID', 'asin', 'overall']], Reader(line_format='user item rating', rating_scale=(1, 5))) trainset = data.build_full_trainset() best_params = { 'n_epochs': 15, 'lr_all': 0.004760245463611792, 'reg_all': 0.40040712444861504, 'random_state': 42 } algo = SVDpp(**best_params) algo.fit(trainset) with open('./model.pkl', 'wb') as f: pickle.dump(algo, f) with open('./titles.txt', 'r', encoding='utf8') as f: options = f.readlines() x = st.text_input('uid') y = st.multiselect('Select book', options) btn = st.button('Submit', on_click=train_model) btn2 = st.button('Predict', on_click=predict)