File size: 4,475 Bytes
e0491e7
 
 
 
816e277
 
 
48200d9
c3ad9c4
816e277
 
c3ad9c4
816e277
 
 
54ba5c0
816e277
 
 
 
 
 
 
c3ad9c4
 
 
816e277
 
 
e0491e7
 
 
816e277
 
 
c3ad9c4
816e277
 
 
 
e0491e7
816e277
 
 
 
 
54ba5c0
816e277
54ba5c0
816e277
e0491e7
54ba5c0
816e277
54ba5c0
816e277
 
e0491e7
816e277
c3ad9c4
816e277
c3ad9c4
816e277
54ba5c0
 
 
 
e0491e7
816e277
 
 
 
e0491e7
816e277
 
 
e0491e7
 
 
 
 
 
 
 
 
 
816e277
 
c3ad9c4
e0491e7
c3ad9c4
 
 
816e277
e0491e7
 
54ba5c0
e0491e7
c3ad9c4
 
e0491e7
c3ad9c4
e0491e7
 
c3ad9c4
 
 
 
e0491e7
 
 
 
c3ad9c4
 
 
 
 
e0491e7
816e277
 
e0491e7
816e277
 
e0491e7
 
816e277
 
c3ad9c4
 
e0491e7
816e277
c3ad9c4
 
 
e0491e7
c3ad9c4
e0491e7
 
 
 
c3ad9c4
e0491e7
 
 
 
 
816e277
c3ad9c4
e0491e7
c3ad9c4
816e277
 
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
# ==============================
# πŸš– 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()