Grupo de estudo Python - COVID-19
- A biblioteca MatPlotLib
- Documentação em https://matplotlib.org/
# Um exemplo básico
import matplotlib.pyplot as plt
import numpy as np
x = [1, 2, 3, 4, 5] # Abscissas
y = [2, 1, 5, 0, -1] # Ordenadas
plt.plot(x, y) # Plota os pares (x[0], y[0]), (x[1], y[2]), ... (x[n], y[n])
plt.show()
x = [1, 2, 3, 4, 5]
y = [2, 1, 5, 0, -1]
fig, ax = plt.subplots() # Cria objetos para manipular o gráfico (aconselhado)
ax.plot(x, y, 'o-') #o = bolinhas, - = linha
# Adiciona grade
ax.grid(True)
# Adiciona título
plt.suptitle('Meu segundo gráfico', fontsize=14)
# Altera cor de fundo
fig.patch.set_facecolor('yellow')
# Adiciona rótulo aos eixos
plt.xlabel("Valores de x", fontsize=14)
plt.ylabel("Valores de y", fontsize=14)
plt.show()
# Gráfico de funções
# Gera array com 50 pontos linearmente espaçados entre 0 e 2pi
x = np.linspace(0, 2*np.pi)
y = np.sin(x) # Função aplicada a array
z = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y, color='blue')
ax.plot(x, z, color='green')
# Adiciona legenda
ax.legend(['$\sin(x)$', '$\cos(x)$'], loc='upper right')
# Adiciona grade
ax.grid(True)
# Adiciona título
plt.suptitle('Gráfico de $\cos(x)$ e $\sin(x)$')
# Altera cor de fundo
fig.patch.set_facecolor('white')
# Adiciona rótulo aos eixos
plt.xlabel("x", fontsize=14)
plt.show()
# Gráfico de funções
# Gera array com 50 pontos linearmente espaçados entre 0 e 2pi
x = np.linspace(0, 2*np.pi)
y = np.sin(x) # Função aplicada a array
z = np.cos(x)
fig, (ax1, ax2) = plt.subplots(1, 2) #Lico = linha e coluna
ax1.plot(x, y)
ax2.plot(x, z)
# Adiciona legenda
ax1.legend(['$\sin(x)$'], loc='upper right')
ax2.legend(['$\cos(x)$'], loc='upper right')
# Adiciona grade
ax1.grid(True)
ax2.grid(True)
# Adiciona título à figura
fig.suptitle('Gráfico de $\sin(x)$ e $\cos(x)$')
ax1.set_title('Seno')
ax2.set_title('Cosseno')
# Altera cor de fundo
fig.patch.set_facecolor('white')
# Adiciona rótulo aos eixos
plt.xlabel("x", fontsize=14)
# Tamanho da figura
plt.gcf().set_size_inches(15, 5)
plt.show()
fig, ax = plt.subplots()
x = np.linspace(-2,2)
y = np.exp(-x**2/2)
# Plota
ax.plot(x, y)
# Coloca grade
ax.grid(True)
# Pinta região
ax.fill_between(x, y, where=(y>.8)) # Entenda o que é y>0.8
# Configura limite da gráfico
ax.set_ylim(bottom=0)
# Altera cor de fundo
fig.patch.set_facecolor('white')
plt.show()
fig, ax = plt.subplots(1,1)
y = [10, 20, 50, 100, 80, 70]
z = [40, 30, 40, 80, 10, 40 ]
nomes =['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun']
#ax.bar(nomes, y)
#ax.bar(nomes, z, bottom=y)
# Experimente alterar a orientação:
ax.barh(nomes, y)
ax.barh(nomes, z, left=y)
# Altera cor de fundo
fig.patch.set_facecolor('white')
# Legendas
ax.legend(['Python', 'C++'])
fig.suptitle('Python e C++')
# plt.plot
plt.show()
# Pie chart, where the slices will be ordered and plotted counter-clockwise:
nomes = ['Porto Alegre', 'Caxias do Sul', 'Bagé', 'Novo Hamburgo',
'Passo Fundo', 'Outros']
dados = [388, 42, 29, 26, 43]
dados.append(889 - sum(dados))
explode = (0, 0.0, 0, 0, 0, 0)
fig, ax = plt.subplots()
ax.pie(dados, explode=explode, labels=nomes, autopct='%1.2f%%',
shadow=False, startangle=90)
# Veja https://docs.python.org/3/library/stdtypes.html#old-string-formatting
ax.axis('equal')
plt.gcf().set_size_inches(6, 5)
fig.set_facecolor('white')
plt.show()
-
O modulo datetime provê ferramentas para manipulação de data e horários de forma automática.
-
Documentação: https://docs.python.org/3.8/library/datetime.html
import datetime
data_inicial = datetime.datetime(2020, 1, 1)
data_final = datetime.datetime(2020, 4, 12) # Não escrever 01
tempo_transcorrido = data_final - data_inicial
# A diferença entre data é um objeto próprio: timedelta
print(data_inicial)
print(data_final)
print(tempo_transcorrido.days)
2020-01-01 00:00:00
2020-04-12 00:00:00
102
data_inicial = datetime.datetime(2020, 1, 1)
tempo_transcorrido = datetime.timedelta(days=45)
datafinal = data_inicial + tempo_transcorrido
print(data_final)
2020-04-12 00:00:00
hoje = datetime.datetime.now() # Recupera a data do dia de hoje
print(hoje)
print(hoje.strftime('%d/%m/%Y'))
print(hoje.strftime('%d/%m/%y')) # https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior
2020-04-20 17:52:00.647367
dia = 20 - 04 - 2020
20/04/20
# Traçando gráficos com datas nos eixos
import datetime
import matplotlib.pyplot as plt
numero_de_casos = [37,66,89,116,146,184,195,210,235,251,273,294,\
329,341,366,421,483,507,551,585,596,608,640,662,\
700,715,726,739,754,801,832,855,870,888,889]
data_inicial = datetime.datetime(2020, 3, 15)
datas = [data_inicial + datetime.timedelta(days=i) for i in range(0, len(numero_de_casos))]
#Cria objetos para o traçado
fig, ax = plt.subplots(1, 1)
# Plota
ax.plot(datas, numero_de_casos, '*-')
# Ajusta ticks a 45 graus
plt.xticks(rotation=45)
# Adiciona rótulo aos eixos
plt.xlabel("Dia de notificação", fontsize=14)
plt.ylabel("Número de casos", fontsize=14)
fig.patch.set_facecolor('white')
plt.show()
# Exercício, adicione grade e título.
# A mesma coisa, mas agora salva o gráfico em arquivo.
import datetime
import matplotlib.pyplot as plt
from google.colab import files
numero_de_casos = [37,66,89,116,146,184,195,210,235,251,273,294,\
329,341,366,421,483,507,551,585,596,608,640,662,\
700,715,726,739,754,801,832,855,870,888,889]
data_inicial = datetime.datetime(2020, 3, 18)
datas = [data_inicial + datetime.timedelta(days=i) for i in range(0, len(numero_de_casos))]
#Cria objetos para o traçado
fig, ax = plt.subplots(1, 1)
# Plota
ax.plot(datas, numero_de_casos, '*-')
# Ajusta ticks a 45 graus
plt.xticks(rotation=45)
# Adiciona rótulo aos eixos
plt.xlabel("Dias transcorridos", fontsize=14)
plt.ylabel("Número de casos", fontsize=14)
fig.patch.set_facecolor('white')
# Salva figura em arquivo
plt.savefig('Evolucao_RS.png', dpi=300)
files.download('Evolucao_RS.png')
# Ajuste de curvas
import datetime
import matplotlib.pyplot as plt
import numpy as np
poly = np.polynomial.polynomial # https://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polyfit.html#numpy.polynomial.polynomial.polyfit
numero_de_casos = [37,66,89,116,146,184,195,210,235,251,273,294,\
329,341,366,421,483,507,551,585,596,608,640,662,\
700,715,726,739,754,801,832,855,870,888,889]
data_inicial = datetime.datetime(2020, 3, 15)
datas = [data_inicial + datetime.timedelta(days=i)
for i in range(0, len(numero_de_casos))]
# Faz ajuste - experimente alterar o grau do polinômio.
coeff = poly.polyfit(range(0, len(numero_de_casos)),
numero_de_casos, deg=1)
# Calcula valores do polinômio
valores_ajustados = [coeff[1]*x +coeff[0] for x in range(0, len(numero_de_casos))]
#Cria objetos para o traçado
fig, ax = plt.subplots(1, 1)
# Plota dados
ax.plot(datas, numero_de_casos, '*')
ax.plot(datas, valores_ajustados)
# Ajusta ticks a 45 graus
plt.xticks(rotation=45)
# Adiciona rótulo aos eixos
plt.xlabel("Dias transcorridos", fontsize=14)
plt.ylabel("Número de casos", fontsize=14)
fig.patch.set_facecolor('white')
plt.show()
print(coeff)
import urllib # https://docs.python.org/3.8/library/urllib.html
import csv # https://docs.python.org/3.8/library/csv.html
import io # https://docs.python.org/3.8/library/io.html
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import datetime
# https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv
url = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'
lista = list(csv.reader(io.StringIO(urllib.request.urlopen(url).read().decode('utf-8'))))
# Dados de entrada
pais = 'Brazil'
minimo_de_casos = 200
# O pais PODE estar listado dividido em regiões.
numero_de_casos = np.zeros(len(lista[0]) - 4)
for linha in lista:
if linha[1] == pais:
numero_de_casos += np.array(linha[4:], dtype='int')
datas = lista[0][4:]
n = np.min((numero_de_casos>=minimo_de_casos).nonzero())
numero_de_casos = numero_de_casos[n:]
datas = datas[n:]
# Converte datas de string para datetime
datas = [datetime.datetime.strptime(str_data, '%m/%d/%y') for str_data in datas]
variacao_diaria = numero_de_casos[1:] - numero_de_casos[:-1]
variacao_percen = 100*variacao_diaria / numero_de_casos[:-1]
# Traça gráfico
fig, (ax1, ax2, ax3) = plt.subplots(1, 3)
# primeiro grafico
ax1.plot(datas, numero_de_casos, '*-')
# Ajusta ticks a 45 graus
plt.sca(ax1)
plt.xticks(rotation=45)
ax1.xaxis.set_major_locator(ticker.AutoLocator())
# Adiciona rótulo aos eixos
plt.ylabel("Número de casos", fontsize=14)
# Adiciona título
ax1.set_title("Número de casos", fontsize=14)
ax1.grid(True)
ax1.set_yscale('log')
# Segundo gráfico
ax2.bar(datas[1:], variacao_diaria)
ax2.set_title("Novos casos", fontsize=14)
plt.sca(ax2)
plt.xticks(rotation=45)
ax2.xaxis.set_major_locator(ticker.AutoLocator())
# Terceiro gráfico
ax3.bar(datas[1:], variacao_percen)
ax3.set_title("Variação percentual", fontsize=14)
plt.sca(ax3)
plt.xticks(rotation=45)
ax3.xaxis.set_major_locator(ticker.AutoLocator())
ax3.yaxis.set_major_formatter(ticker.PercentFormatter())
fig.patch.set_facecolor('white')
plt.gcf().set_size_inches(20, 5)
plt.show()
for i in range(-1, -8, -1):
print(numero_de_casos[i])
255368.0
241080.0
233511.0
220291.0
203165.0
190137.0
178214.0
hoje = 162699
antes = 108620
print(hoje/antes, (hoje/antes)**(1/7))
print(hoje*(1.06)**30)
1.497873319830602 1.0594192728436516
934460.2703418143
import numpy as np
poly = np.polynomial.polynomial
coeff = poly.polyfit([1,2,3,4], [0,2,0,3], deg=1)
print(coeff)
[-0.5 0.7]
(1.08)**30
10.06265688907345