-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtabs_map_list_view
101 lines (80 loc) · 3.12 KB
/
tabs_map_list_view
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
# Required Libraries
import os
import streamlit as st
import pandas as pd
import numpy as np
import pydeck as pdk
from mapbox import Geocoder, Directions
from datetime import datetime, timedelta
import geopy.distance
# Streamlit configurations
# st.set_page_config(page_title="Supplier Locations")
# Environment setup
os.environ["MAPBOX_API_KEY"] = "YOUR_MAPBOX_ACCESS_TOKEN"
# Create geocoder and directions clients
geocoder = Geocoder(access_token=os.environ["MAPBOX_API_KEY"])
directions = Directions(access_token=os.environ["MAPBOX_API_KEY"])
# Get coordinates by address
def get_location_by_address(address):
response = geocoder.forward(address)
if response.status_code == 200:
coordinates = response.json()['features'][0]['geometry']['coordinates']
return coordinates[::-1]
else:
return None
# Shipping times
shipping_times = {
'Drop-ship': timedelta(hours=3),
'Next day': timedelta(days=1),
'Weekly': timedelta(weeks=1),
}
# Read the data
data = pd.read_excel('suppliers_data.xlsx')
# Add location data
data['location'] = data['Address'].apply(lambda x: get_location_by_address(x))
data[['latitude', 'longitude']] = pd.DataFrame(data['location'].tolist(), index=data.index)
# Zip Code Input from User
zip_code = st.text_input("Enter your zip code:")
# Fetch Top 3 suppliers based on ETA
if zip_code:
customer_location = get_location_by_address(zip_code)
data['Distance'] = data['location'].apply(lambda x: geopy.distance.distance(x, customer_location).miles)
for method, time_delta in shipping_times.items():
data[f'ETA_{method}'] = data['location'].apply(lambda x: calculate_eta(x, customer_location, method))
data_top3 = data.nsmallest(3, 'Distance')
# Tabs
list_tab, map_tab = st.tabs(["List View", "Map View"])
with list_tab:
list_tab.write(data_top3)
with map_tab:
# Map Visualization
view_state = pdk.ViewState(
latitude=data_top3['latitude'].mean(),
longitude=data_top3['longitude'].mean(),
zoom=11,
pitch=0)
layer = pdk.Layer(
'ScatterplotLayer',
data_top3,
get_position='[longitude, latitude]',
get_color='[200, 30, 0, 160]',
get_radius=200,
pickable=True)
r = pdk.Deck(
layers=[layer],
initial_view_state=view_state,
tooltip={
"text": "{Address}\nETA_Drop-ship: {ETA_Drop-ship}\nETA_Next day: {ETA_Next day}\nETA_Weekly: {ETA_Weekly}"
})
map_tab.pydeck_chart(r)
def calculate_eta(start_location, end_location, shipping_method):
shipping_time = shipping_times.get(shipping_method)
if shipping_time is None:
raise ValueError(f"Unknown shipping method: {shipping_method}")
response = directions.directions([start_location[::-1], end_location[::-1]], 'mapbox/driving')
travel_time = response.json()['routes'][0]['duration'] # in seconds
order_time = datetime.now()
eta = order_time + shipping_time + timedelta(seconds=travel_time)
return eta.strftime('%Y-%m-%d %H:%M:%S')
if __name__ == "__main__":
pass