import numpy as np import pandas as pd from src.plotter import Plotter SRC_DIR = './results/' I_PRED_SRC_DIR = SRC_DIR + 'I_predictions/' SIM_DIR = './visualizations/' def get_error(y, y_ref): err = [] for i in range(len(y)): diff = y[i] - y_ref err.append(np.linalg.norm(diff) / np.linalg.norm(y_ref)) return np.array(err).mean(axis=0) STATE_LOOKUP = {'Schleswig_Holstein' : (79.5,0.0849), 'Hamburg' : (84.5, 0.0948), 'Niedersachsen' : (77.6, 0.0774), 'Bremen' : (88.3,0.0933), 'Nordrhein_Westfalen' : (79.5,0.0777), 'Hessen' : (75.8,0.1017), 'Rheinland_Pfalz' : (75.6,0.0895), 'Baden_Wuerttemberg' : (74.5,0.0796), 'Bayern' : (75.1,0.0952), 'Saarland' : (82.4,0.1080), 'Berlin' : (78.1,0.0667), 'Brandenburg' : (68.1,0.0724), 'Mecklenburg_Vorpommern' : (74.7,0.0540), 'Sachsen' : (65.1,0.1109), 'Sachsen_Anhalt' : (74.1,0.0785), 'Thueringen' : (70.3,0.0837), 'Germany' : (76.4, 0.0804)} state_names = ['Schleswig-Holstein', 'Hamburg', 'Lower Saxony', 'Bremen', 'North Rhine-Westphalia', 'Hesse', 'Rhineland-Palatinate', 'Baden-Württemberg', 'Bavaria', 'Saarland', 'Berlin', 'Brandenburg', 'Mecklenburg-Western Pomerania', 'Saxony', 'Saxony-Anhalt', 'Thuringia', 'Germany'] plotter = Plotter(additional_colors=['yellow', 'cyan', 'magenta', ]) # plot results for alpha and beta print("Visualizing Alpha and Beta results") # synth param_matrix = np.genfromtxt(SRC_DIR + f'synthetic_parameters.csv', delimiter=',') mean = param_matrix.mean(axis=0) std = param_matrix.std(axis=0) print("States Table form:") print('{0:.4f}'.format(1/3), "&", '{0:.4f}'.format(mean[0]), "&", '{0:.4f}'.format(std[0]), "&", '{0:.4f}'.format(1/2), "&", '{0:.4f}'.format(mean[1]), "&", '{0:.4f}'.format(std[1]), "\\\ ") plotter.scatter(np.arange(1, 6, 1), [param_matrix[:,0], param_matrix[:,1]], [r"$\alpha$", r"$\beta$"], (7,3.5), 'reproducability', '', true_values=[1/3, 1/2], xlabel='iteration') vaccination_ratios = [] mean_std_parameters = {} for state in STATE_LOOKUP.keys(): state_matrix = np.genfromtxt(SRC_DIR + f'{state}_parameters.csv', delimiter=',') mean = state_matrix.mean(axis=0) std = state_matrix.std(axis=0) mean_std_parameters.update({state : (mean, std)}) vaccination_ratios.append(STATE_LOOKUP[state][0]) values = np.array(list(mean_std_parameters.values())) means = values[:,0] stds = values[:,1] alpha_means = means[:,0] beta_means = means[:,1] alpha_stds = stds[:,0] beta_stds = stds[:,1] print(f"Vaccination corr: {np.corrcoef(beta_means, vaccination_ratios)[0, 1]}") vaccination_ratios = vaccination_ratios[:-1] sn = np.array(state_names[:-1]).copy() sn[12] = "MWP" plotter.scatter(sn, [alpha_means[:-1], beta_means[:-1]], [r'$\alpha$', r'$\beta$', ], (12, 6), 'mean_std_alpha_beta_res', '', std=[alpha_stds[:-1], beta_stds[:-1]], true_values=[alpha_means[-1], beta_means[-1]], true_label='Germany', xlabel_rotation=60, plot_legend=True, legend_loc="lower right") print("States Table form:") for i, state in enumerate(STATE_LOOKUP.keys()): print(state_names[i], "&", '{0:.3f}'.format(alpha_means[i]), "{\\tiny $\\pm",'{0:.3f}'.format(alpha_stds[i]), "$}", "&", '{0:.3f}'.format(beta_means[i]), "{\\tiny $\\pm", '{0:.3f}'.format(beta_stds[i]), "$}", "&", STATE_LOOKUP[state][1], "&", '{0:.3f}'.format(beta_means[i]-beta_means[16]), "&", '{0:.1f}'.format(STATE_LOOKUP[state][0]), "\\\ ") print() # plot results for reproduction number # synth synth_iterations = [] for i in range(10): synth_iterations.append(np.genfromtxt(SRC_DIR + f'synthetic_{i}.csv', delimiter=',')) synth_matrix = np.array(synth_iterations) t = np.arange(0, len(synth_matrix[0]), 1) synth_r_t = np.zeros(150, dtype=np.float64) for i, time in enumerate(range(150)): synth_r_t[i] = -np.tanh(time * 0.05 - 2) * 0.4 + 1.35 print(f"Synthetic error R_t: {get_error(synth_matrix.mean(axis=0), synth_r_t)}") plotter.plot(t, [synth_matrix.mean(axis=0), synth_r_t], [r'$\mathcal{R}_t$', r'true $\mathcal{R}_t$'], f"synthetic_R_t_statistics", r"Synthetic data $\mathcal{R}_t$", (9, 6), fill_between=[synth_matrix.std(axis=0)], xlabel="time / days") pred_synth = np.genfromtxt(I_PRED_SRC_DIR + f'synthetic_0_I_prediction.csv', delimiter=',') print(f"Synthetic error I: {get_error(pred_synth[2], pred_synth[1])}") plotter.plot(pred_synth[0], [pred_synth[2], pred_synth[1]], [r'prediction $I$', r'true $I$'], f"synthetic_I_prediction", r"Synthetic data $I$ prediction", (9, 6), xlabel="time / days", ylabel='amount of people') EVENT_LOOKUP = {'start of vaccination' : 455, 'alpha variant' : 357, 'delta variant' : 473, 'omicron variant' : 663} ALPHA = [1 / 14, 1 / 5] cluster_counter = 1 cluster_idx = 0 in_text_r_t_mean = [] in_text_r_t_std = [] in_text_I = [] in_text_I_std = [] cluster_r_t_mean = [] cluster_r_t_std = [] cluster_I = [] cluster_I_std = [] cluster_states = [] for k, state in enumerate(STATE_LOOKUP.keys()): if state == "Thueringen": l = 1 elif state == "Bremen": l = 0 # data fetch arrays r_t = [] pred_i = [] true_i = [] cluster_states.append(state_names[k]) cluster_r_t_mean.append([]) cluster_r_t_std.append([]) cluster_I.append([]) cluster_I_std.append([np.zeros(1200), np.zeros(1200)]) if state == "Thueringen" or state == "Bremen": in_text_r_t_mean.append([]) in_text_r_t_std.append([]) in_text_I.append([]) in_text_I_std.append([np.zeros(1200), np.zeros(1200)]) for i, alpha in enumerate(ALPHA): iterations = [] predictions = [] true = [] for j in range(10): iterations.append(np.genfromtxt(SRC_DIR + f'{state}_{i}_{j}.csv', delimiter=',')) if (k >= 3 and j == 3) or j > 3: data = np.genfromtxt(I_PRED_SRC_DIR + f'{state}_{i}_{j}_I_prediction.csv', delimiter=',') predictions.append(data[2]) true = data[1] iterations = np.array(iterations) r_t.append(iterations) predictions = np.array(predictions) pred_i.append(predictions) true_i.append(true) cluster_r_t_mean[cluster_counter-1].append(iterations.mean(axis=0)) cluster_r_t_std[cluster_counter-1].append(iterations.std(axis=0)) if state == "Thueringen" or state == "Bremen": in_text_r_t_mean[l].append(iterations.mean(axis=0)) in_text_r_t_std[l].append(iterations.std(axis=0)) if state == "Thueringen" or state == "Bremen": in_text_I[l].append(true_i[0]) in_text_I[l].append(true_i[1]) in_text_I[l].append(pred_i[0].mean(axis=0)) in_text_I[l].append(pred_i[1].mean(axis=0)) in_text_I_std[l].append(pred_i[0].std(axis=0)) in_text_I_std[l].append(pred_i[1].std(axis=0)) cluster_I[cluster_counter-1].append(true_i[0]) cluster_I[cluster_counter-1].append(true_i[1]) cluster_I[cluster_counter-1].append(pred_i[0].mean(axis=0)) cluster_I[cluster_counter-1].append(pred_i[1].mean(axis=0)) cluster_I_std[cluster_counter-1].append(pred_i[0].std(axis=0)) cluster_I_std[cluster_counter-1].append(pred_i[1].std(axis=0)) # plot print(f"{state_names[k]} & {'{0:.3f}'.format(get_error(pred_i[0], true_i[0]))} & {'{0:.3f}'.format(get_error(pred_i[1], true_i[1]))} & \phantom{{0}} & {(r_t[0] > 1).sum(axis=1).mean()} & {(r_t[1] > 1).sum(axis=1).mean()} & {'{0:.3f}'.format(r_t[0].max(axis=1).mean())} & {'{0:.3f}'.format(r_t[1].max(axis=1).mean())}\\\ ") if len(cluster_states) == 4 and state != "Thueringen" or len(cluster_states) == 5 and state == "Germany": t = np.arange(0, 1200, 1) if len(cluster_states) == 5: y_lim_exception = 4 else: y_lim_exception = None plotter.cluster_plot(t, cluster_r_t_mean, [r"$\alpha=\frac{1}{14}$", r"$\alpha=\frac{1}{5}$"], (len(cluster_states), 1), (9, 6), f'r_t_cluster_{cluster_idx}', [state + r" $\mathcal{R}_t$" for state in cluster_states], fill_between=cluster_r_t_std, event_lookup=EVENT_LOOKUP, xlabel='time / days', ylim=(0.3, 2.0), legend_loc=(0.53, 0.992), number_of_legend_columns=3) plotter.cluster_plot(t, cluster_I, [r"true $I$ $\alpha=\frac{1}{14}$", r"true $I$ $\alpha=\frac{1}{5}$", r"prediction $I$ $\alpha=\frac{1}{14}$", r"prediction $I$ $\alpha=\frac{1}{5}$"], (len(cluster_states), 1), (9, 6), f'I_cluster_{cluster_idx}', [state + r" $I$ prediction" for state in cluster_states], fill_between=cluster_I_std, xlabel='time / days', ylabel='amount of people', same_axes=False, ylim=(0, 600000), legend_loc=(0.55, 0.992), number_of_legend_columns=2, y_lim_exception=y_lim_exception) cluster_counter = 0 cluster_idx += 1 cluster_r_t_mean = [] cluster_r_t_std = [] cluster_I = [] cluster_I_std = [] cluster_states = [] cluster_counter += 1 plotter.cluster_plot(t, in_text_r_t_mean, [r"$\alpha=\frac{1}{14}$", r"$\alpha=\frac{1}{5}$"], (2, 1), (9, 6), f'r_t_cluster_intext', [state + r" $\mathcal{R}_t$" for state in ['Bremen', 'Thuringia']], fill_between=in_text_r_t_std, event_lookup=EVENT_LOOKUP, xlabel='time / days', ylim=(0.3, 2.0), legend_loc=(0.53, 0.999), add_y_space=0.08, number_of_legend_columns=3) plotter.cluster_plot(t, in_text_I, [r"true $I$ $\alpha=\frac{1}{14}$", r"true $I$ $\alpha=\frac{1}{5}$", r"prediction $I$ $\alpha=\frac{1}{14}$", r"prediction $I$ $\alpha=\frac{1}{5}$"], (2, 1), (9, 6), f'I_cluster_intext', [state + r" $I$ prediction" for state in ['Bremen', 'Thuringia']], fill_between=in_text_I_std, xlabel='time / days', ylabel='amount of people', ylim=(0, 600000), legend_loc=(0.55, 0.999), add_y_space=0.08, number_of_legend_columns=2)