Michtiii's picture
Upload 2 files
e0491e7 verified
# ==============================
# πŸš– 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()