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