1
0
Fork 0

feat: Created dashboard and reworked folder structure

This commit is contained in:
Benedikt Bastin 2021-01-17 02:34:49 +01:00
parent 7cba369103
commit 38a9cb39e8
7 changed files with 300 additions and 16 deletions

129
plot.py
View file

@ -10,14 +10,15 @@ import re
import requests as req
import locale
import os.path
import shutil
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
sources_folder = 'Quellen'
plots_folder = 'Plots'
site_folder = 'site/'
data_folder = 'data/'
einwohner_deutschland = 83190556
herd_immunity = 0.7
today = datetime.date.today()
print_today = today.isoformat()
@ -30,17 +31,18 @@ plt.rcParams["figure.figsize"] = [11.69, 8.27]
# Download
filename = '{}/{}_Impfquotenmonitoring.xlsx'.format(sources_folder, filename_now)
data_filename = '{}/{}_Impfquotenmonitoring.xlsx'.format(data_folder, filename_now)
r = req.get('https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Daten/Impfquotenmonitoring.xlsx?__blob=publicationFile')
with open(filename, 'wb') as outfile:
with open(data_filename, 'wb') as outfile:
outfile.write(r.content)
rki_file = pd.read_excel(filename, sheet_name=None, engine='openpyxl')
rki_file = pd.read_excel(data_filename, sheet_name=None, engine='openpyxl')
raw_data = rki_file['Impfungen_proTag']
@ -61,10 +63,41 @@ 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)])
mean_vaccinations_daily_done = extrapolated_dates[-1]
mean_vaccinations_daily_herd_immunity = extrapolated_dates[int(np.ceil(days_extrapolated * herd_immunity))]
days_extrapolated_with_todays_rate = int(np.ceil(to_be_vaccinated / daily.iloc[-1]))
last_date = dates.iloc[-1]
last_date_day_rate = daily.iloc[-1]
last_date_day_rate_done = dates[0] + datetime.timedelta(days=days_extrapolated_with_todays_rate)
last_date_day_rate_herd_immunity = dates[0] + datetime.timedelta(days=int(np.ceil(days_extrapolated_with_todays_rate * herd_immunity)))
extrapolated_vaccinations = mean_vaccinations_daily * range(1, days_extrapolated + 1)
days_since_start = (dates.iloc[-1].date() - dates[0].date()).days
print(days_since_start)
mean_vaccinations_last_seven_days = np.mean(daily[-7:])
mean_vaccinations_last_seven_days_int = int(np.round(mean_vaccinations_last_seven_days))
days_extrapolated_last_seven_days = int(np.ceil(to_be_vaccinated / mean_vaccinations_last_seven_days))
extrapolated_vaccinations_last_seven_days = total_vaccinations + mean_vaccinations_last_seven_days * range(-days_since_start, days_extrapolated - days_since_start)
mean_vaccinations_last_seven_days_done = dates.iloc[-1] + datetime.timedelta(days=days_extrapolated_last_seven_days)
mean_vaccinations_last_seven_days_herd_immunity = dates.iloc[-1] + datetime.timedelta(days=int(np.ceil(days_extrapolated_last_seven_days * herd_immunity)))
mean_vaccinations_daily_up_to_date = np.round(cumulative / range(1, len(cumulative) + 1))
print(extrapolated_vaccinations[:20])
print(extrapolated_vaccinations_last_seven_days[:20])
print(cumulative)
# Stand aus Daten auslesen
#stand = dates.iloc[-1]
#print_stand = stand.isoformat()
@ -79,14 +112,22 @@ print_stand = stand_date.isoformat()
filename_stand = stand_date.strftime("%Y%m%d%H%M%S")
archive_folder = site_folder + 'archive/' + filename_stand
if os.path.isdir(archive_folder):
print('Archive folder {} already exists'.format(archive_folder))
else:
os.mkdir(archive_folder)
def plot_extrapolation_portion(percentage):
print_percentage = int(percentage * 100)
plot_filename = '{}/{}_extrapolated_to_{}_percent'.format(plots_folder, filename_stand, print_percentage)
plot_filename_latest = '{}/latest_extrapolated_to_{}_percent'.format(plots_folder, print_percentage)
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(plot_filename + 'pdf'):
print('Plot {} already exists'.format(plot_filename))
if os.path.isfile(archive_plot_filename + '.pdf'):
print('Plot {} already exists'.format(archive_plot_filename))
return
fig, ax = plt.subplots(1)
@ -111,7 +152,8 @@ def plot_extrapolation_portion(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')
ax2.plot(extrapolated_dates, extrapolated_vaccinations, color='orange', label='Extrap. kumulierte Impfungen\n({:n} Impfungen/Tag)'.format(mean_vaccinations_daily_int))
ax2.plot(extrapolated_dates, extrapolated_vaccinations, color='orange', label='Extrap. kumulierte Impfungen (Øgesamt)\n{:n} Impfungen/Tag'.format(mean_vaccinations_daily_int))
ax2.plot(extrapolated_dates, extrapolated_vaccinations_last_seven_days, color='goldenrod', label='Extrap. kumulierte Impfungen (Ø7 Tage)\n{:n} Impfungen/Tag'.format(mean_vaccinations_last_seven_days_int))
#ax2.plot()
ax.legend(loc='upper left')
@ -128,14 +170,69 @@ def plot_extrapolation_portion(percentage):
ax2.set_ylabel('Kumulierte Impfungen')
plt.savefig(plot_filename + '.pdf')
plt.savefig(plot_filename + '.png')
plt.savefig(plot_filename_latest + '.pdf')
plt.savefig(plot_filename_latest + '.png')
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(plot_filename))
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 render_dashboard():
dashboard_filename = 'site/index.xhtml'
dashboard_archive_filename = 'site/archive/{}/index.xhtml'.format(filename_stand)
stylesheet_filename = 'site/rki-dashboard.css'
stylesheet_archive_filename = 'site/archive/{}/rki-dashboard.css'.format(filename_stand)
if os.path.isfile(dashboard_archive_filename):
print('Dashboard {} already exists'.format(dashboard_archive_filename))
return
from jinja2 import Template, Environment, FileSystemLoader, select_autoescape
env = Environment(
loader=FileSystemLoader('./'),
autoescape=select_autoescape(['html', 'xml', 'xhtml'])
)
german_text_date_format = '%d. %B %Y'
df = german_text_date_format
german_text_datetime_format = '%d. %B %Y, %H:%M:%S Uhr'
dtf = german_text_datetime_format
latest_dashboard_filename = site_folder + 'index.xhtml'
archive_dashboard_filename = archive_folder
template = env.get_template('dashboard_template.xhtml')
template.stream(
stand = stand_date.strftime(dtf),
filename_stand = filename_stand,
einwohner_deutschland = '{:n}'.format(einwohner_deutschland).replace('.', ''),
herd_immunity = '{:n}'.format(int(herd_immunity * 100)),
total_vaccinations = '{:n}'.format(total_vaccinations).replace('.', ''),
total_vaccinations_percentage = '{:.3n}'.format(total_vaccinations_percentage * 100),
days_since_start = days_since_start,
last_date = last_date.strftime(df),
last_date_day_rate = '{:n}'.format(last_date_day_rate).replace('.', ''),
mean_vaccinations_daily = '{:n}'.format(mean_vaccinations_daily_int).replace('.', ''),
mean_vaccinations_daily_herd_immunity = mean_vaccinations_daily_herd_immunity.strftime(df),
mean_vaccinations_daily_done = mean_vaccinations_daily_done.strftime(df),
last_date_day_rate_herd_immunity = last_date_day_rate_herd_immunity.strftime(df),
last_date_day_rate_done = last_date_day_rate_done.strftime(df),
mean_vaccinations_last_seven_days = '{:n}'.format(mean_vaccinations_last_seven_days_int).replace('.', ''),
mean_vaccinations_last_seven_days_herd_immunity = mean_vaccinations_last_seven_days_herd_immunity.strftime(df),
mean_vaccinations_last_seven_days_done = mean_vaccinations_last_seven_days_done.strftime(df)
).dump('site/index.xhtml')
shutil.copyfile(dashboard_filename, dashboard_archive_filename)
shutil.copyfile(stylesheet_filename, stylesheet_archive_filename)
print('Created dashboard')
render_dashboard()