import pandas as pd
from src.config import BLD
from src.config import FAST_FLAG
[docs]SPRING_START = pd.Timestamp("2021-01-01")
[docs]INCIDENCE_OUTCOMES = [
"newly_infected",
"new_known_case",
"newly_deceased",
"currently_infected",
"knows_currently_infected",
]
[docs]NON_INCIDENCE_OUTCOMES = [
"ever_vaccinated",
"r_effective",
"share_ever_rapid_test",
"share_rapid_test_in_last_week",
"share_b117",
"share_delta",
"share_doing_rapid_test_today",
]
[docs]def create_path_to_last_states_of_simulation(name, seed):
path = BLD / "simulations" / "last_states" / f"{FAST_FLAG}_{name}_{seed}.pkl"
return path
[docs]def create_path_to_raw_rapid_test_statistics(name, seed):
csv_name = f"{FAST_FLAG}_{name}_{seed}.csv"
path = BLD / "simulations" / "period_outputs" / "rapid_test_statistics" / csv_name
return path
[docs]def create_path_to_period_outputs_of_simulation(name, seed):
"""Return the path to the simulation results with the period outcomes."""
path = BLD / "simulations" / "period_outputs" / f"{FAST_FLAG}_{name}_{seed}.pkl"
return path
[docs]def create_path_to_share_known_cases_of_scenario(name, groupby):
if groupby is None:
file_name = f"{FAST_FLAG}_{name}_by_{groupby}.pkl"
else:
file_name = f"{FAST_FLAG}_{name}.pkl"
return BLD / "simulations" / "share_known_cases" / file_name
[docs]def create_path_to_scenario_outcome_time_series(scenario_name, entry):
weekly = not any(outcome in entry for outcome in NON_INCIDENCE_OUTCOMES)
if weekly:
file_name = f"{FAST_FLAG}_{entry}_weekly_incidence.pkl"
elif "ever_vaccinated" in entry:
file_name = f"{FAST_FLAG}_{entry}_share.pkl"
else:
file_name = f"{FAST_FLAG}_{entry}.pkl"
return BLD / "simulations" / "time_series" / scenario_name / file_name
[docs]def create_path_to_rapid_test_statistic_time_series(scenario_name, entry):
file_name = f"{FAST_FLAG}_{entry}.pkl"
return BLD / "simulations" / "time_series" / scenario_name / file_name
[docs]def create_path_to_share_known_cases_plot(name, groupby):
if groupby is not None:
fig_name = f"{FAST_FLAG}_{name}_by_{groupby}.pdf"
else:
fig_name = f"{FAST_FLAG}_{name}.pdf"
return BLD / "figures" / "share_known_cases" / fig_name
[docs]def create_path_to_group_incidence_plot(name, outcome, groupby):
fig_name = f"{FAST_FLAG}_{name}_{outcome}.pdf"
return BLD / "figures" / "incidences_by_group" / groupby / fig_name
[docs]def create_path_for_weekly_outcome_of_scenario(
comparison_name, fast_flag, outcome, suffix
):
file_name = f"{fast_flag}_{outcome}.{suffix}"
if suffix == "pdf":
path = BLD / "figures" / "scenario_comparisons" / comparison_name / file_name
elif suffix == "csv":
path = BLD / "tables" / "scenario_comparisons" / comparison_name / file_name
else:
raise ValueError(f"Unknown suffix {suffix}. Only 'pdf' and 'csv' supported")
return path
# =============================================================================
[docs]def get_named_scenarios():
"""Get the named scenarios.
Returns:
dict: Nested dictionary. The outer keys are the names of the scenarios. The
inner dictionary are the specs passed to load_simulation_inputs and contains
'start_date', 'end_date', 'sim_input_scenario', 'params_scenario' and
'n_seeds'.
"""
if FAST_FLAG == "debug":
n_main_seeds = 1
n_other_seeds = 1
elif FAST_FLAG == "verify":
n_main_seeds = 30
n_other_seeds = 0
elif FAST_FLAG == "full":
n_main_seeds = 30
n_other_seeds = 30
else:
raise ValueError(
f"Unknown FAST_FLAG {FAST_FLAG}."
"Only 'debug', 'verify' or 'full' are allowed."
)
if FAST_FLAG != "debug":
fall_dates = {
"start_date": "2020-09-15",
"end_date": SPRING_START - pd.Timedelta(days=1),
}
spring_dates = {"start_date": SPRING_START, "end_date": "2021-05-31"}
combined_dates = {
"start_date": fall_dates["start_date"],
"end_date": spring_dates["end_date"],
}
else:
# for the plotting we need that combined and spring have dates after 2021-01-15
combined_dates = {"start_date": "2020-12-30", "end_date": "2021-01-18"}
fall_dates = {
"start_date": "2020-12-25",
"end_date": "2020-12-31",
}
spring_dates = {
"start_date": "2021-01-01",
"end_date": "2021-01-18",
}
named_scenarios = {
# Baseline Scenarios
"combined_baseline": {
"sim_input_scenario": "baseline",
"params_scenario": "baseline",
"n_seeds": n_main_seeds,
"is_resumed": False,
**combined_dates,
},
"fall_baseline": {
"sim_input_scenario": "baseline",
"params_scenario": "baseline",
"n_seeds": n_main_seeds,
"save_last_states": True,
"is_resumed": False,
**fall_dates,
},
"spring_baseline": {
"sim_input_scenario": "baseline_save_rapid_test_statistics",
"params_scenario": "baseline",
"n_seeds": n_main_seeds,
"save_rapid_test_statistics": True,
**spring_dates,
},
# Scenarios for the main plots
"spring_no_effects": {
"sim_input_scenario": "just_seasonality",
"params_scenario": "no_seasonality",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_seasonality": {
"sim_input_scenario": "baseline",
"params_scenario": "no_seasonality",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_vaccines": {
"sim_input_scenario": "no_vaccinations",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_rapid_tests": {
"sim_input_scenario": "no_rapid_tests",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
# School Scenarios
"spring_close_educ_after_easter": {
"sim_input_scenario": "close_educ_after_april_5",
"params_scenario": "no_rapid_tests_at_schools_after_easter",
"n_seeds": n_other_seeds,
**spring_dates,
},
# For the school opening scenarios we assume that the supply of rapid tests is
# large enough to allow the same fraction of individuals that should be tested
# is actually tested. After Easter that was 95% for educ workers and 75% for
# school pupils and increases from there to 1 for pupils.
"spring_educ_open_after_easter_with_tests": {
"sim_input_scenario": "open_all_educ_after_easter",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_educ_open_after_easter_without_tests": {
"sim_input_scenario": "open_all_educ_after_easter",
"params_scenario": "no_rapid_tests_at_schools_after_easter",
"n_seeds": n_other_seeds,
**spring_dates,
},
# Other Scenarios
"spring_vaccinate_1_pct_per_day_after_easter": {
"sim_input_scenario": "vaccinate_1_pct_per_day_after_easter",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_school_rapid_tests": {
"sim_input_scenario": "baseline",
"params_scenario": "no_rapid_tests_at_schools",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_work_rapid_tests": {
"sim_input_scenario": "baseline",
"params_scenario": "no_rapid_tests_at_work",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_private_rapid_tests": {
"sim_input_scenario": "baseline",
"params_scenario": "no_private_rapid_test_demand",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_school_and_work_rapid_tests": {
"sim_input_scenario": "baseline",
"params_scenario": "no_rapid_tests_at_schools_and_work",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_school_and_private_rapid_tests": {
"sim_input_scenario": "baseline",
"params_scenario": "no_rapid_tests_at_schools_and_private",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_work_and_private_rapid_tests": {
"sim_input_scenario": "baseline",
"params_scenario": "no_rapid_tests_at_work_and_private",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_rapid_tests_and_no_vaccinations": {
"sim_input_scenario": "just_seasonality",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_rapid_tests_without_seasonality": { # i.e. only vaccinations
"sim_input_scenario": "no_rapid_tests",
"params_scenario": "no_seasonality",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_without_vaccinations_without_seasonality": { # i.e. only rapid tests
"sim_input_scenario": "no_vaccinations",
"params_scenario": "no_seasonality",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_start_all_rapid_tests_after_easter": {
"sim_input_scenario": "baseline",
"params_scenario": "start_all_rapid_tests_after_easter",
"n_seeds": n_other_seeds,
**spring_dates,
},
# Work Scenarios (Home Office and Testing)
"spring_reduce_work_test_offers_to_23_pct_after_easter": {
"sim_input_scenario": "baseline",
"params_scenario": "keep_work_offer_share_at_23_pct_after_easter",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_mandatory_work_rapid_tests_after_easter": {
"sim_input_scenario": "baseline",
"params_scenario": "mandatory_work_rapid_tests_after_easter",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_10_pct_less_work_in_person_after_easter": {
"sim_input_scenario": "plus_10_pct_home_office_after_easter",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_10_pct_more_work_in_person_after_easter": {
"sim_input_scenario": "minus_10_pct_home_office_after_easter",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_with_completely_random_rapid_tests": {
"sim_input_scenario": "completely_random_rapid_tests",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"spring_with_random_rapid_tests_with_30pct_refusers": {
"sim_input_scenario": "random_rapid_tests_with_30pct_refusers",
"params_scenario": "baseline",
"n_seeds": n_other_seeds,
**spring_dates,
},
"robustness_check_early": {
"sim_input_scenario": "robustness_check",
"params_scenario": "robustness_check_params_early",
"n_seeds": n_other_seeds,
**spring_dates,
},
"robustness_check_medium": {
"sim_input_scenario": "robustness_check",
"params_scenario": "robustness_check_params_medium",
"n_seeds": n_other_seeds,
**spring_dates,
},
"robustness_check_late": {
"sim_input_scenario": "robustness_check",
"params_scenario": "robustness_check_params_late",
"n_seeds": n_other_seeds,
**spring_dates,
},
}
return named_scenarios
[docs]def get_available_scenarios(named_scenarios):
available_scenarios = sorted(
name for name, spec in named_scenarios.items() if spec["n_seeds"] > 0
)
return available_scenarios