diff --git a/progress.py b/progress.py index f03fe19..7c3d8f7 100755 --- a/progress.py +++ b/progress.py @@ -9,9 +9,11 @@ from dataclasses import dataclass from glob import glob from typing import Sequence from functools import reduce +from pathlib import Path VOLICU_CELKEM = 8_245_962 OKRSKU_CELKEM = 14_857 +START = datetime.fromisoformat('2023-01-14T14:00:00') kandidati_jmena = { 1: 'Pavel Fischer', 2: 'Jaroslav Bašta', @@ -66,6 +68,12 @@ def nacti_davku(fn) -> dict[tuple[int, int], VysledekOkrsku]: return okrsky +@dataclass +class KolacovaData: + kandidati: dict[str, int] + timestamp: datetime + secteno_okrsku: int + def zpracuj_davky(fns: Sequence[str]): # 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 @@ -75,6 +83,7 @@ def zpracuj_davky(fns: Sequence[str]): okrsky: dict[tuple[int, int], VysledekOkrsku] = {} celkovy_vysledek: dict[str, int] = {} + data: list[KolacovaData] = [] for fn in fns: print(f'Zpracovávám dávku {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É'] = VOLICU_CELKEM - sum(celkovy_vysledek.values()) # Vizualizace / export - # FIXME: Zkopírováno, negenerické, fuj. Má používat nějaký dedikovaný spoolečný kód. - plt.clf() - # Pro srovnání: zpracování okrsků - # TODO: WTF: když tohle nakreslím až po kandidátech, tak se - # kandidáti vyrenderují mimo bbox. - okrsku_secteno = len(okrsky.keys()) - okrsku_zbyva = OKRSKU_CELKEM - okrsku_secteno - plt.pie( - [okrsku_secteno, okrsku_zbyva], - colors=['#000088', '#cccccc'], - center=(1, -1), radius=0.3, - ) - - # Zastoupení kandidátů - order = ( - 'Petr Pavel', - 'Danuše Nerudová', - 'Marek Hilšer', - 'Pavel Fischer', - 'Karel Diviš', - 'Tomáš Zima', - 'Jaroslav Bašta', - 'Andrej Babiš', - 'NEPLATNÉ', - 'NEVOLILI', - 'NEZAPOČÍTANÉ', - ) - # FIXME: průběžné výsledky nemají některé kandidáty. Tohle bychom neměli opravovat tady. - x = [celkovy_vysledek.get(i, 0) for i in order] - print(ts, x) - labels = order - label = str(ts) - colors = { - 'Petr Pavel': '#627210', - '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/{ts}.png' - plt.savefig(fn) - - -zpracuj_davky( - sorted(glob('davky/*.xml')) - ) + data.append(KolacovaData( + kandidati = dict(celkovy_vysledek), + timestamp = ts, + secteno_okrsku = len(okrsky.keys()) + )) + return data + +# FIXME: ne globálním datům! +data = [KolacovaData( + kandidati={'NEZAPOČÍTANÉ': VOLICU_CELKEM}, + timestamp=START, + secteno_okrsku=0, + )] +data.extend(zpracuj_davky(sorted(glob('davky/*.xml')))) + +# Reálně ale kašleme na jednotlivé sekundy, takže z každé vezmeme jen poslední výsledek +po_sekundach = {} +for x in data: + po_sekundach[x.timestamp] = x + +def visualize_data(data: KolacovaData): + # FIXME: Zkopírováno, negenerické, fuj. Má používat nějaký dedikovaný spoolečný kód. + plt.clf() + # Pro srovnání: zpracování okrsků + # TODO: WTF: když tohle nakreslím až po kandidátech, tak se + # kandidáti vyrenderují mimo bbox. + okrsku_zbyva = OKRSKU_CELKEM - data.secteno_okrsku + plt.pie( + [data.secteno_okrsku, okrsku_zbyva], + colors=['#000088', '#cccccc'], + center=(1, -1), radius=0.3, + ) + + # Zastoupení kandidátů + order = ( + 'Petr Pavel', + 'Danuše Nerudová', + 'Marek Hilšer', + 'Pavel Fischer', + 'Karel Diviš', + 'Tomáš Zima', + 'Jaroslav Bašta', + 'Andrej Babiš', + 'NEPLATNÉ', + 'NEVOLILI', + 'NEZAPOČÍTANÉ', + ) + # FIXME: průběžné výsledky nemají některé kandidáty. Tohle bychom neměli opravovat tady. + x = [data.kandidati.get(i, 0) for i in order] + print(data.timestamp, x) + labels = order + label = str(data.timestamp) + colors = { + 'Petr Pavel': '#627210', + '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)