9 jupytext_version: 1.10.2
11 display_name: Python 3
16 ```python Collapsed="false"
22 from scipy.stats import gmean
25 import matplotlib as mpl
26 import matplotlib.pyplot as plt
27 import matplotlib.animation as ani
31 <!-- #region Collapsed="false" -->
32 Belgian data from https://epistat.wiv-isp.be/covid/
35 ```python Collapsed="false"
36 !curl "https://epistat.sciensano.be/Data/COVID19BE_tests.csv" > COVID19BE_tests.csv
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 = ['']
46 ```python Collapsed="false"
50 ```python Collapsed="false"
51 tests_data = raw_data.set_index('DATE').sort_index().groupby('DATE').sum()[:-1]
55 ```python Collapsed="false"
59 ```python Collapsed="false"
60 # data_by_day.newAdmissions.dropna()
63 ```python Collapsed="false"
64 data_by_day = pd.read_csv('data_by_day_be.csv', index_col='dateRep', parse_dates=True)
68 ```python Collapsed="false"
69 data_by_day.loc['2020-07-03']
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()
77 ```python Collapsed="false"
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())
87 ```python Collapsed="false"
88 data_by_day = data_by_day.dropna()
92 ```python Collapsed="false"
93 data_by_day.loc['2020-06-22']
96 ```python Collapsed="false"
97 data_by_day.loc['2020-04-15':'2020-08-26', ['cases_m7', 'tests_m7']].plot()
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
105 ```python Collapsed="false"
106 data_by_day[['fraction_positive', 'fraction_positive_m7']].dropna().plot()
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')
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),
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')
133 ```python Collapsed="false"
134 int((sec_y_max * 1.1) / 100) * 100
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')
149 ```python Collapsed="false"
150 ax = data_by_day.dropna().loc['2020-06-15':].plot(x='fraction_positive_m7', y='tests_m7',
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')
163 ```python Collapsed="false"
164 data_by_day.dropna().loc['2020-06-15':][:2]
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':]
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
183 def build_state_frame(i):
184 this_data = all_data[:i]
186 plt.ylabel('Number of tests')
187 plt.xlabel('Fraction of tests that are positive')
190 p = plt.plot(this_data.fraction_positive_m7, this_data.tests_m7)
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"))
200 animator = ani.FuncAnimation(fig, build_state_frame,
201 frames=all_data.shape[0]+1,
205 animator.save('tests_vs_fraction_positive_be.mp4')
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
214 ```python Collapsed="false"