File size: 1,923 Bytes
0227d13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd
import gradio as gr

catalog = pd.read_csv('cleaned_streaming_catalog.csv')
users = pd.read_csv('synthetic_users_enriched.csv')
watch_history = pd.read_csv('final_streamsmart_dataset.csv')

def recommend_for_user(user_id, top_n=5):
    user = users[users['user_id'] == user_id].iloc[0]
    watched = set(watch_history.loc[watch_history['user_id'] == user_id, 'title_id'])
    recs = catalog[~catalog['title_id'].isin(watched)].copy()
    recs['match_score'] = 0
    recs.loc[recs['genre'].str.contains(user['favorite_genre_1'], case=False, na=False), 'match_score'] += 2
    recs.loc[recs['genre'].str.contains(user['favorite_genre_2'], case=False, na=False), 'match_score'] += 1
    recs.loc[recs['duration_bucket'].astype(str) == user['preferred_length'], 'match_score'] += 1
    recs['final_score'] = recs['match_score'] * 20 + recs['quality_score'] * 0.5 + recs['platform_popularity'] * 0.3
    return recs.sort_values(['match_score', 'final_score'], ascending=False).head(top_n)

def app_recommend(user_id):
    recs = recommend_for_user(user_id)
    user = users[users['user_id'] == user_id].iloc[0]
    summary = f"Top picks for {user['first_name']} ({user_id}) based on {user['favorite_genre_1']} / {user['favorite_genre_2']} preferences."
    return summary, recs[['title', 'type', 'genre', 'release_year', 'final_score']]

with gr.Blocks(title='StreamSmart Recommender') as demo:
    gr.Markdown('# StreamSmart Recommender')
    gr.Markdown('Demo interface for the final project.')
    user_id = gr.Dropdown(choices=users['user_id'].tolist(), label='Choose a synthetic user', value=users['user_id'].iloc[0])
    btn = gr.Button('Generate Recommendations')
    summary = gr.Textbox(label='Recommendation summary')
    table = gr.Dataframe(label='Top recommendations')
    btn.click(app_recommend, inputs=user_id, outputs=[summary, table])

if __name__ == '__main__':
    demo.launch(share=True)