Merge branch 'main' into pages

This commit is contained in:
frankknoll
2022-03-27 22:56:03 +02:00
7 changed files with 578 additions and 66 deletions

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@ src/tmp/
src/results/
docs/data/*.xlsx
docs/data/*.html
.env

View File

@@ -1 +0,0 @@
theme: jekyll-theme-leap-day

View File

@@ -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'

View File

@@ -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,
{

File diff suppressed because one or more lines are too long

View File

@@ -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:

View File

@@ -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,10 +591,14 @@
" 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",
" return dataFrame\n",
"\n",
" def _addBundeslandColumn(self, dataFrame):\n",
" return pd.merge(\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()"
]
}
],