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.")