French Property Prices 2025: Pipeline, Audit and Dashboard
Public data, full method: 3.8 million property transfer lines turned into a controlled pipeline, an audited dataset documented to DDI standards and an interactive dashboard.
- Role
- Design and delivery, end to end
- Period
- Nov 2026
- Status
- Demonstration
- Context
- Public dataset: Demandes de valeurs foncières (DVF), DGFiP, 2025 · Licence Ouverte 2.0
Engineering figures
- 3,793,113lines read and accounted for
- 1,354,095transfers rebuilt without an identifier in the file
- 732,164dwelling sales retained for prices
- 10quality rules, each with its published count
Interactive dashboard
Dwelling prices in 2025, department by department.
Choose an area and a dwelling type: every figure, chart and table below follows. Aggregates only, computed by the pipeline described further down.
An interactive report built the way a Power BI report works: pages, a filter pane that applies to every page, cross-filtering by clicking a mark, drill-through to a detail page. It is a web reproduction written in code for this site, on the same aggregates.
- Dwelling sales retained
- 732,164
- Flats, median price per m²
- €3,370/m²
- Houses, median price per m²
- €2,200/m²
- Transfers recorded in 2025
- 1,354,095
The interactive report needs JavaScript; here are the key figures and the table by department.
| Department | Flats: sales | Flats: median | Houses: sales | Houses: median |
|---|---|---|---|---|
| 01 Ain | 3,042 | €2,760/m² | 4,229 | €2,520/m² |
| 02 Aisne | 624 | €1,330/m² | 4,382 | €1,240/m² |
| 03 Allier | 1,189 | €1,300/m² | 2,526 | €1,180/m² |
| 04 Alpes-de-Haute-Provence | 1,371 | €2,160/m² | 1,385 | €2,550/m² |
| 05 Hautes-Alpes | 2,136 | €2,960/m² | 856 | €2,850/m² |
| 06 Alpes-Maritimes | 18,841 | €4,880/m² | 2,269 | €5,330/m² |
| 07 Ardèche | 970 | €1,580/m² | 2,488 | €2,130/m² |
| 08 Ardennes | 461 | €1,150/m² | 2,135 | €1,300/m² |
| 09 Ariège | 340 | €1,570/m² | 1,757 | €1,470/m² |
| 10 Aube | 1,258 | €1,520/m² | 2,142 | €1,530/m² |
| 11 Aude | 2,130 | €2,370/m² | 4,585 | €1,790/m² |
| 12 Aveyron | 988 | €1,930/m² | 2,075 | €1,490/m² |
| 13 Bouches-du-Rhône | 16,969 | €3,370/m² | 7,377 | €4,060/m² |
| 14 Calvados | 4,475 | €3,270/m² | 4,695 | €2,550/m² |
| 15 Cantal | 466 | €1,370/m² | 1,155 | €1,270/m² |
| 16 Charente | 389 | €1,610/m² | 3,476 | €1,360/m² |
| 17 Charente-Maritime | 2,499 | €3,980/m² | 7,899 | €2,650/m² |
| 18 Cher | 586 | €1,480/m² | 2,711 | €1,180/m² |
| 19 Corrèze | 677 | €1,610/m² | 1,941 | €1,390/m² |
| 2A Corse-du-Sud | 1,234 | €4,150/m² | 491 | €4,380/m² |
| 2B Haute-Corse | 1,332 | €3,190/m² | 602 | €3,260/m² |
| 21 Côte-d'Or | 3,740 | €2,610/m² | 3,340 | €2,230/m² |
| 22 Côtes-d'Armor | 1,625 | €2,280/m² | 5,596 | €2,000/m² |
| 23 Creuse | 85 | €910/m² | 1,424 | €800/m² |
| 24 Dordogne | 721 | €1,670/m² | 3,454 | €1,540/m² |
| 25 Doubs | 3,570 | €2,200/m² | 2,658 | €2,050/m² |
| 26 Drôme | 2,642 | €1,920/m² | 3,274 | €2,470/m² |
| 27 Eure | 1,026 | €1,950/m² | 3,918 | €1,930/m² |
| 28 Eure-et-Loir | 1,075 | €2,150/m² | 3,308 | €1,860/m² |
| 29 Finistère | 3,923 | €2,290/m² | 7,481 | €2,170/m² |
| 30 Gard | 3,729 | €2,370/m² | 5,245 | €2,600/m² |
| 31 Haute-Garonne | 9,969 | €2,970/m² | 7,131 | €2,770/m² |
| 32 Gers | 343 | €1,600/m² | 1,683 | €1,560/m² |
| 33 Gironde | 8,767 | €3,650/m² | 10,971 | €3,230/m² |
| 34 Hérault | 11,075 | €3,480/m² | 7,891 | €3,010/m² |
| 35 Ille-et-Vilaine | 5,730 | €3,400/m² | 6,843 | €2,500/m² |
| 36 Indre | 231 | €1,210/m² | 2,203 | €1,050/m² |
| 37 Indre-et-Loire | 2,618 | €2,660/m² | 3,970 | €2,240/m² |
| 38 Isère | 8,961 | €2,580/m² | 5,947 | €2,780/m² |
| 39 Jura | 1,066 | €1,640/m² | 1,696 | €1,730/m² |
| 40 Landes | 2,081 | €3,290/m² | 3,817 | €2,640/m² |
| 41 Loir-et-Cher | 562 | €1,770/m² | 2,531 | €1,500/m² |
| 42 Loire | 4,578 | €1,320/m² | 3,517 | €2,050/m² |
| 43 Haute-Loire | 564 | €1,510/m² | 1,693 | €1,430/m² |
| 44 Loire-Atlantique | 7,436 | €3,310/m² | 10,106 | €2,940/m² |
| 45 Loiret | 2,413 | €2,180/m² | 4,326 | €1,880/m² |
| 46 Lot | 255 | €1,550/m² | 1,490 | €1,530/m² |
| 47 Lot-et-Garonne | 665 | €1,530/m² | 2,668 | €1,480/m² |
| 48 Lozère | 128 | €1,530/m² | 578 | €1,500/m² |
| 49 Maine-et-Loire | 2,455 | €2,780/m² | 5,815 | €2,080/m² |
| 50 Manche | 919 | €2,390/m² | 4,252 | €1,950/m² |
| 51 Marne | 2,742 | €2,360/m² | 3,436 | €1,930/m² |
| 52 Haute-Marne | 209 | €1,180/m² | 1,518 | €950/m² |
| 53 Mayenne | 550 | €1,970/m² | 2,993 | €1,510/m² |
| 54 Meurthe-et-Moselle | 3,823 | €1,960/m² | 4,707 | €1,890/m² |
| 55 Meuse | 213 | €1,120/m² | 1,583 | €1,070/m² |
| 56 Morbihan | 3,015 | €3,340/m² | 6,232 | €2,610/m² |
| 58 Nièvre | 440 | €1,050/m² | 2,240 | €1,000/m² |
| 59 Nord | 7,624 | €2,800/m² | 20,847 | €1,910/m² |
| 60 Oise | 2,176 | €2,280/m² | 5,751 | €2,210/m² |
| 61 Orne | 344 | €1,210/m² | 2,148 | €1,320/m² |
| 62 Pas-de-Calais | 2,714 | €2,400/m² | 12,155 | €1,670/m² |
| 63 Puy-de-Dôme | 3,145 | €2,140/m² | 4,547 | €1,820/m² |
| 64 Pyrénées-Atlantiques | 5,626 | €3,500/m² | 3,124 | €2,500/m² |
| 65 Hautes-Pyrénées | 1,672 | €1,820/m² | 1,725 | €1,750/m² |
| 66 Pyrénées-Orientales | 4,530 | €2,400/m² | 5,054 | €2,540/m² |
| 69 Rhône | 15,858 | €3,790/m² | 4,506 | €3,570/m² |
| 70 Haute-Saône | 407 | €1,090/m² | 1,782 | €1,140/m² |
| 71 Saône-et-Loire | 1,650 | €1,450/m² | 3,957 | €1,500/m² |
| 72 Sarthe | 1,312 | €1,850/m² | 4,559 | €1,610/m² |
| 73 Savoie | 5,751 | €3,880/m² | 1,972 | €3,250/m² |
| 74 Haute-Savoie | 10,005 | €4,480/m² | 3,557 | €4,560/m² |
| 75 Paris | 27,907 | €9,780/m² | 149 | €13,110/m² |
| 76 Seine-Maritime | 5,966 | €2,270/m² | 7,448 | €2,110/m² |
| 77 Seine-et-Marne | 6,335 | €3,380/m² | 7,565 | €2,950/m² |
| 78 Yvelines | 8,292 | €3,990/m² | 5,778 | €3,790/m² |
| 79 Deux-Sèvres | 450 | €1,780/m² | 3,930 | €1,370/m² |
| 80 Somme | 1,200 | €2,550/m² | 4,734 | €1,650/m² |
| 81 Tarn | 721 | €1,970/m² | 2,902 | €1,580/m² |
| 82 Tarn-et-Garonne | 621 | €1,880/m² | 1,911 | €1,790/m² |
| 83 Var | 12,871 | €3,810/m² | 5,699 | €4,180/m² |
| 84 Vaucluse | 2,518 | €2,240/m² | 3,618 | €2,850/m² |
| 85 Vendée | 1,897 | €3,330/m² | 7,969 | €2,400/m² |
| 86 Vienne | 1,084 | €2,120/m² | 3,491 | €1,460/m² |
| 87 Haute-Vienne | 1,391 | €1,520/m² | 2,676 | €1,410/m² |
| 88 Vosges | 1,193 | €1,380/m² | 2,379 | €1,350/m² |
| 89 Yonne | 660 | €1,480/m² | 2,972 | €1,380/m² |
| 90 Territoire de Belfort | 848 | €1,280/m² | 657 | €1,670/m² |
| 91 Essonne | 6,504 | €2,980/m² | 5,984 | €3,330/m² |
| 92 Hauts-de-Seine | 16,447 | €6,480/m² | 2,126 | €7,280/m² |
| 93 Seine-Saint-Denis | 9,069 | €4,100/m² | 3,515 | €3,840/m² |
| 94 Val-de-Marne | 10,705 | €4,780/m² | 3,068 | €4,820/m² |
| 95 Val-d'Oise | 5,974 | €3,300/m² | 5,328 | €3,510/m² |
| 971 Guadeloupe | 854 | €3,510/m² | 832 | €2,850/m² |
| 972 Martinique | 885 | €3,040/m² | 650 | €2,490/m² |
| 973 Guyane | 319 | €2,830/m² | 401 | €2,700/m² |
| 974 La Réunion | 2,090 | €2,880/m² | 2,451 | €2,830/m² |
Open data and documentation
The published table, documented to DDI standards.
The indicators by department are an open table of their own, described by a DDI-Codebook 2.5 file (bilingual labels, summary statistics, derivations) that a NADA catalogue can import, and a Dublin Core record.
- Indicators by department (CSV, 194 rows)
- DDI-Codebook 2.5 documentation (XML)
- Dublin Core record (XML)
Source: Demandes de valeurs foncières (DVF), DGFiP, 2025, Licence Ouverte 2.0. Reuse conditions (article R112 A-3 of the Livre des procédures fiscales): no re-identification of persons, no indexing of the records. Only aggregates are shown; every price statistic rests on at least 11 sales.
From the DVF file to the dashboard
Each layer is checked before the next one is written. Only aggregates are published.
-
01 · Source
- DVF 2025 archive3.8 M lines, 43 columns
-
02 · Bronze
- Unchanged archiveSHA-256, column contract
-
03 · Silver
- Line rulesQuarantine, duplicates
- Typed linesTransfers rebuilt
-
04 · Gold
- Sale rulesSurfaces, robust z-score
- Star schemaKept local, Power BI ready
-
05 · Publication
- Aggregates11 sales or more
- Dashboard, open table, DDIDocumented, downloadable
01Executive summary
A complete mission, run on public data so that every step can be shown: the 2025 property transfer file of the French tax administration (DVF), 3.8 million lines, turned into a controlled pipeline, an audited dataset, a DDI documentation and the dashboard above.
The deliverables are those of a client engagement: a layered pipeline with a rule catalogue, a quality report that explains what it set aside, an open table documented to international standards, and a dashboard anyone can question. Every figure can be recomputed: the code, the hash of the source file and the run log are kept.
02Problem statement
- No sale identifier: one sale spreads over several lines (one per property unit or parcel) that must be grouped back.
- The declared value is repeated on every line of a sale: summing it inflates amounts.
- 301,443 lines are strictly identical to another one, and no unit identifier tells a duplicate from a second, identical outbuilding.
- Symbolic values, missing surfaces and outlying prices per m² distort any average.
- The data concern people: reuse must allow neither re-identification nor indexing by search engines.
03Pipeline and processing
- Bronze: the archive is kept unchanged, with its SHA-256 hash, size, row count and a check of the 43 expected columns. Address, parcel and lot columns are never parsed.
- Silver: typed values, INSEE commune codes (overseas departments included), duplicate lines set aside, quarantine with the reason for each rejected line, transfers rebuilt from date, nature, value, commune and disposition.
- Gold: a star schema ready for Power BI (sale facts, transfer facts, commune, department and date dimensions), kept on the processing machine.
- Publication: aggregates only, each price statistic resting on at least 11 sales and a commune median on at least 30; an open table by department; a quality report and a run log. The full run takes about 50 seconds.
04Data quality and validation
Ten rules, each with an identifier, a level (file, line, transfer, sale) and an action: stop, quarantine, set aside, exclude from prices or flag for review. Their results are published with the dashboard: 301,443 duplicate lines set aside, 21,076 transfers without a usable value, 447 implausible or missing surfaces.
Outliers are detected with a robust z-score on the logarithm of the price per m², within each department and dwelling type: a flat at 9,000 €/m² is ordinary in Paris and exceptional in the Creuse. The median and the median absolute deviation resist the very outliers they look for. 14,727 sales (2.0 % of simple sales) are set aside this way; 4,614 more, three times above or below their commune median, are flagged for a person to review, not removed.
05Security and governance
- Data minimisation: street address, cadastral parcel and lot numbers are never loaded into memory.
- Record-level tables stay on the processing machine: nothing finer than an aggregate leaves the pipeline.
- Statistical disclosure control: no price statistic under 11 sales, no commune median under 30 sales, values rounded to 10 euros.
- No third-party request: the charts are drawn by the site's own code, under a strict content security policy.
06Technology stack
- Python
- pandas
- NumPy
- DDI-Codebook 2.5
- Dublin Core
- TypeScript
- SVG
07Engineering decisions
-
Median, not mean
- Choice
- Report the median price per m² and its quartiles.
- Why
- Prices are skewed: a few exceptional sales move a mean far more than a median.
-
A local threshold for outliers
- Choice
- Robust z-score within department and type, with national parameters for groups under 30 sales.
- Why
- A single national threshold would flag much of Paris and miss the rural outliers.
-
Aggregates only
- Choice
- Publish no individual sale and no price statistic under 11 sales.
- Why
- The reuse conditions of DVF forbid re-identification, and a median of two sales reveals a price.
-
Charts without a library
- Choice
- Draw the charts with a small module shared by the server and the browser.
- Why
- No third-party script under the site's security policy, a first render without JavaScript, and the same figures in both renders.
08Limitations
- A transfer is rebuilt from its values: two identical sales on the same day in the same commune are merged, and a transfer across several communes is split.
- House prices include the land.
- Off-plan sales often lack the description of the dwelling and are under-represented among simple sales.
- Bas-Rhin, Haut-Rhin, Moselle and Mayotte are not covered by DVF.
- The interactive view is built from aggregates: it never goes below the commune.