This page is under development
## 2020-06-26 23:05:11 URL:https://codeload.github.com/CSSEGISandData/COVID-19/zip/master [74082594] -> "data/corona.zip" [1]
## Archive: data/corona.zip
## 999a788f32f4bec173baef68ca2c39a606cf912c
## inflating: data/time_series_covid19_confirmed_global.csv
## Archive: data/corona.zip
## 999a788f32f4bec173baef68ca2c39a606cf912c
## inflating: data/time_series_covid19_deaths_global.csv
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from datetime import datetime
import matplotlib.dates as dates
from matplotlib.dates import DateFormatter
from matplotlib.ticker import MultipleLocator
class Plot:
def __init__(self, title, start, x_majorLocator, x_minorLocator, y_majorLocator, y_minorLocator, dates=None, listStates=set()):
self.fig1, self.ax1 = plt.subplots()
self.title = title
self.start = start
self.x_majorLocator = x_majorLocator
self.x_minorLocator = x_minorLocator
self.y_majorLocator = y_majorLocator
self.y_minorLocator = y_minorLocator
self.listStates = listStates
self.dates = dates
def addState(self, State):
self.listStates.add(State)
def setPlot(self):
for state in self.listStates:
start = self.start-state.delayedDays
end = -state.delayedDays
y = state.y.values
if (state.delayedDays==0):
y = y[0, start:]/state.population
label = state.label
else:
y = y[0, start:end]/state.population
label = "{}: shifted in time by {} days".format(state.label, state.delayedDays)
self.ax1.plot(self.dates, y, label= label)
def showPlot(self):
xFmt = DateFormatter("%d %b")
self.ax1.xaxis.set_major_formatter(xFmt)
self.ax1.xaxis.set_major_locator(self.x_majorLocator)
self.ax1.xaxis.set_minor_locator(self.x_minorLocator)
self.ax1.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}'))
self.ax1.yaxis.set_major_locator(self.y_majorLocator)
self.ax1.yaxis.set_minor_locator(self.y_minorLocator)
self.ax1.legend()
self.ax1.set_title(self.title)
## Rotate date labels automatically
self.fig1.autofmt_xdate()
self.ax1.grid(True)
plt.show()
class State:
def __init__(self, label, population, delayedDays, isCountry, y=None):
self.__population = population
self.__delayedDays = delayedDays
self.__label = label
self.__isCountry = isCountry
self.__y = y
@property
def label(self):
return self.__label
@label.setter
def label(self, value):
self.__label = value
@property
def population(self):
return self.__population
@population.setter
def population(self, value):
self.__population = value
@property
def isCountry(self):
return self.__isCountry
@isCountry.setter
def isCountry(self, value):
self.__isCountry = value
@property
def delayedDays(self):
return self.__delayedDays
@delayedDays.setter
def delayedDays(self, value):
self.__delayedDays = value
@property
def y(self):
return self.__y
@y.setter
def y(self, value):
self.__y = value
def loadData(testedMode, start, listStates):
if testedMode:
df = pd.read_csv('data/time_series_covid19_confirmed_global.csv', keep_default_na=False)
dates_objects = convertDates(df, start)
setYs(df,listStates)
plot = Plot("Nb of persons tested positive/Million", start, MultipleLocator(20), MultipleLocator(10), MultipleLocator(500), MultipleLocator(100), dates_objects, listStates)
else:
df = pd.read_csv('data/time_series_covid19_deaths_global.csv', keep_default_na=False)
dates_objects = convertDates(df, start)
setYs(df, listStates)
plot = Plot("Nb of deaths/Million", start, MultipleLocator(20), MultipleLocator(10), MultipleLocator(500), MultipleLocator(100), dates_objects, listStates)
return df, plot
def convertDates(df, start):
dates_serie = df.columns[start:]
date_objects = [datetime.strptime(date, '%m/%d/%y') for date in dates_serie]
return date_objects
def setYs(df, listStates):
for state in listStates:
if state.isCountry:
label = state.label
y = df[(df["Province/State"] == "") & (df["Country/Region"] == state.label)]
state.y = y
else:
y = df[df["Province/State"] == state.label]
state.y = y
start = 40
france = State('France', 66.99, 0, True)
italy = State('Italy', 60.48, 0, True)
germany = State('Germany', 82.79, 0, True)
nsw = State("New South Wales", 7.544, 0, False)
qsl = State("Queensland", 5.071, 0, False)
korea = State("Korea, South", 51.47, 0, True)
uk = State("United Kingdom", 66.44, 0, True)
testedMode = False
listStates = {france, italy, uk}
df, plot = loadData(testedMode, start, listStates)
plot.setPlot()
plot.showPlot()



