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