dd-l1-capetown-clinics-bbox
Map (reference ← swipe → agent)
0:00
I'm about to push the `capetown_clinics.csv` export through to our case-management system and I want a quick inventory check first. Can you produce a small JSON file with the total clinic count, the overall bounding box as a bbox array, and the count per subdistrict, so I can confirm every health subdistrict is represented? Please write it to `clinic_inventory.json` with keys `count`, `bbox`, and `count_per_subdistrict`.
0:00
System info
{
"adapter": "openrouter",
"model": "google/gemma-4-26b-a4b-it",
"base_url": "https://openrouter.ai/api/v1"
}
0:02
Bash
ls -F
capetown_clinics.csv
0:21
Write
/work/solve.py
content · 65 lines · py
import pandas as pd
import json
def main():
# Load the CSV
df = pd.read_csv('capetown_clinics.csv')
# Total count
total_count = len(df)
# Bounding box calculation
# Assuming columns are named 'latitude' and 'longitude' or similar.
# Let's check columns first.
print("Columns found:", df.columns.tolist())
# We'll use standard names for lat/lon or try to find them
lat_col = None
lon_col = None
for col in df.columns:
if 'lat' in col.lower():
lat_col = col
if 'lon' in col.lower() or 'lng' in col.lower():
lon_col = col
if not lat_col or not lon_col:
# If not found, we might need to check if they are named differently
# For now, let's assume we found them or error out.
raise ValueError("Could not find latitude or longitude columns.")
min_lat = df[lat_col].min()
max_lat = df[lat_col].max()
min_lon = df[lon_col].min()
max_lon = df[lon_col].max()
bbox = [min_lon, min_lat, max_lon, max_lat] # standard [minx, miny, maxx, maxy]
# Count per subdistrict
# Assuming a column named 'subdistrict' or 'health_subdistrict'
subdistrict_col = None
for col in df.columns:
if 'subdistrict' in col.lower():
subdistrict_col = col
break
if not subdistrict_col:
raise ValueError("Could not find a subdistrict column.")
count_per_subdistrict = df[subdistrict_col].value_counts().to_dict()
# Prepare JSON
inventory = {
"count": int(total_count),
"bbox": bbox,
"count_per_subdistrict": count_per_subdistrict
}
with open('clinic_inventory.json', 'w') as f:
json.dump(inventory, f, indent=4)
print("Successfully created clinic_inventory.json")
if __name__ == "__main__":
main()
Wrote /work/solve.py (1899 chars).
0:22
Bash
python solve.py
Columns found: ['clinic_id', 'name', 'subdistrict', 'wkt_geom']
Traceback (most recent call last):
File "/work/solve.py", line 64, in <module>
main()
~~~~^^
File "/work/solve.py", line 29, in main
raise ValueError("Could not find latitude or longitude columns.")
ValueError: Could not find latitude or longitude columns.
0:37
Write
/work/solve.py
content · 53 lines · py
import pandas as pd
import json
from shapely import wkt
def main():
# Load the CSV
df = pd.read_csv('capetown_clinics.csv')
# Total count
total_count = len(df)
# We have 'wkt_geom' column. Let's use it for bbox.
# The WKT column probably contains POINT(...)
# Convert WKT column to shapely geometries
df['geometry'] = df['wkt_geom'].apply(wkt.loads)
# Calculate bounding box
# We can use the combined bounds of all geometries
# or manually iterate.
all_bounds = []
for geom in df['geometry']:
all_bounds.append(geom.bounds) # (minx, miny, maxx, maxy)
import numpy as np
all_bounds_arr = np.array(all_bounds)
min_lon = all_bounds_arr[:, 0].min()
min_lat = all_bounds_arr[:, 1].min()
max_lon = all_bounds_arr[:, 2].max()
max_lat = all_bounds_arr[:, 3].max()
bbox = [min_lon, min_lat, max_lon, max_lat]
# Count per subdistrict
# Column 'subdistrict' was found in previous run
subdistrict_col = 'subdistrict'
count_per_subdistrict = df[subdistrict_col].value_counts().to_dict()
# Prepare JSON
inventory = {
"count": int(total_count),
"bbox": bbox,
"count_per_subdistrict": count_per_subdistrict
}
with open('clinic_inventory.json', 'w') as f:
json.dump(inventory, f, indent=4)
print("Successfully created clinic_inventory.json")
if __name__ == "__main__":
main()
Wrote /work/solve.py (1475 chars).
0:38
Bash
python solve.py
Successfully created clinic_inventory.json
0:42
Read
clinic_inventory.json
1 {
2 "count": 80,
3 "bbox": [
4 18.380309,
5 -34.073855,
6 18.819549,
7 -33.701317
8 ],
9 "count_per_subdistrict": {
10 "Western": 12,
11 "Southern": 12,
12 "Tygerberg": 11,
13 "Northern": 10,
14 "Eastern": 10,
15 "Klipfontein": 9,
16 "Mitchells Plain": 8,
17 "Khayelitsha": 8
18 }
19 }
0:51