Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -17,7 +17,7 @@ df = pd.DataFrame(data)
|
|
| 17 |
|
| 18 |
# === Parse and clean ===
|
| 19 |
df['Timestamp'] = pd.to_datetime(df['Timestamp'], dayfirst=True, errors='coerce')
|
| 20 |
-
df['Date'] = df['Timestamp'].dt.date.astype(str) #
|
| 21 |
df['Time'] = df['Timestamp'].dt.time
|
| 22 |
|
| 23 |
location_split = df['Location'].str.split(',', expand=True)
|
|
@@ -38,20 +38,49 @@ def show_map(date_str, rep):
|
|
| 38 |
if subset.empty:
|
| 39 |
return "No valid data", None
|
| 40 |
|
| 41 |
-
subset = subset.sort_values(by='Timestamp')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
fig = px.line_mapbox(
|
| 43 |
subset,
|
| 44 |
lat="Latitude", lon="Longitude",
|
| 45 |
hover_name="Dealership Name",
|
| 46 |
-
hover_data={"Time": True, "Time Diff (min)": True},
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
)
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
return table, fig
|
| 56 |
|
| 57 |
# === Gradio UI ===
|
|
|
|
| 17 |
|
| 18 |
# === Parse and clean ===
|
| 19 |
df['Timestamp'] = pd.to_datetime(df['Timestamp'], dayfirst=True, errors='coerce')
|
| 20 |
+
df['Date'] = df['Timestamp'].dt.date.astype(str) # Convert to string
|
| 21 |
df['Time'] = df['Timestamp'].dt.time
|
| 22 |
|
| 23 |
location_split = df['Location'].str.split(',', expand=True)
|
|
|
|
| 38 |
if subset.empty:
|
| 39 |
return "No valid data", None
|
| 40 |
|
| 41 |
+
subset = subset.sort_values(by='Timestamp').copy()
|
| 42 |
+
subset['Visit Order'] = range(1, len(subset) + 1)
|
| 43 |
+
|
| 44 |
+
# Center and size for better visibility
|
| 45 |
+
center_lat = subset['Latitude'].mean()
|
| 46 |
+
center_lon = subset['Longitude'].mean()
|
| 47 |
+
|
| 48 |
+
# Line + colored scatter
|
| 49 |
fig = px.line_mapbox(
|
| 50 |
subset,
|
| 51 |
lat="Latitude", lon="Longitude",
|
| 52 |
hover_name="Dealership Name",
|
| 53 |
+
hover_data={"Time": True, "Time Diff (min)": True, "Visit Order": True},
|
| 54 |
+
height=700,
|
| 55 |
+
zoom=13,
|
| 56 |
+
center={"lat": center_lat, "lon": center_lon}
|
| 57 |
+
)
|
| 58 |
+
|
| 59 |
+
# Colored points by visit order
|
| 60 |
+
scatter = px.scatter_mapbox(
|
| 61 |
+
subset,
|
| 62 |
+
lat="Latitude", lon="Longitude",
|
| 63 |
+
color="Visit Order",
|
| 64 |
+
hover_name="Dealership Name",
|
| 65 |
+
hover_data=["Time", "Time Diff (min)"],
|
| 66 |
+
color_continuous_scale="Bluered"
|
| 67 |
)
|
| 68 |
+
|
| 69 |
+
for trace in scatter.data:
|
| 70 |
+
fig.add_trace(trace)
|
| 71 |
+
|
| 72 |
+
# Start/End markers
|
| 73 |
+
fig.add_trace(px.scatter_mapbox(
|
| 74 |
+
pd.DataFrame([subset.iloc[0]]),
|
| 75 |
+
lat="Latitude", lon="Longitude",
|
| 76 |
+
text=["Start"], color_discrete_sequence=["green"]).data[0])
|
| 77 |
+
fig.add_trace(px.scatter_mapbox(
|
| 78 |
+
pd.DataFrame([subset.iloc[-1]]),
|
| 79 |
+
lat="Latitude", lon="Longitude",
|
| 80 |
+
text=["End"], color_discrete_sequence=["red"]).data[0])
|
| 81 |
+
|
| 82 |
+
fig.update_layout(mapbox_style="open-street-map", title=f"📍 {rep}'s Route on {date_str}")
|
| 83 |
+
table = subset[['Dealership Name', 'Time', 'Time Diff (min)', 'Visit Order']]
|
| 84 |
return table, fig
|
| 85 |
|
| 86 |
# === Gradio UI ===
|