Work: case studies & field notes
Recent work.
Case studies and papers, newest first: what got built, what broke, and what it changed.
01
Could a free satellite have called Amsterdam's quay-replacement schedule?Amsterdam is replacing 200 km of historic quay walls, guided by divers and engineers. The Netherlands publishes a free millimetre-precision InSAR subsidence map. I put the free signal on trial: pre-registered prediction, four failure directions tested, and a mechanism-tested null (AUC 0.49) that turned out to be the interesting answer.
CASE-STUDY
02
The model inside FishFinder: ResNet50, fine-tuning, and when to freeze layersFishFinder classifies 63 Dutch fish species from ~3,000 photos. That only works because the model doesn't start from zero: a pretrained ResNet50, fine-tuned with layer-wise learning rates. Here is how transfer learning, freezing and discriminative LRs actually work, with the real numbers.
EXPLANATION
03
One JSON per Published Number: the Pipeline Contract That Made Adversarial Review CheapHow a one-script, one-JSON, one-figure contract turned a full methodology overhaul of the metro capitalization paper into a single working session instead of a rewrite.
EXPLANATION
04
Calibrating Free Postcode Boundaries from OpenStreetMap: A Transferable Seed-Density Accuracy CurvePostcode boundary polygons are unavailable free of charge for much of Europe: some countries publish authoritative layers, elsewhere they are sold or absent. Voronoi tessellation of OpenStreetMap address points is the natural estimator, but how many address points are needed, and whether the answer transfers across countries, has not been established. We calibrate a single OSM-Voronoi pipeline against national references in the Netherlands and Denmark (5,160 reference polygons), fit a seed-density-to-IoU curve, and test out-of-sample transfer to held-out Belgium (1,188 polygons). The asymptote is robust across functional forms (mean matched IoU saturates at 0.76–0.82), while the fitted 0.7-IoU threshold is form-sensitive (roughly 40–110 seeds); per-postcode scatter is wide (point-level R² of about 0.26), so the curve calibrates the population mean, not individual polygons. Belgium reaches mean matched IoU 0.618 at 81% coverage, near the curve. Applied to Italy, where no free authoritative intra-city postcode layer exists, the pipeline produces 4,209 estimated CAP polygons; Milan reaches mean IoU 0.783 against the community uMap reference (an earlier pipeline configuration), and the 2,903 matched single-CAP municipalities at median 19 seeds land where the curve predicts (mean IoU 0.500). A Swiss evaluation, where the asymptote falls to 0.644, marks the boundary of the regime.
WORKING-PAPER
05
"Pinned" should mean bytes-identical: a snapshot-guard operatorAn operator that treats pinned inputs as a contract: if the bytes changed, the pipeline should refuse to pretend otherwise.
EXPLANATION
06
A custom DuckDB operator: SQL-first ingestion in AirflowBuilding a custom Airflow operator that makes DuckDB the ingestion engine: SQL-first, testable, and cheap.
EXPLANATION
07
Research pipelines are production systems: a seriesWhy research data pipelines deserve production discipline: the series opener.
EXPLANATION
08
Parameters belong in the schema, not the filenameA pre-arXiv audit found the paper and its artifacts disagreeing about which hyperparameters produced the headline number, and nothing in the data model could settle it.
EXPLANATION
09
When Does Metro Infrastructure Capitalize into Property Prices? Phase-Decomposed Difference-in-Differences Evidence from Seven European CitiesWe study when, not merely whether, new metro lines capitalize into residential property prices. Seventeen staggered treated cohorts across seven European cities in five countries (Milano, Amsterdam, Copenhagen, Paris, Helsinki, Rennes, Roma) pool into a single phase-decomposed panel (n = 42,004), with the response decomposed into announcement, construction, opening, and maturity phases. The pooled cross-city average locates the largest response at maturity: prices step up by +9 to +12% (drop-Roma to full-sample, measured as the construction-to-maturity contrast) two or more years after opening, a step that is stable across the control ladder and positive under every leave-one-city-out. The step is a pooled average, however, not a within-city fact. City-by-year fixed effects collapse it to an insignificant -0.5 log points while leaving a +2.5 log-point step at opening, a within-city contrast that is itself entity-clustered ordering evidence, not significant under city-clustered bootstrap. Few-cluster significance of the maturity step is partition- and control-set-dependent: a restricted wild cluster bootstrap gives p = 0.036 clustered on the seven cities (level-only controls; p = 0.080 with the full control set) but p = 0.16 on the twenty-four cohorts. Roma, priced through the same OMI appraisal series as Milano, is itself a within-city null whose pooled contribution runs entirely through the common-year fixed effects, and it disciplines the upper-bound reading throughout. The defensible magnitudes are per-city: foremost Milano's within-ring +167 EUR/m² (≈ +5.6%, wild-bootstrap p = 0.004). We read the delayed-to-maturity step as a cross-city pattern worth testing on longer panels, not as a settled within-city effect.
WORKING-PAPER
10
Seven Cities, 42,000 Observations, and a Headline That Hung on One Modeling ChoiceA phase-decomposed DiD across seven cities, and how one fixed-effects specification choice moved the headline result.
EXPLANATION
11
US vs EU: does training-data geography matter for autonomous-driving object detection?Does an object detector trained on US dashcam data still work on European streets? An original 2024 course project suggested catastrophic transfer failure, but was confounded: precision-only metrics, no held-out test set, a resolution mismatch between datasets, and models never trained in-domain. This controlled redo runs a 2×3 design ({zero-shot COCO, US-fine-tuned, EU-fine-tuned} × {US-test, EU-test}) with YOLOv3u and YOLOv8s on Udacity/CrowdAI (US) and KITTI (EU). On EU test data, EU fine-tuning gains +0.153 mAP@0.5:0.95 over zero-shot while US fine-tuning gains +0.001; the difference-in-differences gap is +0.077 ± 0.007 across three seeds. The pattern is mirror-symmetric, so the correct read is narrow fine-tune specialisation rather than a US-specific geographic bias, with one asymmetry that is genuinely geographic: bicycle detection collapses without European training data.
WORKING-PAPER