Compare commits
6 commits
2ec5c35f22
...
0b2b13b07b
Author | SHA1 | Date | |
---|---|---|---|
|
0b2b13b07b | ||
|
6e93557250 | ||
|
4246649109 | ||
|
06f4754087 | ||
|
e461a372f9 | ||
|
794fcf87d2 |
2 changed files with 214 additions and 107 deletions
320
plot.py
320
plot.py
|
@ -15,10 +15,14 @@ import locale
|
||||||
import os.path
|
import os.path
|
||||||
import shutil
|
import shutil
|
||||||
import math
|
import math
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
from matplotlib.dates import date2num
|
from matplotlib.dates import date2num, DateFormatter, WeekdayLocator
|
||||||
|
import matplotlib.dates as mdates
|
||||||
import matplotlib.ticker as mtick
|
import matplotlib.ticker as mtick
|
||||||
|
|
||||||
|
from isoweek import Week
|
||||||
|
|
||||||
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
|
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
|
||||||
|
|
||||||
site_folder = 'site/'
|
site_folder = 'site/'
|
||||||
|
@ -33,7 +37,7 @@ print_today = today.isoformat()
|
||||||
|
|
||||||
filename_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
filename_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||||
|
|
||||||
|
force_renew = True
|
||||||
|
|
||||||
# https://www.tagesschau.de/ausland/europa/ursula-von-der-leyen-zu-corona-impfstoffen-101.html
|
# https://www.tagesschau.de/ausland/europa/ursula-von-der-leyen-zu-corona-impfstoffen-101.html
|
||||||
target_date_for_herd_immunity = datetime.date(2021, 9, 22)
|
target_date_for_herd_immunity = datetime.date(2021, 9, 22)
|
||||||
|
@ -61,7 +65,7 @@ raw_data = rki_file['Impfungen_proTag']
|
||||||
|
|
||||||
impfungen = raw_data[:-1].dropna(subset=['Datum'])#.fillna(0)
|
impfungen = raw_data[:-1].dropna(subset=['Datum'])#.fillna(0)
|
||||||
|
|
||||||
impfungen.drop(impfungen.tail(1).index,inplace=True) # remove Gesamt row
|
impfungen.drop(impfungen.tail(3).index,inplace=True) # remove Gesamt row
|
||||||
|
|
||||||
dates = impfungen['Datum']
|
dates = impfungen['Datum']
|
||||||
|
|
||||||
|
@ -87,6 +91,17 @@ def calculate_vaccination_data(data):
|
||||||
mean_all_time = np.mean(valid_data)
|
mean_all_time = np.mean(valid_data)
|
||||||
mean_seven_days = np.mean(data[-7:])
|
mean_seven_days = np.mean(data[-7:])
|
||||||
|
|
||||||
|
vaccinations_by_week_map = map(lambda x: (Week.withdate(x[0]), x[1]), zip(dates, data))
|
||||||
|
|
||||||
|
vaccinations_by_week = {}
|
||||||
|
|
||||||
|
for w, v in vaccinations_by_week_map:
|
||||||
|
if w in vaccinations_by_week:
|
||||||
|
vaccinations_by_week[w] = vaccinations_by_week[w] + v
|
||||||
|
else:
|
||||||
|
vaccinations_by_week[w] = v
|
||||||
|
|
||||||
|
|
||||||
def extrapolate(rate, to_be_vaccinated):
|
def extrapolate(rate, to_be_vaccinated):
|
||||||
days_extrapolated = int(np.ceil(to_be_vaccinated / rate))
|
days_extrapolated = int(np.ceil(to_be_vaccinated / rate))
|
||||||
extrapolated_dates = np.array([dates[0] + datetime.timedelta(days=i) for i in range(days_extrapolated)])
|
extrapolated_dates = np.array([dates[0] + datetime.timedelta(days=i) for i in range(days_extrapolated)])
|
||||||
|
@ -131,6 +146,7 @@ def calculate_vaccination_data(data):
|
||||||
'days_since_start': days_since_start_of_vaccination + 1, # Shift from zero to one-based-index
|
'days_since_start': days_since_start_of_vaccination + 1, # Shift from zero to one-based-index
|
||||||
'start_of_vaccination_date': start_of_vaccination_date,
|
'start_of_vaccination_date': start_of_vaccination_date,
|
||||||
'start_of_vaccination_date_str': start_of_vaccination_date.strftime('%d. %B %Y'),
|
'start_of_vaccination_date_str': start_of_vaccination_date.strftime('%d. %B %Y'),
|
||||||
|
'vaccinations_by_week': vaccinations_by_week,
|
||||||
'extrapolation_mean_all_time': extrapolation_mean_all_time,
|
'extrapolation_mean_all_time': extrapolation_mean_all_time,
|
||||||
'extrapolation_last_rate': extrapolation_last_rate,
|
'extrapolation_last_rate': extrapolation_last_rate,
|
||||||
'extrapolation_mean_seven_days': extrapolation_mean_seven_days,
|
'extrapolation_mean_seven_days': extrapolation_mean_seven_days,
|
||||||
|
@ -271,90 +287,12 @@ else:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def plot_extrapolation_portion(percentage):
|
|
||||||
|
|
||||||
print_percentage = int(percentage * 100)
|
|
||||||
archive_plot_filename = '{}/extrapolated_to_{}_percent'.format(archive_folder, print_percentage)
|
|
||||||
latest_plot_filename = '{}/extrapolated_to_{}_percent'.format(site_folder, print_percentage)
|
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
|
||||||
return
|
|
||||||
|
|
||||||
fig, ax = plt.subplots(1)
|
|
||||||
|
|
||||||
|
|
||||||
plt.title(
|
|
||||||
'Tägliche Impfrate (Erst- und Zweitimpfung übereinander), kumulierte Impfungen und lineare Extrapolation bis {:n} % der Bevölkerung Deutschlands\n'
|
|
||||||
'Datenquelle: RKI, Stand: {}. Erstellung: {}, Ersteller: Benedikt Bastin, Lizenz: CC BY-SA 4.0\n'
|
|
||||||
'Erstimpfungen: {:n} ({:n} %), Durchschnittliche Impfrate: {:n} Impfungen/Tag (läuft seit {:n} Tagen)\n'
|
|
||||||
'Zweitimpfungen: {:n} ({:n} %), Durchschnittliche Impfrate: {:n} Impfungen/Tag (läuft seit {:n} Tagen)'.format(
|
|
||||||
print_percentage,
|
|
||||||
print_stand, print_today,
|
|
||||||
data_first_vaccination['total'], np.round(data_first_vaccination['total_percentage'], 2), data_first_vaccination['extrapolation_mean_all_time']['rate'], data_first_vaccination['days_since_start'],
|
|
||||||
data_second_vaccination['total'], np.round(data_second_vaccination['total_percentage'], 2), data_second_vaccination['extrapolation_mean_all_time']['rate'], data_second_vaccination['days_since_start']
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
ax2 = ax.twinx()
|
|
||||||
|
|
||||||
ax.bar(dates, data_first_vaccination['daily'], label='Tägliche Erstimpfungen', color='blue')
|
|
||||||
ax.bar(dates, data_second_vaccination['daily'], label='Tägliche Zweitimpfungen', color='lightblue', bottom=data_first_vaccination['daily'])
|
|
||||||
|
|
||||||
ax.plot(dates, data_first_vaccination['mean_vaccination_rates_daily'], color='violet', label='Durchschnittliche Erstimpfrate\nbis zu diesem Tag (inkl.)')
|
|
||||||
ax.plot(dates, data_second_vaccination['mean_vaccination_rates_daily'], color='magenta', label='Durchschnittliche Zweitimpfrate\nbis zu diesem Tag (inkl.)')
|
|
||||||
|
|
||||||
ax2.set_ylim([0, einwohner_deutschland * percentage])
|
|
||||||
ax2.set_xlim(xmax=dates[0] + datetime.timedelta(days=percentage * data_first_vaccination['extrapolation_mean_all_time']['days_extrapolated']))
|
|
||||||
ax2.grid(True)
|
|
||||||
|
|
||||||
ax2.plot(dates, data_first_vaccination['cumulative'], color='red', label='Kumulierte Erstimpfungen')
|
|
||||||
ax2.plot(dates, data_second_vaccination['cumulative'], color='indianred', label='Kumulierte Zweitimpfungen')
|
|
||||||
|
|
||||||
ax2.plot(data_first_vaccination['extrapolation_mean_all_time']['dates'], data_first_vaccination['extrapolation_mean_all_time']['extrapolated_vaccinations'], color='orange', label='Extrap. kumulierte Erstimpfungen (Ø gesamt)\n{:n} Impfungen/Tag'.format(data_first_vaccination['extrapolation_mean_all_time']['rate_int']))
|
|
||||||
ax2.plot(data_first_vaccination['extrapolation_mean_seven_days']['dates'], data_first_vaccination['extrapolation_mean_seven_days']['extrapolated_vaccinations'], color='goldenrod', label='Extrap. kumulierte Erstimpfungen (Ø 7 Tage)\n{:n} Impfungen/Tag'.format(data_first_vaccination['extrapolation_mean_seven_days']['rate_int']))
|
|
||||||
ax2.plot()
|
|
||||||
|
|
||||||
ax2.plot(data_second_vaccination['extrapolation_mean_all_time']['dates'], data_second_vaccination['extrapolation_mean_all_time']['extrapolated_vaccinations'], color='orange', label='Extrap. kumulierte Zweitimpfungen (Ø gesamt)\n{:n} Impfungen/Tag'.format(data_second_vaccination['extrapolation_mean_all_time']['rate_int']))
|
|
||||||
ax2.plot(data_second_vaccination['extrapolation_mean_seven_days']['dates'], data_second_vaccination['extrapolation_mean_seven_days']['extrapolated_vaccinations'], color='goldenrod', label='Extrap. kumulierte Zweitimpfungen (Ø 7 Tage)\n{:n} Impfungen/Tag'.format(data_second_vaccination['extrapolation_mean_seven_days']['rate_int']))
|
|
||||||
#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='lower right')
|
|
||||||
ax2.get_yaxis().get_major_formatter().set_scientific(False)
|
|
||||||
|
|
||||||
# Estimated percentage for herd immunity
|
|
||||||
#ax2.axline((0, einwohner_deutschland * 0.7), slope=0, color='green')
|
|
||||||
|
|
||||||
ax2.set_ylabel('Kumulierte Impfungen')
|
|
||||||
|
|
||||||
plt.savefig(archive_plot_filename + '.pdf')
|
|
||||||
plt.savefig(archive_plot_filename + '.png')
|
|
||||||
plt.savefig(latest_plot_filename + '.pdf')
|
|
||||||
plt.savefig(latest_plot_filename + '.png')
|
|
||||||
plt.close()
|
|
||||||
|
|
||||||
print('Created plot {} as pdf and png'.format(archive_plot_filename))
|
|
||||||
|
|
||||||
|
|
||||||
plot_extrapolation_portion(0.1)
|
|
||||||
#plot_extrapolation_portion(0.7)
|
|
||||||
plot_extrapolation_portion(1.0)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def plot_vaccination_bar_graph_total_time():
|
def plot_vaccination_bar_graph_total_time():
|
||||||
|
|
||||||
archive_plot_filename = '{}/vaccination_bar_graph_total_time'.format(archive_folder)
|
archive_plot_filename = '{}/vaccination_bar_graph_total_time'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/vaccination_bar_graph_total_time'.format(site_folder)
|
latest_plot_filename = '{}/vaccination_bar_graph_total_time'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -392,12 +330,76 @@ def plot_vaccination_bar_graph_total_time():
|
||||||
|
|
||||||
plot_vaccination_bar_graph_total_time()
|
plot_vaccination_bar_graph_total_time()
|
||||||
|
|
||||||
|
def plot_vaccination_bar_graph_total_time_by_week():
|
||||||
|
|
||||||
|
archive_plot_filename = '{}/vaccination_bar_graph_total_time_by_week'.format(archive_folder)
|
||||||
|
latest_plot_filename = '{}/vaccination_bar_graph_total_time_by_week'.format(site_folder)
|
||||||
|
|
||||||
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
|
return
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(1)
|
||||||
|
|
||||||
|
|
||||||
|
plt.title(
|
||||||
|
'Wöchentliche Impfrate (Erst- und Zweitimpfung übereinander)\n'
|
||||||
|
'Datenquelle: RKI, Stand: {}. Erstellung: {}, Ersteller: Benedikt Bastin, Lizenz: CC BY-SA 4.0\n'.format(
|
||||||
|
print_stand, print_today
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
ax.grid()
|
||||||
|
|
||||||
|
w = [w.day(3) for w in data_first_vaccination['vaccinations_by_week'].keys()]
|
||||||
|
|
||||||
|
f = list(data_first_vaccination['vaccinations_by_week'].values())
|
||||||
|
s = list(data_second_vaccination['vaccinations_by_week'].values())
|
||||||
|
|
||||||
|
bar1 = ax.bar(w, f, label='Wöchentliche Erstimpfungen', color='blue', width=6.8)
|
||||||
|
bar2 = ax.bar(w, s, label='Wöchentliche Zweitimpfungen', color='lightblue', width=6.8, bottom=f)
|
||||||
|
|
||||||
|
for r1, r2 in zip(bar1, bar2):
|
||||||
|
|
||||||
|
x = r1.get_x() + r1.get_width() / 2.0
|
||||||
|
|
||||||
|
h1 = math.floor(r1.get_height() / 1000)
|
||||||
|
h2 = math.floor(r2.get_height() / 1000)
|
||||||
|
hg = math.floor((r1.get_height() + r2.get_height()) / 1000)
|
||||||
|
|
||||||
|
if h1 > 30:
|
||||||
|
plt.text(x, h1 * 500, f'{h1:5n} k'.replace('.', ' '), ha='center', va='center', color='white')
|
||||||
|
|
||||||
|
if h2 > 30:
|
||||||
|
plt.text(x, h1 * 1000 + h2 * 500, f'{h2:5n} k'.replace('.', ' '), ha='center', va='center', color='black')
|
||||||
|
|
||||||
|
plt.text(x, hg * 1000, f'{hg:5n} k'.replace('.', ' '), ha='center', va='bottom')
|
||||||
|
|
||||||
|
ax.legend(loc='upper left')
|
||||||
|
ax.get_xaxis().set_major_formatter(DateFormatter('%Y-w%W'))
|
||||||
|
ax.get_xaxis().set_major_locator(WeekdayLocator(3, 2))
|
||||||
|
ax.get_yaxis().get_major_formatter().set_scientific(False)
|
||||||
|
|
||||||
|
ax.set_xlabel('Datum')
|
||||||
|
ax.set_ylabel('Wöchentliche Impfungen')
|
||||||
|
|
||||||
|
|
||||||
|
plt.savefig(archive_plot_filename + '.pdf')
|
||||||
|
plt.savefig(archive_plot_filename + '.png')
|
||||||
|
plt.savefig(latest_plot_filename + '.pdf')
|
||||||
|
plt.savefig(latest_plot_filename + '.png')
|
||||||
|
plt.close()
|
||||||
|
|
||||||
|
print('Created plot {} as pdf and png'.format(archive_plot_filename))
|
||||||
|
|
||||||
|
plot_vaccination_bar_graph_total_time_by_week()
|
||||||
|
|
||||||
def plot_vaccination_bar_graph_total_time_two_bars():
|
def plot_vaccination_bar_graph_total_time_two_bars():
|
||||||
|
|
||||||
archive_plot_filename = '{}/vaccination_bar_graph_total_time_two_bars'.format(archive_folder)
|
archive_plot_filename = '{}/vaccination_bar_graph_total_time_two_bars'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/vaccination_bar_graph_total_time_two_bars'.format(site_folder)
|
latest_plot_filename = '{}/vaccination_bar_graph_total_time_two_bars'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -443,7 +445,7 @@ def plot_vaccination_bar_graph_compare_both_vaccinations():
|
||||||
archive_plot_filename = '{}/vaccination_bar_graph_compare_both_vaccinations'.format(archive_folder)
|
archive_plot_filename = '{}/vaccination_bar_graph_compare_both_vaccinations'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/vaccination_bar_graph_compare_both_vaccinations'.format(site_folder)
|
latest_plot_filename = '{}/vaccination_bar_graph_compare_both_vaccinations'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -489,7 +491,7 @@ def plot_cumulative_two_vaccinations():
|
||||||
archive_plot_filename = '{}/cumulative_two_vaccinations'.format(archive_folder)
|
archive_plot_filename = '{}/cumulative_two_vaccinations'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/cumulative_two_vaccinations'.format(site_folder)
|
latest_plot_filename = '{}/cumulative_two_vaccinations'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -536,7 +538,7 @@ def plot_cumulative_two_vaccinations_percentage():
|
||||||
archive_plot_filename = '{}/cumulative_two_vaccinations_percentage'.format(archive_folder)
|
archive_plot_filename = '{}/cumulative_two_vaccinations_percentage'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/cumulative_two_vaccinations_percentage'.format(site_folder)
|
latest_plot_filename = '{}/cumulative_two_vaccinations_percentage'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -585,7 +587,7 @@ def plot_people_between_first_and_second():
|
||||||
archive_plot_filename = '{}/people_between_first_and_second'.format(archive_folder)
|
archive_plot_filename = '{}/people_between_first_and_second'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/people_between_first_and_second'.format(site_folder)
|
latest_plot_filename = '{}/people_between_first_and_second'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -635,7 +637,7 @@ def plot_vaccination_rate():
|
||||||
archive_plot_filename = '{}/vaccination_rate'.format(archive_folder)
|
archive_plot_filename = '{}/vaccination_rate'.format(archive_folder)
|
||||||
latest_plot_filename = '{}/vaccination_rate'.format(site_folder)
|
latest_plot_filename = '{}/vaccination_rate'.format(site_folder)
|
||||||
|
|
||||||
if os.path.isfile(archive_plot_filename + '.pdf'):
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
print('Plot {} already exists'.format(archive_plot_filename))
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -679,13 +681,117 @@ def plot_vaccination_rate():
|
||||||
|
|
||||||
plot_vaccination_rate()
|
plot_vaccination_rate()
|
||||||
|
|
||||||
|
def plot_vaccination_done_days():
|
||||||
|
|
||||||
|
archive_plot_filename = '{}/vaccination_done_days'.format(archive_folder)
|
||||||
|
latest_plot_filename = '{}/vaccination_done_days'.format(site_folder)
|
||||||
|
|
||||||
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
|
return
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(1)
|
||||||
|
|
||||||
|
|
||||||
|
plt.title(
|
||||||
|
'Lin. Extrapolation der Erstimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Anzahl Tage, Gesamt und 7 Tage)\n'
|
||||||
|
'Datenquelle: RKI, Stand: {}. Erstellung: {}, Ersteller: Benedikt Bastin, Lizenz: CC BY-SA 4.0\n'.format(
|
||||||
|
print_stand, print_today
|
||||||
|
)
|
||||||
|
)
|
||||||
|
d = data_first_vaccination
|
||||||
|
|
||||||
|
days_remaining_daily = np.ceil((einwohner_deutschland * 0.7 - d['cumulative']) / (d['mean_vaccination_rates_daily']))
|
||||||
|
days_remaining_rolling = np.ceil((einwohner_deutschland * 0.7 - d['cumulative']) / (d['vaccination_rates_daily_rolling_average']))
|
||||||
|
|
||||||
|
ax.set_ylim(0, 2500)
|
||||||
|
|
||||||
|
ax.plot(dates, days_remaining_daily, label='Durchschnitt Gesamt', linewidth=0.5)
|
||||||
|
ax.plot(dates, days_remaining_rolling, label='Durchschnitt 7 Tage', linewidth=2)
|
||||||
|
|
||||||
|
ax.grid(True)
|
||||||
|
|
||||||
|
|
||||||
|
ax.legend(loc='upper right')
|
||||||
|
ax.get_yaxis().get_major_formatter().set_scientific(False)
|
||||||
|
|
||||||
|
ax.set_xlabel('Datum')
|
||||||
|
ax.set_ylabel('Tage, bis 70 % erreicht sind')
|
||||||
|
|
||||||
|
plt.savefig(archive_plot_filename + '.pdf')
|
||||||
|
plt.savefig(archive_plot_filename + '.png')
|
||||||
|
plt.savefig(latest_plot_filename + '.pdf')
|
||||||
|
plt.savefig(latest_plot_filename + '.png')
|
||||||
|
plt.close()
|
||||||
|
|
||||||
|
print('Created plot {} as pdf and png'.format(archive_plot_filename))
|
||||||
|
|
||||||
|
plot_vaccination_done_days()
|
||||||
|
|
||||||
|
def plot_vaccination_done_dates():
|
||||||
|
|
||||||
|
archive_plot_filename = '{}/vaccination_done_dates'.format(archive_folder)
|
||||||
|
latest_plot_filename = '{}/vaccination_done_dates'.format(site_folder)
|
||||||
|
|
||||||
|
if os.path.isfile(archive_plot_filename + '.pdf') and not force_renew:
|
||||||
|
print('Plot {} already exists'.format(archive_plot_filename))
|
||||||
|
return
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(1)
|
||||||
|
|
||||||
|
|
||||||
|
plt.title(
|
||||||
|
'Lin. Extrapolation der Erstimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Datum, Gesamt und 7 Tage)\n'
|
||||||
|
'Datenquelle: RKI, Stand: {}. Erstellung: {}, Ersteller: Benedikt Bastin, Lizenz: CC BY-SA 4.0\n'.format(
|
||||||
|
print_stand, print_today
|
||||||
|
)
|
||||||
|
)
|
||||||
|
d = data_first_vaccination
|
||||||
|
|
||||||
|
#print(d['cumulative'])
|
||||||
|
#print(np.sum(d['daily']))
|
||||||
|
|
||||||
|
#print((einwohner_deutschland - d['cumulative'])[:-1] - d['to_be_vaccinated'])
|
||||||
|
|
||||||
|
|
||||||
|
days_remaining_daily = np.ceil((einwohner_deutschland * 0.7 - d['cumulative']) / (d['mean_vaccination_rates_daily']))
|
||||||
|
days_remaining_rolling = np.ceil((einwohner_deutschland * 0.7 - d['cumulative']) / (d['vaccination_rates_daily_rolling_average']))
|
||||||
|
|
||||||
|
dates_daily = [today + datetime.timedelta(days) for days in days_remaining_daily]
|
||||||
|
dates_rolling = [today + datetime.timedelta(days) for days in days_remaining_rolling.dropna()]
|
||||||
|
|
||||||
|
#print(dates_rolling)
|
||||||
|
|
||||||
|
ax.set_ylim(today, today + datetime.timedelta(int(np.max(days_remaining_rolling) * 1.05)))
|
||||||
|
|
||||||
|
ax.plot(dates, dates_daily, label='Durchschnitt Gesamt', linewidth=0.5)
|
||||||
|
ax.plot(dates[6:], dates_rolling, label='Durchschnitt 7 Tage', linewidth=2)
|
||||||
|
|
||||||
|
ax.grid(True)
|
||||||
|
|
||||||
|
|
||||||
|
ax.legend(loc='upper right')
|
||||||
|
|
||||||
|
ax.set_xlabel('Datum')
|
||||||
|
ax.set_ylabel('Datum, an dem 70 % erreicht sind')
|
||||||
|
|
||||||
|
plt.savefig(archive_plot_filename + '.pdf')
|
||||||
|
plt.savefig(archive_plot_filename + '.png')
|
||||||
|
plt.savefig(latest_plot_filename + '.pdf')
|
||||||
|
plt.savefig(latest_plot_filename + '.png')
|
||||||
|
plt.close()
|
||||||
|
|
||||||
|
print('Created plot {} as pdf and png'.format(archive_plot_filename))
|
||||||
|
|
||||||
|
plot_vaccination_done_dates()
|
||||||
|
|
||||||
def render_dashboard():
|
def render_dashboard():
|
||||||
dashboard_filename = 'site/index.xhtml'
|
dashboard_filename = 'site/index.xhtml'
|
||||||
dashboard_archive_filename = 'site/archive/{}/index.xhtml'.format(filename_stand)
|
dashboard_archive_filename = 'site/archive/{}/index.xhtml'.format(filename_stand)
|
||||||
stylesheet_filename = 'site/rki-dashboard.css'
|
stylesheet_filename = 'site/rki-dashboard.css'
|
||||||
stylesheet_archive_filename = 'site/archive/{}/rki-dashboard.css'.format(filename_stand)
|
stylesheet_archive_filename = 'site/archive/{}/rki-dashboard.css'.format(filename_stand)
|
||||||
|
|
||||||
if os.path.isfile(dashboard_archive_filename):
|
if os.path.isfile(dashboard_archive_filename) and not force_renew:
|
||||||
print('Dashboard {} already exists'.format(dashboard_archive_filename))
|
print('Dashboard {} already exists'.format(dashboard_archive_filename))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -720,44 +826,44 @@ def render_dashboard():
|
||||||
figures = [
|
figures = [
|
||||||
{
|
{
|
||||||
'index': 1,
|
'index': 1,
|
||||||
'filename': 'extrapolated_to_10_percent',
|
|
||||||
'caption': 'Tägliche Impfquote, kumulierte Impfungen und lineare Extrapolation bis 10 % der Bevölkerung Deutschlands'
|
|
||||||
},{
|
|
||||||
'index': 2,
|
|
||||||
'filename': 'extrapolated_to_70_percent',
|
|
||||||
'caption': 'Tägliche Impfquote, kumulierte Impfungen und lineare Extrapolation bis 70 % der Bevölkerung Deutschlands'
|
|
||||||
},{
|
|
||||||
'index': 3,
|
|
||||||
'filename': 'extrapolated_to_100_percent',
|
|
||||||
'caption': 'Tägliche Impfquote, kumulierte Impfungen und lineare Extrapolation bis 100 % der Bevölkerung Deutschlands'
|
|
||||||
},{
|
|
||||||
'index': 4,
|
|
||||||
'filename': 'vaccination_bar_graph_total_time',
|
'filename': 'vaccination_bar_graph_total_time',
|
||||||
'caption': 'Tägliche Impfrate (Erst- und Zweitimpfung übereinander)'
|
'caption': 'Tägliche Impfrate (Erst- und Zweitimpfung übereinander)'
|
||||||
},{
|
},{
|
||||||
'index': 5,
|
'index': 2,
|
||||||
|
'filename': 'vaccination_bar_graph_total_time_by_week',
|
||||||
|
'caption': 'Wöchentliche Impfrate (Erst- und Zweitimpfung übereinander)'
|
||||||
|
},{
|
||||||
|
'index': 3,
|
||||||
'filename': 'vaccination_bar_graph_total_time_two_bars',
|
'filename': 'vaccination_bar_graph_total_time_two_bars',
|
||||||
'caption': 'Tägliche Impfrate (Erst- und Zweitimpfung nebeneinander)'
|
'caption': 'Tägliche Impfrate (Erst- und Zweitimpfung nebeneinander)'
|
||||||
},{
|
},{
|
||||||
'index': 6,
|
'index': 4,
|
||||||
'filename': 'vaccination_bar_graph_compare_both_vaccinations',
|
'filename': 'vaccination_bar_graph_compare_both_vaccinations',
|
||||||
'caption': 'Tägliche Impfrate (Erst- und Zweitimpfung nebeneinander)'
|
'caption': 'Tägliche Impfrate (Erst- und Zweitimpfung nebeneinander)'
|
||||||
},{
|
},{
|
||||||
'index': 7,
|
'index': 5,
|
||||||
'filename': 'cumulative_two_vaccinations',
|
'filename': 'cumulative_two_vaccinations',
|
||||||
'caption': 'Kumulative Impfrate (Erst- und Zweitimpfung)'
|
'caption': 'Kumulative Impfrate (Erst- und Zweitimpfung)'
|
||||||
},{
|
},{
|
||||||
'index': 8,
|
'index': 6,
|
||||||
'filename': 'cumulative_two_vaccinations_percentage',
|
'filename': 'cumulative_two_vaccinations_percentage',
|
||||||
'caption': 'Kumulative Impfrate (Erst- und Zweitimpfung) in Prozent der Bevölkerung Deutschlands'
|
'caption': 'Kumulative Impfrate (Erst- und Zweitimpfung) in Prozent der Bevölkerung Deutschlands'
|
||||||
},{
|
},{
|
||||||
'index': 9,
|
'index': 7,
|
||||||
'filename': 'people_between_first_and_second',
|
'filename': 'people_between_first_and_second',
|
||||||
'caption': 'Anzahl der Personen zwischen Erst- und Zweitimpfung, also Personen, die die erste Impfung erhalten haben, die zweite aber noch nicht'
|
'caption': 'Anzahl der Personen zwischen Erst- und Zweitimpfung, also Personen, die die erste Impfung erhalten haben, die zweite aber noch nicht'
|
||||||
},{
|
},{
|
||||||
'index': 10,
|
'index': 8,
|
||||||
'filename': 'vaccination_rate',
|
'filename': 'vaccination_rate',
|
||||||
'caption': 'Tägliche Impfrate sowie durchschnittliche Impfrate'
|
'caption': 'Tägliche Impfrate sowie durchschnittliche Impfrate'
|
||||||
|
},{
|
||||||
|
'index': 9,
|
||||||
|
'filename': 'vaccination_done_days',
|
||||||
|
'caption': 'Lineare Extrapolation bis 70 % der Bevölkerung anhand der Erstimpfungen der durchschnittlichen Impfrate (Anzahl Tage, Gesamt und 7 Tage)'
|
||||||
|
},{
|
||||||
|
'index': 10,
|
||||||
|
'filename': 'vaccination_done_dates',
|
||||||
|
'caption': 'Lineare Extrapolation bis 70 % der Bevölkerung anhand der Erstimpfungen der durchschnittlichen Impfrate (Datum, Gesamt und 7 Tage)'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
).dump('site/index.xhtml')
|
).dump('site/index.xhtml')
|
||||||
|
|
|
@ -4,4 +4,5 @@ pandas
|
||||||
openpyxl
|
openpyxl
|
||||||
requests
|
requests
|
||||||
jinja2
|
jinja2
|
||||||
|
isoweek
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue