Skip to content

Latest commit

 

History

History
1057 lines (800 loc) · 21 KB

1. Primeiro Notebook.md

File metadata and controls

1057 lines (800 loc) · 21 KB

Sejam bem-vindos.

Grupo de estudo Python - COVID-19

  • Vocês podem acessar esta página no link dado no chat.

Python

  • Python é uma linguagem de programação de alto nível, interpretada, orientada a objetos lançada por Guido van Rossum em 1991.

  • A linguagem prioriza legibilidade do código em detrimento de performance.

  • Atualmente é uma das linguagens de programação mais populares. Tem sido muito usada em computação científica, análise de dados, estatística e integência artificial.

  • O nome Python se deve ao grupo humorístico britânico Monty Python.

  • Você pode trabalhar no Python no modo console, script e notebook.

Documentação:

Espaço para trabalhar

  • Crie um notebook próprio para realizar as atividades. (File, new notebook)
  • Você também pode fazer uma cópia desde notebook. (File, Save a copy in Drive)
  • Se desejar, instale o Python no seu PC.

Indentação e numeração de páginas

No Python, indentação é sintática.

Configurem o editor para indentar com 4 espaços e mostrar número de linha. (Tools, Settings, Editor)

The Zen of Python, by Tim Peters

  • Beautiful is better than ugly.
  • Explicit is better than implicit.
  • Simple is better than complex.
  • Complex is better than complicated.
  • Flat is better than nested.
  • Sparse is better than dense.
  • Readability counts.
  • Special cases aren't special enough to break the rules.
  • Although practicality beats purity.
  • Errors should never pass silently.
  • Unless explicitly silenced.
  • In the face of ambiguity, refuse the temptation to guess.
  • There should be one-- and preferably only one --obvious way to do it.
  • Although that way may not be obvious at first unless you're Dutch.
  • Now is better than never.
  • Although never is often better than right now.
  • If the implementation is hard to explain, it's a bad idea.
  • If the implementation is easy to explain, it may be a good idea.
  • Namespaces are one honking great idea -- let's do more of those!
# Tipos e nomes de variáveis
# Não é necessário declarar o tipo de variável,
# o interpretador define pelo contexto.
# Simplemente use o operador de atribuição

x = 150                 # Inteiro
y = 2.3                 # Float
z = "Eu amo Python"     # String
X = 10

x = 150**30 + 87
print(x, y, z, X)       # Apresenta o valor das variáveis na tela.
						# Você pode listar quantas variáveis quiser.

191751059232884086668491363525390625000000000000000000000000000087 2.3 Eu amo Python 10

# Operações básicas

x = 10*20 + 30          
y = 2/3 - 2**3          # O operador ** implementa potência.

print(x, y)

230 -7.333333333333333

# Usando variáveis para definir novas variáveis

x = 10
y = 20
z = x + y + x*y

print(z)

230

Exercício

No seu notebook. experimente escrever:

x, y = 2, 3
print(x, y)

Também teste:

x = y = 6
print(x, y)
x, y = 2, 3		# Equivale a x = 2 e y = 3
print(x, y)
x = y = 6
print(x, y)		# Equivale a x = 5 e y = 5

2 3
6 6

# Você pode atualizar uma variável usando ela mesma

z = 100
z = z/10		# z = 10
print (z)

z /= 10			# Equivalente a z = z/10 -> z = 1
print(z)

z += 4			# Equivalente a z = z+4
print(z)

z *= 2			# z = z*2
print(z)

print(20%3)

10.0
1.0
5.0
10.0
2

Atenção aos programadores C/C++

Python não implementa operadores de incremento e decremento:

x++         # Syntax erro
++x         # Apenas o operador + duas vezes: não faz nada.
--x         # Apenas o operador - duas vezes: não faz nada.

Você deve escrever:

x += 1      # ou x = x + 1
x -= 1      # ou x = x - 1
# Strings

str1 = 'Eu amo'
str2 = ' Python'

str3 = str1+str2     # Concatena duas strings

print(str3)

Eu amo Python

Notação de strings

Você também usar aspas (") com mesmo valor:

str1 = "Eu amo"
# Você pode extrair pedaços de uma string usando colchetes

# Extrair uma fatia com 5 elementos, começando na posição 2 e terminando na posição 5.
str3 = "Internet"
str4 = str3[1:6]	# O primeiro elemento tem índice 0.
                    # O conjunto é aberto à direita, isto é, o elemento na posição 6 não é incluído.

print(str4)


# Para extrair um único elemento:
str5 = str3[0]  	#Primeiro elemento
str6 = str3[-1] 	#Último elemento

print(str5, str6)


# Extrair o final de uma string
print(str3[7:])

ntern
I t
t

# Comprimento de uma string

str1 = 'Computador'
    #   0123456789

print(len(str1))

10

O Python possui diversos módulos que trazem implementações prontas para diversas aplicações. Exemplos:

  • Numpy: Módulo para computação científica
  • Scipy: Outras funcionalidades para computação científica
  • MatPlotLib: Traçado de gráficos
  • Pandas: Análise de dados
  • Statsmodels: Módulo estatístico
import numpy as np 	# Use np.NOME_DA_FUNÇÃO

x = np.exp(2)  		# Exponencial natural
y = np.sin(10)		# Seno
z = np.log(x) 		# Logaritmo natural

print(x, y, z)

7.38905609893065 -0.5440211108893698 2.0

# Você pode compor funções

x = np.exp(np.log(10) + np.log(2)) #e^(ln(10) + ln(2)) = e^(ln(20))=20

print(x)

20.000000000000007

# A bibliota Numpy também provê algumas contantes

print(np.pi, np.e, np.euler_gamma)

3.141592653589793 2.718281828459045 0.5772156649015329

Exercício:

Implemente a expressão:

$y = \frac{1}{x\sqrt{1+x^2}}$

Calcule para $x=10$.

Dica: Atente às prioridades e np.sqrt().

x = 10
y = 1/(x*np.sqrt(1 + x**2))

print(y)
y = 1/(x*(1 + x**2)**(1/2))
print(y)

print(2^3, 2**3)

0.00995037190209989
0.00995037190209989
1 8

Dados estruturados

  • Listas
  • Conjuntos
  • Dicionários
  • Strings
  • Conjuntos
  • Etc
# Definindo uma lista

primos = [2, 3, 5, 7, 11, 13]

print(primos)

print(primos[0]) 	# Primeiro elemento

print(primos[3:]) 	# Últimos elementos desde a posição 3

[2, 3, 5, 7, 11, 13]
2
[7, 11, 13]

# Concatenar listas

lista1 = [1, 2, 3, 4]
lista2 = [5, 6, 7]
lista3 = lista1 + lista2 	# Atenção, não é soma elemento a elemento

print(lista3)

[1, 2, 3, 4, 5, 6, 7]

# Inserir elementos a uma lista

lista = [1, 0.5, 0.25]
lista.append(0.125) 		# Insere na última posição
lista.append(0.0625)

lista[0] = 2
print(lista)

[2, 0.5, 0.25, 0.125, 0.0625]

# Inserir elemento em dada posição

lista = [0, 2, 4, 8]
lista.insert(3, 6)  		# Posição e elemento

print(lista)

[0, 2, 4, 6, 8]

# Remover elemento em dada posição

print(lista.pop(3))    		# Remove elemento na posição 3
print(lista)

8
[0, 2, 4]

# Listas podem conter elementos de tipos distintos

lista = [1, 'Python', 2.3]
print(lista)

[1, 'Python', 2.3]

# Tamanho de uma lista

lista = [1, 2, 3, 4, 5]
print(len(lista))

5

# Listas podem conter listas

lista = [1, 2, [3, 4]]
print(lista)
print(lista[2])
print(lista[2][0])

[1, 2, [3, 4]]
[3, 4]
3

# Construindo listas a partir de outras listas
# Compreensão de listas

lista1 = [-1, -2, 1, 2, 3, 4]

lista2 = [2*i for i in lista1]
# A lista2 é formada pelo dobro de cada elemento da lista1.
# Lê-se 2*i para i em lista1 (notação usual de conjunto em matemática)

print(lista2)

[-2, -4, 2, 4, 6, 8]
[[-1, -2, 1, 2, 3, 4], 2, 3]
[-2, -4, 2, 4, 6, 8, 2, 3]

import numpy as np
# Exemplos de compreensão de listas

lista3 = [np.sin(numero) for numero in lista1]
print(lista3)

lista4 = [np.log(numero) for numero in lista1 if numero > 0]
# A lista4 é formada pelo logaritmo de cada elemento da lista1 maior que 0.
# Lê-se logaritmo de i para i em lista se i maior que 0.

print(lista4)

[-0.8414709848078965, -0.9092974268256817, 0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282]
[0.0, 0.6931471805599453, 1.0986122886681098, 1.3862943611198906]

Exercício 1

A partir da lista

numeros = [1, 2, 3, 4, 5, 6]

construa a lista com os cubos dos 6 primeiros inteiros positivos.

Exercício 2

Agora construa a lista com os cubos dos 6 primeiros inteiros positivos cujo seno é positivo.

numeros = [1, 2, 3, 4, 5, 6]
cubos = [x**3 for x in numeros[0:2]]
cubos2 = [x**3 for x in numeros if np.sin(x)>0]
print(cubos, cubos2)

[1, 8] [1, 8, 27]

Operadores lógicos e de comparação

# Operador de comparação para números
# Igualdade: ==
# Desigualdade: !=
# Comparação: >, <, >=, <=

#Exemplos

print(2 > 3)
print(2 < 3)
print(2 == 3)
print(2 != 3)

False
True
False
True

# Operadores lógicos
# Disjunção (ou): or
# Conjunção (e): and
# Negação: not

print(2 > 3 and 3 < 4) # F e V = F
print(2 > 3 or 3 < 4)  # V
print(not True)
print(not 2 == 3)
print(not (2 > 3 or 3 < 4))
print(not 2 > 3 or 3 < 4)        # not tem preferência sobre or e and.
print(not (2 > 3) or (3 < 4))    # Idêntico, porém mais visível
print(2 <= 3 or 3 < 4)           # Idêntico, porém muito mais visível

False
True
False
True
False
True
True
True

# E como ficam as string?

print('UFRGS' == 'UFRGS')
print('UFRGS' == 'UFR')
print('UFRGS' != 'UFR')
print('UF' in 'UFRGS')      	# Está contido?
print('UF' not in 'UFRGS') 		# Não está contido?

True
False
True
True
False

# Mais exemplos

x = 'Matemática Aplicada'
y = 'Matemática Pura'

print(x == y)
print(x[0:2] == 'Ma')
print(x[0:2] == 'ma')
print(x[0:10] == y[0:10])
print(x[0:12] == y[0:12])
print(x > y) 					# Ordem lexicográfica
print('A' < 'a')
print('1' < 'A')

False
True
False
True
False
False
True
True

Comandos de repetição

O Python possui duas estruturas de repetição:

  • for: para executar o código em um conjunto pré-determinado de valores.
  • while: para executar enquanto uma dada condição for verdadeira.

Vamos começar pelo comento for

# Comando for
lista = [1, 2, 4]

for x in lista:			# Termine com dois pontos(:)
    y = x**3
    print(x, y)			# Indente os comandos que serão repetidos

1 1
2 8
4 64

# Outro exemplo:

contador = 0        	# existe uma maneira mais pythônica de fazer isso
for x in lista:
    contador += 1   	# Diferentemente de linguagens como o C, Fortran, Java etc,
    y = x+3         	# não existem marcadores de início e fim de bloco.
    print(x, y)     	# O início e o fim da indentação determinam isso.

print("contador = ", contador)  # Retorne a indentação quando terminar o bloco a ser repetido.

1 4
2 5
4 7
contador = 3

# Calcula fatorial:
# Exemplo: 4! = 1x2x3x4 = 24, 5! = 1x2x3x4x5 = 120

fatorial = 1
n = 6

for i in range(1, n+1):   # Observe o objeto range, conta de 1 até n porque o intervalo é aberto à direita.
    fatorial *= i
    print("i = ", i, "- fatorial = ", fatorial)

i = 1 - fatorial = 1
i = 2 - fatorial = 2
i = 3 - fatorial = 6
i = 4 - fatorial = 24
i = 5 - fatorial = 120
i = 6 - fatorial = 720

print(*range(0, 10, 2))

0 2 4 6 8

# Exemplo com strings:

str1 = 'Alegria'
for c in str1:   # Itera nos caracteres da string
    print(c)

A
l
e
g
r
i
a

# Mais um exemplo:

# str1 = 'Teclado de computador'
str1 = input("Entre com uma string: ")

for i in range(1, len(str1) + 1):
    print(str1[0:i])

Entre com uma string: UFRGS
U
UF
UFR
UFRG
UFRGS

Exercício

  • A rotina acima funciona porque 'Teclado' tem 7 letras. Adapte-a para funcionar com strings de qualquer tamanho.

  • Escreva um algoritmo para calcular:

$S = \displaystyle\sum_{j=1}^{100} \frac{1}{j^2} = \frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2}+\cdots + \frac{1}{100^2}$

lista = []

for i in range(0, 10):
    lista.append(i**2)

print(lista)

# lista = [i**2 for i in range(0, 10)]

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# Exemplo de enumeração
# Por vezes, você precisa iterar sobre uma lista com um contador

lista_de_estacoes = ['Novo Hamburgo', 'Fenac', 'Industrial', 'Santo Afonso',
                    'Rio dos Sinos', 'São Leopoldo', 'Unisinos', 'Sapucaia',
                    'Louis Pasteur', 'Esteio', 'Petrobras', 'São Luís',
                     'Mathias Velho','Canoas', 'Fátima', 'Niteroi', 'Anchieta',
                     'Aeroporto', 'Farrapos', 'São Pedro', 'Rodoviária',
                     'Mercado']

for i, estacao in enumerate(lista_de_estacoes):
    print(i, estacao)

# Como você inverteria a ordem das estações?
# Como você colocaria em ordem lexicográfica?

0 Novo Hamburgo
1 Fenac
2 Industrial
3 Santo Afonso
4 Rio dos Sinos
5 São Leopoldo
6 Unisinos
7 Sapucaia
8 Louis Pasteur
9 Esteio
10 Petrobras
11 São Luís
12 Mathias Velho
13 Canoas
14 Fátima
15 Niteroi
16 Anchieta
17 Aeroporto
18 Farrapos
19 São Pedro
20 Rodoviária
21 Mercado

Comandos de seleção

No python existem os comandos if, else e elif

# Exemplo com if

x = 10     # No seu notebook, teste alterar o valor de x e rode a célula novamente

if x > 4:  # Usar dois pontos (:)
    print("x é maior que 4.")        # Indentar

x é maior que 4.

# Outro exemplo

x = 10
y = 2

if x > 4 and y < 4:
    print("x é maior que 4 e y é menor que 4.")

x é maior que 4 e y é menor que 4.

# if e else

x = 2

if x > 4:
    print("x é maior que 4.")
else:       # if e else ficam no mesmo nível de indentação.
    print("x não é maior que 4.") # Executa se condição é falsa

x não é maior que 4.

# if, elif e else

x = 2

if x > 4:
    print("x é maior que 4.")
elif x == 4:                        
    print("x é igual a 4.") # Se a primeira condição é falsa e a outra é verdadeira
else:
    print("x menor que 4.") # Se ambas condições são falsas

# Dica: você pode usar quantos elif's forem necessários.

x menor que 4.

# Operador ternário

x = 3
y = 'x é Positivo' if x > 0 else 'x não é positivo'
print(y)

x = -2
y = 'x é Positivo' if x > 0 else 'x não é positivo'
print(y)

x é Positivo
x não é positivo

Exercício

  • Como você interpreta o código dado por:
z = x if x > y else y
  • Quanto vale z quando x = 2 e y = 7?

Aninhamento de for e if

Pode-se aninhar (colocar um dentro do outro) comandos for e if.

for x in A:
    if condição:
        alguma coisa # Aumentar um nível de indentaçao

Ou ainda aninhar um for dentro de um if:

if condição:
    for x in A:
        alguma coisa
import numpy as np

for x in [2, 3, 5, 7, 11, 13]:
    if np.cos(x) > 0:
        print("O cosseno de", x, "é positivo.")

O cosseno de 5 é positivo.
O cosseno de 7 é positivo.
O cosseno de 11 é positivo.
O cosseno de 13 é positivo.

# Mostra as vogais de uma string

str1 = 'comunidade'

for x in str1:         # Itera nos caracteres da string
    if x in 'abcde':
        print(x)

c
d
a
d
e

# Parando o loop

lista_de_estacoes = ['Novo Hamburgo', 'Fenac', 'Industrial', 'Santo Afonso',
                    'Rio dos Sinos', 'São Leopoldo', 'Unisinos', 'Sapucaia',
                    'Louis Pasteur', 'Esteio', 'Petrobras', 'São Luís',
                    'Mathias Velho','Canoas', 'Fátima', 'Niteroi', 'Anchieta',
                    'Aeroporto', 'Farrapos', 'São Pedro', 'Rodoviária',
                    'Mercado']

for i, estacao in enumerate(lista_de_estacoes):
    print(i, estacao)
    if i==5:
        break

0 Novo Hamburgo
1 Fenac
2 Industrial
3 Santo Afonso
4 Rio dos Sinos
5 São Leopoldo

Exercício

  • Qual alteração você faria para mostrar as consoantes?
  • O código descrito não funciona com letras maiúsculas. Como você corrigiria?
  • O que você acha que acontece quando se roda o código a seguir?
str1 = 'comunidade'
for x in str1:
    if x in 'abcde':
        print(x)
    print("Passei por aqui!")
  • Rode no seu espaço de trabalho e verifique.
# for dentro do if

x = int(input("Entre com um número: "))

if x < 10:
    for j in range(x):
        print(j)
        print("Aqui!")

Entre com um número: 5
0
Aqui!
1
Aqui!
2
Aqui!
3
Aqui!
4
Aqui!

# for dentro de for
lista = []

for x in [1, 2, 3]:
    for y in [10, 20]:
        lista.append(x+y)
        print(x, y)

print(lista)

1 10
1 20
2 10
2 20
3 10
3 20
[11, 21, 12, 22, 13, 23]

Algumas técnicas envolvendo loops

# Exemplo de enumeração
# Por vezes, você precisa iterar sobre uma lista com um contador

lista_de_estacoes = ['Novo Hamburgo', 'Fenac', 'Industrial', 'Santo Afonso',
                    'Rio dos Sinos', 'São Leopoldo', 'Unisinos', 'Sapucaia',
                    'Louis Pasteur', 'Esteio', 'Petrobras', 'São Luís',
                     'Mathias Velho','Canoas', 'Fátima', 'Niteroi', 'Anchieta',
                     'Aeroporto', 'Farrapos', 'São Pedro', 'Rodoviária',
                     'Mercado']

for i, estacao in enumerate(lista_de_estacoes):
    print(i, estacao)
    if i==5:    
        break

0 Novo Hamburgo
1 Fenac
2 Industrial
3 Santo Afonso
4 Rio dos Sinos
5 São Leopoldo

for i, estacao in enumerate(sorted(lista_de_estacoes)):
    print(i, estacao)
    if i>5:
        break

# É possível aplicar métodos à lista: lista_de_estacoes.sort() ou .reverse()
# Qual a diferença entre aplicar um método e uma função?

0 Aeroporto
1 Anchieta
2 Canoas
3 Esteio
4 Farrapos
5 Fenac
6 Fátima

#lista_de_estacoes.sort()
print(sorted(lista_de_estacoes))
print((lista_de_estacoes))
print(lista_de_estacoes.__sizeof__())
# del lista_de_estacoes

Arrays do Numpy

import numpy as np

x = np.array([1, 2, 3])

print(x)

[1 2 3]

# Operações envolvendo arrays se comportam diferente de listas

x = np.array([1, 2, 3])
y = np.array([2, 4, 3])

u = x+y
v = x**y
w = np.concatenate((x, y))  # Atenção aos duplos parênteses. (x, y) significa um par ordenado.
print(u, v, w)

[3 6 6] [ 1 16 27] [1 2 3 2 4 3]

# Métodos usuais

x = np.array([2, 5, 7, 11, 13, 17, 19, 23, 29])

media = x.mean()
maximo = x.max()
minimo = x.min()
desvio_padrao = x.std()

print(minimo, media, maximo, desvio_padrao)

2 14.0 29 8.32666399786453

# Você também pode user funções

x = np.array([2, 5, 7, 11,    13,    17, 19, 23, 29])

media = np.mean(x)
maximo = np.max(x)
minimo = np.min(x)
mediana = np.median(x)
desvio_padrao = np.std(x)
print(minimo, media, mediana, maximo, desvio_padrao)

2 14.0 13.0 29 8.32666399786453

# Você pode iterar em um array

lista = [2, 5, 7, 11, 13, 17, 19, 23, 29]
x = np.array(lista)

s = 0

for i in x:
    s += i

print(s, np.sum(x))

126 126

# Você pode aplicar funções numpy a arrays
x = np.array([2, 5, 7, 11, 13, 17, 19, 23, 29])

y = x * np.pi / 10

z = np.cos(y)    # Se você aplicasse a uma lista, teria o mesmo resultado
                 # e a saída seria um array

print(z)

[ 8.09016994e-01 6.12323400e-17 -5.87785252e-01 -9.51056516e-01 -5.87785252e-01 5.87785252e-01 9.51056516e-01 5.87785252e-01 -9.51056516e-01]

x = np.ones(10)

for i in range(10):
    x[i] = np.cos(i*2)
print(x)

[ 1. -0.41614684 -0.65364362 0.96017029 -0.14550003 -0.83907153 0.84385396 0.13673722 -0.95765948 0.66031671]

Um exemplo trabalhando com dados externos

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

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

# Observar a estrutura da lista e o tipo de variáveis das entradas.
pais = 'Brazil'

for i, linha in enumerate(lista):
#    print(linha)
    if linha[1] == pais:
        dados = np.array(linha[4:], dtype='int')
        break

datas = lista[0][4:]
#print(dados)
#print(dados.nonzero())
# print(np.min(dados.nonzero()))
n = np.min(dados.nonzero())
for i in range(n, len(dados)):
    print(datas[i], (dados[i] - dados[i-1])/dados[i-1])
    if i-n>200:
        break
for x in [1,2]:
    print (x)

print(x)

1
2
2