General updates
[covid19.git] / hospital_data.py
1 #!/usr/bin/env python
2 # coding: utf-8
3 # %%
4 import itertools
5 import collections
6 import json
7 import pandas as pd
8 import numpy as np
9 from scipy.stats import gmean
10 import datetime
11
12 import sqlalchemy
13
14 import matplotlib as mpl
15 import matplotlib.pyplot as plt
16 plt.ioff()
17 # # %matplotlib inline
18
19
20 # %%
21 connection_string = 'postgresql://covid:3NbjJTkT63@localhost/covid'
22
23
24 # %%
25 engine = sqlalchemy.create_engine(connection_string)
26
27
28 # %%
29 normalisation_date = '2020-08-01' # '2020-05-15'
30
31 hospital_normalisation_date = {
32 'hospital_normalisation_date': normalisation_date
33 }
34
35 with open('hospital_normalisation_date.json', 'w') as f:
36 json.dump(hospital_normalisation_date, f)
37
38 hnd = pd.to_datetime(normalisation_date).strftime("%d %B %Y")
39 with open('hospital_normalisation_date.js', 'w') as f:
40 f.write(f"document.write('{hnd}');")
41
42
43 # %%
44 qstr = '''select uk_data.date
45 , uk_data.new_admissions, uk_data_7.new_admissions as new_admissions_7
46 , uk_data.new_cases, uk_data_7.new_cases as new_cases_7
47 , uk_data.new_deaths, uk_data_7.new_deaths as new_deaths_7
48 , uk_data.hospital_cases, uk_data_7.hospital_cases as hospital_cases_7
49 , uk_data.ventilator_beds, uk_data_7.ventilator_beds as ventilator_beds_7
50 from uk_data left outer join uk_data_7 using (date)
51 order by uk_data.date'''
52 hospital_data = pd.read_sql_query(qstr, engine,
53 index_col='date',
54 parse_dates = ['date'])
55
56
57 # %%
58 fig = plt.figure(figsize=(10, 8))
59 ax = hospital_data.loc['2020-03-20':, ['hospital_cases', 'ventilator_beds']].plot(
60 secondary_y='ventilator_beds',
61 figsize=(10, 8),
62 title="People in hospital, and on mechanical ventilation")
63 # axl.legend(['Number in hospital', 'Number on ventilator'])
64 plt.savefig('people_in_hospital.png')
65
66
67 # %%
68 hospital_data['cases_m7nd'] = hospital_data.new_cases_7 / hospital_data.new_cases_7.loc[normalisation_date]
69 hospital_data['deaths_m7nd'] = hospital_data.new_deaths_7 / hospital_data.new_deaths_7.loc[normalisation_date]
70 hospital_data['admissions_m7nd'] = hospital_data.new_admissions_7 / hospital_data.new_admissions_7.loc[normalisation_date]
71
72
73 # %%
74 ymax = (int(hospital_data.loc[normalisation_date:, ['cases_m7nd', 'admissions_m7nd', 'deaths_m7nd']].max().max() * 10) + 1) / 10.0
75 ax = hospital_data.loc[normalisation_date:, ['cases_m7nd', 'admissions_m7nd', 'deaths_m7nd']].plot(
76 ylim=(0, ymax),
77 figsize=(10, 8),
78 title="Cases, hospital admissions, and deaths\n(7-day moving averages)")
79
80 lvi = hospital_data.cases_m7nd.last_valid_index()
81 ax.text(x = lvi + pd.Timedelta(days=1), y = hospital_data.cases_m7nd[lvi], s = f'{hospital_data.cases_m7nd[lvi]:.2f}')
82
83 lvi = hospital_data.admissions_m7nd.last_valid_index()
84 ax.text(x = lvi + pd.Timedelta(days=1), y = hospital_data.admissions_m7nd[lvi], s = f'{hospital_data.admissions_m7nd[lvi]:.2f}')
85
86 lvi = hospital_data.deaths_m7nd.last_valid_index()
87 ax.text(x = lvi + pd.Timedelta(days=1), y = hospital_data.deaths_m7nd[lvi], s = f'{hospital_data.deaths_m7nd[lvi]:.2f}')
88
89
90 ax.set_xlabel("Date")
91 ax.set_ylabel(f'Normalised units, scaled from {normalisation_date}')
92 ax.legend(['Cases', 'Admissions', 'Deaths'])
93
94 plt.savefig('cases_admissions_deaths.png')
95
96
97 # %%
98
99
100
101
102
103 # %% [markdown]
104 #