This page is under development

if [[ -d "data/corona.zip" ]]
then
rm -fr data/corona.zip
fi

wget -nv -O data/corona.zip https://github.com/CSSEGISandData/COVID-19/archive/master.zip
unzip -oj data/corona.zip COVID-19-master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv -d data/
unzip -oj data/corona.zip COVID-19-master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv -d data/ 
## 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()

testedMode = True
listStates = {france, italy, uk}

df, plot = loadData(testedMode, start, listStates)
plot.setPlot()
plot.showPlot()

testedMode = True
listStates = {germany, nsw, korea}

df, plot = loadData(testedMode, start, listStates)
plot.setPlot()
plot.showPlot()

testedMode = False
listStates = {germany, nsw, korea}

df, plot = loadData(testedMode, start, listStates)
plot.setPlot()
plot.showPlot()