File size: 7,254 Bytes
3dd9f2f
 
 
 
 
 
 
 
 
 
3c0bc59
3dd9f2f
 
 
 
 
 
 
 
 
b8d946e
3dd9f2f
 
 
 
 
 
25f70a1
3dd9f2f
 
 
 
 
 
 
 
 
 
 
 
de83f23
3dd9f2f
 
8c587b1
3dd9f2f
 
 
 
 
 
 
 
 
 
 
 
 
7212304
9676325
3dd9f2f
 
13ac327
3dd9f2f
 
9fd09b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15dfb11
2c4c114
 
 
7212304
07019e5
b397956
623c2aa
07019e5
 
3dd9f2f
 
 
 
 
 
 
ecf2a21
3dd9f2f
 
13ac327
9fd09b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15dfb11
de83f23
 
 
7212304
623c2aa
 
07019e5
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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.")