Fi-Job-Maps / Engineering notes
A useful map starts with trustworthy totals
Turning Finnish occupational statistics into a visual interface, while keeping model estimates separate from measured data.
Public interactive project · adapted from karpathy/jobs
- Fetch
- Normalise
- Enrich
- Explore
The problem
A table can describe hundreds of occupations, but makes relative scale difficult to see. Fi-Job-Maps turns Finnish occupational records into a treemap so visitors can compare employment and inspect individual occupations. The public dataset contained 459 records when checked on 10 September 2026.
The pipeline
The Python workflow fetches configured StatFin PxWeb tables, optionally adds AI-exposure estimates, then builds the files served by the static site. Occupational Barometer data can supply outlook categories. The interface is deployed on GitHub Pages, so browsing the built map does not require running an inference service.
Avoid counting the same jobs twice
Occupational classifications contain several hierarchy levels. Adding a parent total to its child categories would inflate employment. The site-data builder selects one level, with level four as the documented default, rather than mixing levels one through five in the same total.
Keep estimates distinguishable from observations
The dataset keeps source fields for pay and outlook, alongside an exposure score and its rationale. AI exposure describes an estimate about tasks; it is not a measured probability of unemployment. Keeping the provenance and interpretation visible matters as much as making the visual attractive.
Ownership and what to inspect
This project adapts the treemap foundation from karpathy/jobs. My work connects that foundation to Finnish occupational data and the supporting Python pipeline. On the live site, inspect an occupation and compare the employment figure, selected colour metric and exposure rationale. A published map establishes a working interface; it does not validate every AI estimate.
My contribution & stack
Sole author — 43 of 43 commits
- Python
- StatFin API
- GitHub Pages
- Ubuntu Server
- Docker
- Coolify
- Grafana
- n8n
- Local LLM