Skip to content
Snippets Groups Projects
Commit d2718678 authored by Jan Eggers's avatar Jan Eggers
Browse files

Kreise Alpha

parent d8d200cd
Branches
No related tags found
No related merge requests found
Showing
with 1121 additions and 14993 deletions
File moved
File moved
#' generiere_testdaten.R
#'
#' Macht aus den Templates für Gemeinde- und Wahlkreisergebnisse
#' jeweils eine Serie von fiktiven Livedaten, um das Befüllen der
#' Grafiken testen zu können.
#'
require(tidyr)
require(dplyr)
require(readr)
require(stringr)
require(openxlsx)
# Alles weg, was noch im Speicher rumliegt
rm(list=ls())
TEST = TRUE
# Aktuelles Verzeichnis als workdir
setwd(this.path::this.dir())
# Aus dem R/Vorbereitung-Verzeichnis zwei Ebenen rauf
setwd("../..")
source("R/lies_konfiguration.R")
source("R/lies_aktuellen_stand.R")
#---- Funktion zum Testdaten-Löschen ----
lösche_testdaten <- function(){
q <- tolower(readline(prompt = "Testdaten löschen - sicher? "))
if (!(q %in% c("j","y","ja"))) { return() }
# Datenarchiv weg
if (file.exists("testdaten/fom_df.rds")){
file.remove("testdaten/fom_df.rds")
}
# Testdaten
testdaten_files <- list.files("testdaten", full.names=TRUE)
for (f in testdaten_files) {
# Grausam, I know.
if (str_detect(f,"ortsteile[0-9]+\\.csv") |
str_detect(f,"wahllokale[0-9]+\\.csv")) {
file.remove(f)
}
}
}
vorlage_url = "Musterdateien/Muster_Downloaddatei_Wahlergebnisse_Landtagswahl_2023.csv"
# Vorlagen laden
# Leider geht mein Skript von Daten auf Wahllokal-Ebene aus, die Daten hier
# sind aber auf Orts-Ebene.
vorlage_df <- read_delim(vorlage_url,
delim = ";", escape_double = FALSE,
locale = locale(date_names = "de",
decimal_mark = ",",
grouping_mark = "."),
trim_ws = TRUE,
skip =1) %>%
# Alle Schnellmeldungen aus der Vorlage löschen
mutate(`Anzahl Wahlbezirke ausgezählt` = 0) %>%
mutate(across(c(6,10,11,12,14:46,76:108), ~ ifelse(is.na(.),0,.)))
# Joine die alten Wahldaten 2018 rein
hessen_df <- vorlage_df %>% filter(Gebietstyp == "LD")
wahllokale_max <- hessen_df$`Anzahl Wahlbezirke`
kreise_2018_df <- e2018_df %>%
filter(is.na(GKZ) & !is.na(Wahlkreis)) %>%
select(wk = Wahlkreis,
wahlberechtigte2018 = 9,
waehler2018 = 10,
wahlschein2018 = 11,
ungueltige2018 = 12,
gueltige2018 = 13,
ungueltige_l_2018 = 33,
gueltige_l_2018 = 34) %>%
mutate(across(everything(), ~ as.integer(.)))
i = 0
# Schleife für die Kreis-Tests: Solange "ausgezählt" sind...
while(hessen_df %>%
pull(`Anzahl Wahlbezirke ausgezählt`) < wahllokale_max) {
# Splitte Vorlage in Hessen, Kreise, Gemeinden
# Jetzt Zufallszahlen
print(i)
factor = (i / 5) + runif(1,0,1/5)
kreise_df <- vorlage_df %>% filter(Gebietstyp == "WK") %>%
mutate(wk = as.integer(str_sub(Gebietsschlüssel,1,3))) %>%
# Wahllokale ausgezählt - Zufall, aber immer ein Fünftel mehr
mutate(`Anzahl Wahlbezirke ausgezählt` = floor(`Anzahl Wahlbezirke` * factor)) %>%
left_join(kreise_2018_df,by = "wk") %>%
mutate(Wahlberechtigte = wahlberechtigte2018,
`Wählerinnen und Wähler`= floor(waehler2018 * factor),
`Wählerinnen und Wähler mit Wahlschein` = floor(wahlschein2018 * factor),
# Wahlbeteiligung später
`ungültige Wahlkreisstimmen` = floor(ungueltige2018 * factor),
#gültig später
) %>%
mutate(Wahlbeteiligung = `Wählerinnen und Wähler` / Wahlberechtigte *100,
`gültige Wahlkreisstimmen` = `Wählerinnen und Wähler` - `ungültige Wahlkreisstimmen`) %>%
mutate(`ungültige Landesstimmen` = floor(ungueltige_l_2018 * factor)) %>%
mutate(`gültige Landesstimmen` = `Wählerinnen und Wähler` - `ungültige Landesstimmen`) %>%
# Parteien ins Langformat bringen
pivot_longer(cols = 18:46,names_to ="partei", values_to = "stimmen") %>%
# Reale Ergebnisse 2018 nach Direktmandat/Partei
left_join(frankentable_direkt_lang_df %>%
mutate(partei = paste0(partei," Wahlkreisstimmen")) %>%
select(wk,partei,stimmen_2018), by=c("wk","partei")) %>%
# Errechne Zufallsanteil
mutate(stimmen = floor(stimmen_2018 * factor)) %>%
select(-stimmen_2018,wk) %>%
# Zurück ins Querformat, Zusatzspalten weg
pivot_wider(names_from = partei, values_from = stimmen) %>%
# Zurücksortieren
select(1:17,
# jettz die neu erzeugten Stimmen
128:156,
# normal weiter
18:119) %>%
# Landesstimmen
mutate(wk = as.integer(str_sub(Gebietsschlüssel,1,3))) %>%
pivot_longer(cols = 80:108,names_to ="partei", values_to = "stimmen") %>%
# Reale Ergebnisse 2018 nach Direktmandat/Partei
left_join(frankentable_landesstimmen_lang_df %>%
mutate(partei = paste0(partei," Landesstimmen")) %>%
select(wk,partei,stimmen_2018), by=c("wk","partei")) %>%
# Errechne Zufallsanteil
mutate(stimmen = floor(stimmen_2018 * factor)) %>%
select(-stimmen_2018,wk) %>%
# Zurück ins Querformat, Zusatzspalten weg
pivot_wider(names_from = partei, values_from = stimmen) %>%
# Zurücksortieren
select(1:79,
121:149,
80:119)
for (ii in c(6:137,143)) {
hessen_df[[ii]] <- sum(kreise_df[[ii]])
}
muster_df <- hessen_df %>% bind_rows(kreise_df)
write_csv2(muster_df,"testdaten/kreise_tmp.csv")
datumsstring = paste0("Musterdatei;JanEggers;Stand: ",format(now(),format="%d.%m.%Y %H:%M:%S"))
tmp <- c(datumsstring,read_lines("testdaten/kreise_tmp.csv"))
write_lines(tmp,paste0("testdaten/muster_kreise_",i,".csv"))
i = i+1
} # End FOR
cat("DONE.")
File moved
library(pacman)
# Laden und ggf. installieren
p_load(this.path)
p_load(readr)
p_load(lubridate)
p_load(tidyr)
p_load(stringr)
p_load(dplyr)
p_load(DatawRappr)
p_load(curl)
p_load(magick)
p_load(openxlsx)
p_load(R.utils)
p_load(utils)
p_load(jsonlite)
rm(list=ls())
# Aktuelles Verzeichnis als workdir
setwd(this.path::this.dir())
# Aus dem R-Verzeichnis eine Ebene rauf
setwd("..")
# Deutsche Zahlen, Daten, Datumsangaben
Sys.setlocale(locale = "de_DE.UTF-8")
TEST = TRUE
DO_PREPARE_MAPS = TRUE
# Logfile anlegen, wenn kein Test
if (!TEST) {
logfile = file("obwahl.log")
sink(logfile, append=T)
sink(logfile, append=T, type="message")
}
# Messaging-Funktionen einbinden
source("R/messaging.R")
# Hole die Konfiguration, die Index-Daten und die Vergleichsdaten
source("R/lies_konfiguration.R")
# Funktionen einbinden
# Das könnte man auch alles hier in diese Datei schreiben, aber ist es übersichtlicher
check = tryCatch(
{ # Bibliotheken
source("R/lies_aktuellen_stand.R")
source("R/aktualisiere_grafiken.R")
},
warning = function(w) {teams_warning(w,title=paste0(wahl_name,": Bibliotheksfunktionen?"))},
error = function(e) {teams_warning(e,title=paste0(wahl_name,": Bibliotheksfunktionen?"))}
)
# Grafiken einrichten: Farbwerte und Switcher für die Karten
# Richtet auch die globale Variable switcher ein, deshalb brauchen wir sie
if (DO_PREPARE_MAPS) {
# Säulengrafiken-Farben anpassen, individuelle CSV
kreise_direkt_saeulen()
# Alle Grafiken auf CSV-und JSON-URL umbiegen
#fix_data(datawrapper_ids_df %>% pull(dw_id))
gemeinden_landesstimme_tabelle()
gemeinden_direkt_tabelle()
if (SERVER) {
n <- now()
system('gsutil -m -h "Cache-Control:no-cache, max_age=0" cp livedaten/* gs://d.data.gcp.cloud.hr.de/livedaten/')
copy_time <- now()-n
cat("Operation took ",copy_time)
} else { teams_warning("Lokaler Zyklus, keine Daten auf Google Bucket kopiert")}
}
# Logging beenden
if (!TEST) {
cat("OK: FERTIG - alle Stimmbezirke ausgezählt: ",as.character(ts),"\n")
sink()
sink(type="message")
file.rename("obwahl.log","obwahl_success.log")
teams_meldung(wahl_name," erfolgreich abgeschlossen.")
}
# EOF
This diff is collapsed.
...@@ -26,6 +26,8 @@ hole_daten <- function(stand_url,a_directory = "daten") { ...@@ -26,6 +26,8 @@ hole_daten <- function(stand_url,a_directory = "daten") {
error = function(e) {teams_warning(e,title=paste0(wahl_name,": Kann Daten nicht von ",stand_url, error = function(e) {teams_warning(e,title=paste0(wahl_name,": Kann Daten nicht von ",stand_url,
" kopieren nach ",fname))} " kopieren nach ",fname))}
) )
} else {
R.utils::copyFile(stand_url,fname)
} }
# Jetzt vom lokalen Laufwerk einlesen # Jetzt vom lokalen Laufwerk einlesen
check = tryCatch( check = tryCatch(
...@@ -73,19 +75,23 @@ check_for_timestamp <- function(my_url) { ...@@ -73,19 +75,23 @@ check_for_timestamp <- function(my_url) {
# Erst checken: Wirklich eine Internet-Verbindung? # Erst checken: Wirklich eine Internet-Verbindung?
# Sonst behandle als lokale Datei. # Sonst behandle als lokale Datei.
if(str_detect(my_url,"^http")) { if(str_detect(my_url,"^http")) {
tmp <- curlGetHeaders(my_url, redirect = T, verify = F) # tmp <- curlGetHeaders(my_url, redirect = T, verify = F)
# Redirect # # Redirect
if (stringr::str_detect(tmp[1]," 404")) { # if (stringr::str_detect(tmp[1]," 404")) {
library(curl) # library(curl)
h <- new_handle() # h <- new_handle()
# Das funktioniert, holt aber alle Daten -> hohe Last # # Das funktioniert, holt aber alle Daten -> hohe Last
t <- curl_fetch_memory(my_url,handle=h)$modified %>% # t <- curl_fetch_memory(my_url,handle=h)$modified %>%
as_datetime() + hours(1) # as_datetime() + hours(1)
} else { # } else {
t <- tmp[stringr::str_detect(tmp,"last-modified")] %>% # t <- tmp[stringr::str_detect(tmp,"last-modified")] %>%
stringr::str_replace("last-modified: ","") %>% # stringr::str_replace("last-modified: ","") %>%
parse_date_time("%a, %d %m %Y %H:%M:%S",tz = "CET") # parse_date_time("%a, %d %m %Y %H:%M:%S",tz = "CET")
} #
# ersetzt durch supersimple Routine, die die erste Zeile der Datei liest und auswertet
first_line <- readLines(my_url, n = 1)
t <- first_line %>% str_extract("(?<=Stand\\: ).+$") %>% as_datetime(format = "%d.%m.%Y %H:%M:%S")
print(t)
} else { # lokale Datei } else { # lokale Datei
t = file.info(my_url)$ctime %>% as_datetime t = file.info(my_url)$ctime %>% as_datetime
print(t) print(t)
...@@ -94,34 +100,58 @@ check_for_timestamp <- function(my_url) { ...@@ -94,34 +100,58 @@ check_for_timestamp <- function(my_url) {
} }
#---- Lese-Funktionen ---- #---- Gelesene Daten filtern und aufbereiten ----
# Das hier ist die Haupt-Lese-Funktion - ein Wrapper für hole_daten #' forme_hessen_landesstimmen
lies_stimmbezirke <- function(stand_url = stimmbezirke_url) { #'
#' Versuche, Daten vom Wahlamtsserver zu lesen - und gib ggf. Warnung oder Fehler zurück #' Nimmt die Livedaten und formt sie in die Lang-Tabelle mit 2018er Vergleichswerten um
#' Schreibt eine Meldung ins Logfile - zugleich ein Lesezeichen forme_hessen_landesstimmen <- function(live_df){
cat(as.character(now())," - Neue Daten lesen\n") # Touch logfile live_hessen_landesstimmen_lang_df <- live_df %>%
check = tryCatch( filter(Gebietstyp == "LD") %>%
{ select(wk = 1,
stand_df <- hole_daten(stimmbezirke_url) wk_name = 2,
}, stimmbezirke = all_of(stimmbezirke_i),
warning = function(w) {teams_warning(w,title="OB-Wahl: Datenakquise")}, gezaehlt = all_of(gezaehlt_i),
error = function(e) {teams_warning(e,title="OB-Wahl: Datenakquise")}) wahlberechtigt = 6,
return(stand_df) waehler = 10,
wahlbeteiligung = 12,
gueltig = 15,
ungueltig = 14,
ungueltig_prozent = 17,
all_of(spaltenindex_landesstimmen_df$idx)
) %>%
mutate(wk = as.integer(str_sub(wk,1,3))) %>%
pivot_longer(cols = 11:31,names_to="partei",values_to ="stimmen") %>%
mutate(across(c(5:10,12), ~ ifelse(is.na(.),0,.))) %>%
# Parteinamen korrigieren
mutate(partei = str_replace(partei," Landesstimmen",""))%>%
# Prozentanteil errechnen
mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>%
left_join(frankentable_landesstimmen_lang_df %>%
filter(wk == 0) %>%
select(partei,prozent_2018),
by="partei") %>%
mutate(prozent_2018 = ifelse(is.na(prozent_2018),0,prozent_2018)) %>%
mutate(differenz = ifelse(prozent==0,0,prozent-prozent_2018))
return(live_hessen_landesstimmen_lang_df)
} }
#' hole_kreise_direkt()
#' forme_kreise_direkt()
#' #'
#' Funktion formatiert den Kreis-Direktwahlergebnis-Teil in eine lange Tabelle um, #' Funktion formatiert den Kreis-Direktwahlergebnis-Teil in eine lange Tabelle um,
#' ergänzt sie um Vergleichswerte von 2018, und gibt die Tabelle zurück. #' ergänzt sie um Vergleichswerte von 2018, und gibt die Tabelle zurück.
hole_kreise_direkt <- function(live_df) { forme_kreise_direkt <- function(live_df) {
# Vorbereitung: Bruda, mach Tabelle lang! # Vorbereitung: Bruda, mach Tabelle lang!
#Liste mit den Kreisnamen #Liste mit den Kreisnamen
live_kreise_direkt_long_df <- live_df %>% live_kreise_direkt_lang_df <- live_df %>%
filter(Gebietstyp == "WK") %>% filter(Gebietstyp == "WK") %>%
select(wk = 1, select(wk = 1,
wk_name = 2, wk_name = 2,
stimmbezirke = all_of(stimmbezirke_i),
gezaehlt = all_of(gezaehlt_i),
wahlberechtigt = 6, wahlberechtigt = 6,
waehler = 10, waehler = 10,
wahlbeteiligung = 12, wahlbeteiligung = 12,
...@@ -131,17 +161,176 @@ hole_kreise_direkt <- function(live_df) { ...@@ -131,17 +161,176 @@ hole_kreise_direkt <- function(live_df) {
all_of(spaltenindex_direkt_df$idx) all_of(spaltenindex_direkt_df$idx)
) %>% ) %>%
mutate(wk = as.integer(str_sub(wk,1,3))) %>% mutate(wk = as.integer(str_sub(wk,1,3))) %>%
pivot_longer(cols = 9:33,names_to="partei",values_to ="stimmen") %>% pivot_longer(cols = 11:35,names_to="partei",values_to ="stimmen") %>%
mutate(across(c(5:10,12), ~ ifelse(is.na(.),0,.))) %>%
# Parteinamen korrigieren
mutate(partei = str_replace(partei," Wahlkreisstimmen",""))%>% mutate(partei = str_replace(partei," Wahlkreisstimmen",""))%>%
# Prozentanteil errechnen
mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>%
# Ergänze die (Nach-)Namen der Direktkandidaten # Ergänze die (Nach-)Namen der Direktkandidaten
left_join(kandidaten_alle_df %>% select (wk,partei=Partei,Nachname,name), left_join(direktkandidaten_df %>% select (wk,partei,Nachname,name),
by=c("wk","partei")) %>% by=c("wk","partei")) %>%
# Parteien ausfiltern # Parteien ausfiltern
filter(!is.na(name)) %>% filter(!is.na(name)) %>%
# Ergänze 2018er Ergebnisse aus der "Frankentabelle" (Kombination direkte und umgerechnete WK) # Ergänze 2018er Ergebnisse aus der "Frankentabelle" (Kombination direkte und umgerechnete WK)
left_join(frankentable_direkt_lang_df,by=c("wk","partei")) %>% left_join(frankentable_direkt_lang_df,by=c("wk","partei")) %>%
mutate(differenz = prozent - prozent_2018) group_by(wk) %>%
return(live_kreise_direkt_long_df) fill(16:20) %>%
ungroup() %>%
mutate(across(c(stimmen_2018,prozent_2018), ~ ifelse(is.na(.),0,.))) %>%
mutate(differenz = ifelse(prozent == 0,0,prozent - prozent_2018))
return(live_kreise_direkt_lang_df)
# Filtere Kreise
}
#' forme_kreise_landesstimmen
#'
#' Funktion formatiert den Kreis-Direktwahlergebnis-Teil in eine lange Tabelle um,
#' ergänzt sie um Vergleichswerte von 2018, und gibt die Tabelle zurück.
forme_kreise_landesstimmen <- function(live_df) {
# Vorbereitung: Bruda, mach Tabelle lang!
#Liste mit den Kreisnamen
live_kreise_landesstimmen_lang_df <- live_df %>%
filter(Gebietstyp == "WK") %>%
select(wk = 1,
wk_name = 2,
stimmbezirke = all_of(stimmbezirke_i),
gezaehlt = all_of(gezaehlt_i),
wahlberechtigt = 6,
waehler = 10,
wahlbeteiligung = 12,
gueltig = 15,
ungueltig = 14,
ungueltig_prozent = 17,
all_of(spaltenindex_landesstimmen_df$idx)
) %>%
mutate(wk = as.integer(str_sub(wk,1,3))) %>%
pivot_longer(cols = 11:31,names_to="partei",values_to ="stimmen") %>%
mutate(across(c(5:10,12), ~ ifelse(is.na(.),0,.))) %>%
# Parteinamen korrigieren
mutate(partei = str_replace(partei," Landesstimmen",""))%>%
# Prozentanteil errechnen
mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>%
# Ergänze 2018er Ergebnisse aus der "Frankentabelle" (Kombination direkte und umgerechnete WK)
left_join(frankentable_landesstimmen_lang_df,by=c("wk","partei")) %>%
group_by(wk) %>%
fill(wahlberechtigte_2018:veraendert) %>%
ungroup() %>%
mutate(across(c(stimmen_2018,prozent_2018), ~ ifelse(is.na(.),0,.))) %>%
return(live_kreise_landesstimmen_lang_df)
# Filtere Kreise # Filtere Kreise
} }
#' forme_gemeinden_direkt
#'
#' Für alle Gemeinden aus den Livedaten eine Tabelle
forme_gemeinden_direkt <- function(live_df) {
#Liste mit den Kreisnamen
live_gemeinden_direkt_lang_df <- live_df %>%
# Städte UND Gemeinden - THEORETISCH. Tatsächlich: Keine Direktkandidaten in den KS
filter(Gebietstyp %in% c("VF","KS")) %>%
#.Kleine Schwierigkeit mit Offenbach: Hat wk 0 - wie alle kreisfreien Städte
# (die ja idR mehrere Wahlkreise umfassen)
# Entweder die Namen aus der gemeinden_alle nach AGS reinjoinen, oder
# Sonderbedingung für Offenbach.
select(wk = 1,
g_name = 2,
stimmbezirke = all_of(stimmbezirke_i),
gezaehlt = all_of(gezaehlt_i),
wahlberechtigt = 6,
waehler = 10,
wahlbeteiligung = 12,
gueltig = 15,
ungueltig = 14,
ungueltig_prozent = 17,
all_of(spaltenindex_direkt_df$idx)
) %>%
pivot_longer(cols = 11:35,names_to="partei",values_to ="stimmen") %>%
# NA in den Stimmenzähl-Spalten und den Parteistimmen-Spalten tilgen
mutate(across(c(5:10,12), ~ ifelse(is.na(.),0,.))) %>%
# AGS und Wahlkreis aus dem Gebietsschlüssel extrahieren
mutate(AGS = str_sub(wk,4,9)) %>%
mutate(wk = as.integer(str_sub(wk,1,3))) %>%
# Offenbach korrigieren
mutate(wk = ifelse(AGS == "413000",43,wk)) %>%
# Namen aus der Namenstabelle überschreibt "Hans-Stadten-Stadt" etc.
left_join(gemeinden_alle_df %>% distinct(AGS,name), by="AGS") %>%
mutate(g_name = name) %>%
select(-name) %>%
# Parteinamen extrahieren - mit V3-Partei!
mutate(partei = str_replace(partei," Wahlkreisstimmen",""))%>%
# Prozentanteil errechnen
mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>%
# Ergänze die (Nach-)Namen der Direktkandidaten
left_join(direktkandidaten_df %>% select (wk,partei,Nachname,name),
by=c("wk","partei"))%>%
# Parteien ausfiltern
filter(!is.na(name)) %>%
# Ergänze 2018er Ergebnisse aus der "Frankentabelle" (Kombination direkte und umgerechnete WK)
left_join(frankentable_direkt_lang_df,by=c("wk","partei")) %>%
group_by(wk) %>%
fill(wahlberechtigte_2018:veraendert) %>%
ungroup() %>%
mutate(across(c(stimmen_2018,prozent_2018), ~ ifelse(is.na(.),0,.))) %>%
mutate(differenz = ifelse(prozent == 0,0,prozent - prozent_2018))
return(live_gemeinden_direkt_lang_df)
# Filtere Kreise
}
#' forme_gemeinden_landesstimmen
#'
#' Für alle Gemeinden aus den Livedaten eine Tabelle
forme_gemeinden_landesstimmen <- function(live_df) {
#Liste mit den Kreisnamen
live_gemeinden_landesstimmen_lang_df <- live_df %>%
# Städte UND Gemeinden!
filter(Gebietstyp %in% c("VF","KS")) %>%
#.Kleine Schwierigkeit mit Offenbach: Hat wk 0 - wie alle kreisfreien Städte
# (die ja idR mehrere Wahlkreise umfassen)
# Entweder die Namen aus der gemeinden_alle nach AGS reinjoinen, oder
# Sonderbedingung für Offenbach.
select(wk = 1,
g_name = 2,
stimmbezirke = all_of(stimmbezirke_i),
gezaehlt = all_of(gezaehlt_i),
wahlberechtigt = 6,
waehler = 10,
wahlbeteiligung = 12,
gueltig = 15,
ungueltig = 14,
ungueltig_prozent = 17,
all_of(spaltenindex_landesstimmen_df$idx)
) %>%
# Nur die Parteien von den Landeslisten
pivot_longer(cols = 11:31,names_to="partei",values_to ="stimmen") %>%
# NA in den Stimmenzähl-Spalten und den Parteistimmen-Spalten tilgen
mutate(across(c(5:10,12), ~ ifelse(is.na(.),0,.))) %>%
# AGS und Wahlkreis aus dem Gebietsschlüssel extrahieren
mutate(AGS = str_sub(wk,4,9)) %>%
mutate(wk = as.integer(str_sub(wk,1,3))) %>%
# Offenbach korrigieren
mutate(wk = ifelse(AGS == "413000",43,wk)) %>%
# Namen aus der Namenstabelle überschreibt "Hans-Stadten-Stadt" etc.
left_join(gemeinden_alle_df %>% distinct(AGS,name), by="AGS") %>%
mutate(g_name = name) %>%
select(-name) %>%
# Parteinamen korrigieren
mutate(partei = str_replace(partei," Landesstimmen",""))%>%
# Prozentanteil errechnen
mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>%
# Ergänze 2018er Ergebnisse aus der "Frankentabelle" (Kombination direkte und umgerechnete WK)
left_join(frankentable_landesstimmen_lang_df,by=c("wk","partei")) %>%
group_by(wk) %>%
fill(wahlberechtigte_2018:veraendert) %>%
ungroup() %>%
mutate(across(c(stimmen_2018,prozent_2018), ~ ifelse(is.na(.),0,.))) %>%
mutate(differenz = ifelse(prozent == 0,0,prozent - prozent_2018))
return(live_gemeinden_landesstimmen_lang_df)
# Filtere Kreise
}
...@@ -258,7 +258,7 @@ direktkandidaten_df <- kandidaten_alle_df %>% ...@@ -258,7 +258,7 @@ direktkandidaten_df <- kandidaten_alle_df %>%
arrange(wk,p_id) %>% arrange(wk,p_id) %>%
mutate(name = paste0(Nachname," (",partei,")")) %>% mutate(name = paste0(Nachname," (",partei,")")) %>%
select(wk,wk_name = wkn, select(wk,wk_name = wkn,
name,farbwert,Titel,Nachname, Vorname, name,partei,farbwert,Titel,Nachname, Vorname,
Geburtsjahr, Geburtsort, Beruf, Geburtsjahr, Geburtsort, Beruf,
Listenplatz, Check_id) Listenplatz, Check_id)
......
...@@ -23,12 +23,10 @@ setwd(this.path::this.dir()) ...@@ -23,12 +23,10 @@ setwd(this.path::this.dir())
setwd("..") setwd("..")
# Deutsche Zahlen, Daten, Datumsangaben # Deutsche Zahlen, Daten, Datumsangaben
Sys.setlocale(locale = "de_DE") Sys.setlocale(locale = "de_DE.UTF-8")
# Lies Kommandozeilen-Parameter: # Lies Kommandozeilen-Parameter:
# (Erweiterte Funktion aus dem R.utils-Paket) # (Erweiterte Funktion aus dem R.utils-Paket)
TEST = TRUE
DO_PREPARE_MAPS = FALSE
# Kommandozeilen-Argumente # Kommandozeilen-Argumente
args = R.utils::commandArgs(asValues = TRUE) args = R.utils::commandArgs(asValues = TRUE)
if (length(args)!=0) { if (length(args)!=0) {
...@@ -45,6 +43,8 @@ if (length(args)!=0) { ...@@ -45,6 +43,8 @@ if (length(args)!=0) {
if (!dir.exists(paste0("index/",wahl_name))) stop("Kein Index-Verzeichnis für ",wahl_name) if (!dir.exists(paste0("index/",wahl_name))) stop("Kein Index-Verzeichnis für ",wahl_name)
} }
} }
TEST = TRUE
DO_PREPARE_MAPS = FALSE
...@@ -119,21 +119,36 @@ while (gezaehlt < stimmbezirke_n) { ...@@ -119,21 +119,36 @@ while (gezaehlt < stimmbezirke_n) {
if (ts_daten > ts) { if (ts_daten > ts) {
ts <- ts_daten ts <- ts_daten
live_df <- hole_daten(stimmbezirke_url) live_df <- hole_daten(stimmbezirke_url)
# Als erstes: Landesstimmen ganz Hessen
forme_hessen_landesstimmen(live_df) %>%
aktualisiere_hessen_landesstimmen()
cat("Hessen aktualisiert")
# #
live_hessen_direkt_df <- hole_kreise_direkt(live_df) live_kreise_direkt_lang_df <- forme_kreise_direkt(live_df)
aktualisiere_kreise_landesstimmen() write_csv(live_kreise_direkt_lang_df,"livedaten/kreise_direkt_lang.csv")
cat("Grafik Land aktualisiert\n") aktualisiere_kreise_direkt(live_kreise_direkt_lang_df)
# cat("Grafiken Kreise-Direktstimmen CSV/JSON aktualisiert\n")
aktualisiere_kreise_direkt(live_df)
aktualisiere_kreise_landesstimmen(live_df)
aktualisiere_gemeinden_direkt(live_df)
aktualisiere_gemeinden_landesstimmen(live_df)
aktualisiere_staedte_landesstimmen(live_df)
# #
live_kreise_landesstimmen_lang_df <- forme_kreise_landesstimmen(live_df)
write_csv(live_kreise_landesstimmen_lang_df,"livedaten/kreise_landesstimmen_lang.csv")
aktualisiere_kreise_landesstimmen(live_kreise_landesstimmen_lang_df)
#---- Noch keine Testdaten für Gemeinden ----
# live_gemeinden_direkt_lang_df <- forme_gemeinden_direkt(live_df)
# write_csv(live_gemeinden_direkt_lang_df,"livedaten/gemeinden_direkt_lang.csv")
# aktualisiere_gemeinden_direkt(live_gemeinden_direkt_lang_df)
# cat("Grafiken Gemeinde Direktstimmen CSV/JSON aktualisiert\n")
# #
# live_gemeinden_landesstimmen_lang_df <- forme_gemeinden_landesstimmen(live_df)
# write_csv(live_gemeinden_landesstimmen_lang_df,"livedaten/gemeinden_landesstimmen_lang.csv")
# # aktualisiere_staedte_landesstimmen(live_df) Schon mit drin
# cat("Grafiken Gemeinde Landesstimmen CSV/JSON aktualisiert\n")
# #
cat("Aktualisierte Daten kopiert in",aktualisiere_bucket(),"\n") cat("Aktualisierte Daten kopiert in",aktualisiere_bucket(),"\n")
# #
neu_gezaehlt <- live_df %>% filter(Gebietstyp == "LD") %>% select(all_of(stimmbezirke_i)) %>% pull() neu_gezaehlt <- live_df %>% filter(Gebietstyp == "LD") %>% select(all_of(stimmbezirke_i)) %>% pull()
# Nachricht neu gezählte Stimmbezirke # Nachricht neu gezählte Stimmbezirke
teams_meldung("Gezählte Stimmbezirke: ",neu_gezaehlt," (neu: ",neu_gezaehlt-gezaehlt,")")
gezaehlt <- neu_gezaehlt gezaehlt <- neu_gezaehlt
} else { } else {
# Logfile erneuern und 30 Sekunden schlafen # Logfile erneuern und 30 Sekunden schlafen
......
...@@ -16,7 +16,7 @@ library(teamr) ...@@ -16,7 +16,7 @@ library(teamr)
# Webhook schon im Environment? # Webhook schon im Environment?
if (Sys.getenv("WEBHOOK_LTWHE") == "") { if ((t_txt <- Sys.getenv("WEBHOOK_LTWHE")) == "") {
t_txt <- read_file("~/key/webhook_ltwhe.key") t_txt <- read_file("~/key/webhook_ltwhe.key")
Sys.setenv(WEBHOOK_LTWHE= t_txt) Sys.setenv(WEBHOOK_LTWHE= t_txt)
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
No preview for this file type
No preview for this file type
No preview for this file type
File added
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