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

Benennung: Stimmbezirke statt Wahllokale

parent 1bce4738
No related branches found
No related tags found
No related merge requests found
Showing
with 45 additions and 8107 deletions
#' aktualisiere_karten.R
aktualisiere_karten <- function(wl_url = wahllokale_url) {
aktualisiere_karten <- function(wl_url = stimmbezirke_url) {
# Lies Ortsteil-Daten ein und vergleiche
neue_orts_df <- lies_gebiet(wl_url) %>%
aggregiere_stadtteile() %>%
......
......@@ -143,7 +143,7 @@ generiere_auszählungsbalken <- function(ausgezählt,anz,max,ts) {
format.Date(ts, "%d.%m.%y, %H:%M Uhr"),
"</strong> - ",
anz," von ",max,
" Wahllokalen ausgezählt<br>"
" Stimmbezirken ausgezählt<br>"
)
}
......
#' generiere_testdaten.R
#'
#' Macht aus den Templates für Ortsteil- und Wahllokal-Ergebnisse
#' Macht aus den Templates für Ortsteil- und Stimmbezirk-Ergebnisse
#' jeweils eine Serie von fiktiven Livedaten, um das Befüllen der
#' Grafiken testen zu können.
#'
......@@ -27,24 +27,24 @@ lösche_testdaten <- function(){
for (f in testdaten_files) {
# Grausam, I know.
if (str_detect(f,"ortsteile[0-9]+\\.csv") |
str_detect(f,"wahllokale[0-9]+\\.csv")) {
str_detect(f,"stimmbezirke[0-9]+\\.csv")) {
file.remove(f)
}
}
}
# Vorlagen laden
vorlage_wahllokale_df <- read_delim("testdaten/Open-Data-06412000-Buergerentscheid-zur-Abwahl-des-Oberbuergermeisters-der-Stadt-Frankfurt-am-Main_-Herrn-Peter-Feldmann-Stimmbezirk.csv",
vorlage_stimmbezirke_df <- read_delim("testdaten/Open-Data-06412000-Buergerentscheid-zur-Abwahl-des-Oberbuergermeisters-der-Stadt-Frankfurt-am-Main_-Herrn-Peter-Feldmann-Stimmbezirk.csv",
delim = ";", escape_double = FALSE,
locale = locale(date_names = "de",
decimal_mark = ",",
grouping_mark = "."),
trim_ws = TRUE)
wahllokale_max <- sum(vorlage_wahllokale_df$`max-schnellmeldungen`)
stimmbezirke_max <- sum(vorlage_stimmbezirke_df$`max-schnellmeldungen`)
# Konstanten für die Simulation - werden jeweils um bis zu +/-25% variiert
c_wahlberechtigt = 510000 / wahllokale_max # Gleich große Wahlbezirke
c_wahlberechtigt = 510000 / stimmbezirke_max # Gleich große stimmbezirke
c_wahlbeteiligung = 0.3 # Wahlbeteiligung um 30%, wird im Lauf der "Wahl" erhöht (kleinere WL sind schneller ausgezählt)
c_wahlschein = 0.25 # 25% Briefwähler
c_nv = 0.05 # 0,5% wählen "spontan" und sind nicht verzeichnet (nv) im Wählerverzeichnis
......@@ -63,13 +63,13 @@ variiere <- function(x = 1) {
i = 1
# Schleife für die Wahllokale: Solange noch nicht alle "ausgezählt" sind...
while(sum(vorlage_wahllokale_df$`anz-schnellmeldungen`) < wahllokale_max) {
# Schleife für die stimmbezirke: Solange noch nicht alle "ausgezählt" sind...
while(sum(vorlage_stimmbezirke_df$`anz-schnellmeldungen`) < stimmbezirke_max) {
# ...splitte das df in die gemeldeten (meldungen_anz == 1) und nicht gemeldeten Zeilen
tmp_gemeldet_df <- vorlage_wahllokale_df %>% filter(`anz-schnellmeldungen` == 1)
# Die Variable rand wird als Anteil von 20 Meldungen an debn noch offenen Wahllokale berechnet
rand <- 20 / (nrow(vorlage_wahllokale_df) - nrow(tmp_gemeldet_df))
tmp_sample_df <- vorlage_wahllokale_df %>%
tmp_gemeldet_df <- vorlage_stimmbezirke_df %>% filter(`anz-schnellmeldungen` == 1)
# Die Variable rand wird als Anteil von 20 Meldungen an debn noch offenen stimmbezirke berechnet
rand <- 20 / (nrow(vorlage_stimmbezirke_df) - nrow(tmp_gemeldet_df))
tmp_sample_df <- vorlage_stimmbezirke_df %>%
filter(`anz-schnellmeldungen` == 0) %>%
# Bei den noch nicht ausgefüllten "Meldungen" mit einer Wahrscheinlichkeit
# von rand in die Gruppe sortieren, die neu "gemeldet" wird
......@@ -106,23 +106,23 @@ while(sum(vorlage_wahllokale_df$`anz-schnellmeldungen`) < wahllokale_max) {
# Kurze Statusmeldung
cat("Neu gemeldet:",nrow(tmp_neu_df),"noch offen:",nrow(tmp_offen_df))
# Phew. Aktualisierte Testdatei zusammenführen und anlegen.
vorlage_wahllokale_df <- tmp_gemeldet_df %>%
vorlage_stimmbezirke_df <- tmp_gemeldet_df %>%
bind_rows(tmp_neu_df) %>%
bind_rows(tmp_offen_df) %>%
# wieder in die Reihenfolge nach Wahllokal-Nummer
# wieder in die Reihenfolge nach stimmbezirk-Nummer
arrange(`gebiet-nr`)
write_csv2(vorlage_wahllokale_df,
paste0("testdaten/wahllokale",
write_csv2(vorlage_stimmbezirke_df,
paste0("testdaten/stimmbezirke",
sprintf("%02i",i),
".csv"),
escape = "backslash")
# Generiere die passende Ortsteil-Meldung
# Geht aus irgeneindem Grund nicht, aber wir brauchens ja auch nicht.
# ortsteile_df <- zuordnung_wahllokale_df %>%
# ortsteile_df <- zuordnung_stimmbezirke_df %>%
# select(`gebiet-name` = name,ortsteilnr) %>%
# left_join(vorlage_wahllokale_df,by="gebiet-name") %>%
# # Zuordnung der Wahllokale
# left_join(vorlage_stimmbezirke_df,by="gebiet-name") %>%
# # Zuordnung der stimmbezirke
# group_by(ortsteilnr) %>%
# # Das crasht - WTF???
# summarize(across(7:18, ~ sum(.,na.rm = T))) %>%
......@@ -133,7 +133,7 @@ while(sum(vorlage_wahllokale_df$`anz-schnellmeldungen`) < wahllokale_max) {
i <- i+1
# Wahlbeteiligung schrittweise ein wenig anheben - um zu simulieren,
# dass "kleinere" Wahllokale zuerst ausgezählt werden
# dass "kleinere" stimmbezirke zuerst ausgezählt werden
c_wahlbeteiligung <- c_wahlbeteiligung + 0.002
}
......
......@@ -32,7 +32,7 @@ for (i in c(1:nrow(config_df))) {
#---- Daten ins Archiv schreiben oder daraus lesen
archiviere <- function(df,a_directory = "daten/wahllokale") {
archiviere <- function(df,a_directory = "daten/stimmbezirke") {
if (!dir.exists(a_directory)) {
dir.create(a_directory)
}
......@@ -45,7 +45,7 @@ archiviere <- function(df,a_directory = "daten/wahllokale") {
".csv"))
}
hole_letztes_df <- function(a_directory = "daten/wahllokale") {
hole_letztes_df <- function(a_directory = "daten/stimmbezirke") {
if (!dir.exists(a_directory)) return(tibble())
neuester_file <- list.files(a_directory, full.names=TRUE) %>%
file.info() %>%
......@@ -65,7 +65,7 @@ hole_letztes_df <- function(a_directory = "daten/wahllokale") {
#---- Lese-Funktionen ----
lies_gebiet <- function(stand_url = wahllokale_url) {
lies_gebiet <- function(stand_url = stimmbezirke_url) {
ts <- now()
# Versuch Daten zu lesen - und gib ggf. Warnung oder Fehler zurück
check = tryCatch(
......@@ -113,11 +113,11 @@ vergleiche_stand <- function(alt_df, neu_df) {
return(sum(abs(neu_sum_df - alt_sum_df))==0)
}
#' Liest Wahllokale, gibt nach Ortsteil aggregierte Daten zurück
#' Liest Stimmbezirke, gibt nach Ortsteil aggregierte Daten zurück
#' (hier: kein Sicherheitscheck)
aggregiere_stadtteile <- function(wahllokale_df) {
ortsteile_df <- wahllokale_df %>%
left_join(zuordnung_wahllokale_df,by=c("nr","name")) %>%
aggregiere_stadtteile <- function(stimmbezirke_df) {
ortsteile_df <- stimmbezirke_df %>%
left_join(zuordnung_stimmbezirke_df,by=c("nr","name")) %>%
group_by(ortsteilnr) %>%
summarize(zeitstempel = last(zeitstempel),
across(meldungen_anz:nein, ~ sum(.,na.rm = T))) %>%
......@@ -131,7 +131,7 @@ aggregiere_stadtteile <- function(wahllokale_df) {
# Sicherheitscheck: Warnen, wenn nicht alle Ortsteile zugeordnet
if (nrow(ortsteile_df) != nrow(stadtteile_df)) teams_warnung("Nicht alle Ortsteile zugeordnet")
if (nrow(zuordnung_wahllokale_df) != length(unique(wahllokale_df$nr))) teams_warnung("Nicht alle Wahllokale zugeordnet")
if (nrow(zuordnung_stimmbezirke_df) != length(unique(stimmbezirke_df$nr))) teams_warnung("Nicht alle Stimmbezirke zugeordnet")
return(ortsteile_df)
}
......
......@@ -26,7 +26,7 @@ source("R/generiere_balken.R")
#----aktualisiere_fom() ----
# fom ist das "Feldmann-o-meter", die zentrale Grafik mit dem Stand der Auszählung.
aktualisiere_fom <- function(wl_url = wahllokale_url) {
aktualisiere_fom <- function(wl_url = stimmbezirke_url) {
# Einlesen: Feldmann-o-meter-Daten so far.
# Wenn die Daten noch nicht existieren, generiere ein leeres df.
......@@ -57,8 +57,8 @@ aktualisiere_fom <- function(wl_url = wahllokale_url) {
arrange(zeitstempel) %>%
tail(1)
# Neue Daten holen (mit Fehlerbehandlung)
wahllokale_df <- lies_gebiet(wl_url)
neue_fom_df <- wahllokale_df %>%
stimmbezirke_df <- lies_gebiet(wl_url)
neue_fom_df <- stimmbezirke_df %>%
# Namen raus
select(-name,-nr) %>%
# Daten aufsummieren
......@@ -69,7 +69,7 @@ aktualisiere_fom <- function(wl_url = wahllokale_url) {
return(FALSE)
} else {
# Archiviere die Rohdaten
archiviere(wahllokale_df,"daten/wahllokale/")
archiviere(stimmbezirke_df,"daten/stimmbezirke/")
# Ergänze das fom_df um die neuen Daten und sichere es
fom_df <- fom_df %>% bind_rows(neue_fom_df)
saveRDS(fom_df,"daten/fom_df.rds")
......@@ -137,7 +137,7 @@ aktualisiere_fom <- function(wl_url = wahllokale_url) {
# (die dann wieder aktualisiere_karten() aufruft)
check = tryCatch(
{
neue_daten <- aktualisiere_fom(wahllokale_url)
neue_daten <- aktualisiere_fom(stimmbezirke_url)
},
warning = function(w) {teams_warning(w,title="Feldmann: fom")},
error = function(e) {teams_warning(e,title="Feldmann: fom")})
......@@ -145,7 +145,7 @@ check = tryCatch(
if (neue_daten) {
check = tryCatch(
{
neue_daten <- aktualisiere_karten(wahllokale_url)
neue_daten <- aktualisiere_karten(stimmbezirke_url)
},
warning = function(w) {teams_warning(w,title="Feldmann: Karten")},
error = function(e) {teams_warning(e,title="Feldmann: Karten")})
......@@ -159,7 +159,7 @@ if (neue_daten) {
"<strong>Update OK</strong><br/><br/>",
fom_df$meldungen_anz,
" von ",
fom_df$meldungen_max," Wahllokale ausgezählt ",
fom_df$meldungen_max," Stimmbezirke ausgezählt ",
"<ul><li><strong>Quorum zur Abwahl ist derzeit",
ifelse(fom_df$ja / fom_df$wahlberechtigt < 0.3, " nicht ", " "),
"erreicht</strong></li>",
......@@ -178,7 +178,7 @@ if (neue_daten) {
}
} else {
teams_warning("Neue Wahllokal-Daten, aber keine neuen Ortsdaten?")
teams_warning("Neue Stimmbezirk-Daten, aber keine neuen Ortsdaten?")
}
}
# Auch hier TRUE zurückbekommen;; alles OK?
\ No newline at end of file
......@@ -40,8 +40,8 @@ rechnet eine Routine es schnell selbst.
Durch Aufruf der Funktion **aktualisiere_karten()** werden die Ortsdaten erzeugt und für die Stadtteile in Datawrapper ausgegeben. Aus der Stadtteil-Auszählung werden die drei Datawrapper-Grafiken auf den aktuellen
Stand gebracht:
- eine Choropleth-Karte mit dem Anteil der Ja-Stimmen an der Wahlbevölkerung,
- eine Symbol-Karte mit den absoluten Ja-Stimmen nach Wahlbezirk,
- eine Tabelle mit den Ergebnissen in barrierefreier Form.
- eine Symbol-Karte mit den absoluten Ja-Stimmen nach Ortsteil,
- eine Tabelle mit den Ortsteil-Ergebnissen in barrierefreier Form.
### index-Dateien
......@@ -53,7 +53,7 @@ Stand gebracht:
## Datenquelle und Datenformat
Nutzt die Livedaten von https://wahlen.frankfurt.de - die aktuellen Daten nach Wahllokal, Ortsteil und Ortsbezirk sind als CSV-Datei [auf dieser Seite zu finden](https://votemanager-ffm.ekom21cdn.de/2022-11-06/06412000/praesentation/opendata.html). Dort ist das Datenformat auch erklärt:
Nutzt die Livedaten von https://wahlen.frankfurt.de - die aktuellen Daten nach Ortsteil und Stimmbezirk sind als CSV-Datei [auf dieser Seite zu finden](https://votemanager-ffm.ekom21cdn.de/2022-11-06/06412000/praesentation/opendata.html). Dort ist das Datenformat auch erklärt:
- datum : Datum des Wahltermins
- wahl : Name der Wahl
- ags : AGS der Behörde
......@@ -72,12 +72,14 @@ Nutzt die Livedaten von https://wahlen.frankfurt.de - die aktuellen Daten nach W
- D1 : Ja-Stimmen
- D2 : Nein-Stimmen
Es gibt 575 Stimmbezirke - also administrative Auszählungs-Einheiten. Fast 200 von diesen "Bezirken" sind die Briefwahl-Auszählungen - sie werden alle in der Messe ausgezählt. Insgesamt gibt es 2019 Wahllokale. (vgl. index/opendata-wahllokale.csv)
## Wann gibt es wo Daten?
- Sobald ein Wahllokal ausgezählt ist, wird eine "Schnellmeldung" erzeugt und werden die CSVs aktualisiert.
- Eine Schnellmeldung umfasst ein Wahllokal.
- Sobald einer der 575 Stimmbezirke ausgezählt ist, wird eine "Schnellmeldung" erzeugt und werden die CSVs aktualisiert.
- Eine Schnellmeldung umfasst einen Stimmbezirk, ein Wahllokal idR mehrere davon.
- Nicht ausgezählte Wahllokale enthalten NA bei Wahlberechtigten/Wählern
- Ortsteile haben, solang sie noch nicht ganz ausgezählt sind, fiktive Wahlberechtigten-Zahlen - die dann nur die Wahllokale abbilden, die bereits ausgezählt sind. (Beispiel: Ein Ortsteil hat 3000 Wahlberechtigte in 3 Wahllokal-Bezirken mit jeweils 1000 Wahlberechtigten - solange nur 2 ausgezählt sind, wird für den Ortsteil eine Wahlberechtigten-Anzahl von 2000 angezeigt.)
- Briefwahl"lokale" - die Wahllokale mit den Nummern 9xx-xx - haben 0 Wahlberechtigte.
- Briefwahl"lokale" - die Stimmbezirke mit den Nummern 9xx-xx - haben 0 Wahlberechtigte.
**An dieser Stelle ein Dankeschön an das Wahlamt der Stadt Frankfurt, das trotz Zeitdrucks geduldig und kompetent Unterstützung geleistet hat.**
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment