Im letzten Post hatte ich bereits angekündigt, dass ich aktuell daran arbeite Daten vom RKI mit Python abzuziehen, diese mit Plotly grafisch aufzubereiten und schließlich jeden Morgen in einen Telegram-Kanal zu senden.

Heute werde ich euch zeigen, wie ich die heruntergeladenen Daten mit plotly in Python visualisiere.

Auch dafür bereiten wir zunächst das Skript vor, indem wir die notwendigen Abhängigkeiten laden. Falls euch etwas fehlt, könnt ihr es in der Regel mittels pip install <name> jederzeit installieren.

1#imports
2import os
3import pandas as pd
4import plotly.graph_objects as go
5import requests
6
7from kaleido.scopes.plotly import PlotlyScope

Mit der Hilfe von os.path.abspath() defineren wir uns die Arbeitspfade. Gehen wir davon aus, dass sich in dem Verzeichnis, in dem unser Python-Skript liegt, auch die Unterordner data/ und img/ befinden. Aus ersterem wollen wir später die Datei rki.csv laden. In letzteres den fertigen Plot speichern.

Außerdem, sollten wir ein paar Farben festlegen.

1# define working paths
2app_dir = os.path.abspath(os.path.dirname(__file__))
3data_dir = app_dir + '/data/'
4img_dir = app_dir + '/img/'
5
6# define colors
7spaetzle_gelb_light = 'rgb(255,254,249)'
8spaetzle_gelb_dark = 'rgb(145,113,5)'
9light_grey = 'rgb(204, 204, 204)'

Laden wir die CSV-Datei und schränken sie auf den/die für uns relevanten Landkreis/e ein.

1# import as Pandas data frame and restrict to county "Stuttgart"
2rki = pd.read_csv(data_dir + "rki.csv", sep = ";")
3df_str = rki.loc[rki.GEN == "Stuttgart"]
4df_str.head()

Jeder plotly-Plot beginnt mit fig = go.Figure(). An fig werden dann weitere Elemente angefügt.

 1# create plot
 2fig = go.Figure()
 3fig.add_trace(go.Scatter(
 4    x = df_str.last_update,
 5    y = df_str.cases7_per_100k,
 6    text = df_str.cases7_per_100k.round(),
 7    mode="lines+markers+text",
 8    textposition="top center",
 9    textfont_color=spaetzle_gelb_dark,
10    line=dict(color = spaetzle_gelb_dark,
11))

Schon ganz nett, aber layout-technisch geht da noch was.

 1# make layout great again!
 2fig.update_layout(
 3    title = '7-Tage Inzidenz (100k EW): Stuttgart',
 4    title_font_color=spaetzle_gelb_dark,
 5    xaxis=dict(
 6        showline=True,
 7        showgrid=False,
 8        showticklabels=True,
 9        linecolor=light_grey,
10        color = light_grey,
11        linewidth=2,
12        ticks='outside', 
13    ),
14    yaxis=dict(
15        showgrid=False,
16        zeroline=False,
17        showline=False,
18        showticklabels=False,
19    ),
20    plot_bgcolor=spaetzle_gelb_light,
21    paper_bgcolor=spaetzle_gelb_light,
22    showlegend=False,
23)
24fig.update_yaxes(rangemode = 'tozero')

Diese Grafik sollten wir jetzt noch abspeichern, damit wir sie im nächsten Schritt in einen Telegram-Kanal senden können.

1# export plotly as png
2scope = PlotlyScope()
3with open(img_dir + "figure.png", "wb") as f:
4    f.write(scope.transform(fig, format="png"))

I love to hear your opinion. If you want to exchange on what I wrote in this article, please write me an email ✉️ and we can start a conversation.