File size: 3,369 Bytes
3dd9f2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import pandas as pd
from surprise import Dataset, Reader

laptop_df = pd.read_csv('laptop_data.csv')
user_df = pd.read_csv('user_data.csv')  

laptop_df = laptop_df.fillna(0)
user_df = user_df.fillna(0)

# Create a Surprise Dataset
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(user_df[['User_ID', 'Laptop_ID', 'Rating']], reader)

from surprise.model_selection import train_test_split
from surprise import SVD
from surprise import accuracy

# Train-test split
trainset, testset = train_test_split(data, test_size=0.2, random_state=42)

# Train the collaborative filtering model (SVD algorithm for example)
model = SVD()
model.fit(trainset)

def recommend_laptops(age=None, category=None, gender=None, user_id=None, num_recommendations=5):
    if user_id is not None:
        # Existing user
        user_ratings = user_interactions[user_interactions['User_ID'] == user_id]
        user_unrated_laptops = laptop_df[~laptop_df['Laptop_ID'].isin(user_ratings['Laptop_ID'])]
        user_unrated_laptops['Predicted_Rating'] = user_unrated_laptops['Laptop_ID'].apply(lambda x: model.predict(user_id, x).est)
        recommendations = user_unrated_laptops.sort_values(by='Predicted_Rating', ascending=False).head(num_recommendations)
    else:
        # New user
        new_user_data = pd.DataFrame({
            'User_ID': [10002],  
            'Age': [age],
            'Category': [category],
            'Gender': [gender]
        })
        new_user_data = new_user_data.merge(laptop_df, how='cross')
        new_user_data['Predicted_Rating'] = new_user_data.apply(lambda row: model.predict(999, row['Laptop_ID']).est, axis=1)
        recommendations = new_user_data.sort_values(by='Predicted_Rating', ascending=False).head(num_recommendations)

    return recommendations[['Laptop_ID', 'Laptop_Name', 'Predicted_Rating']]


import streamlit as st

# Streamlit app
st.title("Laptop Recommendation System")

# User choice: New or Existing user
user_type = st.radio("Are you a new user or an existing user?", ('New User', 'Existing User'))

if user_type == 'New User':
    # User input for new users
    new_user_age = st.slider("Age:", min_value=12, max_value=89, value=25)
    new_user_category = st.selectbox("What best describes you:", ['Student', 'Professor', 'Banker', 'Businessman', 'Programmer'])
    new_user_gender = st.radio("Gender:", ['Male', 'Female'])

# Button to get recommendations for new users
    if st.button("Get Laptop Recommendations"):
        recommendations = recommend_laptops(age=new_user_age, category=new_user_category, gender=new_user_gender)
        st.subheader("Top 5 Recommended Laptops:")
        st.dataframe(recommendations[['Laptop_ID', 'Laptop_Name', 'Predicted_Rating']], index=False)

# User input for existing users
elif user_type == 'Existing User':
    # User input for existing users
    existing_user_id = st.text_input("Enter your user ID:", "")

    # Button to get recommendations
    if st.button("Get aptop Recommendations"):
        if existing_user_id:
            recommendations = recommend_laptops(user_id=int(existing_user_id))
            st.subheader(f"Top 5 Recommended Laptops for User ID {existing_user_id}:")
            st.dataframe(recommendations[['Laptop_ID', 'Laptop_Name', 'Predicted_Rating']], index=False)
        else:
            st.warning("Please enter a valid user ID.")