|
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 |
|
|
|
|
|
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__) |
|
|
|
|
|
df = pd.read_excel("Laptops_dataset.xlsx") |
|
|
|
|
|
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()) |
|
} |
|
|
|
|
|
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(): |
|
|
|
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: |
|
|
|
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'] |
|
} |
|
|
|
|
|
input_df = pd.DataFrame([input_data]) |
|
processed_features = preprocessor.transform(input_df) |
|
prediction = model.predict(processed_features)[0] |
|
|
|
|
|
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') |
|
|
|
|
|
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'] |
|
} |
|
|
|
|
|
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) |