Spaces:
Sleeping
Sleeping
changes to be MVP ready
Browse files- app/pages/0_AOIs.py +169 -0
- app/pages/1_🌍_Flood_extent_analysis.py +33 -103
- app/src/gfm.py +22 -39
- bboxes/bboxes.json +167 -1
- pyproject.toml +2 -1
- uv.lock +380 -0
app/pages/0_AOIs.py
ADDED
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
import os
|
3 |
+
from pathlib import Path
|
4 |
+
|
5 |
+
import folium
|
6 |
+
import requests
|
7 |
+
import streamlit as st
|
8 |
+
from folium.plugins import Draw
|
9 |
+
from src.config_parameters import params
|
10 |
+
from src.gfm import download_gfm_geojson, get_existing_flood_geojson, sync_cached_data
|
11 |
+
from src.utils import (
|
12 |
+
add_about,
|
13 |
+
set_tool_page_style,
|
14 |
+
toggle_menu_button,
|
15 |
+
)
|
16 |
+
from streamlit_folium import st_folium
|
17 |
+
|
18 |
+
# Page configuration
|
19 |
+
st.set_page_config(layout="wide", page_title=params["browser_title"])
|
20 |
+
|
21 |
+
# If app is deployed hide menu button
|
22 |
+
toggle_menu_button()
|
23 |
+
|
24 |
+
# Create sidebar
|
25 |
+
add_about()
|
26 |
+
|
27 |
+
# Page title
|
28 |
+
st.markdown("# Flood extent analysis")
|
29 |
+
|
30 |
+
# Set page style
|
31 |
+
set_tool_page_style()
|
32 |
+
|
33 |
+
# Create two rows: top and bottom panel
|
34 |
+
row1 = st.container()
|
35 |
+
save_area = False
|
36 |
+
|
37 |
+
with row1:
|
38 |
+
action_type = st.radio(
|
39 |
+
label="Action Type",
|
40 |
+
options=["See Areas", "Create New Area", "Delete Area"],
|
41 |
+
label_visibility="hidden",
|
42 |
+
)
|
43 |
+
|
44 |
+
# call to render Folium map in Streamlit
|
45 |
+
folium_map = folium.Map([39, 0], zoom_start=8)
|
46 |
+
feat_group_selected_area = folium.FeatureGroup(name="selected_area")
|
47 |
+
|
48 |
+
if action_type == "See Areas":
|
49 |
+
with open("./bboxes/bboxes.json", "r") as f:
|
50 |
+
bboxes = json.load(f)
|
51 |
+
for area_name in bboxes.keys():
|
52 |
+
bbox = bboxes[area_name]["bounding_box"]
|
53 |
+
feat_group_selected_area.add_child(folium.GeoJson(bbox))
|
54 |
+
|
55 |
+
folium_map.fit_bounds(feat_group_selected_area.get_bounds())
|
56 |
+
|
57 |
+
elif action_type == "Create New Area":
|
58 |
+
Draw(
|
59 |
+
export=False,
|
60 |
+
draw_options={
|
61 |
+
"circle": False,
|
62 |
+
"polyline": False,
|
63 |
+
"polygon": False,
|
64 |
+
"rectangle": True,
|
65 |
+
"marker": False,
|
66 |
+
"circlemarker": False,
|
67 |
+
},
|
68 |
+
).add_to(folium_map)
|
69 |
+
|
70 |
+
new_area_name = st.text_input("Area name")
|
71 |
+
save_area = st.button("Save Area")
|
72 |
+
|
73 |
+
elif action_type == "Delete Area":
|
74 |
+
# Load existing bboxes
|
75 |
+
with open("./bboxes/bboxes.json", "r") as f:
|
76 |
+
bboxes = json.load(f)
|
77 |
+
existing_areas = bboxes.keys()
|
78 |
+
|
79 |
+
area_to_delete = st.selectbox("Choose area to delete", options=existing_areas)
|
80 |
+
bbox = bboxes[area_to_delete]["bounding_box"]
|
81 |
+
feat_group_selected_area.add_child(folium.GeoJson(bbox))
|
82 |
+
folium_map.fit_bounds(feat_group_selected_area.get_bounds())
|
83 |
+
|
84 |
+
delete_area = st.button("Delete")
|
85 |
+
|
86 |
+
if delete_area:
|
87 |
+
with open("./bboxes/bboxes.json", "r") as f:
|
88 |
+
bboxes = json.load(f)
|
89 |
+
bboxes.pop(area_to_delete, None)
|
90 |
+
with open("./bboxes/bboxes.json", "w") as f:
|
91 |
+
json.dump(bboxes, f)
|
92 |
+
st.toast("Area successfully deleted")
|
93 |
+
|
94 |
+
with open("./bboxes/bboxes.json", "r") as f:
|
95 |
+
bboxes = json.load(f)
|
96 |
+
|
97 |
+
# geojson_catania = get_existing_flood_geojson("Catania")
|
98 |
+
# print(geojson_catania)
|
99 |
+
# geojson_selected_area = folium.GeoJson(geojson_catania)
|
100 |
+
|
101 |
+
# feat_group_selected_area.add_child(geojson_selected_area)
|
102 |
+
m = st_folium(
|
103 |
+
folium_map,
|
104 |
+
width=800,
|
105 |
+
height=450,
|
106 |
+
feature_group_to_add=feat_group_selected_area,
|
107 |
+
)
|
108 |
+
|
109 |
+
if save_area:
|
110 |
+
check_drawing = m["all_drawings"] != [] and m["all_drawings"] is not None
|
111 |
+
if not check_drawing:
|
112 |
+
st.error("Please create a region using the rectangle tool on the map.")
|
113 |
+
elif new_area_name == "":
|
114 |
+
st.error("Please provide a name for the new area")
|
115 |
+
else:
|
116 |
+
# Get the drawn area
|
117 |
+
selected_area_geojson = m["all_drawings"][-1]
|
118 |
+
|
119 |
+
print("starting to post new area name to gfm api")
|
120 |
+
coordinates = selected_area_geojson["geometry"]["coordinates"]
|
121 |
+
|
122 |
+
username = os.environ["gfm_username"]
|
123 |
+
password = os.environ["gfm_password"]
|
124 |
+
base_url = "https://api.gfm.eodc.eu/v1"
|
125 |
+
|
126 |
+
# Get token, setup header
|
127 |
+
token_url = f"{base_url}/auth/login"
|
128 |
+
|
129 |
+
payload = {"email": username, "password": password}
|
130 |
+
|
131 |
+
response = requests.post(token_url, json=payload)
|
132 |
+
user_id = response.json()["client_id"]
|
133 |
+
access_token = response.json()["access_token"]
|
134 |
+
header = {"Authorization": f"bearer {access_token}"}
|
135 |
+
|
136 |
+
print("authenticated to API")
|
137 |
+
# Create area of impact
|
138 |
+
create_aoi_url = f"{base_url}/aoi/create"
|
139 |
+
|
140 |
+
payload = {
|
141 |
+
"aoi_name": new_area_name,
|
142 |
+
"description": new_area_name,
|
143 |
+
"user_id": user_id,
|
144 |
+
"geoJSON": {"type": "Polygon", "coordinates": coordinates},
|
145 |
+
}
|
146 |
+
|
147 |
+
r = requests.post(url=create_aoi_url, json=payload, headers=header)
|
148 |
+
print(r.json())
|
149 |
+
print("Posted new AOI")
|
150 |
+
|
151 |
+
print("Writing new area to bbox json")
|
152 |
+
# Load existing bboxes
|
153 |
+
with open("./bboxes/bboxes.json", "r") as f:
|
154 |
+
bboxes = json.load(f)
|
155 |
+
|
156 |
+
# If the area doesn't exist, create it
|
157 |
+
if new_area_name not in bboxes:
|
158 |
+
bboxes[new_area_name] = {}
|
159 |
+
|
160 |
+
# Save the new bounding box under the date range key
|
161 |
+
bboxes[new_area_name] = {
|
162 |
+
"bounding_box": selected_area_geojson,
|
163 |
+
"date_ranges": [], # Will be populated when files are downloaded
|
164 |
+
}
|
165 |
+
# Write the updated data back to file
|
166 |
+
with open("./bboxes/bboxes.json", "w") as f:
|
167 |
+
json.dump(bboxes, f, indent=4)
|
168 |
+
|
169 |
+
st.toast("Area successfully created")
|
app/pages/1_🌍_Flood_extent_analysis.py
CHANGED
@@ -38,39 +38,40 @@ row1 = st.container()
|
|
38 |
col1, col2 = row1.columns([2, 1])
|
39 |
feat_group_selected_area = folium.FeatureGroup(name="selected_area")
|
40 |
with col1:
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
if
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
"Select available date range", options=
|
58 |
)
|
|
|
|
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
|
65 |
-
|
66 |
-
|
|
|
67 |
geojson_flood_area = get_existing_flood_geojson(
|
68 |
-
selected_area,
|
69 |
)
|
70 |
feat_group_selected_area.add_child(geojson_flood_area)
|
71 |
|
72 |
-
elif area_type == "New area":
|
73 |
-
new_area_name = st.text_input("Area name")
|
74 |
# Add collapsable container for input map
|
75 |
with st.expander("Input map", expanded=True):
|
76 |
# Create folium map
|
@@ -85,20 +86,6 @@ with col1:
|
|
85 |
# this is necessary to start up the page
|
86 |
folium_map = folium.Map(location=[39, 0], zoom_start=8)
|
87 |
|
88 |
-
# Add drawing tools to map
|
89 |
-
if area_type == "New area":
|
90 |
-
Draw(
|
91 |
-
export=False,
|
92 |
-
draw_options={
|
93 |
-
"circle": False,
|
94 |
-
"polyline": False,
|
95 |
-
"polygon": False,
|
96 |
-
"rectangle": True,
|
97 |
-
"marker": False,
|
98 |
-
"circlemarker": False,
|
99 |
-
},
|
100 |
-
).add_to(folium_map)
|
101 |
-
|
102 |
m = st_folium(
|
103 |
folium_map,
|
104 |
width=800,
|
@@ -107,7 +94,7 @@ with col1:
|
|
107 |
)
|
108 |
with col2:
|
109 |
# Add collapsable container for image dates
|
110 |
-
with st.expander("Choose
|
111 |
start_date = st.date_input("Start date")
|
112 |
end_date = st.date_input("End date")
|
113 |
# Add collapsable container for parameters
|
@@ -115,12 +102,7 @@ with col2:
|
|
115 |
# Add slider for threshold
|
116 |
st.text("Add relevant (API) parameters here")
|
117 |
|
118 |
-
|
119 |
-
if area_type == "New area":
|
120 |
-
button_text = "Get new flood extent"
|
121 |
-
else:
|
122 |
-
button_text = "Update flood extent"
|
123 |
-
submitted = st.button(button_text)
|
124 |
|
125 |
|
126 |
# If the button is clicked do the following
|
@@ -129,72 +111,20 @@ if submitted:
|
|
129 |
# Some basic validation on dates and that there's an area if relevant
|
130 |
get_gfm = True
|
131 |
check_dates = start_date <= end_date
|
132 |
-
if area_type == "New area":
|
133 |
-
check_drawing = m["all_drawings"] != [] and m["all_drawings"] is not None
|
134 |
|
135 |
# Output error if dates are not valid
|
136 |
if not check_dates:
|
137 |
st.error("Make sure that the dates were inserted correctly")
|
138 |
get_gfm = False
|
139 |
-
# Output error if no polygons were drawn
|
140 |
-
if area_type == "New area":
|
141 |
-
if not check_drawing:
|
142 |
-
st.error("Please create a region using the rectangle tool on the map.")
|
143 |
-
get_gfm = False
|
144 |
-
elif new_area_name == "":
|
145 |
-
st.error("Please provide a name for the new area")
|
146 |
-
get_gfm = False
|
147 |
|
148 |
# Only if checks pass go and get the GFM data
|
149 |
if get_gfm:
|
150 |
-
if area_type == "Existing area":
|
151 |
-
area_name = selected_area
|
152 |
-
elif area_type == "New area":
|
153 |
-
area_name = new_area_name
|
154 |
-
|
155 |
# Show loader because it will take a while
|
156 |
with st.spinner("Getting GFM files... Please wait..."):
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
# Load existing bboxes
|
162 |
-
with open("./bboxes/bboxes.json", "r") as f:
|
163 |
-
bboxes = json.load(f)
|
164 |
-
|
165 |
-
# Get the drawn area
|
166 |
-
selected_area_geojson = m["all_drawings"][-1]
|
167 |
-
|
168 |
-
# If the area doesn't exist, create it
|
169 |
-
if new_area_name not in bboxes:
|
170 |
-
bboxes[new_area_name] = {}
|
171 |
-
|
172 |
-
# Save the new bounding box under the date range key
|
173 |
-
bboxes[new_area_name][date_range_str] = {
|
174 |
-
"bounding_box": selected_area_geojson,
|
175 |
-
"flood_files": [], # Will be populated when files are downloaded
|
176 |
-
}
|
177 |
-
|
178 |
-
# Write the updated data back to file
|
179 |
-
with open("./bboxes/bboxes.json", "w") as f:
|
180 |
-
json.dump(bboxes, f, indent=4)
|
181 |
-
|
182 |
-
# Download files, also getting coordinates for GFM
|
183 |
-
coords = selected_area_geojson["geometry"]["coordinates"][0]
|
184 |
-
# download_gfm_geojson(area_name, new_coordinates=coords)
|
185 |
-
download_gfm_geojson(
|
186 |
-
area_name,
|
187 |
-
bbox=bboxes[new_area_name][date_range_str]["bounding_box"],
|
188 |
-
new_coordinates=coords,
|
189 |
-
)
|
190 |
-
|
191 |
-
# For an existing area just get the latest update from GFM
|
192 |
-
if area_type == "Existing area":
|
193 |
-
# download_gfm_geojson(area_name)
|
194 |
-
download_gfm_geojson(
|
195 |
-
selected_area,
|
196 |
-
bbox=bboxes[selected_area][selected_date_range]["bounding_box"],
|
197 |
-
)
|
198 |
|
199 |
# Display that getting the files is finished
|
200 |
st.markdown("Getting GFM files finished")
|
|
|
38 |
col1, col2 = row1.columns([2, 1])
|
39 |
feat_group_selected_area = folium.FeatureGroup(name="selected_area")
|
40 |
with col1:
|
41 |
+
with open("./bboxes/bboxes.json", "r") as f:
|
42 |
+
bboxes = json.load(f)
|
43 |
+
selected_area = st.selectbox("Select saved area", options=bboxes.keys())
|
44 |
+
|
45 |
+
# retrieve and select available dates
|
46 |
+
if selected_area:
|
47 |
+
area_folder = Path(f"./output/{selected_area}")
|
48 |
+
if area_folder.exists():
|
49 |
+
available_product_times = [
|
50 |
+
str(f.name) for f in area_folder.iterdir() if f.is_dir()
|
51 |
+
]
|
52 |
+
|
53 |
+
available_product_times = [
|
54 |
+
prod_time.replace("_", ":") for prod_time in available_product_times
|
55 |
+
]
|
56 |
+
selected_product_time = st.selectbox(
|
57 |
+
"Select available date range", options=available_product_times
|
58 |
)
|
59 |
+
else:
|
60 |
+
selected_product_time = None
|
61 |
|
62 |
+
# display the bounding box
|
63 |
+
bounding_box = bboxes[selected_area]["bounding_box"]
|
64 |
+
geojson_selected_area = folium.GeoJson(bounding_box)
|
65 |
+
feat_group_selected_area.add_child(geojson_selected_area)
|
66 |
|
67 |
+
# geojson_selected_area = folium.GeoJson(bboxes[selected_area])
|
68 |
+
# feat_group_selected_area.add_child(geojson_selected_area)
|
69 |
+
if selected_product_time:
|
70 |
geojson_flood_area = get_existing_flood_geojson(
|
71 |
+
selected_area, selected_product_time
|
72 |
)
|
73 |
feat_group_selected_area.add_child(geojson_flood_area)
|
74 |
|
|
|
|
|
75 |
# Add collapsable container for input map
|
76 |
with st.expander("Input map", expanded=True):
|
77 |
# Create folium map
|
|
|
86 |
# this is necessary to start up the page
|
87 |
folium_map = folium.Map(location=[39, 0], zoom_start=8)
|
88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
m = st_folium(
|
90 |
folium_map,
|
91 |
width=800,
|
|
|
94 |
)
|
95 |
with col2:
|
96 |
# Add collapsable container for image dates
|
97 |
+
with st.expander("Choose Dates", expanded=True):
|
98 |
start_date = st.date_input("Start date")
|
99 |
end_date = st.date_input("End date")
|
100 |
# Add collapsable container for parameters
|
|
|
102 |
# Add slider for threshold
|
103 |
st.text("Add relevant (API) parameters here")
|
104 |
|
105 |
+
submitted = st.button("Update flood extent")
|
|
|
|
|
|
|
|
|
|
|
106 |
|
107 |
|
108 |
# If the button is clicked do the following
|
|
|
111 |
# Some basic validation on dates and that there's an area if relevant
|
112 |
get_gfm = True
|
113 |
check_dates = start_date <= end_date
|
|
|
|
|
114 |
|
115 |
# Output error if dates are not valid
|
116 |
if not check_dates:
|
117 |
st.error("Make sure that the dates were inserted correctly")
|
118 |
get_gfm = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
|
120 |
# Only if checks pass go and get the GFM data
|
121 |
if get_gfm:
|
|
|
|
|
|
|
|
|
|
|
122 |
# Show loader because it will take a while
|
123 |
with st.spinner("Getting GFM files... Please wait..."):
|
124 |
+
# download_gfm_geojson(area_name)
|
125 |
+
download_gfm_geojson(
|
126 |
+
selected_area, from_date=start_date, to_date=end_date
|
127 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
|
129 |
# Display that getting the files is finished
|
130 |
st.markdown("Getting GFM files finished")
|
app/src/gfm.py
CHANGED
@@ -51,7 +51,9 @@ def sync_cached_data(bboxes_path="./bboxes/bboxes.json", output_dir="./output"):
|
|
51 |
print(f"Error: {bboxes_path} is not a valid JSON file.")
|
52 |
|
53 |
|
54 |
-
def download_gfm_geojson(
|
|
|
|
|
55 |
"""
|
56 |
Should provide an existing area name or a new area name with new_coordinates
|
57 |
"""
|
@@ -70,21 +72,6 @@ def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path
|
|
70 |
header = {"Authorization": f"bearer {access_token}"}
|
71 |
print("logged in")
|
72 |
|
73 |
-
# Only if new coordinates are provided create the AOI in GFM
|
74 |
-
if new_coordinates:
|
75 |
-
# Create area of impact
|
76 |
-
create_aoi_url = f"{base_url}/aoi/create"
|
77 |
-
|
78 |
-
payload = {
|
79 |
-
"aoi_name": area_name,
|
80 |
-
"description": area_name,
|
81 |
-
"user_id": user_id,
|
82 |
-
"geoJSON": {"type": "Polygon", "coordinates": [new_coordinates]},
|
83 |
-
}
|
84 |
-
|
85 |
-
r = requests.post(url=create_aoi_url, json=payload, headers=header)
|
86 |
-
print("Posted new AOI")
|
87 |
-
|
88 |
# Get Area of Impact
|
89 |
aoi_url = f"{base_url}/aoi/user/{user_id}"
|
90 |
response = requests.get(aoi_url, headers=header)
|
@@ -96,24 +83,30 @@ def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path
|
|
96 |
break
|
97 |
|
98 |
# Get all product IDs
|
|
|
|
|
|
|
|
|
|
|
99 |
prod_url = f"{base_url}/aoi/{aoi_id}/products"
|
100 |
-
response = requests.get(prod_url, headers=header)
|
101 |
products = response.json()["products"]
|
102 |
print(f"Found {len(products)} products for {area_name}")
|
103 |
|
104 |
-
# Set output path
|
105 |
if not output_file_path:
|
106 |
-
|
107 |
-
|
108 |
-
Path(output_file_path).mkdir(parents=True, exist_ok=True)
|
109 |
-
|
110 |
-
# Remove existing flood files before downloading
|
111 |
-
for f in Path(output_file_path).glob("*FLOOD*.geojson"):
|
112 |
-
f.unlink()
|
113 |
|
114 |
# Download all available flood products
|
115 |
for product in products:
|
116 |
product_id = product["product_id"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
print(f"Downloading product: {product_id}")
|
118 |
|
119 |
download_url = f"{base_url}/download/product/{product_id}"
|
@@ -129,20 +122,16 @@ def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path
|
|
129 |
print("Done!")
|
130 |
|
131 |
|
132 |
-
def get_existing_flood_geojson(area_name,
|
133 |
"""
|
134 |
Getting a saved GFM flood geojson in an output folder of GFM files. Merge in one feature group if multiple.
|
135 |
"""
|
136 |
-
|
137 |
if not output_file_path:
|
138 |
-
output_file_path = f"./output/{area_name}/{
|
139 |
-
|
140 |
-
# Ensure the output directory exists
|
141 |
-
# if not Path(output_file_path).exists():
|
142 |
-
# raise FloodGeoJsonError(f"Error: Output folder '{output_file_path}' does not exist.")
|
143 |
|
144 |
# Combine multiple flood files into a FeatureGroup
|
145 |
-
flood_geojson_group = folium.FeatureGroup(name=f"{area_name} Floods {
|
146 |
|
147 |
for flood_file in Path(output_file_path).glob("*FLOOD*.geojson"):
|
148 |
with open(flood_file, "r") as f:
|
@@ -153,9 +142,3 @@ def get_existing_flood_geojson(area_name, date_range, output_file_path=None):
|
|
153 |
# TODO: consider merging multiple flood layers into one, to avoid overlap
|
154 |
|
155 |
return flood_geojson_group
|
156 |
-
|
157 |
-
|
158 |
-
if __name__ == "__main__":
|
159 |
-
# download_gfm_geojson('Catania')
|
160 |
-
gj = get_existing_flood_geojson("Albufera Floods")
|
161 |
-
print(type(gj))
|
|
|
51 |
print(f"Error: {bboxes_path} is not a valid JSON file.")
|
52 |
|
53 |
|
54 |
+
def download_gfm_geojson(
|
55 |
+
area_name, from_date=None, to_date=None, output_file_path=None
|
56 |
+
):
|
57 |
"""
|
58 |
Should provide an existing area name or a new area name with new_coordinates
|
59 |
"""
|
|
|
72 |
header = {"Authorization": f"bearer {access_token}"}
|
73 |
print("logged in")
|
74 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
# Get Area of Impact
|
76 |
aoi_url = f"{base_url}/aoi/user/{user_id}"
|
77 |
response = requests.get(aoi_url, headers=header)
|
|
|
83 |
break
|
84 |
|
85 |
# Get all product IDs
|
86 |
+
params = {
|
87 |
+
"time": "range",
|
88 |
+
"from": f"{from_date}T00:00:00",
|
89 |
+
"to": f"{to_date}T00:00:00",
|
90 |
+
}
|
91 |
prod_url = f"{base_url}/aoi/{aoi_id}/products"
|
92 |
+
response = requests.get(prod_url, headers=header, params=params)
|
93 |
products = response.json()["products"]
|
94 |
print(f"Found {len(products)} products for {area_name}")
|
95 |
|
|
|
96 |
if not output_file_path:
|
97 |
+
base_file_path = "./output"
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
|
99 |
# Download all available flood products
|
100 |
for product in products:
|
101 |
product_id = product["product_id"]
|
102 |
+
|
103 |
+
# Converts product_time from e.g. "2025-01-05T06:10:37" to ""2025-01-05 06h
|
104 |
+
# Reason for bucketing per hour is that products are often seconds or minutes apart and should be grouped
|
105 |
+
product_time = product["product_time"]
|
106 |
+
product_time = product_time.split(":")[0].replace("T", " ") + "h"
|
107 |
+
output_file_path = f"{base_file_path}/{area_name}/{product_time}"
|
108 |
+
Path(output_file_path).mkdir(parents=True, exist_ok=True)
|
109 |
+
|
110 |
print(f"Downloading product: {product_id}")
|
111 |
|
112 |
download_url = f"{base_url}/download/product/{product_id}"
|
|
|
122 |
print("Done!")
|
123 |
|
124 |
|
125 |
+
def get_existing_flood_geojson(area_name, product_time, output_file_path=None):
|
126 |
"""
|
127 |
Getting a saved GFM flood geojson in an output folder of GFM files. Merge in one feature group if multiple.
|
128 |
"""
|
129 |
+
product_time = product_time.replace(":", "_")
|
130 |
if not output_file_path:
|
131 |
+
output_file_path = f"./output/{area_name}/{product_time}"
|
|
|
|
|
|
|
|
|
132 |
|
133 |
# Combine multiple flood files into a FeatureGroup
|
134 |
+
flood_geojson_group = folium.FeatureGroup(name=f"{area_name} Floods {product_time}")
|
135 |
|
136 |
for flood_file in Path(output_file_path).glob("*FLOOD*.geojson"):
|
137 |
with open(flood_file, "r") as f:
|
|
|
142 |
# TODO: consider merging multiple flood layers into one, to avoid overlap
|
143 |
|
144 |
return flood_geojson_group
|
|
|
|
|
|
|
|
|
|
|
|
bboxes/bboxes.json
CHANGED
@@ -1 +1,167 @@
|
|
1 |
-
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"Valencia": {
|
3 |
+
"bounding_box": {
|
4 |
+
"type": "Feature",
|
5 |
+
"properties": {},
|
6 |
+
"geometry": {
|
7 |
+
"type": "Polygon",
|
8 |
+
"coordinates": [
|
9 |
+
[
|
10 |
+
[
|
11 |
+
-1.098633,
|
12 |
+
39.227998
|
13 |
+
],
|
14 |
+
[
|
15 |
+
-1.098633,
|
16 |
+
39.639538
|
17 |
+
],
|
18 |
+
[
|
19 |
+
0.439453,
|
20 |
+
39.639538
|
21 |
+
],
|
22 |
+
[
|
23 |
+
0.439453,
|
24 |
+
39.227998
|
25 |
+
],
|
26 |
+
[
|
27 |
+
-1.098633,
|
28 |
+
39.227998
|
29 |
+
]
|
30 |
+
]
|
31 |
+
]
|
32 |
+
}
|
33 |
+
}
|
34 |
+
},
|
35 |
+
"Tsjad": {
|
36 |
+
"bounding_box": {
|
37 |
+
"type": "Feature",
|
38 |
+
"properties": {},
|
39 |
+
"geometry": {
|
40 |
+
"type": "Polygon",
|
41 |
+
"coordinates": [
|
42 |
+
[
|
43 |
+
[
|
44 |
+
17.050781,
|
45 |
+
9.178025
|
46 |
+
],
|
47 |
+
[
|
48 |
+
17.050781,
|
49 |
+
11.18918
|
50 |
+
],
|
51 |
+
[
|
52 |
+
20.313721,
|
53 |
+
11.18918
|
54 |
+
],
|
55 |
+
[
|
56 |
+
20.313721,
|
57 |
+
9.178025
|
58 |
+
],
|
59 |
+
[
|
60 |
+
17.050781,
|
61 |
+
9.178025
|
62 |
+
]
|
63 |
+
]
|
64 |
+
]
|
65 |
+
}
|
66 |
+
}
|
67 |
+
},
|
68 |
+
"Uganda": {
|
69 |
+
"bounding_box": {
|
70 |
+
"type": "Feature",
|
71 |
+
"properties": {},
|
72 |
+
"geometry": {
|
73 |
+
"type": "Polygon",
|
74 |
+
"coordinates": [
|
75 |
+
[
|
76 |
+
[
|
77 |
+
32.519531,
|
78 |
+
0.966751
|
79 |
+
],
|
80 |
+
[
|
81 |
+
32.519531,
|
82 |
+
2.921097
|
83 |
+
],
|
84 |
+
[
|
85 |
+
34.145508,
|
86 |
+
2.921097
|
87 |
+
],
|
88 |
+
[
|
89 |
+
34.145508,
|
90 |
+
0.966751
|
91 |
+
],
|
92 |
+
[
|
93 |
+
32.519531,
|
94 |
+
0.966751
|
95 |
+
]
|
96 |
+
]
|
97 |
+
]
|
98 |
+
}
|
99 |
+
}
|
100 |
+
},
|
101 |
+
"Pego": {
|
102 |
+
"bounding_box": {
|
103 |
+
"type": "Feature",
|
104 |
+
"properties": {},
|
105 |
+
"geometry": {
|
106 |
+
"type": "Polygon",
|
107 |
+
"coordinates": [
|
108 |
+
[
|
109 |
+
[
|
110 |
+
-0.085831,
|
111 |
+
38.867781
|
112 |
+
],
|
113 |
+
[
|
114 |
+
-0.085831,
|
115 |
+
38.884085
|
116 |
+
],
|
117 |
+
[
|
118 |
+
-0.058966,
|
119 |
+
38.884085
|
120 |
+
],
|
121 |
+
[
|
122 |
+
-0.058966,
|
123 |
+
38.867781
|
124 |
+
],
|
125 |
+
[
|
126 |
+
-0.085831,
|
127 |
+
38.867781
|
128 |
+
]
|
129 |
+
]
|
130 |
+
]
|
131 |
+
}
|
132 |
+
}
|
133 |
+
},
|
134 |
+
"Albufera": {
|
135 |
+
"bounding_box": {
|
136 |
+
"type": "Feature",
|
137 |
+
"properties": {},
|
138 |
+
"geometry": {
|
139 |
+
"type": "Polygon",
|
140 |
+
"coordinates": [
|
141 |
+
[
|
142 |
+
[
|
143 |
+
-0.410614,
|
144 |
+
39.2615
|
145 |
+
],
|
146 |
+
[
|
147 |
+
-0.410614,
|
148 |
+
39.373057
|
149 |
+
],
|
150 |
+
[
|
151 |
+
-0.263672,
|
152 |
+
39.373057
|
153 |
+
],
|
154 |
+
[
|
155 |
+
-0.263672,
|
156 |
+
39.2615
|
157 |
+
],
|
158 |
+
[
|
159 |
+
-0.410614,
|
160 |
+
39.2615
|
161 |
+
]
|
162 |
+
]
|
163 |
+
]
|
164 |
+
}
|
165 |
+
}
|
166 |
+
}
|
167 |
+
}
|
pyproject.toml
CHANGED
@@ -11,4 +11,5 @@ dependencies = [
|
|
11 |
"python-dotenv==1.0.1",
|
12 |
"streamlit>=1.41.1",
|
13 |
"streamlit-folium>=0.24.0",
|
14 |
-
|
|
|
|
11 |
"python-dotenv==1.0.1",
|
12 |
"streamlit>=1.41.1",
|
13 |
"streamlit-folium>=0.24.0",
|
14 |
+
"ipykernel>=6.29.5",
|
15 |
+
]
|
uv.lock
CHANGED
@@ -17,6 +17,24 @@ wheels = [
|
|
17 |
{ url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 },
|
18 |
]
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
[[package]]
|
21 |
name = "attrs"
|
22 |
version = "25.1.0"
|
@@ -65,6 +83,39 @@ wheels = [
|
|
65 |
{ url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
|
66 |
]
|
67 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
[[package]]
|
69 |
name = "charset-normalizer"
|
70 |
version = "3.4.1"
|
@@ -121,6 +172,53 @@ wheels = [
|
|
121 |
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
|
122 |
]
|
123 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
[[package]]
|
125 |
name = "flood-mapping-gfm"
|
126 |
version = "0.1.0"
|
@@ -128,6 +226,7 @@ source = { virtual = "." }
|
|
128 |
dependencies = [
|
129 |
{ name = "folium" },
|
130 |
{ name = "geopandas" },
|
|
|
131 |
{ name = "python-dotenv" },
|
132 |
{ name = "requests" },
|
133 |
{ name = "streamlit" },
|
@@ -138,6 +237,7 @@ dependencies = [
|
|
138 |
requires-dist = [
|
139 |
{ name = "folium", specifier = ">=0.19.4" },
|
140 |
{ name = "geopandas", specifier = ">=1.0.1" },
|
|
|
141 |
{ name = "python-dotenv", specifier = "==1.0.1" },
|
142 |
{ name = "requests", specifier = ">=2.32.3" },
|
143 |
{ name = "streamlit", specifier = ">=1.41.1" },
|
@@ -210,6 +310,62 @@ wheels = [
|
|
210 |
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
|
211 |
]
|
212 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
213 |
[[package]]
|
214 |
name = "jinja2"
|
215 |
version = "3.1.5"
|
@@ -249,6 +405,36 @@ wheels = [
|
|
249 |
{ url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
|
250 |
]
|
251 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
[[package]]
|
253 |
name = "markdown-it-py"
|
254 |
version = "3.0.0"
|
@@ -299,6 +485,18 @@ wheels = [
|
|
299 |
{ url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
|
300 |
]
|
301 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
302 |
[[package]]
|
303 |
name = "mdurl"
|
304 |
version = "0.1.2"
|
@@ -317,6 +515,15 @@ wheels = [
|
|
317 |
{ url = "https://files.pythonhosted.org/packages/8a/19/cb00eca0ce44c5a197b1a084d66f3fb41c07625efdd69b22bfd9bf8b0e3e/narwhals-1.24.0-py3-none-any.whl", hash = "sha256:73ff60578641059221de2e4f337bfdf0260378fb1553f787d27411602cfc5e72", size = 308077 },
|
318 |
]
|
319 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
320 |
[[package]]
|
321 |
name = "numpy"
|
322 |
version = "2.2.2"
|
@@ -398,6 +605,27 @@ wheels = [
|
|
398 |
{ url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
|
399 |
]
|
400 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
401 |
[[package]]
|
402 |
name = "pillow"
|
403 |
version = "11.1.0"
|
@@ -436,6 +664,27 @@ wheels = [
|
|
436 |
{ url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
|
437 |
]
|
438 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
439 |
[[package]]
|
440 |
name = "protobuf"
|
441 |
version = "5.29.3"
|
@@ -450,6 +699,39 @@ wheels = [
|
|
450 |
{ url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 },
|
451 |
]
|
452 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
453 |
[[package]]
|
454 |
name = "pyarrow"
|
455 |
version = "19.0.0"
|
@@ -478,6 +760,15 @@ wheels = [
|
|
478 |
{ url = "https://files.pythonhosted.org/packages/36/ef/1d7975053af9d106da973bac142d0d4da71b7550a3576cc3e0b3f444d21a/pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89", size = 42077618 },
|
479 |
]
|
480 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
481 |
[[package]]
|
482 |
name = "pydeck"
|
483 |
version = "0.9.1"
|
@@ -578,6 +869,63 @@ wheels = [
|
|
578 |
{ url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
|
579 |
]
|
580 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
581 |
[[package]]
|
582 |
name = "referencing"
|
583 |
version = "0.36.2"
|
@@ -708,6 +1056,20 @@ wheels = [
|
|
708 |
{ url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 },
|
709 |
]
|
710 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
711 |
[[package]]
|
712 |
name = "streamlit"
|
713 |
version = "1.41.1"
|
@@ -789,6 +1151,15 @@ wheels = [
|
|
789 |
{ url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 },
|
790 |
]
|
791 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
792 |
[[package]]
|
793 |
name = "typing-extensions"
|
794 |
version = "4.12.2"
|
@@ -834,6 +1205,15 @@ wheels = [
|
|
834 |
{ url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
|
835 |
]
|
836 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
837 |
[[package]]
|
838 |
name = "xyzservices"
|
839 |
version = "2025.1.0"
|
|
|
17 |
{ url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 },
|
18 |
]
|
19 |
|
20 |
+
[[package]]
|
21 |
+
name = "appnope"
|
22 |
+
version = "0.1.4"
|
23 |
+
source = { registry = "https://pypi.org/simple" }
|
24 |
+
sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 }
|
25 |
+
wheels = [
|
26 |
+
{ url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
|
27 |
+
]
|
28 |
+
|
29 |
+
[[package]]
|
30 |
+
name = "asttokens"
|
31 |
+
version = "3.0.0"
|
32 |
+
source = { registry = "https://pypi.org/simple" }
|
33 |
+
sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 }
|
34 |
+
wheels = [
|
35 |
+
{ url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 },
|
36 |
+
]
|
37 |
+
|
38 |
[[package]]
|
39 |
name = "attrs"
|
40 |
version = "25.1.0"
|
|
|
83 |
{ url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
|
84 |
]
|
85 |
|
86 |
+
[[package]]
|
87 |
+
name = "cffi"
|
88 |
+
version = "1.17.1"
|
89 |
+
source = { registry = "https://pypi.org/simple" }
|
90 |
+
dependencies = [
|
91 |
+
{ name = "pycparser" },
|
92 |
+
]
|
93 |
+
sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
|
94 |
+
wheels = [
|
95 |
+
{ url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 },
|
96 |
+
{ url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 },
|
97 |
+
{ url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 },
|
98 |
+
{ url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 },
|
99 |
+
{ url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 },
|
100 |
+
{ url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 },
|
101 |
+
{ url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 },
|
102 |
+
{ url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 },
|
103 |
+
{ url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 },
|
104 |
+
{ url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 },
|
105 |
+
{ url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 },
|
106 |
+
{ url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
|
107 |
+
{ url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
|
108 |
+
{ url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
|
109 |
+
{ url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
|
110 |
+
{ url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
|
111 |
+
{ url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
|
112 |
+
{ url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
|
113 |
+
{ url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
|
114 |
+
{ url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
|
115 |
+
{ url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
|
116 |
+
{ url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
|
117 |
+
]
|
118 |
+
|
119 |
[[package]]
|
120 |
name = "charset-normalizer"
|
121 |
version = "3.4.1"
|
|
|
172 |
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
|
173 |
]
|
174 |
|
175 |
+
[[package]]
|
176 |
+
name = "comm"
|
177 |
+
version = "0.2.2"
|
178 |
+
source = { registry = "https://pypi.org/simple" }
|
179 |
+
dependencies = [
|
180 |
+
{ name = "traitlets" },
|
181 |
+
]
|
182 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 }
|
183 |
+
wheels = [
|
184 |
+
{ url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 },
|
185 |
+
]
|
186 |
+
|
187 |
+
[[package]]
|
188 |
+
name = "debugpy"
|
189 |
+
version = "1.8.12"
|
190 |
+
source = { registry = "https://pypi.org/simple" }
|
191 |
+
sdist = { url = "https://files.pythonhosted.org/packages/68/25/c74e337134edf55c4dfc9af579eccb45af2393c40960e2795a94351e8140/debugpy-1.8.12.tar.gz", hash = "sha256:646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce", size = 1641122 }
|
192 |
+
wheels = [
|
193 |
+
{ url = "https://files.pythonhosted.org/packages/ba/e6/0f876ecfe5831ebe4762b19214364753c8bc2b357d28c5d739a1e88325c7/debugpy-1.8.12-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:7e94b643b19e8feb5215fa508aee531387494bf668b2eca27fa769ea11d9f498", size = 2500846 },
|
194 |
+
{ url = "https://files.pythonhosted.org/packages/19/64/33f41653a701f3cd2cbff8b41ebaad59885b3428b5afd0d93d16012ecf17/debugpy-1.8.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086b32e233e89a2740c1615c2f775c34ae951508b28b308681dbbb87bba97d06", size = 4222181 },
|
195 |
+
{ url = "https://files.pythonhosted.org/packages/32/a6/02646cfe50bfacc9b71321c47dc19a46e35f4e0aceea227b6d205e900e34/debugpy-1.8.12-cp312-cp312-win32.whl", hash = "sha256:2ae5df899732a6051b49ea2632a9ea67f929604fd2b036613a9f12bc3163b92d", size = 5227017 },
|
196 |
+
{ url = "https://files.pythonhosted.org/packages/da/a6/10056431b5c47103474312cf4a2ec1001f73e0b63b1216706d5fef2531eb/debugpy-1.8.12-cp312-cp312-win_amd64.whl", hash = "sha256:39dfbb6fa09f12fae32639e3286112fc35ae976114f1f3d37375f3130a820969", size = 5267555 },
|
197 |
+
{ url = "https://files.pythonhosted.org/packages/cf/4d/7c3896619a8791effd5d8c31f0834471fc8f8fb3047ec4f5fc69dd1393dd/debugpy-1.8.12-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:696d8ae4dff4cbd06bf6b10d671e088b66669f110c7c4e18a44c43cf75ce966f", size = 2485246 },
|
198 |
+
{ url = "https://files.pythonhosted.org/packages/99/46/bc6dcfd7eb8cc969a5716d858e32485eb40c72c6a8dc88d1e3a4d5e95813/debugpy-1.8.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:898fba72b81a654e74412a67c7e0a81e89723cfe2a3ea6fcd3feaa3395138ca9", size = 4218616 },
|
199 |
+
{ url = "https://files.pythonhosted.org/packages/03/dd/d7fcdf0381a9b8094da1f6a1c9f19fed493a4f8576a2682349b3a8b20ec7/debugpy-1.8.12-cp313-cp313-win32.whl", hash = "sha256:22a11c493c70413a01ed03f01c3c3a2fc4478fc6ee186e340487b2edcd6f4180", size = 5226540 },
|
200 |
+
{ url = "https://files.pythonhosted.org/packages/25/bd/ecb98f5b5fc7ea0bfbb3c355bc1dd57c198a28780beadd1e19915bf7b4d9/debugpy-1.8.12-cp313-cp313-win_amd64.whl", hash = "sha256:fdb3c6d342825ea10b90e43d7f20f01535a72b3a1997850c0c3cefa5c27a4a2c", size = 5267134 },
|
201 |
+
{ url = "https://files.pythonhosted.org/packages/38/c4/5120ad36405c3008f451f94b8f92ef1805b1e516f6ff870f331ccb3c4cc0/debugpy-1.8.12-py2.py3-none-any.whl", hash = "sha256:274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6", size = 5229490 },
|
202 |
+
]
|
203 |
+
|
204 |
+
[[package]]
|
205 |
+
name = "decorator"
|
206 |
+
version = "5.1.1"
|
207 |
+
source = { registry = "https://pypi.org/simple" }
|
208 |
+
sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 }
|
209 |
+
wheels = [
|
210 |
+
{ url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
|
211 |
+
]
|
212 |
+
|
213 |
+
[[package]]
|
214 |
+
name = "executing"
|
215 |
+
version = "2.2.0"
|
216 |
+
source = { registry = "https://pypi.org/simple" }
|
217 |
+
sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 }
|
218 |
+
wheels = [
|
219 |
+
{ url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 },
|
220 |
+
]
|
221 |
+
|
222 |
[[package]]
|
223 |
name = "flood-mapping-gfm"
|
224 |
version = "0.1.0"
|
|
|
226 |
dependencies = [
|
227 |
{ name = "folium" },
|
228 |
{ name = "geopandas" },
|
229 |
+
{ name = "ipykernel" },
|
230 |
{ name = "python-dotenv" },
|
231 |
{ name = "requests" },
|
232 |
{ name = "streamlit" },
|
|
|
237 |
requires-dist = [
|
238 |
{ name = "folium", specifier = ">=0.19.4" },
|
239 |
{ name = "geopandas", specifier = ">=1.0.1" },
|
240 |
+
{ name = "ipykernel", specifier = ">=6.29.5" },
|
241 |
{ name = "python-dotenv", specifier = "==1.0.1" },
|
242 |
{ name = "requests", specifier = ">=2.32.3" },
|
243 |
{ name = "streamlit", specifier = ">=1.41.1" },
|
|
|
310 |
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
|
311 |
]
|
312 |
|
313 |
+
[[package]]
|
314 |
+
name = "ipykernel"
|
315 |
+
version = "6.29.5"
|
316 |
+
source = { registry = "https://pypi.org/simple" }
|
317 |
+
dependencies = [
|
318 |
+
{ name = "appnope", marker = "sys_platform == 'darwin'" },
|
319 |
+
{ name = "comm" },
|
320 |
+
{ name = "debugpy" },
|
321 |
+
{ name = "ipython" },
|
322 |
+
{ name = "jupyter-client" },
|
323 |
+
{ name = "jupyter-core" },
|
324 |
+
{ name = "matplotlib-inline" },
|
325 |
+
{ name = "nest-asyncio" },
|
326 |
+
{ name = "packaging" },
|
327 |
+
{ name = "psutil" },
|
328 |
+
{ name = "pyzmq" },
|
329 |
+
{ name = "tornado" },
|
330 |
+
{ name = "traitlets" },
|
331 |
+
]
|
332 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 }
|
333 |
+
wheels = [
|
334 |
+
{ url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 },
|
335 |
+
]
|
336 |
+
|
337 |
+
[[package]]
|
338 |
+
name = "ipython"
|
339 |
+
version = "8.32.0"
|
340 |
+
source = { registry = "https://pypi.org/simple" }
|
341 |
+
dependencies = [
|
342 |
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
343 |
+
{ name = "decorator" },
|
344 |
+
{ name = "jedi" },
|
345 |
+
{ name = "matplotlib-inline" },
|
346 |
+
{ name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
|
347 |
+
{ name = "prompt-toolkit" },
|
348 |
+
{ name = "pygments" },
|
349 |
+
{ name = "stack-data" },
|
350 |
+
{ name = "traitlets" },
|
351 |
+
]
|
352 |
+
sdist = { url = "https://files.pythonhosted.org/packages/36/80/4d2a072e0db7d250f134bc11676517299264ebe16d62a8619d49a78ced73/ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251", size = 5507441 }
|
353 |
+
wheels = [
|
354 |
+
{ url = "https://files.pythonhosted.org/packages/e7/e1/f4474a7ecdb7745a820f6f6039dc43c66add40f1bcc66485607d93571af6/ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa", size = 825524 },
|
355 |
+
]
|
356 |
+
|
357 |
+
[[package]]
|
358 |
+
name = "jedi"
|
359 |
+
version = "0.19.2"
|
360 |
+
source = { registry = "https://pypi.org/simple" }
|
361 |
+
dependencies = [
|
362 |
+
{ name = "parso" },
|
363 |
+
]
|
364 |
+
sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 }
|
365 |
+
wheels = [
|
366 |
+
{ url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 },
|
367 |
+
]
|
368 |
+
|
369 |
[[package]]
|
370 |
name = "jinja2"
|
371 |
version = "3.1.5"
|
|
|
405 |
{ url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
|
406 |
]
|
407 |
|
408 |
+
[[package]]
|
409 |
+
name = "jupyter-client"
|
410 |
+
version = "8.6.3"
|
411 |
+
source = { registry = "https://pypi.org/simple" }
|
412 |
+
dependencies = [
|
413 |
+
{ name = "jupyter-core" },
|
414 |
+
{ name = "python-dateutil" },
|
415 |
+
{ name = "pyzmq" },
|
416 |
+
{ name = "tornado" },
|
417 |
+
{ name = "traitlets" },
|
418 |
+
]
|
419 |
+
sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 }
|
420 |
+
wheels = [
|
421 |
+
{ url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 },
|
422 |
+
]
|
423 |
+
|
424 |
+
[[package]]
|
425 |
+
name = "jupyter-core"
|
426 |
+
version = "5.7.2"
|
427 |
+
source = { registry = "https://pypi.org/simple" }
|
428 |
+
dependencies = [
|
429 |
+
{ name = "platformdirs" },
|
430 |
+
{ name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" },
|
431 |
+
{ name = "traitlets" },
|
432 |
+
]
|
433 |
+
sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 }
|
434 |
+
wheels = [
|
435 |
+
{ url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
|
436 |
+
]
|
437 |
+
|
438 |
[[package]]
|
439 |
name = "markdown-it-py"
|
440 |
version = "3.0.0"
|
|
|
485 |
{ url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
|
486 |
]
|
487 |
|
488 |
+
[[package]]
|
489 |
+
name = "matplotlib-inline"
|
490 |
+
version = "0.1.7"
|
491 |
+
source = { registry = "https://pypi.org/simple" }
|
492 |
+
dependencies = [
|
493 |
+
{ name = "traitlets" },
|
494 |
+
]
|
495 |
+
sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 }
|
496 |
+
wheels = [
|
497 |
+
{ url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
|
498 |
+
]
|
499 |
+
|
500 |
[[package]]
|
501 |
name = "mdurl"
|
502 |
version = "0.1.2"
|
|
|
515 |
{ url = "https://files.pythonhosted.org/packages/8a/19/cb00eca0ce44c5a197b1a084d66f3fb41c07625efdd69b22bfd9bf8b0e3e/narwhals-1.24.0-py3-none-any.whl", hash = "sha256:73ff60578641059221de2e4f337bfdf0260378fb1553f787d27411602cfc5e72", size = 308077 },
|
516 |
]
|
517 |
|
518 |
+
[[package]]
|
519 |
+
name = "nest-asyncio"
|
520 |
+
version = "1.6.0"
|
521 |
+
source = { registry = "https://pypi.org/simple" }
|
522 |
+
sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 }
|
523 |
+
wheels = [
|
524 |
+
{ url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 },
|
525 |
+
]
|
526 |
+
|
527 |
[[package]]
|
528 |
name = "numpy"
|
529 |
version = "2.2.2"
|
|
|
605 |
{ url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
|
606 |
]
|
607 |
|
608 |
+
[[package]]
|
609 |
+
name = "parso"
|
610 |
+
version = "0.8.4"
|
611 |
+
source = { registry = "https://pypi.org/simple" }
|
612 |
+
sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 }
|
613 |
+
wheels = [
|
614 |
+
{ url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 },
|
615 |
+
]
|
616 |
+
|
617 |
+
[[package]]
|
618 |
+
name = "pexpect"
|
619 |
+
version = "4.9.0"
|
620 |
+
source = { registry = "https://pypi.org/simple" }
|
621 |
+
dependencies = [
|
622 |
+
{ name = "ptyprocess" },
|
623 |
+
]
|
624 |
+
sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
|
625 |
+
wheels = [
|
626 |
+
{ url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
|
627 |
+
]
|
628 |
+
|
629 |
[[package]]
|
630 |
name = "pillow"
|
631 |
version = "11.1.0"
|
|
|
664 |
{ url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
|
665 |
]
|
666 |
|
667 |
+
[[package]]
|
668 |
+
name = "platformdirs"
|
669 |
+
version = "4.3.6"
|
670 |
+
source = { registry = "https://pypi.org/simple" }
|
671 |
+
sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
|
672 |
+
wheels = [
|
673 |
+
{ url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
|
674 |
+
]
|
675 |
+
|
676 |
+
[[package]]
|
677 |
+
name = "prompt-toolkit"
|
678 |
+
version = "3.0.50"
|
679 |
+
source = { registry = "https://pypi.org/simple" }
|
680 |
+
dependencies = [
|
681 |
+
{ name = "wcwidth" },
|
682 |
+
]
|
683 |
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 }
|
684 |
+
wheels = [
|
685 |
+
{ url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 },
|
686 |
+
]
|
687 |
+
|
688 |
[[package]]
|
689 |
name = "protobuf"
|
690 |
version = "5.29.3"
|
|
|
699 |
{ url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 },
|
700 |
]
|
701 |
|
702 |
+
[[package]]
|
703 |
+
name = "psutil"
|
704 |
+
version = "7.0.0"
|
705 |
+
source = { registry = "https://pypi.org/simple" }
|
706 |
+
sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 }
|
707 |
+
wheels = [
|
708 |
+
{ url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 },
|
709 |
+
{ url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 },
|
710 |
+
{ url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 },
|
711 |
+
{ url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 },
|
712 |
+
{ url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 },
|
713 |
+
{ url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 },
|
714 |
+
{ url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 },
|
715 |
+
]
|
716 |
+
|
717 |
+
[[package]]
|
718 |
+
name = "ptyprocess"
|
719 |
+
version = "0.7.0"
|
720 |
+
source = { registry = "https://pypi.org/simple" }
|
721 |
+
sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
|
722 |
+
wheels = [
|
723 |
+
{ url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
|
724 |
+
]
|
725 |
+
|
726 |
+
[[package]]
|
727 |
+
name = "pure-eval"
|
728 |
+
version = "0.2.3"
|
729 |
+
source = { registry = "https://pypi.org/simple" }
|
730 |
+
sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 }
|
731 |
+
wheels = [
|
732 |
+
{ url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
|
733 |
+
]
|
734 |
+
|
735 |
[[package]]
|
736 |
name = "pyarrow"
|
737 |
version = "19.0.0"
|
|
|
760 |
{ url = "https://files.pythonhosted.org/packages/36/ef/1d7975053af9d106da973bac142d0d4da71b7550a3576cc3e0b3f444d21a/pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89", size = 42077618 },
|
761 |
]
|
762 |
|
763 |
+
[[package]]
|
764 |
+
name = "pycparser"
|
765 |
+
version = "2.22"
|
766 |
+
source = { registry = "https://pypi.org/simple" }
|
767 |
+
sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
|
768 |
+
wheels = [
|
769 |
+
{ url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
|
770 |
+
]
|
771 |
+
|
772 |
[[package]]
|
773 |
name = "pydeck"
|
774 |
version = "0.9.1"
|
|
|
869 |
{ url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
|
870 |
]
|
871 |
|
872 |
+
[[package]]
|
873 |
+
name = "pywin32"
|
874 |
+
version = "308"
|
875 |
+
source = { registry = "https://pypi.org/simple" }
|
876 |
+
wheels = [
|
877 |
+
{ url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 },
|
878 |
+
{ url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 },
|
879 |
+
{ url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 },
|
880 |
+
{ url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 },
|
881 |
+
{ url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 },
|
882 |
+
{ url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 },
|
883 |
+
]
|
884 |
+
|
885 |
+
[[package]]
|
886 |
+
name = "pyzmq"
|
887 |
+
version = "26.2.1"
|
888 |
+
source = { registry = "https://pypi.org/simple" }
|
889 |
+
dependencies = [
|
890 |
+
{ name = "cffi", marker = "implementation_name == 'pypy'" },
|
891 |
+
]
|
892 |
+
sdist = { url = "https://files.pythonhosted.org/packages/5a/e3/8d0382cb59feb111c252b54e8728257416a38ffcb2243c4e4775a3c990fe/pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca", size = 278433 }
|
893 |
+
wheels = [
|
894 |
+
{ url = "https://files.pythonhosted.org/packages/9c/b9/260a74786f162c7f521f5f891584a51d5a42fd15f5dcaa5c9226b2865fcc/pyzmq-26.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:a6549ecb0041dafa55b5932dcbb6c68293e0bd5980b5b99f5ebb05f9a3b8a8f3", size = 1348495 },
|
895 |
+
{ url = "https://files.pythonhosted.org/packages/bf/73/8a0757e4b68f5a8ccb90ddadbb76c6a5f880266cdb18be38c99bcdc17aaa/pyzmq-26.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0250c94561f388db51fd0213cdccbd0b9ef50fd3c57ce1ac937bf3034d92d72e", size = 945035 },
|
896 |
+
{ url = "https://files.pythonhosted.org/packages/cf/de/f02ec973cd33155bb772bae33ace774acc7cc71b87b25c4829068bec35de/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ee4297d9e4b34b5dc1dd7ab5d5ea2cbba8511517ef44104d2915a917a56dc8", size = 671213 },
|
897 |
+
{ url = "https://files.pythonhosted.org/packages/d1/80/8fc583085f85ac91682744efc916888dd9f11f9f75a31aef1b78a5486c6c/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2a9cb17fd83b7a3a3009901aca828feaf20aa2451a8a487b035455a86549c09", size = 908750 },
|
898 |
+
{ url = "https://files.pythonhosted.org/packages/c3/25/0b4824596f261a3cc512ab152448b383047ff5f143a6906a36876415981c/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786dd8a81b969c2081b31b17b326d3a499ddd1856e06d6d79ad41011a25148da", size = 865416 },
|
899 |
+
{ url = "https://files.pythonhosted.org/packages/a1/d1/6fda77a034d02034367b040973fd3861d945a5347e607bd2e98c99f20599/pyzmq-26.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2d88ba221a07fc2c5581565f1d0fe8038c15711ae79b80d9462e080a1ac30435", size = 865922 },
|
900 |
+
{ url = "https://files.pythonhosted.org/packages/ad/81/48f7fd8a71c427412e739ce576fc1ee14f3dc34527ca9b0076e471676183/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c84c1297ff9f1cd2440da4d57237cb74be21fdfe7d01a10810acba04e79371a", size = 1201526 },
|
901 |
+
{ url = "https://files.pythonhosted.org/packages/c7/d8/818f15c6ef36b5450e435cbb0d3a51599fc884a5d2b27b46b9c00af68ef1/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46d4ebafc27081a7f73a0f151d0c38d4291656aa134344ec1f3d0199ebfbb6d4", size = 1512808 },
|
902 |
+
{ url = "https://files.pythonhosted.org/packages/d9/c4/b3edb7d0ae82ad6fb1a8cdb191a4113c427a01e85139906f3b655b07f4f8/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91e2bfb8e9a29f709d51b208dd5f441dc98eb412c8fe75c24ea464734ccdb48e", size = 1411836 },
|
903 |
+
{ url = "https://files.pythonhosted.org/packages/69/1c/151e3d42048f02cc5cd6dfc241d9d36b38375b4dee2e728acb5c353a6d52/pyzmq-26.2.1-cp312-cp312-win32.whl", hash = "sha256:4a98898fdce380c51cc3e38ebc9aa33ae1e078193f4dc641c047f88b8c690c9a", size = 581378 },
|
904 |
+
{ url = "https://files.pythonhosted.org/packages/b6/b9/d59a7462848aaab7277fddb253ae134a570520115d80afa85e952287e6bc/pyzmq-26.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0741edbd0adfe5f30bba6c5223b78c131b5aa4a00a223d631e5ef36e26e6d13", size = 643737 },
|
905 |
+
{ url = "https://files.pythonhosted.org/packages/55/09/f37e707937cce328944c1d57e5e50ab905011d35252a0745c4f7e5822a76/pyzmq-26.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:e5e33b1491555843ba98d5209439500556ef55b6ab635f3a01148545498355e5", size = 558303 },
|
906 |
+
{ url = "https://files.pythonhosted.org/packages/4f/2e/fa7a91ce349975971d6aa925b4c7e1a05abaae99b97ade5ace758160c43d/pyzmq-26.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23", size = 942331 },
|
907 |
+
{ url = "https://files.pythonhosted.org/packages/64/2b/1f10b34b6dc7ff4b40f668ea25ba9b8093ce61d874c784b90229b367707b/pyzmq-26.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be", size = 1345831 },
|
908 |
+
{ url = "https://files.pythonhosted.org/packages/4c/8d/34884cbd4a8ec050841b5fb58d37af136766a9f95b0b2634c2971deb09da/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399", size = 670773 },
|
909 |
+
{ url = "https://files.pythonhosted.org/packages/0f/f4/d4becfcf9e416ad2564f18a6653f7c6aa917da08df5c3760edb0baa1c863/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9", size = 908836 },
|
910 |
+
{ url = "https://files.pythonhosted.org/packages/07/fa/ab105f1b86b85cb2e821239f1d0900fccd66192a91d97ee04661b5436b4d/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab", size = 865369 },
|
911 |
+
{ url = "https://files.pythonhosted.org/packages/c9/48/15d5f415504572dd4b92b52db5de7a5befc76bb75340ba9f36f71306a66d/pyzmq-26.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce", size = 865676 },
|
912 |
+
{ url = "https://files.pythonhosted.org/packages/7e/35/2d91bcc7ccbb56043dd4d2c1763f24a8de5f05e06a134f767a7fb38e149c/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a", size = 1201457 },
|
913 |
+
{ url = "https://files.pythonhosted.org/packages/6d/bb/aa7c5119307a5762b8dca6c9db73e3ab4bccf32b15d7c4f376271ff72b2b/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9", size = 1513035 },
|
914 |
+
{ url = "https://files.pythonhosted.org/packages/4f/4c/527e6650c2fccec7750b783301329c8a8716d59423818afb67282304ce5a/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad", size = 1411881 },
|
915 |
+
{ url = "https://files.pythonhosted.org/packages/89/9f/e4412ea1b3e220acc21777a5edba8885856403d29c6999aaf00a9459eb03/pyzmq-26.2.1-cp313-cp313-win32.whl", hash = "sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb", size = 581354 },
|
916 |
+
{ url = "https://files.pythonhosted.org/packages/55/cd/f89dd3e9fc2da0d1619a82c4afb600c86b52bc72d7584953d460bc8d5027/pyzmq-26.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf", size = 643560 },
|
917 |
+
{ url = "https://files.pythonhosted.org/packages/a7/99/5de4f8912860013f1116f818a0047659bc20d71d1bc1d48f874bdc2d7b9c/pyzmq-26.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce", size = 558037 },
|
918 |
+
{ url = "https://files.pythonhosted.org/packages/06/0b/63b6d7a2f07a77dbc9768c6302ae2d7518bed0c6cee515669ca0d8ec743e/pyzmq-26.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e", size = 938580 },
|
919 |
+
{ url = "https://files.pythonhosted.org/packages/85/38/e5e2c3ffa23ea5f95f1c904014385a55902a11a67cd43c10edf61a653467/pyzmq-26.2.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891", size = 1339670 },
|
920 |
+
{ url = "https://files.pythonhosted.org/packages/d2/87/da5519ed7f8b31e4beee8f57311ec02926822fe23a95120877354cd80144/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6", size = 660983 },
|
921 |
+
{ url = "https://files.pythonhosted.org/packages/f6/e8/1ca6a2d59562e04d326a026c9e3f791a6f1a276ebde29da478843a566fdb/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a", size = 896509 },
|
922 |
+
{ url = "https://files.pythonhosted.org/packages/5c/e5/0b4688f7c74bea7e4f1e920da973fcd7d20175f4f1181cb9b692429c6bb9/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3", size = 853196 },
|
923 |
+
{ url = "https://files.pythonhosted.org/packages/8f/35/c17241da01195001828319e98517683dad0ac4df6fcba68763d61b630390/pyzmq-26.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e", size = 855133 },
|
924 |
+
{ url = "https://files.pythonhosted.org/packages/d2/14/268ee49bbecc3f72e225addeac7f0e2bd5808747b78c7bf7f87ed9f9d5a8/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7", size = 1191612 },
|
925 |
+
{ url = "https://files.pythonhosted.org/packages/5e/02/6394498620b1b4349b95c534f3ebc3aef95f39afbdced5ed7ee315c49c14/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8", size = 1500824 },
|
926 |
+
{ url = "https://files.pythonhosted.org/packages/17/fc/b79f0b72891cbb9917698add0fede71dfb64e83fa3481a02ed0e78c34be7/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460", size = 1399943 },
|
927 |
+
]
|
928 |
+
|
929 |
[[package]]
|
930 |
name = "referencing"
|
931 |
version = "0.36.2"
|
|
|
1056 |
{ url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 },
|
1057 |
]
|
1058 |
|
1059 |
+
[[package]]
|
1060 |
+
name = "stack-data"
|
1061 |
+
version = "0.6.3"
|
1062 |
+
source = { registry = "https://pypi.org/simple" }
|
1063 |
+
dependencies = [
|
1064 |
+
{ name = "asttokens" },
|
1065 |
+
{ name = "executing" },
|
1066 |
+
{ name = "pure-eval" },
|
1067 |
+
]
|
1068 |
+
sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 }
|
1069 |
+
wheels = [
|
1070 |
+
{ url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
|
1071 |
+
]
|
1072 |
+
|
1073 |
[[package]]
|
1074 |
name = "streamlit"
|
1075 |
version = "1.41.1"
|
|
|
1151 |
{ url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 },
|
1152 |
]
|
1153 |
|
1154 |
+
[[package]]
|
1155 |
+
name = "traitlets"
|
1156 |
+
version = "5.14.3"
|
1157 |
+
source = { registry = "https://pypi.org/simple" }
|
1158 |
+
sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 }
|
1159 |
+
wheels = [
|
1160 |
+
{ url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 },
|
1161 |
+
]
|
1162 |
+
|
1163 |
[[package]]
|
1164 |
name = "typing-extensions"
|
1165 |
version = "4.12.2"
|
|
|
1205 |
{ url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
|
1206 |
]
|
1207 |
|
1208 |
+
[[package]]
|
1209 |
+
name = "wcwidth"
|
1210 |
+
version = "0.2.13"
|
1211 |
+
source = { registry = "https://pypi.org/simple" }
|
1212 |
+
sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 }
|
1213 |
+
wheels = [
|
1214 |
+
{ url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
|
1215 |
+
]
|
1216 |
+
|
1217 |
[[package]]
|
1218 |
name = "xyzservices"
|
1219 |
version = "2025.1.0"
|