File size: 5,485 Bytes
48fed9c
 
 
 
2a203cc
48fed9c
ac41ad0
48fed9c
 
 
 
 
 
ac41ad0
48fed9c
 
 
 
 
 
 
 
 
 
ac41ad0
48fed9c
 
 
ac41ad0
48fed9c
 
 
 
 
 
 
 
 
 
 
ac41ad0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48fed9c
ac41ad0
 
 
 
 
 
 
 
 
 
 
2a203cc
 
 
 
 
 
 
 
70f2e4c
2a203cc
 
 
ac41ad0
 
 
 
 
 
 
 
 
 
 
 
 
176207a
ac41ad0
 
 
 
2a203cc
ac41ad0
 
 
 
2a203cc
ac41ad0
 
2a203cc
ac41ad0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16e7e4a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176207a
ac41ad0
 
 
 
 
 
 
 
 
 
 
 
 
48fed9c
ac41ad0
 
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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()