Spaces:
Runtime error
Runtime error
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=(0, 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 model | |
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_df[user_df['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(10002, row['Laptop_ID']).est, axis=1) | |
recommendations = new_user_data.sort_values(by='Predicted_Rating', ascending=False).head(num_recommendations) | |
return recommendations | |
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', 'Other']) | |
new_user_gender = st.radio("Gender:", ['Male', 'Female', 'Other']) | |
# Button to get recommendations for new users | |
if st.button("Get Recommendations"): | |
recommendations = recommend_laptops(age=new_user_age, category=new_user_category, gender=new_user_gender) | |
st.subheader("Top 5 Recommended Laptops:") | |
# decoding features | |
type_mapping = {1: 'gaming laptop', 2: 'thin and light laptop', 3: '2 in 1 laptop', 4: 'notebook', 5: 'laptop', | |
6: '2 in 1 gaming laptop', 7: 'business laptop', 8: 'chromebook', 9: 'creator laptop'} | |
processor_brand_mapping = {1: 'intel', 2: 'amd', 3: 'qualcomm', 4: 'apple', 5: 'mediatek'} | |
os_mapping = {1: 'windows', 2: 'chrome os', 3: 'dos', 4: 'mac', 5: 'ubuntu'} | |
company_mapping = {1: 'asus', 2: 'hp', 3: 'lenovo', 4: 'dell', 5: 'msi', 6: 'realme', 7: 'avita', 8: 'acer', | |
9: 'samsung', 10: 'infinix', 11: 'lg', 12: 'apple', 13: 'nokia', 14: 'redmibook', | |
15: 'mi', 16: 'vaio'} | |
# Decode the encoded features | |
recommendations['Type'] = recommendations['Type'].map(type_mapping) | |
recommendations['Processor Brand'] = recommendations['Processor Brand'].map(processor_brand_mapping) | |
recommendations['Operating System'] = recommendations['Operating System'].map(os_mapping) | |
recommendations['company'] = recommendations['company'].map(company_mapping) | |
boolean_columns = ['SSD', 'Expandable Memory', 'Touchscreen'] | |
for column in boolean_columns: | |
recommendations[column] = recommendations[column].map({0: 'No', 1: 'Yes'}) | |
recommendations_table = recommendations[['name', 'Price (in Indian Rupees)', 'Type', 'Dedicated Graphic Memory Capacity', | |
'Processor Brand', 'SSD', 'RAM (in GB)', 'RAM Type', 'Expandable Memory', | |
'Operating System', 'Touchscreen', 'Screen Size (in inch)', 'Weight (in kg)', | |
'Refresh Rate', 'screen_resolution', 'company', 'Storage', 'Processor name', | |
'CPU_ranking', 'battery_backup', 'gpu name ', 'gpu_benchmark']] | |
recommendations_table = recommendations_table.reset_index(drop=True) | |
st.dataframe(recommendations_table) | |
# 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 Laptop Recommendations"): | |
if existing_user_id: | |
recommendations = recommend_laptops(user_id=int(existing_user_id)) | |
st.subheader(f"Top 5 Recommended Laptops for User {existing_user_id}:") | |
# decoding features | |
type_mapping = {1: 'gaming laptop', 2: 'thin and light laptop', 3: '2 in 1 laptop', 4: 'notebook', 5: 'laptop', | |
6: '2 in 1 gaming laptop', 7: 'business laptop', 8: 'chromebook', 9: 'creator laptop'} | |
processor_brand_mapping = {1: 'intel', 2: 'amd', 3: 'qualcomm', 4: 'apple', 5: 'mediatek'} | |
os_mapping = {1: 'windows', 2: 'chrome os', 3: 'dos', 4: 'mac', 5: 'ubuntu'} | |
company_mapping = {1: 'asus', 2: 'hp', 3: 'lenovo', 4: 'dell', 5: 'msi', 6: 'realme', 7: 'avita', 8: 'acer', | |
9: 'samsung', 10: 'infinix', 11: 'lg', 12: 'apple', 13: 'nokia', 14: 'redmibook', | |
15: 'mi', 16: 'vaio'} | |
# Decode the encoded features | |
recommendations['Type'] = recommendations['Type'].map(type_mapping) | |
recommendations['Processor Brand'] = recommendations['Processor Brand'].map(processor_brand_mapping) | |
recommendations['Operating System'] = recommendations['Operating System'].map(os_mapping) | |
recommendations['company'] = recommendations['company'].map(company_mapping) | |
boolean_columns = ['SSD', 'Expandable Memory', 'Touchscreen'] | |
for column in boolean_columns: | |
recommendations[column] = recommendations[column].map({0: 'No', 1: 'Yes'}) | |
recommendations_table = recommendations[['name', 'Price (in Indian Rupees)', 'Type', 'Dedicated Graphic Memory Capacity', | |
'Processor Brand', 'SSD', 'RAM (in GB)', 'RAM Type', 'Expandable Memory', | |
'Operating System', 'Touchscreen', 'Screen Size (in inch)', 'Weight (in kg)', | |
'Refresh Rate', 'screen_resolution', 'company', 'Storage', 'Processor name', | |
'CPU_ranking', 'battery_backup', 'gpu name ', 'gpu_benchmark']] | |
recommendations_table = recommendations_table.reset_index(drop=True) | |
st.dataframe(recommendations_table) | |
else: | |
st.warning("Please enter a valid user ID.") | |