Historia cen na prawdziwych danych: ogloszenia, NBP i GUS
Deploy Polska Lokalnie / deploy (push) Successful in 12s

Strona /historia-cen pokazywala pusty wykres (wczesniej zmyslony). Teraz:

Ceny ofertowe z ogloszen:
- Tabela price_snapshots: codzienny zapis srednich cen za m2 z opublikowanych
  ogloszen per miasto i dzielnica, typ (mieszkanie/dom) i rynek. Zapis co noc
  (02:30) i przy starcie, gdy brakuje dzisiejszego. Historii sprzed pierwszego
  zapisu nie odtwarzamy.

Ceny transakcyjne ze zrodel publicznych (porownanie, cale miasto, mieszkania):
- NBP: plik ceny_mieszkan.xlsx (baza BaRN) - 17 miast, rynek pierwotny
  i wtorny, od III kw. 2006. Odczyt XLSX bez nowych zaleznosci.
- GUS: API Banku Danych Lokalnych (temat P3794) - miasta na prawach powiatu,
  kwartalnie od 2010, z opoznieniem ok. roku.
- Import raz w tygodniu i przy starcie, gdy dane sa starsze niz tydzien;
  blad zrodla nie kasuje poprzednich danych.
- GET /api/price-history (publiczny): historia, biezaca srednia z ogloszen,
  od kiedy zbieramy dane oraz serie NBP i GUS.

Frontend:
- Okresy "Ostatnie 5 lat" (domyslny), "Od 2006 (NBP)", "2026 do dzis";
  trzy serie z legenda, dymek ze wszystkimi zrodlami, statystyki i wnioski
  z prawdziwych liczb, porownanie cen ofertowych z NBP i GUS oraz roznica
  i srednia, gdy zrodla sie roznia. Ceny w "Porownaj lokalizacje".
- Poprawione dopasowanie lokalizacji ("Warszawa" otwierala "Warszawa,
  Mokotów"), usuniete resztki zmyslonych cen i opcja "Lokal uzytkowy".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-22 13:56:26 +02:00
parent e7402dbfed
commit e92c68ec93
16 changed files with 1722 additions and 212 deletions
+61
View File
@@ -8586,6 +8586,67 @@ a.city-card:hover {
stroke-width: 4;
}
/* Zrodla porownawcze: NBP (niebieska) i GUS (pomaranczowa, przerywana) - ceny transakcyjne. */
.history-line-nbp {
stroke: #2f6fd6;
stroke-width: 2.5;
}
.history-line-gus {
stroke: #e08a1e;
stroke-dasharray: 7 5;
stroke-width: 2.5;
}
.history-dot-nbp {
stroke: #2f6fd6;
}
.history-dot-gus {
stroke: #e08a1e;
}
.history-tooltip small {
color: #3f4d61;
font-size: 11px;
font-weight: 700;
white-space: nowrap;
}
.history-tooltip small strong {
font-size: 12px;
}
.history-legend {
display: flex;
flex-wrap: wrap;
gap: 8px 18px;
margin: 4px 0 14px;
}
.history-legend span {
align-items: center;
color: #4b5a6e;
display: inline-flex;
font-size: 12px;
font-weight: 700;
gap: 7px;
}
.history-legend span::before {
border-top: 3px solid #0aa35f;
content: '';
width: 22px;
}
.history-legend .nbp::before {
border-top-color: #2f6fd6;
}
.history-legend .gus::before {
border-top: 3px dashed #e08a1e;
}
.history-guide {
stroke: #cfd9e5 !important;
stroke-dasharray: 5 5;