︠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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
positivedeathtotal
date
03/044NaN155
03/055NaN197
\n
"}︡{"done":true} ︠deb56e76-734f-4e1c-b808-e1975170d373s︠ df.tail() ︡a35f1e1e-f25f-4561-a523-e1bbf73991f8︡{"html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
positivedeathtotal
date
06/181356396718.01284693
06/191364706718.01312003
06/201371046829.01337968
06/211377626851.01361784
06/221382246875.01380003
\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}