diff --git a/.gitignore b/.gitignore index bcb4b42ba00..e8931f7ff21 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ src/tmp/ src/results/ docs/data/*.xlsx docs/data/*.html +.env diff --git a/_config.yml b/_config.yml deleted file mode 100644 index b8497135943..00000000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-leap-day \ No newline at end of file diff --git a/docs/FreeBedsChartView.js b/docs/FreeBedsChartView.js index 437857d63f9..849bbf22b5f 100644 --- a/docs/FreeBedsChartView.js +++ b/docs/FreeBedsChartView.js @@ -11,7 +11,7 @@ class FreeBedsChartView { if (this.#chart != null) { this.#chart.destroy(); } - const label = 'Anteil freier Betten'; + const label = 'freie Betten'; this.#chart = new Chart( this.#canvas, { @@ -35,9 +35,9 @@ class FreeBedsChartView { } function drawTrafficLights(chart) { - const RED = 'rgba(240, 59, 32, 0.75)'; - const YELLOW = 'rgba(254, 178, 76, 0.75)'; - const GREEN = 'rgba(56, 168, 0, 0.75)'; + const RED = 'rgba(240, 59, 32, 0.75)'; // #F03B20 + const YELLOW = 'rgba(254, 178, 76, 0.75)'; // #FEB24C + const GREEN = 'rgba(56, 168, 0, 0.75)'; // #38A800 chart.ctx.save(); fillRect({ chart: chart, startInPercent: 0, endInPercent: 10, color: RED }); fillRect({ chart: chart, startInPercent: 10, endInPercent: 25, color: YELLOW }); @@ -60,7 +60,7 @@ class FreeBedsChartView { backgroundColor: 'rgba(0, 0, 150, 1)' }, { - label: 'Median der Anteile freier Betten', + label: 'Median freier Betten', data: data, parsing: { yAxisKey: 'median_free_beds_in_percent' diff --git a/docs/MedianOfFreeBedsByKreisChartView.js b/docs/MedianOfFreeBedsByKreisChartView.js index 46dc1096b41..ee94e8537a1 100644 --- a/docs/MedianOfFreeBedsByKreisChartView.js +++ b/docs/MedianOfFreeBedsByKreisChartView.js @@ -11,7 +11,7 @@ class MedianOfFreeBedsByKreisChartView { if (this.#chart != null) { this.#chart.destroy(); } - const label = 'Median der Anteile freier Betten'; + const label = 'Median freier Betten'; this.#chart = new Chart( this.#canvas, { diff --git a/docs/intensivstationen.html b/docs/intensivstationen.html index 774e7afef93..020a94da460 100644 --- a/docs/intensivstationen.html +++ b/docs/intensivstationen.html @@ -1,22 +1,28 @@ + - - -Die Lage auf den Intensivstationen in meinem Landkreis von 2020 bis heute - - - - - - - - - - - - - + + + + + + + + + + + + -Fork me on GitHub -

Die Lage auf den Intensivstationen in meinem Landkreis von 2020 bis heute

- - -

Freie und belegte Intensivbetten

-

+ Fork me on GitHub +

Die Lage auf den Intensivstationen von 2020 bis heute

+ + +

Die Lage auf den Intensivstationen in meinem Landkreis von 2020 bis heute

+ + +

Freie und belegte Intensivbetten

+

Einwohnerzahl: -

- -

-
-
Belegte Betten:
-
Anzahl der belegten Intensivbetten (Low- und High-Care), unabhängig von der Behandlungsursache, +

+ +

+
+
Belegte Betten:
+
Anzahl der belegten Intensivbetten (Low- und High-Care), unabhängig von der Behandlungsursache, für Erwachsene und Kinder.
-
Freie Betten:
-
Anzahl der freien, betreibbaren Intensivbetten (Low- und High-Care) für Erwachsene und Kinder zur +
Freie Betten:
+
Anzahl der freien, betreibbaren Intensivbetten (Low- und High-Care) für Erwachsene und Kinder zur Behandlung von allen intensivpflichtigen Erkrankungen.
-
-

Anteil freier Betten an der Gesamtzahl der Intensivbetten

-

- -

-

Median der Anteile freier Betten

-

- -

-
-
Datensatz:
-
Landkreis-Daten
-
siehe auch:
-
Dashboard +
+

Anteil freier Betten an der Gesamtzahl der Intensivbetten

+

+ +

+

Median freier Betten

+

+ +

+
+
+
Datensatz:
+
Landkreis-Daten
+
siehe auch:
+
Dashboard DIVI-Intensivregister auf Landkreisebene
-
Kartenansichten -
-
Datenstand:
-
26.03.2022, 12:33 Uhr
-
+
Kartenansichten +
+
Datenstand:
+
26.03.2022, 12:33 Uhr
+
+ \ No newline at end of file diff --git a/src/help.txt b/src/help.txt index 0a6179cb954..82a3a6f6ff8 100644 --- a/src/help.txt +++ b/src/help.txt @@ -18,7 +18,7 @@ FK-FIXME: FK-TODO: - Darstellung als Dashboard, siehe https://covid-karte.de/ oder https://experience.arcgis.com/experience/3a132983ad3c4ab8a28704e9addefaba -- nach den "Median der Anteile freier Betten"-Werten Rot-Gelb-Grün eingefärbte Deutschland-Karte anzeigen wie in https://experience.arcgis.com/experience/3a132983ad3c4ab8a28704e9addefaba +- nach den "Median freier Betten"-Werten Rot-Gelb-Grün eingefärbte Deutschland-Karte anzeigen wie in https://experience.arcgis.com/experience/3a132983ad3c4ab8a28704e9addefaba - Alle Charts mit Slidern versehen? anacron job: diff --git a/src/intensivstationen/Intensivstationen.ipynb b/src/intensivstationen/Intensivstationen.ipynb index 1d7e04e35d7..5a629b10497 100644 --- a/src/intensivstationen/Intensivstationen.ipynb +++ b/src/intensivstationen/Intensivstationen.ipynb @@ -32,7 +32,7 @@ "source": [ "from datetime import datetime\n", "\n", - "print(datetime.now().strftime(\"%d.%m.%Y, %H:%M:%S Uhr\"))\t" + "print(datetime.now().strftime(\"%d.%m.%Y, %H:%M:%S Uhr\"))" ] }, { @@ -591,11 +591,15 @@ " self.kreise = kreise\n", "\n", " def addKreisAndBundeslandAndEinwohnerzahlColumns(self, dataFrame):\n", + " dataFrame = self.addKreisAndEinwohnerzahlColumns(dataFrame)\n", + " return self._addBundeslandColumn(dataFrame)\n", + " \n", + " def addKreisAndEinwohnerzahlColumns(self, dataFrame):\n", " dataFrame_kreise = pd.merge(dataFrame, self.kreise, how = 'left', left_on = 'gemeindeschluessel', right_index = True)\n", " dataFrame['Kreis'] = dataFrame_kreise['Kreis']\n", " dataFrame['Einwohnerzahl'] = dataFrame_kreise['Einwohnerzahl']\n", - " return self._addBundeslandColumn(dataFrame)\n", - " \n", + " return dataFrame\n", + "\n", " def _addBundeslandColumn(self, dataFrame):\n", " return pd.merge(\n", " dataFrame,\n", @@ -4720,9 +4724,9 @@ " def __init__(self, dataFrame):\n", " self.dataFrame = dataFrame\n", "\n", - " def createMedianOfFreeBedsByKreisTable(self):\n", + " def createMedianOfFreeBedsByKreisTable(self, kreisKey):\n", " self.dataFrame['free_beds_divided_by_all_beds_in_percent'] = self.dataFrame['betten_frei'] / (self.dataFrame['betten_frei'] + self.dataFrame['betten_belegt']) * 100\n", - " aggregated = self.dataFrame.groupby('Kreis').agg(\n", + " aggregated = self.dataFrame.groupby(kreisKey).agg(\n", " median_free_beds_in_percent =\n", " pd.NamedAgg(\n", " column = 'free_beds_divided_by_all_beds_in_percent',\n", @@ -4758,7 +4762,7 @@ " medianOfFreeBedsByKreisTableFactory = MedianOfFreeBedsByKreisTableFactory(dataFrame)\n", " \n", " # When\n", - " medianOfFreeBedsByKreisTable = medianOfFreeBedsByKreisTableFactory.createMedianOfFreeBedsByKreisTable()\n", + " medianOfFreeBedsByKreisTable = medianOfFreeBedsByKreisTableFactory.createMedianOfFreeBedsByKreisTable('Kreis')\n", "\n", " # Then\n", " assert_frame_equal(\n", @@ -4818,10 +4822,117 @@ "outputs": [], "source": [ "medianOfFreeBedsByKreisTableFactory = MedianOfFreeBedsByKreisTableFactory(timeSeries)\n", - "medianOfFreeBedsByKreisTable = medianOfFreeBedsByKreisTableFactory.createMedianOfFreeBedsByKreisTable()\n", + "medianOfFreeBedsByKreisTable = medianOfFreeBedsByKreisTableFactory.createMedianOfFreeBedsByKreisTable('Kreis')\n", "medianOfFreeBedsByKreisTable.reset_index().to_json('../../docs/data/intensivstationen/medianOfFreeBedsByKreisTable.json', orient = \"records\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "396cb4f8", + "metadata": {}, + "outputs": [], + "source": [ + "def createMedianOfFreeBedsByKreisTableForChoroplethMap(medianOfFreeBedsByKreisTableFactory):\n", + " medianOfFreeBedsByKreisTable = medianOfFreeBedsByKreisTableFactory.createMedianOfFreeBedsByKreisTable('gemeindeschluessel').reset_index()\n", + " return ColumnsAdder(kreise).addKreisAndEinwohnerzahlColumns(medianOfFreeBedsByKreisTable)\n", + " \n", + "medianOfFreeBedsByKreisTable = createMedianOfFreeBedsByKreisTableForChoroplethMap(medianOfFreeBedsByKreisTableFactory)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4247571", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import json\n", + "\n", + "\n", + "class Datawrapper:\n", + "\n", + " def __init__(self, accessToken):\n", + " self.authHeader = {\"Authorization\": f\"Bearer {accessToken}\"}\n", + "\n", + " def setChartTitle(self, title):\n", + " response = requests.request(\n", + " \"PATCH\",\n", + " \"https://api.datawrapper.de/v3/charts/dYmYb\",\n", + " json={\"title\": title},\n", + " headers={\n", + " \"Accept\": \"*/*\",\n", + " \"Content-Type\": \"application/json\"\n", + " } | self.authHeader)\n", + " return json.loads(response.text)\n", + "\n", + " def uploadChartData(self, data: pd.DataFrame):\n", + " response = requests.request(\n", + " \"PUT\",\n", + " \"https://api.datawrapper.de/v3/charts/dYmYb/data\",\n", + " data=data.to_csv(\n", + " index=False,\n", + " columns=['gemeindeschluessel', 'median_free_beds_in_percent', 'Kreis']).encode(\"utf-8\"),\n", + " headers={\n", + " \"Accept\": \"*/*\",\n", + " \"Content-Type\": \"text/csv\"\n", + " } | self.authHeader)\n", + " return response.text\n", + "\n", + " def fetchChartData(self):\n", + " response = requests.request(\n", + " \"GET\",\n", + " \"https://api.datawrapper.de/v3/charts/dYmYb/data\",\n", + " headers={\n", + " \"Accept\": \"text/csv\"\n", + " } | self.authHeader)\n", + "\n", + " return response.text\n", + "\n", + " def publishChart(self):\n", + " response = requests.request(\n", + " \"POST\",\n", + " \"https://api.datawrapper.de/v3/charts/dYmYb/publish\",\n", + " headers={\n", + " \"Accept\": \"*/*\"\n", + " } | self.authHeader)\n", + " return json.loads(response.text)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1b75357", + "metadata": {}, + "outputs": [], + "source": [ + "def getChartTitle(dateStart, dateEnd):\n", + " def formatDate(date):\n", + " return date.strftime(\"%d.%m.%Y\")\n", + "\n", + " return f\"Median freier Intensivbetten im Zeitraum {formatDate(dateStart)} bis {formatDate(dateEnd)}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9de2f34e", + "metadata": {}, + "outputs": [], + "source": [ + "from decouple import AutoConfig\n", + "\n", + "config = AutoConfig(search_path='../..')\n", + "dataWrapper = Datawrapper(config('DATAWRAPPER_API_TOKEN'))\n", + "dataWrapper.setChartTitle(\n", + " getChartTitle(\n", + " dateStart=timeSeries['date'].min(),\n", + " dateEnd=timeSeries['date'].max()))\n", + "dataWrapper.uploadChartData(medianOfFreeBedsByKreisTable)\n", + "dataWrapper.publishChart()\n" + ] + }, { "cell_type": "code", "execution_count": null, @@ -4829,7 +4940,7 @@ "metadata": {}, "outputs": [], "source": [ - "def publish():\n", + "def publishGitHubPages():\n", " %cd /home/frankknoll/Dokumente/Corona/projects/HowBadIsMyBatch-pages\n", " ! git add -A\n", " ! git commit -m \"updating data\"\n", @@ -4843,7 +4954,7 @@ "metadata": {}, "outputs": [], "source": [ - "publish()" + "publishGitHubPages()" ] } ],