Skip to content
Snippets Groups Projects
Commit 29a1b31b authored by untergeekDE's avatar untergeekDE
Browse files

Dokumentation ergänzt

parent 9fa45f85
No related branches found
No related tags found
No related merge requests found
...@@ -294,6 +294,8 @@ aktualisiere_top <- function(kand_tabelle_df,top=5) { ...@@ -294,6 +294,8 @@ aktualisiere_top <- function(kand_tabelle_df,top=5) {
} }
aktualisiere_tabelle_alle <- function(kand_tabelle_df) { aktualisiere_tabelle_alle <- function(kand_tabelle_df) {
# Daten und Metadaten hochladen, für die Balkengrafik mit allen
# Stimmen für alle Kandidaten
dw_data_to_chart(kand_tabelle_df, chart_id = tabelle_alle_id) dw_data_to_chart(kand_tabelle_df, chart_id = tabelle_alle_id)
balken_text <- generiere_auszählung_nurtext(gezaehlt,stimmbezirke_n,ts) balken_text <- generiere_auszählung_nurtext(gezaehlt,stimmbezirke_n,ts)
# Metadaten anpassen: Farbcodes für Parteien # Metadaten anpassen: Farbcodes für Parteien
......
...@@ -15,7 +15,7 @@ p_load(R.utils) ...@@ -15,7 +15,7 @@ p_load(R.utils)
rm(list=ls()) rm(list=ls())
TEST = TRUE TEST = FALSE
DO_PREPARE_MAPS = TRUE DO_PREPARE_MAPS = TRUE
...@@ -95,10 +95,10 @@ while (gezaehlt < stimmbezirke_n) { ...@@ -95,10 +95,10 @@ while (gezaehlt < stimmbezirke_n) {
ts <- ts_daten ts <- ts_daten
hole_wahldaten() hole_wahldaten()
} else { } else {
# Logfile erneuern und 15 Sekunden schlafen # Logfile erneuern und 10 Sekunden schlafen
system("touch obwahl.log") system("touch obwahl.log")
if (TEST) cat("Warte...\n") if (TEST) cat("Warte...\n")
Sys.sleep(15) Sys.sleep(10)
} }
} }
# Titel der Grafik "top" umswitchen # Titel der Grafik "top" umswitchen
......
...@@ -44,14 +44,9 @@ Aggregation auf Stadtebene ...@@ -44,14 +44,9 @@ Aggregation auf Stadtebene
(siehe ["Sitemap"](./sitemap.md) für den Code) (siehe ["Sitemap"](./sitemap.md) für den Code)
# TODO ## Nice-To-Have
- Vergleich letzte Kommunalwahl
- Upload aufs Repository
## NTH
- Umschalten Top5-Titel Ergebnis
- Zusatzfeature: Briefwahlprognostik - wieviele Stimmen fehlen vermutlich noch? - Zusatzfeature: Briefwahlprognostik - wieviele Stimmen fehlen vermutlich noch?
- Shapefiles KS, DA verbessern - Shapefiles KS, DA verbessern
- Datensparsamere Alternativ-CURL-Poll-Datei (zB mit dem Gesamtergebnis) - Datensparsamere Alternativ-CURL-Poll-Datei (zB mit dem Gesamtergebnis)
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
## Programme ## Programme
...liegen im Ordner "R": ...liegen im Ordner "R":
* **main.R**: Hauptprogramm, das alle Funktionen aufruft: Lies die Konfigurationsdateien ein. Schaue nach neuen Daten, lade sie herunter, verarbeite sie, gibt sie aus, versendet Teams-Messages, loggt jede Aktion in der Datei "obwahl.log"" mit. Die anderen R-Dateien sind über die "source()"-Funktion eingebunden - als Includes, gewissermaßen. * **main.R**: Hauptprogramm, das alle Funktionen aufruft: Lies die Konfigurationsdateien ein. Schaue nach neuen Daten, lade sie herunter, verarbeite sie, gibt sie aus, versendet Teams-Messages, loggt jede Aktion in der Datei "obwahl.log"" mit. Die anderen R-Dateien sind über die "source()"-Funktion eingebunden - als Includes.
* **main_oneshot.R** Version des Hauptprogramms, das nur einmal durchläuft, alles aktualisiert und sich dann verabschiedet
* **lies_konfiguration.R ** liest die Konfiguration für das Programm (Start der Wahl, Daten über Wahlberechtigte, Datawrapper-IDs) und liest die Index-Dateien ein: Kandidaten, Stadtteile, Wahllokale, Kommunalwahl-Ergebnisse. * **lies_konfiguration.R ** liest die Konfiguration für das Programm (Start der Wahl, Daten über Wahlberechtigte, Datawrapper-IDs) und liest die Index-Dateien ein: Kandidaten, Stadtteile, Wahllokale, Kommunalwahl-Ergebnisse.
* **lies_aktuellen_stand.R**: Funktionen, um auf neue Daten zu überprüfen, sie herunterzuladen und zu archivieren. * **lies_aktuellen_stand.R**: Funktionen, um auf neue Daten zu überprüfen, sie herunterzuladen und zu archivieren.
* **aktualisiere_karten.R**: Funktionen, um die Datawrapper-Karten zu aktualisieren. * **aktualisiere_karten.R**: Funktionen, um die Datawrapper-Karten zu aktualisieren.
...@@ -12,30 +13,69 @@ ...@@ -12,30 +13,69 @@
Im Ordner "R" gibt es einen Unterordner "Vorbereitung", der diese Skripte enthält: Im Ordner "R" gibt es einen Unterordner "Vorbereitung", der diese Skripte enthält:
* generiere_testdaten.R * generiere_testdaten.R - erstelle fiktive Daten einer fortschreitenden Auszählung, um die Programme testen zu können.
* teste-curl-polling.R - Testskript, um veränderte Daten über einen CURL-Aufruf so schnell wie möglich zu erkennen (sekundengenau) * teste-curl-polling.R - Testskript, um veränderte Daten über einen CURL-Aufruf so schnell wie möglich zu erkennen (sekundengenau)
* prepare.R - generiert die Datawrapper-Skripte und -karten und Indexdaten.
## Wie das Programm arbeitet
```main.R``` wird einmal aufgerufen und arbeitet dann, bis die Wahl vorbei ist
oder ein Fehler auftritt:
- Lies zunächst die Konfigurationsdatei ein und hole Index-Dateien (mehr zu denen unten)
- Starte eine Schleife, solange nicht alle Stimmbezirke ausgezählt sind
- Checke, ob sich der Zeitstempel der Daten verändert hat (```check_timestamp()```)
- Lies sie ein (```lies_stimmbezirke()```), archiviere sie und rechne sie in die benötigten Tabellen um (```berechne_kand_tabelle, aggregiere_stadtteildaten, berechne_ergänzt, berechne_hochburgen)
- Gib dann die ersten drei Grafiken aus: die Top-5-Grafik, die Balkengrafik mit allen Kandidierenden und die Tabelle mit den Stadtteil-Ergebnissen
- Nutze die Stadtteil-Ergebnis-Tabelle, um eine Teams-Meldung mit dem aktuellen Stand und dem Ergebnis evtl. ausgezählter Stadtteile zu versenden
- Aktualisiere dann die Karten: eine Sieger-Karte und die Choropleth-Karten für alle Kandiderenden.
- Falls keine aktuellen Daten da sind: touchiere einmal kurz die Datei "obwahl.log" (die ja von der its_alive.R überwacht wird, wenn ein entsprechender Cronjob läuft) und beginne dann von vorn
Es gibt eine Version namens **main_oneshot.R**, die nur einmal durchläuft, ohne auf ein neues Datum zu prüfen. Die ist gut dafür, nachzuaktualisieren.
## Wo man welche Funktionen findet (und was sie tun) ## Wo man welche Funktionen findet (und was sie tun)
### messaging.R
- teams_meldung()
- teams_error()
- teams_warnung()
geben über Teams Meldungen aus, z.B. wenn eine neue Auszählung vorliegt.
### lies_aktuellen_stand.R ### lies_aktuellen_stand.R
- archiviere(dir) - Hilfsfunktion, schreibt geholte Stimmbezirks-Daten auf die Festplatte - archiviere(dir) - Hilfsfunktion, schreibt geholte Stimmbezirks-Daten auf die Festplatte
- hole_letztes_df(dir) - Hilfsfunktion, holt die zuletzt geschriebene Stimmbezirks-Datei aus dem Verzeichnis zurück - hole_letztes_df(dir) - Hilfsfunktion, holt die zuletzt geschriebene Stimmbezirks-Datei aus dem Verzeichnis zurück (derzeit nicht benötigt)
- vergleiche_stand(alt_df,neu_df) - berechnet Spaltensummen und vergleicht die Daten
- check_for_timestamp(url) - liest das Änderungsdatum der Datei unter der URL aus - check_for_timestamp(url) - liest das Änderungsdatum der Datei unter der URL aus
- lies_stimmbezirke(url) - liest aus der Datei unter der URL die Stimmbezirke - lies_stimmbezirke(url) - liest aus der Datei unter der URL die Stimmbezirke
- aggregiere_stadtteildaten(stimmbezirke_df) - aggregiert auf Ortsteil-Ebene - aggregiere_stadtteildaten(stimmbezirke_df) - aggregiert auf Ortsteil-Ebene
- berechne_führende - berechne_ergänzt(url) - ergänzt die Stadtteildaten mit den Namen der Kandidierenden, Prozentwerten - und Spalten für die führenden n Kandidierenden (diese Tabelle braucht man für die Choropleth- und Sieger-Karten, die im Mouseover-Tooltipp genau diese Informationen darstellen)
- berechne_kand_tabelle() - die Stimmen- und Prozente-Tabelle mit allen Kandidaten, für die Top-Säulen und Alle-Balkengrafik
- berechne_hochburgen() - eine Tabelle mit den jeweils drei stärksten und drei schwächsten Stadtteilen
- hole_wahldaten() - Sammel-Aufruf. Berechnet alle Tabellen und aktualisiert alle Grafiken, und setzt eine Teams-Meldung ab, wenn es ein Update gab
### aktualisiere_karten.R ### aktualisiere_karten.R
## Wie das Programm arbeitet
```main.R``` wird einmal aufgerufen und arbeitet dann, bis die Wahl vorbei ist Hilfsfunktionen:
oder ein Fehler auftritt: - generiere_auszählungsbalken() gibt einen HTML-String zurück, der den Fortschrittsbalken enthält: wie viele der Stimmbezirke sind gezählt?
- generiere_auszählung_nurtext() - nur die Ziffern, kein Balken
- font_colour() - eine Hilfsfunktion, die einen RGB-Hex-Farbwert (#12a7bc o.ä.) nimmt und eine Textfarbe zurückgibt, die man darauf lesen kann - weiß oder schwarz. Wird für den Switcher benutzt.
- aufhellen() - gibt eine aufgehellte Farbe zurück; für die Choropleth-Karten
- link_text() produziert einen HTML-String mit einem Button und dem Link zu einer Karte.
- generiere_switcher() baut aus all dem den HTML-String für die Karten - mit den Buttons mit Links.
- karten_body_html() generiert den HTML-Code für das Tooltip-Mouseover (mit den kleinen Balkengrafiken für die ersten (top) Kandidierenden im Stadtteil)
- vorbereitung_alle_karten() setzt für (existierende!) Karten die Metadaten: Farbskala für die Choroplethen bzw. Farbwerte für die Sieger-Karte; Switcher-Buttons im Intro-Absatz, Tooltip mit den Balkengrafiken.
- generiere_socialmedia() exportiert zwei Karten als PNG - wenn der Code auf dem Server läuft, werden sie in ein übers Netz zugängliches Google-Bucket kopiert und der Link auf die PNGs in einen String gepackt, der dann in die Teams-Update-Meldung kommt.
- aktualisiere_top() - aktualisiere und publiziere die Säulen-Grafik der top (top) Kandidaten
- aktualisiere_tabelle_alle() - aktualisiere, vermetadate und publiziere die Balkengrafik mit allen Stimmen für alle Kandidaten
- aktualisiere_karten() - Die Sieger- und die Choropleth-Karten aktualisieren und publizieren
- aktualisiere_hochburgen() - Die Tabelle mit den Hochburgen nach Kandidat
- aktualisiere_ergebnistabelle() - Baut und publiziert die vielen kleinen HTML-Strings mit den Ergebnissen für die gesamte Stadt und jeden Stadtteil als Text. Gibt die Tabelle zurück; die wird auch für die Teams-Nachricht genutzt.
- Lies zunächst die Konfigurationsdatei ein und hole Index-Dateien
- Starte eine Schleife, solange nicht alle Stimmbezirke ausgezählt sind
- Checke, ob sich der Zeitstempel der Daten verändert hat (```check_timestamp()```)
- Lies sie ein (```lies_gebiet()```)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment