gamaba's picture
Update app.py
70f2e4c verified
import pandas as pd
import pickle
import gradio as gr
from sklearn.preprocessing import LabelEncoder
import os
# --- Load dataset ---
df_original = pd.read_csv('AB_ELEVATORS_DATASET_final.csv')
categorical_cols_original = [
'BRAND NAME', 'LIFT_TYPE', 'DOOR_FRAME', 'DOOR_TYPE', 'CABIN_MATERIAL', 'MOTOR_TYPE'
]
# --- Create encoders ---
encoders = {}
for col in categorical_cols_original:
le = LabelEncoder()
le.fit(df_original[col])
encoders[col] = le
categorical_options = {
col: list(df_original[col].unique()) for col in categorical_cols_original
}
# --- Load model ---
with open("elevator_model.pkl", "rb") as f:
model = pickle.load(f)
# --- Prediction function ---
def predict_price(
brand_name_str,
lift_type_str,
door_frame_str,
door_type_str,
cabin_material_str,
motor_type_str,
passengers_capacity,
speed_mps,
floors
):
try:
# Encode inputs
input_data = pd.DataFrame([[
encoders['BRAND NAME'].transform([brand_name_str])[0],
encoders['LIFT_TYPE'].transform([lift_type_str])[0],
encoders['DOOR_FRAME'].transform([door_frame_str])[0],
encoders['DOOR_TYPE'].transform([door_type_str])[0],
encoders['CABIN_MATERIAL'].transform([cabin_material_str])[0],
encoders['MOTOR_TYPE'].transform([motor_type_str])[0],
int(passengers_capacity),
float(speed_mps),
int(floors)
]], columns=[
'brand_name', 'lift_type', 'door_frame', 'door_type',
'cabin_material', 'motor_type',
'passengers_capacity', 'speed_mps', 'floors'
])
prediction = model.predict(input_data)[0]
price = float(prediction)
return (
f"### πŸ’° Estimated Price: β‚Ή {price:,.2f}",
"βœ… Quote generated successfully"
)
except Exception as e:
return f"❌ Error: {str(e)}", "⚠️ Please check inputs"
#Function to get image path from dropdown
def get_image_path(category, selection):
if selection is None:
return None
# Convert dropdown value β†’ UPPERCASE filename
filename = selection.upper().replace(" ", "_") + ".jpg"
path = os.path.join("Images", category, filename)
return path if os.path.exists(path) else None
# --- Custom UI using Blocks ---
with gr.Blocks(theme=gr.themes.Soft(), title="AB Elevators") as demo:
gr.Markdown("""
<div style="text-align:center; padding:20px;">
<h1 style="color:gold; text-shadow:2px 2px 5px black;">
πŸš€ AB ELEVATORS
</h1>
<h3>Smart Lift Price Prediction System</h3>
<p>Get instant quotations based on your requirements</p>
</div>
""")
with gr.Row():
with gr.Column():
brand = gr.Dropdown(categorical_options['BRAND NAME'], label="🏒 Brand")
lift = gr.Dropdown(categorical_options['LIFT_TYPE'], label="πŸ›— Lift Type")
lift_img = gr.Image(label="Lift Type Preview", height=150) #Lift_Type Image Display
door_frame = gr.Dropdown(categorical_options['DOOR_FRAME'], label="πŸšͺ Door Frame")
with gr.Column():
door_type = gr.Dropdown(categorical_options['DOOR_TYPE'], label="πŸšͺ Door Type")
door_img = gr.Image(label="Door Type Preview", height=150)
cabin = gr.Dropdown(categorical_options['CABIN_MATERIAL'], label="🧱 Cabin Material")
motor = gr.Dropdown(categorical_options['MOTOR_TYPE'], label="βš™οΈ Motor Type")
motor_img = gr.Image(label="Motor Type Preview", height=150)
gr.Markdown("### πŸ”’ Configuration")
with gr.Row():
passengers = gr.Slider(
minimum=int(df_original['PASSENGERS CAPACITY'].min()),
maximum=int(df_original['PASSENGERS CAPACITY'].max()),
step=1,
label="πŸ‘₯ Passengers Capacity",
value=int(df_original['PASSENGERS CAPACITY'].mean())
)
speed = gr.Slider(
minimum=float(df_original['SPEED_MPS'].min()),
maximum=float(df_original['SPEED_MPS'].max()),
step=0.1,
label="⚑ Speed (MPS)",
value=float(df_original['SPEED_MPS'].mean())
)
floors = gr.Slider(
minimum=int(df_original['FLOORS'].min()),
maximum=int(df_original['FLOORS'].max()),
step=1,
label="🏒 Floors",
value=int(df_original['FLOORS'].mean())
)
predict_btn = gr.Button("πŸ’‘ Generate Quote", variant="primary")
output_price = gr.Markdown()
output_status = gr.Markdown()
# --- Image Updates ---
lift.change(
fn=lambda x: get_image_path("Lift_Type", x),
inputs=lift,
outputs=lift_img
)
door_type.change(
fn=lambda x: get_image_path("Door_Type", x),
inputs=door_type,
outputs=door_img
)
motor.change(
fn=lambda x: get_image_path("Motor_Type", x),
inputs=motor,
outputs=motor_img
)
predict_btn.click(
fn=predict_price,
inputs=[brand, lift, door_frame, door_type, cabin, motor,
passengers, speed, floors],
outputs=[output_price, output_status]
)
gr.Markdown("""
<hr>
<div style="text-align:center;">
<p>✨ Designed for AB Elevators | AI Powered Pricing</p>
</div>
""")
# --- Launch ---
demo.launch()