Back to projects
shippedlive demo

Buenos Aires Real Estate

How the city prices a square meter.

Built from 59,069 for-sale apartment listings across two sources — scraped, deduplicated, and cleaned into one dataset, then mapped to median price per m² across all 48 barrios. Two sources — Argenprop, until its WAF blocked the scraper, and Mercado Libre, which carries the bulk of the dataset. The findings: location explains 46% of the variance in price per m², unit size almost none, and Puerto Madero is its own tier without being an island.

Listings59,069
Barrios48
Location explains46%
PythonhttpxBeautifulSoupPostgreSQLSQL
how.it.works

How it works

ScrapehttpxArgenprop · BeautifulSoup
BlockedWAFsource stops answering
Re-source59,069Mercado Libre · 48 barrios
Dedupeby IDstored in PostgreSQL
Clean64 → 48barrio labels normalized
AnalyzemedianUSD / m² + variance split
Publishreport + CSVfindings & dataset
46%

of the variance in price per m² is explained by location alone. Unit size explains 0.7%.

59,069listingstwo sources · all of CABA
48barriosfrom 64 raw labels
$6,190Puerto Maderomedian USD / m² · 1.58× Palermo
01

The price map

All 48 barrios, by median price per m². The gradient runs north to south: the corridor along the river — Núñez, Belgrano, Palermo — reaches $3,900, the center sits around $2,300, and the southern edge — Villa Lugano, Villa Soldati — drops near $1,000. Puerto Madero stretches the axis, but look below it: its floor reaches down into the premium end of the next three barrios.

The city, shaded by median price per m²brighter = more expensive
Puerto Madero — $6,190/m²Palermo — $3,912/m²Núñez — $3,879/m²Belgrano — $3,699/m²Colegiales — $3,375/m²Saavedra — $3,310/m²Coghlan — $3,157/m²Villa Urquiza — $3,112/m²Villa Devoto — $3,110/m²Chacarita — $3,096/m²Recoleta — $3,037/m²Villa Ortúzar — $2,932/m²Villa Crespo — $2,924/m²Caballito — $2,736/m²Villa Pueyrredón — $2,635/m²Parque Chas — $2,587/m²Retiro — $2,571/m²Villa del Parque — $2,534/m²Agronomía — $2,478/m²Almagro — $2,475/m²San Telmo — $2,464/m²Monte Castro — $2,394/m²Parque Chacabuco — $2,379/m²Barracas — $2,353/m²Liniers — $2,312/m²Villa Luro — $2,292/m²Villa Real — $2,291/m²Mataderos — $2,287/m²La Paternal — $2,282/m²Boedo — $2,280/m²Villa Santa Rita — $2,210/m²Flores — $2,111/m²Villa General Mitre — $2,108/m²San Cristóbal — $2,094/m²Vélez Sársfield — $1,975/m²Monserrat — $1,964/m²Villa Riachuelo — $1,938/m²Versalles — $1,888/m²Parque Patricios — $1,862/m²Floresta — $1,827/m²Parque Avellaneda — $1,825/m²San Nicolás — $1,816/m²Balvanera — $1,771/m²La Boca — $1,434/m²Constitución — $1,410/m²Nueva Pompeya — $1,136/m²Villa Lugano — $1,053/m²Villa Soldati — $957/m²NúñezBelgranoPalermoRecoletaCaballitoFloresVilla LuganoVilla SoldatiN
Puerto Madero$6,190/m²#1 of 48 · median 92 m² · 978 listingshover a barrio
$957$3,912 /m²
Puerto Madero · $6,190, off the ramp
Median price per m² — all 48 barriosUSD / m²
1.58× Palermo at the median$1k$2k$3k$4k$5k$6kPUERTO MADERO$6,190THE REST OF THE CITY$957 – $3,912 / m²Palermo · Núñez · Belgrano median → p90Puerto Madero p10 → medianoverlap $4,590 – $6,140
48 barrios
Puerto Madero
$6,190/m²
Palermo
$3,912/m²
Núñez
$3,879/m²
Belgrano
$3,699/m²
Colegiales
$3,375/m²
Saavedra
$3,310/m²
Coghlan
$3,157/m²
Villa Urquiza
$3,112/m²
Villa Devoto
$3,110/m²
Chacarita
$3,096/m²
Recoleta
$3,037/m²
Villa Ortúzar
$2,932/m²
Villa Crespo
$2,924/m²
Caballito
$2,736/m²
Villa Pueyrredón
$2,635/m²
Parque Chas
$2,587/m²
Retiro
$2,571/m²
Villa del Parque
$2,534/m²
Agronomía
$2,478/m²
Almagro
$2,475/m²
San Telmo
$2,464/m²
Monte Castro
$2,394/m²
Parque Chacabuco
$2,379/m²
Barracas
$2,353/m²
Liniers
$2,312/m²
Villa Luro
$2,292/m²
Villa Real
$2,291/m²
Mataderos
$2,287/m²
La Paternal
$2,282/m²
Boedo
$2,280/m²
Villa Santa Rita
$2,210/m²
Flores
$2,111/m²
Villa General Mitre
$2,108/m²
San Cristóbal
$2,094/m²
Vélez Sársfield
$1,975/m²
Monserrat
$1,964/m²
Villa Riachuelo
$1,938/m²
Versalles
$1,888/m²
Parque Patricios
$1,862/m²
Floresta
$1,827/m²
Parque Avellaneda
$1,825/m²
San Nicolás
$1,816/m²
Balvanera
$1,771/m²
La Boca
$1,434/m²
Constitución
$1,410/m²
Nueva Pompeya
$1,136/m²
Villa Lugano
$1,053/m²
Villa Soldati
$957/m²
02

Location, not size

In many cities, small units carry a price-per-m² premium. If that held here, this cloud would slope down to the right. It doesn’t. A variance decomposition over all 59,069 listings puts it in numbers: location explains 46% of the variance in price per m²; unit size explains 0.7% — practically nothing. The one exception is at the top: above 100 m², price per m² does climb, and Puerto Madero sits top-right — the largest apartments and the most expensive per m², the exact opposite of the premium.

Price per m² vs unit sizeone dot = one barrio
$1k$2k$3k$4k$5k$6k40 m²50 m²60 m²70 m²80 m²90 m²Median unit size →Median USD / m² →Puerto Madero

Knowing a unit’s size tells you almost nothing about its price per m². Knowing its barrio tells you nearly half.

03

Two kinds of expensive

Plot total price against price per m² and most barrios drift up together — the two rankings correlate at 0.93. Recoleta doesn’t: 3rd in the city by total price, only 11th per m². It’s expensive because the apartments are big and old, not because each square meter commands a premium — a real exception, but a narrow one.

Total price vs price per m²Puerto Madero omitted (off the scale)
$1k$2k$3k$4k$50k$100k$150k$200kMedian total price →Median USD / m² →PalermoRecoleta
04

The query behind the map

No need to open the repo. This is the heart of the analysis: one snapshot per listing, filtered to a clean USD scope, aggregated to a true median per barrio.

analysis/queries.ipynb — median price per m²
WITH latest AS (
  SELECT DISTINCT ON (listing_id) listing_id, price, currency
  FROM listing_snapshots
  ORDER BY listing_id, captured_at DESC     -- newest snapshot per listing
)
SELECT
  l.neighborhood,
  COUNT(*) AS n,
  ROUND(percentile_cont(0.5) WITHIN GROUP (
    ORDER BY s.price / l.covered_m2)) AS median_usd_m2
FROM latest s
JOIN listings l ON l.id = s.listing_id
WHERE s.currency = 'USD'
  AND l.covered_m2 > 0
  AND l.neighborhood IS NOT NULL
GROUP BY l.neighborhood
HAVING COUNT(*) >= 10
ORDER BY median_usd_m2 DESC;
05

My contribution

01Scraperfault-tolerant httpx + BeautifulSoup
02Second sourceArgenprop's WAF blocked the scrape; Mercado Libre carries the bulk of the dataset
03Barrio normalization64 raw labels → 48 official
04Data-quality auditempty columns handled, not faked
05SQL analysismedian USD / m² per barrio + variance decomposition
06Findings + datasetreport + a clean, documented CSV
06

Three takeaways

GeographyLocation sets the priceBarrio explains 46% of the variance in price per m²; unit size explains 0.7%. The size premium most cities show simply isn't here.
OutlierPuerto Madero is a tier, not an island1.58× Palermo at the median — but its floor (p10 $4,590) reaches into the premium end of Palermo, Núñez and Belgrano. A tier of its own, not a separate market.
MethodTwo sources, one medianWhen Argenprop's WAF blocked the scrape, Mercado Libre became the second source. Right-skewed prices demand the median; the whole thing is built end-to-end from raw scrapes, not a borrowed dataset.