Data engineering
Michelin Guide to France
A reviewed annual pipeline publishes three CSV and five GeoJSON products for the deployed Dash application.
Deployed · Plotly Autumn App Challenge 2024 winner
Pipeline and application
Michelin Guide to France separates an annual data pipeline from a deployed Dash application. The pipeline publishes versioned CSV and GeoJSON products; the application imports one reviewed release and carries only the current guide-year assets. It never runs the pipeline or reads its working directories. Wine geography follows a separate lifecycle.
Actual data work
Annual acceptance and identity
A new restaurant CSV is a candidate, not an automatic release. The pipeline records its source, validates the schema, cleans the records, and prepares country partitions in a temporary workspace. France records are reconciled against the previous accepted year using normalised URLs, postcodes, names, addresses, and coordinates; Michelin awards are excluded from identity evidence. Ambiguity, schema drift, and unusual changes remain visible for review. Accepted outputs retain years, hashes, manifests, and validation reports and cannot be silently overwritten.
Reference data and geographic products
Department and region assignment uses versioned INSEE/OECD data, administrative references, and local boundaries. Identifiers remain strings so leading zeroes and Corsican codes 2A and 2B survive. Joins fail on missing, duplicated, or inconsistent keys; no restaurant is dropped to make reconciliation pass.
The pipeline publishes restaurant and aggregate products for 13 metropolitan regions and 96 metropolitan departments. Arrondissement assignment produces a 320-feature mainland GeoJSON and a separate 20-feature Paris file. Point-in-polygon matches must be unique; a documented coastal fallback is allowed only within the same department and 500 metres. Empty areas retain zero counts. Publication checks rows, geometry, key coverage, totals, years, and reloadability across map and tabular products.
Annual comparison
Consecutive accepted years can be compared without rewriting either release. Deterministic matches run first; ambiguous fuzzy candidates remain for review. CSV, JSON, and Markdown reports distinguish award changes, renaming, relocation, additions, and guide removals. A missing record is not called a restaurant closure, and missing historical fields are not converted to zero.
Main engineering challenges
Release contract
The application release script stages exactly three CSV and five GeoJSON products from an approved annual directory. It validates fields, identifier types, geometries, and the exact file set; updates the guide year; imports the application; and runs its tests. Historical releases remain in the pipeline.
Review boundary
A scheduled workflow can prepare annual changes, but publication is not unattended. Identity matches may need manual resolution, generated-data pull requests require review, and preparing application assets does not deploy them. The application consumes an approved product set rather than whichever files the pipeline generated most recently.
What the deployed product enables
Guide
Guide supports regional and departmental navigation, location search, filtered restaurant markers, and restaurant detail.
The Paris state connects geographic filters, restaurant markers, and one selected record.
Analysis and Economics
Analysis compares classifications and rankings across regions, departments, and arrondissements. Economics joins the validated geography to published demographic and economic fields.
Reviewed regional geography is joined to an INSEE unemployment metric. The comparison is descriptive, not causal.
Wine & Gastronomy
Wine & Gastronomy uses separately maintained AOC geometry. Visitors can choose a region or appellation, toggle boundaries and Michelin-starred restaurants, filter ratings, and inspect an appellation summary. The interface identifies that contextual summary as generated by GPT-4.1 mini; it is separate from the mapped products.
The Sauternes state combines AOC boundaries, restaurant locations, rating controls, and an appellation panel.
Shared loaders validate schemas before route-specific callbacks use Plotly and MapLibre views.
Limitations
The 2026 application and annual products are deployed; the project won the Plotly Autumn App Challenge 2024. Upstream timing remains outside the system, ambiguous identities and annual changes require review, and release preparation does not deploy. Cross-year identity is reconciled for reporting rather than stored as a permanent master identifier. Historical gaps remain missing, and generated wine summaries are not authoritative AOC references.