General updates
[covid19.git] / test_and_case_data-be.md
1 ---
2 jupyter:
3 jupytext:
4 formats: ipynb,md
5 text_representation:
6 extension: .md
7 format_name: markdown
8 format_version: '1.3'
9 jupytext_version: 1.10.2
10 kernelspec:
11 display_name: Python 3
12 language: python
13 name: python3
14 ---
15
16 ```python Collapsed="false"
17 import itertools
18 import collections
19 import json
20 import pandas as pd
21 import numpy as np
22 from scipy.stats import gmean
23 import datetime
24
25 import matplotlib as mpl
26 import matplotlib.pyplot as plt
27 import matplotlib.animation as ani
28 %matplotlib inline
29 ```
30
31 <!-- #region Collapsed="false" -->
32 Belgian data from https://epistat.wiv-isp.be/covid/
33 <!-- #endregion -->
34
35 ```python Collapsed="false"
36 !curl "https://epistat.sciensano.be/Data/COVID19BE_tests.csv" > COVID19BE_tests.csv
37 ```
38
39 ```python Collapsed="false"
40 raw_data = pd.read_csv('COVID19BE_tests.csv',
41 parse_dates=[0], dayfirst=True,
42 keep_default_na=False, na_values = ['']
43 )
44 ```
45
46 ```python Collapsed="false"
47 raw_data.dtypes
48 ```
49
50 ```python Collapsed="false"
51 tests_data = raw_data.set_index('DATE').sort_index().groupby('DATE').sum()[:-1]
52 tests_data
53 ```
54
55 ```python Collapsed="false"
56 tests_data.plot()
57 ```
58
59 ```python Collapsed="false"
60 # data_by_day.newAdmissions.dropna()
61 ```
62
63 ```python Collapsed="false"
64 data_by_day = pd.read_csv('data_by_day_be.csv', index_col='dateRep', parse_dates=True)
65 data_by_day
66 ```
67
68 ```python Collapsed="false"
69 data_by_day.loc['2020-07-03']
70 ```
71
72 ```python Collapsed="false"
73 data_by_day = data_by_day.merge(tests_data[['TESTS_ALL']], how='outer',
74 left_index=True, right_index=True).dropna()
75 ```
76
77 ```python Collapsed="false"
78 data_by_day
79 ```
80
81 ```python Collapsed="false"
82 data_by_day['deaths_m7'] = data_by_day.deaths.transform(lambda x: x.rolling(7, 1).mean())
83 data_by_day['cases_m7'] = data_by_day.cases.transform(lambda x: x.rolling(7, 1).mean())
84 data_by_day['tests_m7'] = data_by_day.TESTS_ALL.transform(lambda x: x.rolling(7, 1).mean())
85 ```
86
87 ```python Collapsed="false"
88 data_by_day = data_by_day.dropna()
89 data_by_day
90 ```
91
92 ```python Collapsed="false"
93 data_by_day.loc['2020-06-22']
94 ```
95
96 ```python Collapsed="false"
97 data_by_day.loc['2020-04-15':'2020-08-26', ['cases_m7', 'tests_m7']].plot()
98 ```
99
100 ```python Collapsed="false"
101 data_by_day['fraction_positive'] = data_by_day.cases / data_by_day.TESTS_ALL
102 data_by_day['fraction_positive_m7'] = data_by_day.cases_m7 / data_by_day.tests_m7
103 ```
104
105 ```python Collapsed="false"
106 data_by_day[['fraction_positive', 'fraction_positive_m7']].dropna().plot()
107 ```
108
109 ```python Collapsed="false"
110 # ax = data_by_day.dropna().loc['2020-06-15': , ['fraction_positive', 'fraction_positive_m7']].plot(figsize=(10, 8), title='Fraction of tests with positive results')
111 # ax.legend(['Fraction positive per day', 'Fraction positive, 7 day moving average'])
112 # ax.set_ylabel('Fraction positive')
113 # plt.savefig('fraction_positive_tests.png')
114 ```
115
116 ```python Collapsed="false"
117 pri_y_max = int((data_by_day.dropna().loc['2020-06-15': , 'tests_m7'].max() * 1.1) / 100 ) * 100
118 ax = data_by_day.dropna().loc['2020-06-15': , 'tests_m7'].plot(figsize=(10, 8),
119 style=['k-'],
120 legend=False,
121 ylim=(0, pri_y_max))
122 ax.set_title('Tests done and new cases (7 day moving average)')
123 ax.legend(['Tests, 7 day moving average'], loc='lower left')
124 ax.set_ylabel('Tests')
125 sec_y_max = int((data_by_day.dropna().loc['2020-06-15':, 'cases_m7'].max() * 1.1) / 100) * 100
126 ax = data_by_day.dropna().loc['2020-06-15':, 'cases_m7'].plot(ax=ax, secondary_y=True, style='r--')
127 ax.set_ylim((0, sec_y_max))
128 ax.legend(['Cases (7 day moving average)'], loc='lower right')
129 ax.set_ylabel('New cases')
130 plt.savefig('tests_and_cases_be.png')
131 ```
132
133 ```python Collapsed="false"
134 int((sec_y_max * 1.1) / 100) * 100
135 ```
136
137 ```python Collapsed="false"
138 ax = (data_by_day.dropna().loc['2020-06-15': , ['fraction_positive', 'fraction_positive_m7']] * 100).plot(figsize=(10, 8),
139 style=['b:', 'k-'], legend=False)
140 ax.set_title('Fraction of tests with positive results')
141 ax.legend(['Fraction positive (%)', 'Fraction positive (%), 7 day moving average'], loc='lower left')
142 ax.set_ylabel('Fraction positive')
143 ax = data_by_day.dropna().loc['2020-06-15':, 'cases_m7'].plot(ax=ax, secondary_y=True, style='r--')
144 ax.legend(['Cases (7 day moving average)'], loc='lower right')
145 ax.set_ylabel('New cases')
146 plt.savefig('fraction_positive_tests_be.png')
147 ```
148
149 ```python Collapsed="false"
150 ax = data_by_day.dropna().loc['2020-06-15':].plot(x='fraction_positive_m7', y='tests_m7',
151 figsize=(8, 8),
152 legend=None)
153 ax.set_xlabel("Fraction of tests that are positive")
154 ax.set_ylabel("Number of tests")
155 for d in data_by_day.dropna().loc['2020-06-15'::15].index:
156 ax.plot(data_by_day.loc[d, 'fraction_positive_m7'], data_by_day.loc[d, 'tests_m7'], 'o',
157 markersize=8)#, markerfacecolor=marker_col, markeredgecolor=marker_col)
158 ax.text(data_by_day.loc[d, 'fraction_positive_m7'] + 0.0002, data_by_day.loc[d, 'tests_m7'],
159 s = d.strftime("%d %B %Y"))
160 plt.savefig('fraction_positive_tests_vs_tests_be.png')
161 ```
162
163 ```python Collapsed="false"
164 data_by_day.dropna().loc['2020-06-15':][:2]
165 ```
166
167 ```python Collapsed="false"
168 fig = plt.figure(figsize=(8, 8))
169 plt.ylabel('Number of tests')
170 plt.xlabel('Fraction of tests that are positive')
171 all_data = data_by_day.dropna().loc['2020-06-15':]
172
173
174 minx = all_data.fraction_positive_m7.min() * 0.9
175 maxx = all_data.fraction_positive_m7.max() * 1.1
176 miny = all_data.tests_m7.min() * 0.9
177 maxy = all_data.tests_m7.max() * 1.1
178
179 plt.xlim(minx, maxx)
180 plt.ylim(miny, maxy)
181 # plt.legend(None)
182
183 def build_state_frame(i):
184 this_data = all_data[:i]
185 plt.clf()
186 plt.ylabel('Number of tests')
187 plt.xlabel('Fraction of tests that are positive')
188 plt.xlim(minx, maxx)
189 plt.ylim(miny, maxy)
190 p = plt.plot(this_data.fraction_positive_m7, this_data.tests_m7)
191 p[0].set_color('r')
192 for d in this_data[::15].index:
193 plt.plot(this_data.loc[d, 'fraction_positive_m7'],
194 this_data.loc[d, 'tests_m7'], 'o',
195 markersize=8, markerfacecolor='r', markeredgecolor='r')
196 plt.text(this_data.loc[d, 'fraction_positive_m7'] + 0.0002,
197 this_data.loc[d, 'tests_m7'],
198 s = d.strftime("%d %B %Y"))
199
200 animator = ani.FuncAnimation(fig, build_state_frame,
201 frames=all_data.shape[0]+1,
202 interval=100,
203 repeat_delay=200,
204 repeat=True)
205 animator.save('tests_vs_fraction_positive_be.mp4')
206 plt.show()
207 ```
208
209 ```python Collapsed="false"
210 !rm tests_vs_fraction_positive_animation_be.png
211 !ffmpeg -i tests_vs_fraction_positive_be.mp4 -plays 0 -final_delay 1 -f apng tests_vs_fraction_positive_animation_be.png
212 ```
213
214 ```python Collapsed="false"
215
216 ```