Country × AEZ typology for African agriculture (FAO GAEZ v5)
# agri-complexity
Country × AEZ typology for African agriculture. Uses FAO GAEZ v5 pixel data
to build country-by-agro-ecological-zone features (yield gaps, value/ha,
crop mix), clusters zones into recurring "zone types," and benchmarks
realized yield against the GAEZ potential.
Companion project notes:
`project_africa_ag_typology.md` (Obsidian vault, internal).
## Repo layout
```
01–10 build scripts reads raw FAO/GAEZ → writes generated/
11–13 cluster zones k-means + UMAP on zone features
14–16 zone perf realized vs. potential yield
tool/ small d3 web viewer (reads tool/data/*.geojson|json)
imgs/ saved chart PNGs (tracked — used as PR previews)
data/ small reference CSVs (crop dictionary, FAO crosswalk)
```
## Code in git, data on the cluster
Anything in `generated/` or `tool/data/` is excluded from git. It lives on
the **UM6P Data Playground** under `u13/agri-complexity/` (Taimur's
namespace). Pull it with the bundled `um6p-storage` Claude skill:
```bash
# one-time, gets a bearer token
python .claude/skills/um6p-storage/dp_storage.py login --email you@um6p.ma
# pull all the generated outputs
mkdir -p generated tool/data
for f in $(python .claude/skills/um6p-storage/dp_storage.py ls u13/agri-complexity/generated \
| awk '$1 ~ /^[0-9]+$/ {print $2}'); do
python .claude/skills/um6p-storage/dp_storage.py get "$f" generated/
done
for f in $(python .claude/skills/um6p-storage/dp_storage.py ls u13/agri-complexity/tool-data \
| awk '$1 ~ /^[0-9]+$/ {print $2}'); do
python .claude/skills/um6p-storage/dp_storage.py get "$f" tool/data/
done
```
Or, inside Claude Code, just ask: *"pull the agri-complexity data from the
playground."* The skill knows the namespace.
After pushing changes that update outputs:
```bash
python .claude/skills/um6p-storage/dp_storage.py put generated/foo.parquet agri-complexity/generated
```
(only Taimur — `u13` — can write into `u13/`; other team members publish
under their o …