Michtiii commited on
Commit
e0491e7
Β·
verified Β·
1 Parent(s): c3ad9c4

Upload 2 files

Browse files
Files changed (1) hide show
  1. app.py +49 -62
app.py CHANGED
@@ -1,3 +1,7 @@
 
 
 
 
1
  import numpy as np
2
  import pandas as pd
3
  import gradio as gr
@@ -23,7 +27,9 @@ def generate_data(n=1000):
23
  def feature_engineering(df):
24
  df = df.copy()
25
  df["earning_per_km"] = df["fare"] / (df["trip_distance"] + 1)
26
- df["efficiency"] = (df["fare"] * df["surge"]) / (df["pickup_distance"] + df["trip_distance"])
 
 
27
  return df
28
 
29
  # ------------------------------
@@ -32,6 +38,7 @@ def feature_engineering(df):
32
  def train_model():
33
  data = generate_data()
34
  data = feature_engineering(data)
 
35
  data["reward"] = data["efficiency"]
36
 
37
  X = data.drop("reward", axis=1)
@@ -41,12 +48,13 @@ def train_model():
41
 
42
  model = RandomForestRegressor(n_estimators=50, random_state=42)
43
  model.fit(X_train, y_train)
 
44
  return model, X.columns.tolist()
45
 
46
  model, feature_columns = train_model()
47
 
48
  # ------------------------------
49
- # 4. Generate Ride Options (For Single Input)
50
  # ------------------------------
51
  def generate_rides(pickup, trip, fare, surge):
52
  rides = []
@@ -56,109 +64,88 @@ def generate_rides(pickup, trip, fare, surge):
56
  "trip_distance": max(1, trip + np.random.uniform(-2, 2)),
57
  "fare": max(50, fare + np.random.uniform(-50, 50)),
58
  "surge": min(2, max(1, surge + np.random.choice([0, 0.5]))),
59
- "rating": np.random.uniform(3, 5)
60
  })
61
  return pd.DataFrame(rides)
62
 
63
  # ------------------------------
64
- # 5. Explain Logic
65
  # ------------------------------
66
  def explain(row):
67
  reasons = []
68
- if row["fare"] > 300: reasons.append("High Fare")
69
- if row["pickup_distance"] < 3: reasons.append("Close Pickup")
70
- if row["surge"] > 1: reasons.append("Surge Benefit")
71
- if row["trip_distance"] > 10: reasons.append("Long Trip")
 
 
 
 
 
 
72
  return ", ".join(reasons) if reasons else "Balanced Ride"
73
 
74
  # ------------------------------
75
- # 6. Recommendation for Sliders
76
  # ------------------------------
77
  def recommend(pickup, trip, fare, surge):
78
  rides = generate_rides(pickup, trip, fare, surge)
79
  rides = feature_engineering(rides)
 
 
80
  rides = rides[feature_columns]
 
81
  scores = model.predict(rides)
82
  rides["score"] = scores
 
83
  rides = rides.sort_values(by="score", ascending=False).head(3)
 
 
84
  output = ""
85
  for idx, row in rides.iterrows():
86
  output += (
87
  f"πŸš– Ride Option\n"
88
- f"Score: {round(row['score'],2)}\n"
89
- f"Fare: β‚Ή{round(row['fare'],2)}\n"
90
- f"Pickup: {round(row['pickup_distance'],2)} km\n"
91
- f"Trip: {round(row['trip_distance'],2)} km\n"
92
  f"Surge: {row['surge']}\n"
93
  f"Why: {explain(row)}\n"
94
  f"-----------------------------\n"
95
  )
96
- return output
97
-
98
- # ------------------------------
99
- # 7. Recommendation for Excel Upload
100
- # ------------------------------
101
- def recommend_excel(file):
102
- if file is None:
103
- return "No file uploaded.", None
104
- df = pd.read_excel(file)
105
-
106
- # Check required columns
107
- required_cols = ["pickup_distance", "trip_distance", "fare", "surge"]
108
- for col in required_cols:
109
- if col not in df.columns:
110
- return f"Missing column: {col}", None
111
-
112
- df = feature_engineering(df)
113
- df = df[feature_columns]
114
- df["score"] = model.predict(df)
115
 
116
- # Top 3 per row (if needed, we just sort overall)
117
- df = df.sort_values(by="score", ascending=False)
118
-
119
- # Explanation column
120
- df["reason"] = df.apply(explain, axis=1)
121
-
122
- return df.head(10), df # preview, full df for download
123
 
124
  # ------------------------------
125
- # 8. Gradio UI
126
  # ------------------------------
127
  with gr.Blocks() as demo:
128
- gr.Markdown("## πŸš– Uber Driver Recommendation System with Excel Upload")
129
- gr.Markdown("You can either use sliders for single ride recommendation or upload Excel for batch processing.")
130
 
131
- # ----- Sliders -----
132
  with gr.Row():
133
  pickup = gr.Slider(0.5, 10, value=2, label="Pickup Distance (km)")
134
  trip = gr.Slider(1, 20, value=5, label="Trip Distance (km)")
 
135
  with gr.Row():
136
  fare = gr.Slider(50, 500, value=200, label="Fare (β‚Ή)")
137
  surge = gr.Slider(1, 2, value=1, step=0.5, label="Surge")
138
- btn_single = gr.Button("Get Recommendation")
139
- output_single = gr.Textbox(label="Top Ride Recommendations", lines=15)
140
- btn_single.click(fn=recommend, inputs=[pickup, trip, fare, surge], outputs=output_single)
141
-
142
- gr.Markdown("---")
143
 
144
- # ----- Excel Upload -----
145
- gr.Markdown("### Upload Excel for Batch Ride Recommendation")
146
- file_input = gr.File(label="Upload Excel file with columns: pickup_distance, trip_distance, fare, surge", file_types=[".xlsx"])
147
- btn_excel = gr.Button("Generate Recommendations")
148
- excel_preview = gr.Dataframe(label="Top Recommendations Preview")
149
- download_btn = gr.File(label="Download Full Recommendations Excel")
150
 
151
- def process_excel(file):
152
- preview, full_df = recommend_excel(file)
153
- if full_df is not None:
154
- full_df.to_excel("ride_recommendations.xlsx", index=False)
155
- return preview, "ride_recommendations.xlsx"
156
- return preview, None
157
 
158
- btn_excel.click(fn=process_excel, inputs=file_input, outputs=[excel_preview, download_btn])
 
 
 
 
159
 
160
  # ------------------------------
161
- # 9. Launch
162
  # ------------------------------
163
  if __name__ == "__main__":
164
  demo.launch()
 
1
+ # ==============================
2
+ # πŸš– Uber Driver Recommendation System
3
+ # # ==============================
4
+
5
  import numpy as np
6
  import pandas as pd
7
  import gradio as gr
 
27
  def feature_engineering(df):
28
  df = df.copy()
29
  df["earning_per_km"] = df["fare"] / (df["trip_distance"] + 1)
30
+ df["efficiency"] = (df["fare"] * df["surge"]) / (
31
+ df["pickup_distance"] + df["trip_distance"]
32
+ )
33
  return df
34
 
35
  # ------------------------------
 
38
  def train_model():
39
  data = generate_data()
40
  data = feature_engineering(data)
41
+
42
  data["reward"] = data["efficiency"]
43
 
44
  X = data.drop("reward", axis=1)
 
48
 
49
  model = RandomForestRegressor(n_estimators=50, random_state=42)
50
  model.fit(X_train, y_train)
51
+
52
  return model, X.columns.tolist()
53
 
54
  model, feature_columns = train_model()
55
 
56
  # ------------------------------
57
+ # 4. Generate Ride Options (FIXED)
58
  # ------------------------------
59
  def generate_rides(pickup, trip, fare, surge):
60
  rides = []
 
64
  "trip_distance": max(1, trip + np.random.uniform(-2, 2)),
65
  "fare": max(50, fare + np.random.uniform(-50, 50)),
66
  "surge": min(2, max(1, surge + np.random.choice([0, 0.5]))),
67
+ "rating": np.random.uniform(3, 5) # βœ… FIX
68
  })
69
  return pd.DataFrame(rides)
70
 
71
  # ------------------------------
72
+ # 5. Explanation Logic
73
  # ------------------------------
74
  def explain(row):
75
  reasons = []
76
+
77
+ if row["fare"] > 300:
78
+ reasons.append("High Fare")
79
+ if row["pickup_distance"] < 3:
80
+ reasons.append("Close Pickup")
81
+ if row["surge"] > 1:
82
+ reasons.append("Surge Benefit")
83
+ if row["trip_distance"] > 10:
84
+ reasons.append("Long Trip")
85
+
86
  return ", ".join(reasons) if reasons else "Balanced Ride"
87
 
88
  # ------------------------------
89
+ # 6. Recommendation Engine (FIXED)
90
  # ------------------------------
91
  def recommend(pickup, trip, fare, surge):
92
  rides = generate_rides(pickup, trip, fare, surge)
93
  rides = feature_engineering(rides)
94
+
95
+ # βœ… Ensure feature consistency
96
  rides = rides[feature_columns]
97
+
98
  scores = model.predict(rides)
99
  rides["score"] = scores
100
+
101
  rides = rides.sort_values(by="score", ascending=False).head(3)
102
+
103
+ # βœ… Clean UI Output
104
  output = ""
105
  for idx, row in rides.iterrows():
106
  output += (
107
  f"πŸš– Ride Option\n"
108
+ f"Score: {round(row['score'], 2)}\n"
109
+ f"Fare: β‚Ή{round(row['fare'], 2)}\n"
110
+ f"Pickup: {round(row['pickup_distance'], 2)} km\n"
111
+ f"Trip: {round(row['trip_distance'], 2)} km\n"
112
  f"Surge: {row['surge']}\n"
113
  f"Why: {explain(row)}\n"
114
  f"-----------------------------\n"
115
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
+ return output
 
 
 
 
 
 
118
 
119
  # ------------------------------
120
+ # 7. Gradio UI (STABLE)
121
  # ------------------------------
122
  with gr.Blocks() as demo:
123
+ gr.Markdown("## πŸš– Uber Driver Recommendation System")
124
+ gr.Markdown("AI-based smart ride selection")
125
 
 
126
  with gr.Row():
127
  pickup = gr.Slider(0.5, 10, value=2, label="Pickup Distance (km)")
128
  trip = gr.Slider(1, 20, value=5, label="Trip Distance (km)")
129
+
130
  with gr.Row():
131
  fare = gr.Slider(50, 500, value=200, label="Fare (β‚Ή)")
132
  surge = gr.Slider(1, 2, value=1, step=0.5, label="Surge")
 
 
 
 
 
133
 
134
+ btn = gr.Button("Get Recommendation")
 
 
 
 
 
135
 
136
+ output = gr.Textbox(
137
+ label="Top Ride Recommendations",
138
+ lines=15
139
+ )
 
 
140
 
141
+ btn.click(
142
+ fn=recommend,
143
+ inputs=[pickup, trip, fare, surge],
144
+ outputs=output
145
+ )
146
 
147
  # ------------------------------
148
+ # 8. Launch
149
  # ------------------------------
150
  if __name__ == "__main__":
151
  demo.launch()