Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
from surprise import Dataset, Reader
|
3 |
+
|
4 |
+
laptop_df = pd.read_csv('laptop_data.csv')
|
5 |
+
user_df = pd.read_csv('user_data.csv')
|
6 |
+
|
7 |
+
laptop_df = laptop_df.fillna(0)
|
8 |
+
user_df = user_df.fillna(0)
|
9 |
+
|
10 |
+
# Create a Surprise Dataset
|
11 |
+
reader = Reader(rating_scale=(1, 5))
|
12 |
+
data = Dataset.load_from_df(user_df[['User_ID', 'Laptop_ID', 'Rating']], reader)
|
13 |
+
|
14 |
+
from surprise.model_selection import train_test_split
|
15 |
+
from surprise import SVD
|
16 |
+
from surprise import accuracy
|
17 |
+
|
18 |
+
# Train-test split
|
19 |
+
trainset, testset = train_test_split(data, test_size=0.2, random_state=42)
|
20 |
+
|
21 |
+
# Train the collaborative filtering model (SVD algorithm for example)
|
22 |
+
model = SVD()
|
23 |
+
model.fit(trainset)
|
24 |
+
|
25 |
+
def recommend_laptops(age=None, category=None, gender=None, user_id=None, num_recommendations=5):
|
26 |
+
if user_id is not None:
|
27 |
+
# Existing user
|
28 |
+
user_ratings = user_interactions[user_interactions['User_ID'] == user_id]
|
29 |
+
user_unrated_laptops = laptop_df[~laptop_df['Laptop_ID'].isin(user_ratings['Laptop_ID'])]
|
30 |
+
user_unrated_laptops['Predicted_Rating'] = user_unrated_laptops['Laptop_ID'].apply(lambda x: model.predict(user_id, x).est)
|
31 |
+
recommendations = user_unrated_laptops.sort_values(by='Predicted_Rating', ascending=False).head(num_recommendations)
|
32 |
+
else:
|
33 |
+
# New user
|
34 |
+
new_user_data = pd.DataFrame({
|
35 |
+
'User_ID': [10002],
|
36 |
+
'Age': [age],
|
37 |
+
'Category': [category],
|
38 |
+
'Gender': [gender]
|
39 |
+
})
|
40 |
+
new_user_data = new_user_data.merge(laptop_df, how='cross')
|
41 |
+
new_user_data['Predicted_Rating'] = new_user_data.apply(lambda row: model.predict(999, row['Laptop_ID']).est, axis=1)
|
42 |
+
recommendations = new_user_data.sort_values(by='Predicted_Rating', ascending=False).head(num_recommendations)
|
43 |
+
|
44 |
+
return recommendations[['Laptop_ID', 'Laptop_Name', 'Predicted_Rating']]
|
45 |
+
|
46 |
+
|
47 |
+
import streamlit as st
|
48 |
+
|
49 |
+
# Streamlit app
|
50 |
+
st.title("Laptop Recommendation System")
|
51 |
+
|
52 |
+
# User choice: New or Existing user
|
53 |
+
user_type = st.radio("Are you a new user or an existing user?", ('New User', 'Existing User'))
|
54 |
+
|
55 |
+
if user_type == 'New User':
|
56 |
+
# User input for new users
|
57 |
+
new_user_age = st.slider("Age:", min_value=12, max_value=89, value=25)
|
58 |
+
new_user_category = st.selectbox("What best describes you:", ['Student', 'Professor', 'Banker', 'Businessman', 'Programmer'])
|
59 |
+
new_user_gender = st.radio("Gender:", ['Male', 'Female'])
|
60 |
+
|
61 |
+
# Button to get recommendations for new users
|
62 |
+
if st.button("Get Laptop Recommendations"):
|
63 |
+
recommendations = recommend_laptops(age=new_user_age, category=new_user_category, gender=new_user_gender)
|
64 |
+
st.subheader("Top 5 Recommended Laptops:")
|
65 |
+
st.dataframe(recommendations[['Laptop_ID', 'Laptop_Name', 'Predicted_Rating']], index=False)
|
66 |
+
|
67 |
+
# User input for existing users
|
68 |
+
elif user_type == 'Existing User':
|
69 |
+
# User input for existing users
|
70 |
+
existing_user_id = st.text_input("Enter your user ID:", "")
|
71 |
+
|
72 |
+
# Button to get recommendations
|
73 |
+
if st.button("Get aptop Recommendations"):
|
74 |
+
if existing_user_id:
|
75 |
+
recommendations = recommend_laptops(user_id=int(existing_user_id))
|
76 |
+
st.subheader(f"Top 5 Recommended Laptops for User ID {existing_user_id}:")
|
77 |
+
st.dataframe(recommendations[['Laptop_ID', 'Laptop_Name', 'Predicted_Rating']], index=False)
|
78 |
+
else:
|
79 |
+
st.warning("Please enter a valid user ID.")
|