Brandýs-Boleslav
Začni psát pro vyhledávání...

Nezávislá kontrola dat parkování

Nezávislá kontrola dat parkování

Datum kontroly: 2026-08-02

Kontrolované zdroje:

  • /Volumes/Verbatim 2TB/Radnice/Dokumenty úřad/Parkování/Analýza/Textova_zprava_2023.pdf
  • /Volumes/Verbatim 2TB/Radnice/Dokumenty úřad/Parkování/data celoplošné brandýs public.xlsx
  • doprava/data/parkovani.json
  • doprava/tools/parkovani-import.py

Stručný závěr

Potvrzuji, že sloupce v PDF příloze nejsou v dosavadním čtení prohozené. Hlavička odpovídá pořadí:

PS 361 | PS ČSN | OA DEN | OA NOC | OBS NOC 361 | OBS DEN 361 | OBS NOC ČSN | OBS DEN ČSN

Vnitřní kontrola obsazeností toto pořadí podporuje: procentní obsazenost se až na zaokrouhlení vztahuje k nočnímu počtu pro OBS NOC a k dennímu počtu pro OBS DEN. Zobrazené počty OA jsou ale zjevně zaokrouhlené celé hodnoty, zatímco procenta byla pravděpodobně počítána z nezaokrouhlených průměrů.

Zásadní nesrovnalost je jinde: kapacity v souhrnných tabulkách 3.1 a 3.2 přesně odpovídají součtům kapacit z PDF přílohy, ale počty vozidel OA v souhrnných tabulkách neodpovídají součtům OA DEN/OA NOC z PDF přílohy. Souhrnné počty OA naopak velmi dobře odpovídají agregaci průměrů z Excelu, s několika výjimkami způsobenými přečíslováním, dělenými řádky a duplicitou ID.

Následná sekvenční kontrola našla kořenovou příčinu s vysokou jistotou. Sloupce OA v PDF vznikly pozičním spojením dvou nezávisle seřazených seznamů, nikoli spojením přes správné ID. Identifikace úseku, název a kapacity proto patří aktuálnímu řádku, ale OA DEN/OA NOC zpravidla patří jinému úseku z Excelu. Procenta OBS byla následně správně vypočtena z chybně přiřazených OA a kapacity aktuálního řádku, takže jsou aritmeticky konzistentní, ale místně nesprávná.

Pro veřejnou mapu jsou proto nepoužitelné nejen absolutní počty OA z PDF přílohy, ale i její hotové hodnoty OBS. Bezpečnější základ je spojit kapacity z přílohy s excelovými průměry přes skutečné ID a obsazenost znovu vypočítat.

Ověření bodů A-D

A) Kapacity souhlasí

Potvrzuji.

Pro Historické jádro a typy MK + SIL vychází z PDF přílohy:

zdroj/výběr PS 361 PS ČSN
PDF příloha, Historické jádro, MK+SIL 257 306
tabulka 3.2 257 306

Kontrola přes všechny ZSJ:

  • tabulka 3.1, všechny typy komunikací: kapacity sedí ve 20 z 20 řádků;
  • tabulka 3.2, jen MK+SIL: kapacity sedí v 19 z 19 řádků.

B) Počty vozidel nesouhlasí

Potvrzuji rozpor, ale upřesňuji jeho velikost.

Čísla OA NOC = 524 a OA DEN = 364 odpovídají neúplné extrakci v parkovani.json: chybí v ní mimo jiné řádek 382 a sufixové řádky v historickém jádru. Při plné extrakci PDF přílohy vychází pro Historické jádro, MK+SIL:

zdroj/výběr OA NOC OA DEN
PDF příloha, plná extrakce 662 446
parkovani.json, neúplná extrakce 524 364
tabulka 3.2 167 226

Rozpor tedy není chyba ve čtení pořadí sloupců. Naopak, po opravě extrakce je rozpor u nočního OA ještě větší.

Stejný vzorec platí obecně:

  • tabulka 3.1: součet OA z PDF přílohy má shodu se souhrnem v 0 z 20 ZSJ;
  • tabulka 3.2: součet OA z PDF přílohy má shodu se souhrnem v 0 z 19 ZSJ.

C) PDF příloha nesouhlasí s Excel souborem

Potvrzuji.

U uvedených ID sedí přímé párování podle ID a názvů úseků, ale nesedí hodnoty vozidel:

ID úsek Excel průměr den Excel průměr noc PDF OA DEN PDF OA NOC
101 Nádražní, U Železnice - slepá 6,5 1,5 16 16
354 Na prádle, Ivana Olbrachta - S.K. Neumanna - 1. část 12,3 11,5 2 0
355 S.K. Neumanna, Podkostelní - Na prádle 8,8 13,0 33 35

Test přes celý soubor:

  • přímé párování xlsx.ID -> PDF ID je správná osa: 669 spárovaných řádků, z toho 663 má současně velmi dobrou shodu ulice i úseku;
  • xlsx.úsek -> PDF ID je špatná osa: 486 spárovaných řádků, ale jen 2 mají současně dobrou shodu ulice i úseku;
  • konstantní posun ID neobstál: nejlepší je posun 0, další posuny mají řádově horší shodu.

Hodnota v PDF příloze není ani prostý průměr, ani součet, ani maximum měření z Excelu. Při přímém párování 669 řádků vyšlo:

hypotéza pro PDF OA přesná shoda den přesná shoda noc přesná shoda obojí
Excel Průměr den/noc 22 52 9
součet měření z Excelu 24 43 11
maximum měření z Excelu 48 56 15

Žádná z těchto hypotéz nevysvětluje PDF OA DEN/OA NOC při přímém párování stejného ID. Hodnoty ale vysvětluje jejich pořadí po seřazení Excelu podle pomocného sloupce úsek; podrobnosti jsou níže.

D) Počet záznamů

Upřesňuji.

PDF příloha má podle nezávislé extrakce:

  • 669 řádků s čistě číselným ID;
  • 35 řádků se sufixem typu 354a;
  • 8 dělených řádků typu 416-1;
  • celkem tedy 712 datových řádků.

Excel má:

  • 708 datových řádků;
  • 707 unikátních hodnot ID;
  • duplicitní ID = 627;
  • 672 řádků s číselným ID, 35 se sufixem a 1 s děleným ID.

Tvrzení PDF 669, xlsx 708 platí jen pro počítání čistě číselných ID v PDF. Pokud se bere celá tabulková příloha včetně sufixových a dělených ID, PDF má 712 datových řádků.

Vztah mezi PDF, Excel a souhrnnými tabulkami

Nejlépe obstála tato hypotéza:

Kapacity v souhrnech jsou agregované z PDF přílohy, ale souhrnné počty OA jsou agregované z průměrů v Excelu nebo z blízkého předchůdce Excelu, nikoli ze sloupců OA DEN/OA NOC v PDF příloze.

Evidence:

  • Kapacity z PDF sedí na souhrny 3.1 a 3.2 přesně ve všech řádcích.
  • Součty OA DEN/OA NOC z PDF nesedí na souhrny v žádné ZSJ.
  • Agregace Průměr den/noc z Excelu přes přímé ID sedí nebo téměř sedí na většinu souhrnných OA.
  • Pro Historické jádro, MK+SIL odpovídá tabulka 3.2 hodnotám z Excelu po zohlednění přejmenovaného ID 496a -> 500a: OA NOC přibližně 166,5 -> 167, OA DEN přibližně 225,8 -> 226.

Nalezená kořenová příčina: poziční spojení řádků

Hodnoty OA v tabulkové příloze nejsou jinou metrikou ani náhodnými čísly. Jsou to průměry z Excelu nebo z jeho velmi blízké verze, které byly připojeny ke kapacitní tabulce podle pořadí řádků. Kapacitní tabulka je řazena podle zveřejněného ID, zatímco zdroj počtů vozidel odpovídá pořadí pomocného excelového sloupce úsek.

Přímé důkazy:

PDF řádek správný excelový řádek stejného místa řádek, ze kterého PDF skutečně převzalo OA
101, Nádražní ID 101: den 6,5, noc 1,5 ID 299, úsek=101: den 15,5, noc 16 → PDF 16/16
354, Na prádle ID 354: den 12,33, noc 11,5 ID 591, úsek=501: den 1,5, noc 0 → PDF 2/0
355, S. K. Neumanna ID 355: den 8,83, noc 13 ID 592, úsek=502: den 32,5, noc 34,5 → PDF 33/35

U ID 354 dává chybně připojený denní průměr 1,5 po zaokrouhlení PDF hodnotu 2 a současně 1,5 / 19 = 7,9 %, přesně jako v příloze. U ID 355 dávají průměry 32,5/34,5 po zaokrouhlení 33/35 a při kapacitě 8 také přesně uvedených 406,3 %/431,3 %.

Pořadí je rozhodující: PDF ID 354 je 253. číselný řádek přílohy a excelový záznam s úsek=501 je 253. záznam po seřazení podle tohoto pomocného pole. ID 355 a úsek=502 jsou shodně 254. záznamy.

Přísná sekvenční kontrola, která vyžadovala současnou shodu zaokrouhlených OA i všech čtyř procent OBS, takto spárovala 622 z 669 číselných řádků. Dlouhé souvislé bloky mají postupné posuny 0, +30, +70, +113 a další; skoky přesně odpovídají mezerám v technickém číslování a vloženým či odebraným řádkům mezi verzemi. Zbylých 47 řádků lze vysvětlit verzovými změnami, dělením úseků a formátovými anomáliemi, ale bez původního Word/GIS projektu nelze určit konkrétní operaci, která chybu vytvořila. Datově nelze rozlišit například kopírování sloupců řádek po řádku od GIS joinu přes pořadové rowid.

Důsledek: vnitřní shoda OBS = OA / kapacita nepotvrzuje správnost řádku. Potvrzuje jen to, že procenta byla dopočtena až po chybném připojení OA.

Neobstály tyto hypotézy:

  • PDF OA je součet měření z Excelu: ne, přesná shoda jen u 11 z 669 řádků pro den i noc současně.
  • PDF OA je maximum měření z Excelu: ne, přesná shoda jen u 15 z 669 řádků pro den i noc současně.
  • Souhrn je prostý součet OA z PDF přílohy: ne, nesedí ani v jedné ZSJ.
  • ID jsou posunutá o konstantu: ne, nejlepší shoda je bez posunu.
  • Sloupec xlsx.úsek sedí na PDF ID lépe než xlsx.ID: ne, je výrazně horší.

Poslední bod platí pro přímý join xlsx.úsek = PDF ID a shodu názvů. Nový nález je odlišný: nejde o join podle hodnoty tohoto pole, ale o shodu pořadí záznamů po jeho seřazení.

Výjimky a signály přečíslování:

  • Excel obsahuje 496a, zatímco PDF obsahuje odpovídající úsek jako 500a.
  • Excel obsahuje 578a, zatímco PDF obsahuje odpovídající úsek jako 570a.
  • Excel obsahuje základní ID 416, 689, 729, zatímco PDF má dělené řádky 416-1/2/3, 689-1/2, 729-1/2.
  • PDF obsahuje 479, které jsem v Excelu nenašel.
  • Excel má duplicitní ID = 627; druhý řádek má v Excelu úsek = 941.

Kontrola parkovani.json

Aktuální soubor parkovani.json obsahuje všech 712 řádků PDF přílohy: 669 s čistě číselným ID, 35 se sufixem a 8 s děleným ID. Následující odstavec zachycuje historický stav první verze importu, který vysvětlil, proč tehdy vznikl výstup pouze se 662 úseky.

Původní import čistě číselných řádků vynechal těchto 7 z 669 záznamů:

ID typ ZSJ komunikace/úsek proč vypadlo
382 MK Historické jádro Na potoce, Petra Jilemnického - U kapličky v PDF je v obsazenosti ######, regex ho nebral
519 SIL K Toušení Královická, křižovatka Y - hranice města v PDF je holé 0 místo 0,0%
526 MK K Toušení Jiřího Macháčka, Královická - jih ZPS je v PDF ano malými písmeny
527 MK K Toušení Jiřího Macháčka, před sportovištěm ZPS je v PDF ano malými písmeny
528 MK K Toušení Jiřího Macháčka, parkoviště vedle sportoviště ZPS je v PDF ano malými písmeny
529 MK K Toušení Jiřího Macháčka, komunikace 1 ZPS je v PDF ano malými písmeny
552 MK U školy Husova, U parku - U cikorky v PDF je holé 0 místo 0,0%

Není to systematický výpadek jednoho typu komunikace: ze 7 číselných výpadků je 6 MK a 1 SIL, příčinou je formát textové extrakce.

Proti plným 712 řádkům PDF přílohy tak původní parkovani.json vynechával 50 řádků:

  • 7 číselných řádků výše;
  • všech 35 sufixových ID typu 354a;
  • všech 8 dělených ID typu 416-1.

Typově šlo o 39 MK, 8 UK a 3 SIL. Pro veřejnou mapu to bylo významné, protože mezi vynechanými byly i skutečné uliční úseky a parkoviště, ne jen technické poznámky. Tato konkrétní chyba textové extrakce je v aktuálním importu opravena; chybná OA/OBS v PDF a neshody ID mezi PDF a Excelovým sešitem zůstávají.

Další rizika pro veřejnou mapu

  1. OA DEN/OA NOC v PDF příloze jsou přiřazené k nesprávným úsekům kvůli pozičnímu spojení dvou seznamů.
  2. Hotové hodnoty OBS v PDF jsou také místně nesprávné, přestože jsou uvnitř řádku aritmeticky konzistentní.
  3. Některá ID jsou přečíslovaná nebo rozdělená mezi verzemi dat.
  4. Excel obsahuje duplicitní ID 627.
  5. PDF obsahuje formátové anomálie: ######, holé 0 ve sloupcích obsazenosti, malé ano, extrémní procenta a řádky se sufixem nebo děleným ID.
  6. U úseků s nulovou kapacitou se objevují stavy ZÁKAZ a zároveň nenulové počty vozidel. Mapová vrstva musí tyto případy zobrazovat odděleně od běžné procentní obsazenosti.

Vypořádání v mapě (2. 8. 2026)

Nálezy byly nezávisle přepočítány a promítnuty do /doprava:

  • Ověření extrakce: vlastní pdftotext a vlastní parser dal 712 řádků s unikátními ID a nulovou odchylkou proti parkovani.json.
  • Ověření kořenové příčiny: seřazení surových dat podle pomocného sloupce úsek vysvětlí 661 z 669 číselných řádků přílohy osmi posuny, zatímco pořadí podle ID jen 147 a přímý join přes ID pouhých 20. Šum je ~25 shod na posun, dva hlavní posuny mají 286 a 261. Kořenová příčina potvrzena.
  • Ověření vnitřní konzistence OBS: zpětný dopočet sedí u 346 z 351 ověřitelných řádků. Konzistence tedy platí a skutečně nic nedokazuje.
  • Ověření agregace: kapacity z přílohy sedí na tabulku 3.1 v 16 z 16 porovnatelných ZSJ, počty vozidel z přílohy v 0 z 16.

Doporučení 2 (převodník přejmenovaných a dělených ID) nebylo do té doby implementované. Deset úseků nemělo v surových datech protějšek, jejich kapacita ale v součtu ulice zůstávala — Rozmarýnova se proto v mapě zobrazovala jako prázdná (0 %) místo skutečných 120 %, Kralupská jako 47 % místo 93 %. Převodník je doplněný v doprava/tools/parkovani-geometrie.py (PREVOD_ID), dělené úseky sdílejí jeden řádek surových dat.

Tím se současně vysvětlily oba dosud nerozhodnuté rozdíly proti tabulce 3.1:

ZSJ publikováno (noc/den) agregace před opravou po opravě
U nádraží 1285 / 1032 1152,5 / 953,7 1284,5 / 1032,0
Zahradní město 158 / 89 34,5 / 33,2 158,0 / 88,8

Rozdíl tedy nebyl rozporem v datech, ale chybou párování na naší straně. Příznak spolehlivostVozidel: "nejista" byl u obou oblastí zrušen.

Blok 245–249 ve Staré Boleslavi

Poslední skupina neshod se ukázala jako lokální přečíslování po změně dělení území, ne jako další systematická chyba. Napříč všemi 711 spárovanými řádky je medián podobnosti názvů 1,00 a pod 0,75 klesá jen pět dvojic — všechny v tomto jednom bloku.

Zpracovatel k němu podklady nemá, rozhodovala proto shoda názvů, protože ta určuje identitu úseku:

PDF xlsx jistota
248 „nám. SV. Václava - jih” 245 „nám. SV. Václava / jih” vysoká — doslovná shoda
247 „nám. SV. Václava - sever” 248 „nám. SV. Václava / sever” vysoká — doslovná shoda
479 „Františka Strunze, Martinovskí-slepá” 249 „Františka Strunze / Martinovská - slepá” vysoká — jediný výskyt ulice v obou souborech
249 „Maxe Švabinského + nám. Sv. václava” 247 „Maxe Švabinského / k nám. Sv Václava” střední — zbytek po vyloučení, oba popisy míří na tutéž spojku
245 „parkoviště pod Mariánským nám.” ponecháno bez protějšku

U 245 se nabízel xlsx 147a „Boleslavská / parkoviště pod Mariánským nám.

  • západ”, jenže příloha slovník východ/západ používá na řádku 244, kde sedí doslova, a u 245 ne. Přiřazení by bylo dohadem, proto zůstává „nevíme”. Dvojice PDF 147/147a se neřeší: všechny excelové řádky, které pro ně přicházejí v úvahu, mají nula vozidel, takže na výsledku nezáleží.

Vyhodnocení dopadu. Na mapě se nezměnilo nic kromě 479, které přešlo z „neznámo” na „naměřeno nula”. Čtyři z pěti dotčených úseků (30 stání) mají v příloze název, který neodpovídá žádné ulici v silniční síti, takže se nekreslí. Bilance za ZSJ se nezměnila vůbec — celá permutace probíhá uvnitř ZSJ U kostela a přesouvaný řádek 249 má nulové hodnoty. U kostela zůstává na 142 vozidlech v noci a 271 ve dne, tedy přesně na publikované tabulce 3.1. Oprava je tedy správná, ale prakticky bezvýznamná; její cenou je, že kontrolní výpis skriptu už hlásí jen dva skutečné překlepy místo šesti smíšených nálezů.

Zbývající známá nejistota: PDF 245 (19 stání) je bez počtů vozidel.

Doporučení

Pro veřejnou mapu nelze použít OA DEN/OA NOC ani OBS z PDF přílohy. Kořenová příčina rozporu je dostatečně doložená i bez vyjádření zpracovatele: vozidla jsou v příloze připojená k jiným úsekům.

Nejmenší bezpečný postup:

  1. Brát z PDF pouze identifikaci úseku, typ, ZSJ a kapacity; nepřebírat jeho OA ani OBS.
  2. Brát Průměr den/noc z Excelu a spojovat jej s kapacitami přes skutečné ID, včetně explicitního převodníku pro přejmenované a dělené úseky.
  3. Obsazenost dopočítat z nezaokrouhlených excelových průměrů a zvolené kapacity. Zobrazený počet lze zaokrouhlit až samostatně pro popisek.
  4. Opravit import tak, aby bral sufixová a dělená ID a formátové výjimky.
  5. V mapě explicitně označit úseky s nulovou kapacitou a stavy ZÁKAZ/NO, protože běžné procento obsazenosti u nich není interpretovatelné stejně jako u nenulové kapacity.
  6. Vyžádat od zpracovatele původní zdrojový sešit/GIS projekt a potvrzení chyby; to je důležité pro oficiální opravu analýzy, nikoli už pro identifikaci technické příčiny.