| import joblib |
| import pandas as pd |
| import gradio as gr |
|
|
| # Load model once (HF best practice) |
| artifact = joblib.load("pue_artifact.joblib") |
|
|
| def predict_pue(input_dict): |
| X = pd.DataFrame([input_dict]) |
| X = X.reindex(columns=artifact["features"], fill_value=0) |
|
|
| ride = artifact["ride_encoder"].inverse_transform( |
| artifact["ride_model"].predict(X) |
| )[0] |
|
|
| discount_prob = artifact["discount_model"].predict_proba(X)[0][1] |
|
|
| route = artifact["route_encoder"].inverse_transform( |
| artifact["route_model"].predict(X) |
| )[0] |
|
|
| return { |
| "Recommended Ride Type": ride, |
| "Discount Probability": round(float(discount_prob), 2), |
| "Preferred Route": route |
| } |
|
|
| def ui_predict( |
| zone_id, hour, day_of_week, is_weekend, |
| weather_factor, event_factor, traffic_index, |
| distance_km, duration_min, base_fare, |
| avg_distance, avg_duration, avg_fare, |
| discount_usage_rate, total_rides |
| ): |
|
|
| input_data = { |
| "zone_id": int(zone_id), |
| "hour": int(hour), |
| "day_of_week": int(day_of_week), |
| "is_weekend": int(is_weekend), |
| "weather_factor": weather_factor, |
| "event_factor": event_factor, |
| "traffic_index": traffic_index, |
| "distance_km": distance_km, |
| "duration_min": duration_min, |
| "base_fare": base_fare, |
| "avg_distance": avg_distance, |
| "avg_duration": avg_duration, |
| "avg_fare": avg_fare, |
| "discount_usage_rate": discount_usage_rate, |
| "total_rides": int(total_rides) |
| } |
|
|
| return predict_pue(input_data) |
|
|
| demo = gr.Interface( |
| fn=ui_predict, |
| inputs=[ |
| gr.Number(label="Zone ID"), |
| gr.Slider(0,23,step=1,label="Hour"), |
| gr.Slider(0,6,step=1,label="Day of Week"), |
| gr.Radio([0,1],label="Weekend"), |
| gr.Slider(1,1.5,label="Weather Factor"), |
| gr.Slider(1,1.6,label="Event Factor"), |
| gr.Slider(0.5,2,label="Traffic Index"), |
| gr.Number(label="Distance (km)"), |
| gr.Number(label="Duration (min)"), |
| gr.Number(label="Base Fare"), |
| gr.Number(label="Avg Distance"), |
| gr.Number(label="Avg Duration"), |
| gr.Number(label="Avg Fare"), |
| gr.Slider(0,1,label="Discount Usage Rate"), |
| gr.Number(label="Total Rides") |
| ], |
| outputs="json", |
| title="Personalized User Experience – Ride-Hailing ML", |
| description="Real-time personalization: ride type, discount probability, and route preference." |
| ) |
|
|
| demo.launch() |
|
|