Skip to content

Latest commit

 

History

History
468 lines (336 loc) · 10.8 KB

2. Segundo Notebook.md

File metadata and controls

468 lines (336 loc) · 10.8 KB

Sejam bem-vindos.

Grupo de estudo Python - COVID-19

Apresentação de dados

# 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()

Gráfico 02-01

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 02-02

# 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 02-03

# 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()

Gráfico 02-04

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()

Gráfico 02-05

Gráfico de Barras

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()

Gráfico 02-06

Gráficos de pizza

# 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()

Gráfico 02-07

Trabalhando com datas

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.

Gráfico 02-08

# 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')

Gráfico 02-09

# 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)

Gráfico 02-10

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])

Gráfico 02-11
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