Data trust
Methodology and definitions
Everything an analyst should know before trusting the numbers in the demo: sources, observation window, deduplication and exact metric definitions. The demo is limited to Warsaw; the full platform covers more cities.
Data sources
District metrics and the forecast in this demo come exclusively from Otodom rental listings. We don't merge them with other portals, to avoid mixing inconsistent price fields.
- Otodom — Primary rental-listing source (rent, area, publication date, district). The basis of all district metrics and the forecast in this demo.
- OLX — Additional rental listings (noisy prices, weak district). Collected, but deliberately unused for district metrics in the demo — field quality below threshold.
- Labour market (OLX Jobs, pracuj.pl) — Migration-demand proxy. Used in the full platform; not in this demo's metrics.
Observation window and freshness
The pipeline collects listings daily. “Active supply” and all medians cover listings seen in the last 30 days. History goes back about half a year — enough for multi-month trends and short-horizon forecasts, but not for year-on-year comparisons (which would need ≥ 12 months), so we don't show those. The last-computed date is shown above the tiles on the market pulse.
Deduplication
Every listing is counted once — we deduplicate by Otodom listing id, keeping the most recent observation of each listing. So re-collecting the same listing doesn't inflate supply or medians.
Asking rent, not transaction rent
All amounts are asking rents — listing prices, not actual contract rates. We have no access to a rental-transaction registry and don't pretend to. The asking level reflects direction and market tension well, but can be higher than the finally negotiated figure.
What is an “active listing”
A unique rental listing with at least one observation in the 30-day window, with a city and district assigned and a price in a plausible range. Districts with fewer than 30 active listings are omitted — we show the gap, we don't smooth it.
Metric definitions
Median rent (PLN/mo)
The middle monthly asking rent (not transaction rent) in a district.
- How we compute: Median (50th percentile) of asking rents from active rental listings in the district. The city value is the median of the district medians.
- Window: Listings active in the last 30 days.
- Exclusions: Rents outside 500–30,000 PLN are dropped as erroneous/contaminated (sale prices, junk).
- Sample: Number of active listings in the district (the “sample” column). Districts with < 30 listings are omitted, not smoothed.
Rent per m² (PLN/m²)
Median rent per square metre.
- How we compute: Median of (rent ÷ area) across the district's listings. It's the basis for price-anomaly signals.
- Window: Listings active in the last 30 days.
- Exclusions: Area outside 8–400 m² and rent outside 500–30,000 PLN are dropped.
- Sample: Same sample as median rent (the district's active listings).
Median days on market (days)
How many days a listing stays active from publication to last observation.
- How we compute: Median of (last observation − publication date). Publication date comes straight from the Otodom listing (100% populated).
- Window: Computed for listings active in the last 30 days.
- Exclusions: Negative values (published after last-seen, ~4%) and over 365 days (re-listings/long tail, ~18%) are trimmed.
- Sample: The district's active listings with a valid publication date.
Active supply (listings)
Number of unique rental listings seen in the 30-day window.
- How we compute: Count of unique listings (deduplicated by Otodom id) with at least one observation in the last 30 days. The city value is the sum across districts.
- Window: Trailing 30 days.
- Exclusions: Listings without a city/district are omitted. Districts with < 30 listings aren't reported.
- Sample: The value itself is the sample size.
Supply change (%)
Change in active supply versus the previous 30-day window.
- How we compute: (current supply − previous supply) ÷ previous supply, over 30-day windows.
- Window: Current 30 days vs previous 30 days.
- Exclusions: Because of the Otodom collection gap (~20 Jul – 20 Aug 2026) the comparison window is sometimes empty — then we return null, not a fabricated value.
- Sample: Requires a non-empty previous window.
Anomaly signals — what “+1.9σ” means
An anomaly signal = a district's z-score versus the other districts of the same city that period.
For each district we compute the z-score of its rent per m² and of its supply change against the distribution of all the city's districts that same period (population z-score). The signal takes the sign of whichever metric deviates most (|z|). The trigger is |z| ≥ 1.5σ.
- Trigger threshold: |z| ≥ 1.5σ. The sign comes from whichever metric deviates most strongly.
- Baseline: The baseline is the cross-section of Warsaw districts this period (peer comparison), not a single district's time series.
- „This district's rent per m² stands out from the other Warsaw districts.”
- „This district's supply change stands out from the other Warsaw districts.”
Example: Śródmieście +1.9σ means the rent per m² in Śródmieście is 1.9 standard deviations above the distribution of all reported Warsaw districts that period.
Forecast
The forecast is a model. On a real weekly median-rent series (by listing publication week) we fit a trend by least squares and project it a few weeks ahead with a 95% prediction band. The trend is damped — its momentum fades over the horizon, so we don't extrapolate a steep line indefinitely. Monthly seasonality is enabled once at least two full years of data exist. Alongside the forecast we publish the backtest error (MAPE and MAE) computed one-week-ahead on previously unused observations.
Known limitations and gaps
- Collection gap (approx. 20 Jul – 20 Aug 2026): the “vs previous 30 days” window is sometimes empty, so we return supply change as null rather than fabricating it.
- One source and one city in the demo: Otodom only, Warsaw only.
- No transaction data: we don't show sale prices, rental yield or notarial deeds — we have no sources for them.
- No year-on-year comparisons: history is too short (~6 months).