File size: 5,334 Bytes
9714b3f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5c84935
 
9714b3f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
143
144
145
from flask import Flask, request, jsonify, render_template
import pandas as pd
import numpy as np
import joblib
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import StandardScaler, LabelEncoder

# Custom LabelEncoder Transformer
class LabelEncoderTransformer(BaseEstimator, TransformerMixin):
    def __init__(self):
        self.encoders = {}

    def fit(self, X, y=None):
        for col in X.columns:
            le = LabelEncoder()
            le.fit(X[col])
            self.encoders[col] = le
        return self

    def transform(self, X):
        X_transformed = X.copy()
        for col in X.columns:
            X_transformed[col] = self.encoders[col].transform(X[col])
        return X_transformed

    def inverse_transform(self, X):
        X_inverse = X.copy()
        for col in X.columns:
            X_inverse[col] = self.encoders[col].inverse_transform(X[col])
        return X_inverse

app = Flask(__name__)

# Load dataset
df = pd.read_excel("Laptops_dataset.xlsx")

# Extract unique values
unique_values = {
    'Ram': sorted(df['Ram'].unique().tolist()),
    'Memory': sorted(df['Memory'].unique().tolist()),
    'Size': sorted(df['Size'].unique().tolist()),
    'GPU_type': sorted(df['GPU_type'].unique().tolist()),
    'CPU_type': sorted(df['CPU_type'].unique().tolist())
}

# Load model and preprocessor
model = joblib.load("best_model.pkl")
preprocessor = joblib.load("preprocessor.pkl")

@app.route('/')
def index():
    return render_template('new_web.html')

@app.route('/form')
def form():
    # Extract unique values from dataset
    ram_values = sorted(df['Ram'].unique().tolist())
    memory_values = sorted(df['Memory'].unique().tolist())
    size_values = sorted(df['Size'].unique().tolist())
    gpu_values = sorted(df['GPU_type'].unique().tolist())
    cpu_values = sorted(df['CPU_type'].unique().tolist())
    
    return render_template('form_web.html',
                         ram_values=ram_values,
                         memory_values=memory_values,
                         size_values=size_values,
                         gpu_values=gpu_values,
                         cpu_values=cpu_values)

@app.route("/submit_form", methods=['POST'])
def prediction():
    if request.method == "POST":
        try:
            # Get form data
            input_data = {
                'Ram': int(request.form['ram']),
                'Memory': int(request.form['memory']),
                'Size': float(request.form['size']),
                'GPU_type': request.form['gpu_type'],
                'CPU_type': request.form['cpu_type']
            }
            
            # Create DataFrame and process
            input_df = pd.DataFrame([input_data])
            processed_features = preprocessor.transform(input_df)
            prediction = model.predict(processed_features)[0]
            
            # Find similar laptops in price range
            price_range = (prediction - 2000000, prediction + 2000000)
            similar_laptops = df[
                (df['Price'] >= price_range[0]) & 
                (df['Price'] <= price_range[1])
            ][['Name', 'Link', 'Price']].to_dict('records')

            # Get values for the sidebar form
            ram_values = sorted(df['Ram'].unique().tolist())
            memory_values = sorted(df['Memory'].unique().tolist())
            size_values = sorted(df['Size'].unique().tolist())
            gpu_values = sorted(df['GPU_type'].unique().tolist())
            cpu_values = sorted(df['CPU_type'].unique().tolist())
            
            return render_template('output_web.html',
                                ram=input_data['Ram'],
                                memory=input_data['Memory'],
                                size=input_data['Size'],
                                gpu_type=input_data['GPU_type'],
                                cpu_type=input_data['CPU_type'],
                                output=f"{prediction:,.0f}",
                                similar_laptops=similar_laptops,
                                ram_values=ram_values,
                                memory_values=memory_values,
                                size_values=size_values,
                                gpu_values=gpu_values,
                                cpu_values=cpu_values)
        
        except Exception as e:
            print(f"Error in prediction: {e}")
            return render_template('error.html', error=str(e))

@app.route("/api/predict", methods=["POST"])
def api_predict():
    try:
        data = request.get_json()
        input_data = {
            'Ram': int(data['ram']),
            'Memory': int(data['memory']),
            'Size': float(data['size']),
            'GPU_type': data['gpu_type'],
            'CPU_type': data['cpu_type']
        }
        
        # Create DataFrame with proper column order
        columns = ['Ram', 'Memory', 'Size', 'GPU_type', 'CPU_type']
        input_df = pd.DataFrame([input_data])[columns]
        
        processed_features = preprocessor.transform(input_df)
        prediction = model.predict(processed_features)[0]
        
        return jsonify({"price": float(prediction)})
    
    except Exception as e:
        return jsonify({"error": str(e)}), 400

if __name__ == "__main__":
    app.run(debug=True)