Created
June 23, 2021 13:42
-
-
Save btseytlin/ac62bd79c6cc7733d9f6d85534ef8ae7 to your computer and use it in GitHub Desktop.
Medium "How to actually forecast COVID-19" embed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from sir_models.utils import eval_on_select_dates_and_k_days_ahead | |
| from sir_models.utils import smape | |
| from sklearn.metrics import mean_absolute_error | |
| K = 30 | |
| last_day = train_subset.date.iloc[-1] - pd.to_timedelta(K, unit='D') | |
| eval_dates = pd.date_range(start='2020-06-01', end=last_day)[::20] | |
| def eval_hidden_moscow(train_df, t, train_t, eval_t): | |
| weights = { | |
| 'I': 0.25, | |
| 'R': 0.25, | |
| 'D': 0.5, | |
| } | |
| model = SEIRHidden() | |
| fitter = HiddenCurveFitter( | |
| new_deaths_col='deaths_per_day_ma7', | |
| new_cases_col='infected_per_day_ma7', | |
| new_recoveries_col='recovered_per_day_ma7', | |
| weights=weights, | |
| max_iters=1000, | |
| save_params_every=500) | |
| fitter.fit(model, train_df) | |
| train_initial_conditions = model.get_initial_conditions(train_df) | |
| train_states, history = model.predict(train_t, train_initial_conditions, history=False) | |
| test_initial_conds = [compartment[-1] for compartment in train_states] | |
| test_states, history = model.predict(eval_t, test_initial_conds, history=False) | |
| return model, fitter, test_states | |
| (models, fitters, | |
| model_predictions, | |
| train_dfs, test_dfs) = eval_on_select_dates_and_k_days_ahead(train_subset, | |
| eval_func=eval_hidden_moscow, | |
| eval_dates=eval_dates, | |
| k=K) | |
| model_pred_D = [pred[7] for pred in model_predictions] | |
| true_D = [tdf.total_dead.values for tdf in test_dfs] | |
| baseline_pred_D = [[tdf.iloc[-1].total_dead]*K for tdf in train_dfs] | |
| overall_errors_model = [mean_absolute_error(true, pred) for true, pred in zip(true_D, model_pred_D)] | |
| overall_errors_baseline = [mean_absolute_error(true, pred) for true, pred in zip(true_D, baseline_pred_D)] | |
| print('Mean overall error baseline', np.mean(overall_errors_baseline).round(3)) | |
| print('Mean overall error model', np.mean(overall_errors_model).round(3)) | |
| overall_smape_model = [smape(true, pred) for true, pred in zip(true_D, model_pred_D)] | |
| np.median(overall_smape_model) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment