︠673adb23-845e-41d2-9a55-a0bbc7e91d2di︠
%md
# COVID-19 Display Testing Time Series
︡00722435-043b-4311-9bcd-189e613efbfc︡{"done":true,"md":"\n# COVID-19 Display Testing Time Series"}
︠d9fab1df-5e40-4904-9e52-87754b54fdd6s︠
%auto
%default_mode python3
︡c8ae407e-014e-4e9d-80b8-0d67018d9310︡{"done":true}
︠4f2a9599-8634-4079-b4fd-05b537d976bes︠
import pandas as pd
import numpy as np
︡23fd6a4e-d6dc-4478-a856-66ed2cd3f5b8︡{"done":true}
︠8e2dfebb-111d-4953-8ef3-bdf90858e085s︠
state = 'il'
# use testing series collected by The Covid Tracking Project
# https://covidtracking.com/api/
# state abbreviation must be lower case
if state == 'US':
url = f"https://covidtracking.com/api/us/daily.csv"
else:
url = f"https://covidtracking.com/api/v1/states/{state}/daily.csv"
url
︡82723ce2-7775-48ce-befb-2d21e90f2f46︡{"stdout":"'https://covidtracking.com/api/v1/states/il/daily.csv'"}︡{"done":true}
︠3393df03-a3f7-4ff0-8889-1aab2f8cd68as︠
# fetch state data from Covid Tracking Project
# keep only a few columns
df = pd.read_csv(url, parse_dates=['date', 'dateChecked'])[['date','positive','death','total']]
︡1e7b2bc1-4b06-493a-8f0c-0d1726362231︡{"done":true}
︠dfd7878f-f814-45b4-8689-1e176e6cee42s︠
# use date as x-axis for displays so make it the index
df.set_index('date', inplace=True)
df.set_index(df.index.strftime('%m/%d'), inplace=True)
df.sort_index(inplace=True)
︡31d33737-6768-47f8-9491-4c16483fc5e7︡{"done":true}
︠800f0f33-5dd7-41c6-817c-d5b6c4b04f1bs︠
df.head(2)
︡ce3df052-3578-48bd-8002-c337ff8348d2︡{"html":"
\n\n
\n \n \n | \n positive | \n death | \n total | \n
\n \n date | \n | \n | \n | \n
\n \n \n \n 03/04 | \n 4 | \n NaN | \n 155 | \n
\n \n 03/05 | \n 5 | \n NaN | \n 197 | \n
\n \n
\n
"}︡{"done":true}
︠deb56e76-734f-4e1c-b808-e1975170d373s︠
df.tail()
︡a35f1e1e-f25f-4561-a523-e1bbf73991f8︡{"html":"\n\n
\n \n \n | \n positive | \n death | \n total | \n
\n \n date | \n | \n | \n | \n
\n \n \n \n 06/18 | \n 135639 | \n 6718.0 | \n 1284693 | \n
\n \n 06/19 | \n 136470 | \n 6718.0 | \n 1312003 | \n
\n \n 06/20 | \n 137104 | \n 6829.0 | \n 1337968 | \n
\n \n 06/21 | \n 137762 | \n 6851.0 | \n 1361784 | \n
\n \n 06/22 | \n 138224 | \n 6875.0 | \n 1380003 | \n
\n \n
\n
"}︡{"done":true}
︠ff4e28cc-c4e8-4a5a-922a-0348caa1972as︠
title = f"COVID-19 cumulative numbers\npositive tests and total tests in {state}"
df[-30:].plot(y=['positive','total'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡0ef6d005-3879-4a39-8f7b-3086e0385f43︡{"file":{"filename":"/tmp/tmp7A6jSx.png","show":true,"text":null,"uuid":"b9ed50f9-6e7e-474e-9479-9878fd45c93f"},"once":false}︡{"done":true}
︠d0c6a426-4c01-4272-8235-e666122761fas︠
df['positive/total'] = df.loc[:,'positive']/df.loc[:,'total']
︡f0347eb7-0e11-4998-96e2-8c226d649db1︡{"done":true}
︠3ec24571-ac2d-441e-81c7-997bdb7f184ds︠
title = f"COVID-19 positive tests / total tests in {state}"
df[-30:].plot(y=['positive/total'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡ce6c4ee2-0835-4b49-80e2-1896724733e8︡{"file":{"filename":"/tmp/tmpBQSNZ6.png","show":true,"text":null,"uuid":"3e07d7ff-6886-438b-9379-b139c6bab6b7"},"once":false}︡{"done":true}
︠aa106e98-c28a-4fbf-a0ac-11d9124c89f7s︠
# just the confirmed (positives)
title = f"COVID-19 cumulative confirmed cases in {state}"
df[-30:].plot(y=['positive'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡142100de-62f9-4a25-b938-b3c6cb26b317︡{"file":{"filename":"/tmp/tmpht44VL.png","show":true,"text":null,"uuid":"b211f62b-d318-43ea-83dc-3937d76c5d00"},"once":false}︡{"done":true}
︠517fdd25-0ba4-4a6c-b7b7-f5c4aa3e4d28s︠
df['new_cases_per_day'] = df['positive'].diff()
title = f"COVID-19 new cases reported each day in {state}"
df[-30:].plot(y=['new_cases_per_day'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡a9102625-5cec-4807-818e-ff72ca6720d0︡{"file":{"filename":"/tmp/tmpq4i36R.png","show":true,"text":null,"uuid":"ec221f9f-2632-45b3-9b6c-637cd4cf8ebf"},"once":false}︡{"done":true}
︠4cabce1e-d490-416a-b34f-81e09c544bcfs︠
title = f"COVID-19 7-day moving avg new cases in {state}"
df['7d_avg_new_cases'] = df['new_cases_per_day'].rolling(7).mean()
df[-30:].plot(y=['7d_avg_new_cases'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡27e61237-ac42-4db8-9f95-7bdfa63455b6︡{"file":{"filename":"/tmp/tmpOFXPzq.png","show":true,"text":null,"uuid":"acb9a6bd-1e1b-40ce-ad8f-99a1a0bc7d17"},"once":false}︡{"done":true}
︠45b148a2-fcfe-4c4b-8681-c7333923b698s︠
# deaths
title = f"COVID-19 deaths in {state}"
df[-30:].plot(y=['death'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡b885e32f-1bdd-417a-a1f9-eecd726e61cf︡{"file":{"filename":"/tmp/tmpzGoUb2.png","show":true,"text":null,"uuid":"38ba2dc6-43e3-4259-a875-4ab94217aaed"},"once":false}︡{"done":true}
︠e27673dc-587c-4a5a-92e7-c4848d9c4498s︠
df['deaths_each_day'] = df['death'].diff()
︡1e8ab734-03f4-40a4-80ae-c200b4ca4ce8︡{"done":true}
︠c2321275-b566-4683-982d-50a000585d7cs︠
title = f"COVID-19 deaths each day in {state}"
df[-30:].plot(y=['deaths_each_day'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡42bd991f-3952-4c46-bc58-19de3e935452︡{"file":{"filename":"/tmp/tmpQg3H7T.png","show":true,"text":null,"uuid":"b6b1f3bb-f40f-4efc-8584-47e5ca61a5e6"},"once":false}︡{"done":true}
︠c5c50705-32dd-415b-aaae-11a98b7a40b6s︠
title = f"COVID-19 7-day moving avg deaths in {state}"
df['7d_avg_deaths'] = df['deaths_each_day'].rolling(7).mean()
df[-30:].plot(y=['7d_avg_deaths'], kind="bar", figsize=[8, 5], rot=45, fontsize=7, title=title);
︡cf94895d-22ec-4c36-aea5-a97a7a80261e︡{"file":{"filename":"/tmp/tmpAWpf6N.png","show":true,"text":null,"uuid":"f4689462-e09d-47bb-a77e-71ffd8492440"},"once":false}︡{"done":true}
︠9ba0f59f-517e-4864-9ba7-6fb5f90d6baes︠
︡33b17570-efd0-42d7-b502-eac2d76c1779︡{"done":true}