2021-01-15 00:09:25 +00:00
|
|
|
#!/usr/bin/python
|
|
|
|
# vim: set fileencoding=utf-8 :
|
|
|
|
|
2021-01-14 23:16:40 +00:00
|
|
|
import numpy as np
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
import pandas as pd
|
|
|
|
|
|
|
|
import datetime
|
|
|
|
import re
|
2021-01-15 00:01:43 +00:00
|
|
|
import requests as req
|
2021-01-15 19:19:06 +00:00
|
|
|
import locale
|
2021-01-16 13:26:46 +00:00
|
|
|
import os.path
|
2021-01-15 19:19:06 +00:00
|
|
|
|
|
|
|
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
|
2021-01-15 00:01:43 +00:00
|
|
|
|
2021-01-15 00:26:02 +00:00
|
|
|
sources_folder = 'Quellen'
|
|
|
|
plots_folder = 'Plots'
|
|
|
|
|
2021-01-14 23:16:40 +00:00
|
|
|
|
|
|
|
einwohner_deutschland = 83190556
|
|
|
|
|
2021-01-15 00:01:43 +00:00
|
|
|
today = datetime.date.today()
|
|
|
|
print_today = today.isoformat()
|
|
|
|
|
|
|
|
filename_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
2021-01-14 23:16:40 +00:00
|
|
|
|
|
|
|
# DIN A4 Plots
|
|
|
|
plt.rcParams["figure.figsize"] = [11.69, 8.27]
|
|
|
|
|
2021-01-15 00:01:43 +00:00
|
|
|
|
|
|
|
# Download
|
|
|
|
|
2021-01-15 00:26:02 +00:00
|
|
|
filename = '{}/{}_Impfquotenmonitoring.xlsx'.format(sources_folder, filename_now)
|
2021-01-15 00:01:43 +00:00
|
|
|
|
|
|
|
r = req.get('https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Daten/Impfquotenmonitoring.xlsx?__blob=publicationFile')
|
|
|
|
|
|
|
|
with open(filename, 'wb') as outfile:
|
|
|
|
outfile.write(r.content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rki_file = pd.read_excel(filename, sheet_name=None, engine='openpyxl')
|
2021-01-14 23:19:31 +00:00
|
|
|
|
|
|
|
raw_data = rki_file['Impfungen_proTag']
|
2021-01-14 23:16:40 +00:00
|
|
|
|
|
|
|
impfungen = raw_data[:-1].dropna()
|
|
|
|
|
|
|
|
dates = impfungen['Datum']
|
|
|
|
daily = impfungen['Gesamtzahl Impfungen']
|
|
|
|
cumulative = np.cumsum(impfungen['Gesamtzahl Impfungen'])
|
|
|
|
|
2021-01-15 18:59:50 +00:00
|
|
|
total_vaccinations = int(np.sum(daily))
|
|
|
|
total_vaccinations_percentage = float(total_vaccinations) / einwohner_deutschland
|
|
|
|
|
2021-01-14 23:16:40 +00:00
|
|
|
mean_vaccinations_daily = np.mean(daily)
|
2021-01-15 18:59:50 +00:00
|
|
|
mean_vaccinations_daily_int = int(np.round(mean_vaccinations_daily))
|
2021-01-14 23:16:40 +00:00
|
|
|
|
2021-01-15 18:59:50 +00:00
|
|
|
to_be_vaccinated = einwohner_deutschland - total_vaccinations
|
2021-01-14 23:16:40 +00:00
|
|
|
days_extrapolated = int(np.ceil(to_be_vaccinated / mean_vaccinations_daily))
|
|
|
|
|
|
|
|
extrapolated_dates = np.array([dates[0] + datetime.timedelta(days=i) for i in range(days_extrapolated)])
|
|
|
|
|
|
|
|
extrapolated_vaccinations = mean_vaccinations_daily * range(days_extrapolated)
|
|
|
|
|
|
|
|
|
2021-01-15 18:59:50 +00:00
|
|
|
|
2021-01-14 23:16:40 +00:00
|
|
|
# Stand aus Daten auslesen
|
|
|
|
#stand = dates.iloc[-1]
|
|
|
|
#print_stand = stand.isoformat()
|
|
|
|
|
|
|
|
# Stand aus offiziellen Angaben auslesen
|
2021-01-14 23:19:31 +00:00
|
|
|
stand = rki_file['Erläuterung'].iloc[1][0]
|
2021-01-14 23:16:40 +00:00
|
|
|
|
|
|
|
stand_regex = re.compile('^Datenstand: (\d\d.\d\d.\d\d\d\d, \d\d:\d\d) Uhr$')
|
|
|
|
m = stand_regex.match(stand)
|
|
|
|
stand_date = datetime.datetime.strptime(m.groups()[0], '%d.%m.%Y, %H:%M')
|
|
|
|
print_stand = stand_date.isoformat()
|
|
|
|
|
|
|
|
filename_stand = stand_date.strftime("%Y%m%d%H%M%S")
|
|
|
|
|
|
|
|
def plot_extrapolation_portion(percentage):
|
|
|
|
|
2021-01-16 13:26:46 +00:00
|
|
|
print_percentage = int(percentage * 100)
|
|
|
|
plot_filename = '{}/{}_extrapolated_to_{}_percent.pdf'.format(plots_folder, filename_stand, print_percentage)
|
|
|
|
|
|
|
|
if os.path.isfile(plot_filename):
|
|
|
|
print('Plot {} already exists'.format(plot_filename))
|
|
|
|
return
|
|
|
|
|
2021-01-14 23:16:40 +00:00
|
|
|
fig, ax = plt.subplots(1)
|
|
|
|
|
|
|
|
|
|
|
|
plt.title(
|
2021-01-15 19:19:06 +00:00
|
|
|
'Tägliche Impfquote, kumulierte Impfungen und lineare Extrapolation bis {:n} % der Bevölkerung Deutschlands\n'
|
2021-01-15 18:59:50 +00:00
|
|
|
'Erstellung: {}, Datenquelle: RKI, Stand: {}\n'
|
2021-01-15 19:19:06 +00:00
|
|
|
'Impfungen gesamt: {:n} ({:n} %), Durchschnittliche Impfrate: {:n} Impfungen/Tag'.format(
|
2021-01-15 18:59:50 +00:00
|
|
|
print_percentage,
|
|
|
|
print_today, print_stand,
|
|
|
|
total_vaccinations, np.round(total_vaccinations_percentage * 100, 2), mean_vaccinations_daily_int
|
|
|
|
)
|
2021-01-14 23:16:40 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
ax2 = ax.twinx()
|
|
|
|
|
|
|
|
ax.bar(dates, daily, label='Tägliche Impfungen')
|
|
|
|
|
|
|
|
ax2.set_ylim([0, einwohner_deutschland * percentage])
|
|
|
|
ax2.set_xlim(xmax=dates[0] + datetime.timedelta(days=percentage * days_extrapolated))
|
|
|
|
ax2.grid(True)
|
|
|
|
ax2.plot(dates, cumulative, color='red', label='Kumulierte Impfungen')
|
2021-01-15 19:19:06 +00:00
|
|
|
ax2.plot(extrapolated_dates, extrapolated_vaccinations, color='orange', label='Extrap. kumulierte Impfungen\n({:n} Impfungen/Tag)'.format(mean_vaccinations_daily_int))
|
2021-01-14 23:16:40 +00:00
|
|
|
#ax2.plot()
|
|
|
|
|
|
|
|
ax.legend(loc='upper left')
|
|
|
|
ax.get_yaxis().get_major_formatter().set_scientific(False)
|
|
|
|
|
|
|
|
ax.set_xlabel('Datum')
|
|
|
|
ax.set_ylabel('Tägliche Impfungen')
|
|
|
|
|
|
|
|
ax2.legend(loc='center right')
|
|
|
|
ax2.get_yaxis().get_major_formatter().set_scientific(False)
|
|
|
|
|
2021-01-15 19:20:14 +00:00
|
|
|
# Estimated percentage for herd immunity
|
|
|
|
#ax2.axline((0, einwohner_deutschland * 0.7), slope=0, color='green')
|
2021-01-14 23:16:40 +00:00
|
|
|
|
|
|
|
ax2.set_ylabel('Kumulierte Impfungen')
|
|
|
|
|
2021-01-16 13:26:46 +00:00
|
|
|
plt.savefig(plot_filename)
|
2021-01-14 23:16:40 +00:00
|
|
|
plt.close()
|
|
|
|
|
2021-01-16 13:26:46 +00:00
|
|
|
print('Created plot {}'.format(plot_filename))
|
|
|
|
|
2021-01-14 23:16:40 +00:00
|
|
|
|
|
|
|
plot_extrapolation_portion(0.1)
|
|
|
|
plot_extrapolation_portion(1.0)
|