import gradio as gr import joblib import pandas as pd import numpy as np import requests # ===================== LOAD MODEL ===================== artifact = joblib.load("dynamic_pricing_artifact_v1.joblib") model = artifact["model"] FEATURES = artifact["features"] FIXED_FARE = artifact["fixed_fare"] RATE_PER_KM = artifact["rate_per_km"] # ===================== WEATHER ===================== API_KEY = "YOUR_API_KEY" CITY = "Visakhapatnam,IN" def get_weather_features(): try: url = "https://api.openweathermap.org/data/2.5/weather" params = {"q": CITY, "appid": API_KEY, "units": "metric"} data = requests.get(url, params=params, timeout=5).json() condition = data.get("weather", [{}])[0].get("main", "Clear") temp = data.get("main", {}).get("temp", 30) mapping = { "Clear": 1.0, "Clouds": 1.05, "Rain": 1.20, "Thunderstorm": 1.30 } return mapping.get(condition, 1.0), temp except: return 1.0, 30 # ===================== PREDICTION ===================== def predict_dynamic_price( zone_id, demand, supply, driver_availability, event_factor, traffic_index, distance_km, duration_min, hour, day_of_week, is_weekend, is_holiday, is_festival ): # ---- WEATHER ---- weather_factor, temperature = get_weather_features() # ---- BASE FARE ---- base_price = FIXED_FARE + (distance_km * RATE_PER_KM) # ---- BUILD FEATURE VECTOR ---- row = {f: 0.0 for f in FEATURES} inputs = { "zone_id": zone_id, "hour": hour, "day_of_week": day_of_week, "is_weekend": is_weekend, "is_holiday": is_holiday, "is_festival": is_festival, "demand": demand, "supply": supply, "driver_availability": driver_availability, "weather_factor": weather_factor, "event_factor": event_factor, "temperature": temperature, "traffic_index": traffic_index, "distance_km": distance_km, "duration_min": duration_min, "base_fare": base_price } for k, v in inputs.items(): if k in row: row[k] = float(v) # ===================================================== # DEMAND vs SUPPLY EFFECT # ===================================================== ratio = (demand + 1) / (supply + 1) row["demand_supply_ratio"] = np.clip(ratio, 0, 50) # ===================================================== # SEASON FIX (avoid zero vector) # ===================================================== if "season_winter" in row: row["season_winter"] = 0 if "season_summer" in row: row["season_summer"] = 1 if "season_monsoon" in row: row["season_monsoon"] = 0 if "season_autumn" in row: row["season_autumn"] = 0 # ---- Create dataframe ---- df_row = pd.DataFrame([[row[f] for f in FEATURES]], columns=FEATURES) # ---- MODEL PREDICTION ---- surge = float(model.predict(df_row)[0]) # ===================================================== # EXTRA RESPONSE: DEMAND vs SUPPLY # ===================================================== surge += 0.15 * (ratio - 1) # ===================================================== # DRIVER AVAILABILITY EFFECT (STRONG) # ===================================================== driver_factor = (supply + 1) / (driver_availability + 1) surge += 0.20 * (driver_factor - 1) # ---- Stability ---- surge = np.clip(surge, 1.0, 3.5) final_price = base_price * surge return round(base_price, 2), round(surge, 3), round(final_price, 2) # ===================== UI ===================== inputs = [ gr.Number(label="Zone ID", value=1), gr.Number(label="Demand", value=150), gr.Number(label="Supply", value=80), gr.Number(label="Driver Availability", value=60), gr.Number(label="Event Factor", value=1.0), gr.Number(label="Traffic Index", value=0.5), gr.Number(label="Distance (km)", value=10), gr.Number(label="Duration (min)", value=20), gr.Number(label="Hour", value=18), gr.Number(label="Day of Week", value=4), gr.Number(label="Is Weekend", value=0), gr.Number(label="Is Holiday", value=0), gr.Number(label="Is Festival", value=0), ] outputs = [ gr.Number(label="Base Price"), gr.Number(label="Surge Factor"), gr.Number(label="Final Dynamic Price"), ] demo = gr.Interface( fn=predict_dynamic_price, inputs=inputs, outputs=outputs, title="Dynamic Pricing (Fully Responsive)" ) demo.launch()