Spaces:
Sleeping
Sleeping
| # ============================== | |
| # π Uber Driver Recommendation System | |
| # # ============================== | |
| import numpy as np | |
| import pandas as pd | |
| import gradio as gr | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.ensemble import RandomForestRegressor | |
| # ------------------------------ | |
| # 1. Data Generation | |
| # ------------------------------ | |
| def generate_data(n=1000): | |
| np.random.seed(42) | |
| return pd.DataFrame({ | |
| "pickup_distance": np.random.uniform(0.5, 10, n), | |
| "trip_distance": np.random.uniform(1, 20, n), | |
| "fare": np.random.uniform(50, 500, n), | |
| "surge": np.random.choice([1, 1.5, 2], n), | |
| "rating": np.random.uniform(3, 5, n) | |
| }) | |
| # ------------------------------ | |
| # 2. Feature Engineering | |
| # ------------------------------ | |
| def feature_engineering(df): | |
| df = df.copy() | |
| df["earning_per_km"] = df["fare"] / (df["trip_distance"] + 1) | |
| df["efficiency"] = (df["fare"] * df["surge"]) / ( | |
| df["pickup_distance"] + df["trip_distance"] | |
| ) | |
| return df | |
| # ------------------------------ | |
| # 3. Train Model | |
| # ------------------------------ | |
| def train_model(): | |
| data = generate_data() | |
| data = feature_engineering(data) | |
| data["reward"] = data["efficiency"] | |
| X = data.drop("reward", axis=1) | |
| y = data["reward"] | |
| X_train, _, y_train, _ = train_test_split(X, y, test_size=0.2, random_state=42) | |
| model = RandomForestRegressor(n_estimators=50, random_state=42) | |
| model.fit(X_train, y_train) | |
| return model, X.columns.tolist() | |
| model, feature_columns = train_model() | |
| # ------------------------------ | |
| # 4. Generate Ride Options (FIXED) | |
| # ------------------------------ | |
| def generate_rides(pickup, trip, fare, surge): | |
| rides = [] | |
| for _ in range(5): | |
| rides.append({ | |
| "pickup_distance": max(0.5, pickup + np.random.uniform(-1, 1)), | |
| "trip_distance": max(1, trip + np.random.uniform(-2, 2)), | |
| "fare": max(50, fare + np.random.uniform(-50, 50)), | |
| "surge": min(2, max(1, surge + np.random.choice([0, 0.5]))), | |
| "rating": np.random.uniform(3, 5) # β FIX | |
| }) | |
| return pd.DataFrame(rides) | |
| # ------------------------------ | |
| # 5. Explanation Logic | |
| # ------------------------------ | |
| def explain(row): | |
| reasons = [] | |
| if row["fare"] > 300: | |
| reasons.append("High Fare") | |
| if row["pickup_distance"] < 3: | |
| reasons.append("Close Pickup") | |
| if row["surge"] > 1: | |
| reasons.append("Surge Benefit") | |
| if row["trip_distance"] > 10: | |
| reasons.append("Long Trip") | |
| return ", ".join(reasons) if reasons else "Balanced Ride" | |
| # ------------------------------ | |
| # 6. Recommendation Engine (FIXED) | |
| # ------------------------------ | |
| def recommend(pickup, trip, fare, surge): | |
| rides = generate_rides(pickup, trip, fare, surge) | |
| rides = feature_engineering(rides) | |
| # β Ensure feature consistency | |
| rides = rides[feature_columns] | |
| scores = model.predict(rides) | |
| rides["score"] = scores | |
| rides = rides.sort_values(by="score", ascending=False).head(3) | |
| # β Clean UI Output | |
| output = "" | |
| for idx, row in rides.iterrows(): | |
| output += ( | |
| f"π Ride Option\n" | |
| f"Score: {round(row['score'], 2)}\n" | |
| f"Fare: βΉ{round(row['fare'], 2)}\n" | |
| f"Pickup: {round(row['pickup_distance'], 2)} km\n" | |
| f"Trip: {round(row['trip_distance'], 2)} km\n" | |
| f"Surge: {row['surge']}\n" | |
| f"Why: {explain(row)}\n" | |
| f"-----------------------------\n" | |
| ) | |
| return output | |
| # ------------------------------ | |
| # 7. Gradio UI (STABLE) | |
| # ------------------------------ | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## π Uber Driver Recommendation System") | |
| gr.Markdown("AI-based smart ride selection") | |
| with gr.Row(): | |
| pickup = gr.Slider(0.5, 10, value=2, label="Pickup Distance (km)") | |
| trip = gr.Slider(1, 20, value=5, label="Trip Distance (km)") | |
| with gr.Row(): | |
| fare = gr.Slider(50, 500, value=200, label="Fare (βΉ)") | |
| surge = gr.Slider(1, 2, value=1, step=0.5, label="Surge") | |
| btn = gr.Button("Get Recommendation") | |
| output = gr.Textbox( | |
| label="Top Ride Recommendations", | |
| lines=15 | |
| ) | |
| btn.click( | |
| fn=recommend, | |
| inputs=[pickup, trip, fare, surge], | |
| outputs=output | |
| ) | |
| # ------------------------------ | |
| # 8. Launch | |
| # ------------------------------ | |
| if __name__ == "__main__": | |
| demo.launch() | |