Website / app.py
NV9523's picture
Update app.py
ca0677a verified
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)