diff --git a/plot.py b/plot.py index 27315df..381e3ae 100644 --- a/plot.py +++ b/plot.py @@ -142,7 +142,7 @@ def parse_rki(filename): extrapolation_last_rate = extrapolate(data.iloc[-1], to_be_vaccinated) extrapolation_mean_seven_days = extrapolate(mean_seven_days, to_be_vaccinated) - mean_vaccination_rates_daily = np.round(cumulative / range(1, len(cumulative) + 1)) + mean_vaccination_rates_daily = data.expanding().mean() #np.round(cumulative / range(1, len(cumulative) + 1)) vaccination_rates_daily_rolling_average = data.rolling(7).mean() vaccinations_missing_until_target = einwohner_deutschland * herd_immunity - total @@ -682,29 +682,30 @@ def plot_vaccination_done_days(): plt.title( - 'Lin. Extrapolation der Erstimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Anzahl Tage, Gesamt und 7 Tage)\n' + 'Lin. Extrapolation der Erst- und Zweitimpfungen 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 * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) - days_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) ax.set_xlim(start_of_reporting_date, today) ax.set_ylim(0, 2500) ax.axhline(days_until_target, label='Impfziel Ende Sommer') - ax.plot(dates, days_remaining_daily, label='Durchschnitt Gesamt', linewidth=0.5) - ax.plot(dates, days_remaining_rolling, label='Durchschnitt 7 Tage', linewidth=2) + for d, c, l in [(data_first_vaccination, 'blue', 'Erstimpfungen'), (data_second_vaccination, 'lightblue', 'Zweitimpfungen')]: + + days_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) + days_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) + + ax.plot(dates, days_remaining_daily, label=f'{l} Durchschnitt Gesamt', linewidth=0.5, color=c) + ax.plot(dates, days_remaining_rolling, label=f'{l} Durchschnitt 7 Tage', linewidth=2, color=c) ax.grid(True) d = datetime.date(2021, 3, 1) ax.add_patch(Rectangle((d, 0), today - d, 52 * 7, edgecolor='darkgrey', lw=3, fill=False, label='Detailansicht (s.u.)')) - ax.legend(loc='upper right') + ax.legend(loc='lower left') ax.get_yaxis().get_major_formatter().set_scientific(False) ax.set_xlabel('Datum') @@ -726,27 +727,28 @@ def plot_vaccination_done_weeks(): plt.title( - 'Lin. Extrapolation der Erstimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Anzahl Wochen, Gesamt und 7 Tage)\n' + 'Lin. Extrapolation der Erst- und Zweitimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Anzahl Wochen, 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 - - weeks_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) / 7 - weeks_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) / 7 ax.set_xlim(datetime.date(2021, 3, 1), today) ax.set_ylim(0, 52) ax.axhline(days_until_target / 7, label='Impfziel Ende Sommer') - ax.plot(dates, weeks_remaining_daily, label='Durchschnitt Gesamt', linewidth=0.5) - ax.plot(dates, weeks_remaining_rolling, label='Durchschnitt 7 Tage', linewidth=2) + for d, c, l in [(data_first_vaccination, 'blue', 'Erstimpfungen'), (data_second_vaccination, 'lightblue', 'Zweitimpfungen')]: + + weeks_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) / 7 + weeks_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) / 7 + + ax.plot(dates, weeks_remaining_daily, label=f'{l} Durchschnitt Gesamt', linewidth=0.5, color=c) + ax.plot(dates, weeks_remaining_rolling, label=f'{l} Durchschnitt 7 Tage', linewidth=2, color=c) ax.grid(True) - ax.legend(loc='upper right') + ax.legend(loc='lower left') ax.get_yaxis().get_major_formatter().set_scientific(False) ax.set_xlabel('Datum') @@ -769,31 +771,37 @@ def plot_vaccination_done_dates(): plt.title( - 'Lin. Extrapolation der Erstimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Datum, Gesamt und 7 Tage)\n' + 'Lin. Extrapolation der Erst- und Zweitimpfungen 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 - days_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) - days_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) + for d, c, l in [(data_first_vaccination, 'blue', 'Erstimpfungen'), (data_second_vaccination, 'lightblue', 'Zweitimpfungen')]: - 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()] + days_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) + #days_remaining_daily[np.isnan(days_remaining_daily)] = 10000 + days_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) + #days_remaining_rolling[np.isnan(days_remaining_rolling)] = 10000 + + dates_daily = [today + datetime.timedelta(days) for days in days_remaining_daily.dropna()] + dates_rolling = [today + datetime.timedelta(days) for days in days_remaining_rolling.dropna()] + + offset = len(dates) - len(dates_daily) + ax.plot(dates[offset:], dates_daily, label=f'{l} Durchschnitt Gesamt', linewidth=0.5, color=c) + + offset = len(dates) - len(dates_rolling) + ax.plot(dates[offset:], dates_rolling, label=f'{l} Durchschnitt 7 Tage', linewidth=2, color=c) ax.set_xlim(start_of_reporting_date, today) - ax.set_ylim(today, today + datetime.timedelta(int(np.max(days_remaining_rolling) * 1.05))) + ax.set_ylim(today, datetime.date(2025, 7, 1)) + ax.axhline(target_date_for_herd_immunity - datetime.timedelta(21), label='Impfziel Ende Sommer') ax.add_patch(Rectangle((datetime.date(2021, 4, 6), today), today - datetime.date(2021, 4, 6), target_date_for_herd_immunity - today, edgecolor='darkgrey', lw=3, fill=False, label='Detailansicht (s.u.)')) - - 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.legend(loc='lower left') ax.set_xlabel('Datum') ax.set_ylabel('Datum, an dem 70 % erreicht sind') @@ -815,30 +823,36 @@ def plot_vaccination_done_dates_detail(): plt.title( - 'Lin. Extrapolation der Erstimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Detail, Datum, Gesamt und 7 Tage)\n' + 'Lin. Extrapolation der Erst- und Zweitimpfungen bis 70 % der Bevölkerung anhand der durchschn. Impfrate (Detail, 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 - days_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) - days_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) + for d, c, l in [(data_first_vaccination, 'blue', 'Erstimpfungen'), (data_second_vaccination, 'lightblue', 'Zweitimpfungen')]: - 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()] + days_remaining_daily = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['mean_vaccination_rates_daily'])) + days_remaining_daily[np.isnan(days_remaining_daily)] = 10000 + days_remaining_rolling = np.ceil((einwohner_deutschland * herd_immunity - d['cumulative']) / (d['vaccination_rates_daily_rolling_average'])) + days_remaining_rolling[np.isnan(days_remaining_rolling)] = 10000 + + dates_daily = [today + datetime.timedelta(days) for days in days_remaining_daily.dropna()] + dates_rolling = [today + datetime.timedelta(days) for days in days_remaining_rolling.dropna()] + + offset = len(dates) - len(dates_daily) + ax.plot(dates[offset:], dates_daily, label=f'{l} Durchschnitt Gesamt', linewidth=0.5, color=c) + + offset = len(dates) - len(dates_rolling) + ax.plot(dates[offset:], dates_rolling, label=f'{l} Durchschnitt 7 Tage', linewidth=2, color=c) ax.set_xlim(datetime.date(2021, 4, 6), today) ax.set_ylim(today, target_date_for_herd_immunity) ax.axhline(target_date_for_herd_immunity - datetime.timedelta(21), label='Impfziel Ende Sommer') - 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.legend(loc='lower left') ax.set_xlabel('Datum') ax.set_ylabel('Datum, an dem 70 % erreicht sind') @@ -928,19 +942,19 @@ def render_dashboard(): },{ 'index': 10, 'filename': 'vaccination_done_days', - 'caption': 'Lineare Extrapolation bis 70 % der Bevölkerung anhand der Erstimpfungen der durchschnittlichen Impfrate (Anzahl Tage, Gesamt und 7 Tage)' + 'caption': 'Lineare Extrapolation der Erst- und Zweitimpfungen bis 70 % der Bevölkerung anhand der durchschnittlichen Impfrate (Anzahl Tage, Gesamt und 7 Tage)' },{ 'index': 11, 'filename': 'vaccination_done_weeks', - 'caption': 'Lineare Extrapolation bis 70 % der Bevölkerung anhand der Erstimpfungen der durchschnittlichen Impfrate (Anzahl Wochen, Gesamt und 7 Tage)' + 'caption': 'Lineare Extrapolation der Erst- und Zweitimpfungen bis 70 % der Bevölkerung anhand der durchschnittlichen Impfrate (Anzahl Wochen, Gesamt und 7 Tage)' },{ 'index': 12, 'filename': 'vaccination_done_dates', - 'caption': 'Lineare Extrapolation bis 70 % der Bevölkerung anhand der Erstimpfungen der durchschnittlichen Impfrate (Datum, Gesamt und 7 Tage)' + 'caption': 'Lineare Extrapolation der Erst- und Zweitimpfungen bis 70 % der Bevölkerung anhand der durchschnittlichen Impfrate (Datum, Gesamt und 7 Tage)' },{ 'index': 13, 'filename': 'vaccination_done_dates_detail', - 'caption': 'Lineare Extrapolation bis 70 % der Bevölkerung anhand der Erstimpfungen der durchschnittlichen Impfrate (Datum, Gesamt und 7 Tage)' + 'caption': 'Lineare Extrapolation der Erst- und Zweitimpfungen bis 70 % der Bevölkerung anhand der durchschnittlichen Impfrate (Datum, Gesamt und 7 Tage)' } ] ).dump('site/index.xhtml')