Sblížení kódu pro vizualizaci průběhu (kopírováním…)

master^2
LEdoian 2 years ago
parent ec77e6a4c0
commit 241230135d

@ -9,9 +9,11 @@ from dataclasses import dataclass
from glob import glob from glob import glob
from typing import Sequence from typing import Sequence
from functools import reduce from functools import reduce
from pathlib import Path
VOLICU_CELKEM = 8_245_962 VOLICU_CELKEM = 8_245_962
OKRSKU_CELKEM = 14_857 OKRSKU_CELKEM = 14_857
START = datetime.fromisoformat('2023-01-14T14:00:00')
kandidati_jmena = { kandidati_jmena = {
1: 'Pavel Fischer', 1: 'Pavel Fischer',
2: 'Jaroslav Bašta', 2: 'Jaroslav Bašta',
@ -66,6 +68,12 @@ def nacti_davku(fn) -> dict[tuple[int, int], VysledekOkrsku]:
return okrsky return okrsky
@dataclass
class KolacovaData:
kandidati: dict[str, int]
timestamp: datetime
secteno_okrsku: int
def zpracuj_davky(fns: Sequence[str]): def zpracuj_davky(fns: Sequence[str]):
# Zpracovávací fáze: načteme dávku, nahradíme předchozí instance pro okrsky # Zpracovávací fáze: načteme dávku, nahradíme předchozí instance pro okrsky
# Počítací fáze: sečteme hlasy za všechny okrsky, vyrobíme dump nebo koláč ke každému času # Počítací fáze: sečteme hlasy za všechny okrsky, vyrobíme dump nebo koláč ke každému času
@ -75,6 +83,7 @@ def zpracuj_davky(fns: Sequence[str]):
okrsky: dict[tuple[int, int], VysledekOkrsku] = {} okrsky: dict[tuple[int, int], VysledekOkrsku] = {}
celkovy_vysledek: dict[str, int] = {} celkovy_vysledek: dict[str, int] = {}
data: list[KolacovaData] = []
for fn in fns: for fn in fns:
print(f'Zpracovávám dávku {fn}') print(f'Zpracovávám dávku {fn}')
nove = nacti_davku(fn) nove = nacti_davku(fn)
@ -95,59 +104,78 @@ def zpracuj_davky(fns: Sequence[str]):
celkovy_vysledek['NEZAPOČÍTANÉ'] = 0 # del který funguje i v první iteraci :-) celkovy_vysledek['NEZAPOČÍTANÉ'] = 0 # del který funguje i v první iteraci :-)
celkovy_vysledek['NEZAPOČÍTANÉ'] = VOLICU_CELKEM - sum(celkovy_vysledek.values()) celkovy_vysledek['NEZAPOČÍTANÉ'] = VOLICU_CELKEM - sum(celkovy_vysledek.values())
# Vizualizace / export # Vizualizace / export
# FIXME: Zkopírováno, negenerické, fuj. Má používat nějaký dedikovaný spoolečný kód. data.append(KolacovaData(
plt.clf() kandidati = dict(celkovy_vysledek),
# Pro srovnání: zpracování okrsků timestamp = ts,
# TODO: WTF: když tohle nakreslím až po kandidátech, tak se secteno_okrsku = len(okrsky.keys())
# kandidáti vyrenderují mimo bbox. ))
okrsku_secteno = len(okrsky.keys()) return data
okrsku_zbyva = OKRSKU_CELKEM - okrsku_secteno
plt.pie( # FIXME: ne globálním datům!
[okrsku_secteno, okrsku_zbyva], data = [KolacovaData(
colors=['#000088', '#cccccc'], kandidati={'NEZAPOČÍTANÉ': VOLICU_CELKEM},
center=(1, -1), radius=0.3, timestamp=START,
) secteno_okrsku=0,
)]
# Zastoupení kandidátů data.extend(zpracuj_davky(sorted(glob('davky/*.xml'))))
order = (
'Petr Pavel', # Reálně ale kašleme na jednotlivé sekundy, takže z každé vezmeme jen poslední výsledek
'Danuše Nerudová', po_sekundach = {}
'Marek Hilšer', for x in data:
'Pavel Fischer', po_sekundach[x.timestamp] = x
'Karel Diviš',
'Tomáš Zima', def visualize_data(data: KolacovaData):
'Jaroslav Bašta', # FIXME: Zkopírováno, negenerické, fuj. Má používat nějaký dedikovaný spoolečný kód.
'Andrej Babiš', plt.clf()
'NEPLATNÉ', # Pro srovnání: zpracování okrsků
'NEVOLILI', # TODO: WTF: když tohle nakreslím až po kandidátech, tak se
'NEZAPOČÍTANÉ', # kandidáti vyrenderují mimo bbox.
) okrsku_zbyva = OKRSKU_CELKEM - data.secteno_okrsku
# FIXME: průběžné výsledky nemají některé kandidáty. Tohle bychom neměli opravovat tady. plt.pie(
x = [celkovy_vysledek.get(i, 0) for i in order] [data.secteno_okrsku, okrsku_zbyva],
print(ts, x) colors=['#000088', '#cccccc'],
labels = order center=(1, -1), radius=0.3,
label = str(ts) )
colors = {
'Petr Pavel': '#627210', # Zastoupení kandidátů
'Danuše Nerudová': '#811367', order = (
'Andrej Babiš': '#262161', 'Petr Pavel',
'Jaroslav Bašta': '#B51119', 'Danuše Nerudová',
'Marek Hilšer': '#CA834E', 'Marek Hilšer',
'Pavel Fischer': '#244C76', 'Pavel Fischer',
'Karel Diviš': '#3B6E5D', 'Karel Diviš',
'Tomáš Zima': '#E5DE1A', 'Tomáš Zima',
'NEPLATNÉ': '#000000', 'Jaroslav Bašta',
'NEVOLILI': '#666666', 'Andrej Babiš',
'NEZAPOČÍTANÉ': '#CCCCCC', 'NEPLATNÉ',
} 'NEVOLILI',
plt.pie(x, labels=labels, colors=[colors[i] for i in order], autopct='%1.3f %%') 'NEZAPOČÍTANÉ',
plt.text(0, -1.2, label, ha='center') )
# FIXME: průběžné výsledky nemají některé kandidáty. Tohle bychom neměli opravovat tady.
# save x = [data.kandidati.get(i, 0) for i in order]
fn = f'progress_png/{ts}.png' print(data.timestamp, x)
plt.savefig(fn) labels = order
label = str(data.timestamp)
colors = {
zpracuj_davky( 'Petr Pavel': '#627210',
sorted(glob('davky/*.xml')) 'Danuše Nerudová': '#811367',
) 'Andrej Babiš': '#262161',
'Jaroslav Bašta': '#B51119',
'Marek Hilšer': '#CA834E',
'Pavel Fischer': '#244C76',
'Karel Diviš': '#3B6E5D',
'Tomáš Zima': '#E5DE1A',
'NEPLATNÉ': '#000000',
'NEVOLILI': '#666666',
'NEZAPOČÍTANÉ': '#CCCCCC',
}
plt.pie(x, labels=labels, colors=[colors[i] for i in order], autopct='%1.3f %%')
plt.text(0, -1.2, label, ha='center')
# save
fn = f'progress_png/{data.timestamp}.png'
plt.savefig(fn)
Path('./progress_png').mkdir(exist_ok=True)
for kolac in po_sekundach.values():
visualize_data(kolac)

Loading…
Cancel
Save