100% acharam este documento útil (1 voto)
3 visualizações186 páginas

Programacao Python Machine Learning

O documento apresenta o livro 'Programação em Python para Machine Learning', que visa ensinar os fundamentos da linguagem Python e suas aplicações em aprendizado de máquina. Abrange tópicos como manipulação de dados com NumPy e Pandas, além de introduzir conceitos de machine learning utilizando a biblioteca Scikit-Learn. Ao final, os leitores estarão capacitados para aplicar suas habilidades em programação e análise de dados no mercado de trabalho.

Enviado por

emmybuglia
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
100% acharam este documento útil (1 voto)
3 visualizações186 páginas

Programacao Python Machine Learning

O documento apresenta o livro 'Programação em Python para Machine Learning', que visa ensinar os fundamentos da linguagem Python e suas aplicações em aprendizado de máquina. Abrange tópicos como manipulação de dados com NumPy e Pandas, além de introduzir conceitos de machine learning utilizando a biblioteca Scikit-Learn. Ao final, os leitores estarão capacitados para aplicar suas habilidades em programação e análise de dados no mercado de trabalho.

Enviado por

emmybuglia
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

PROGRAMAÇÃO EM PYTHON

PARA MACHINE LEARNING


1ª edição
Programação em
Python para Machine
Learning
Autoria: Me. Marcos Candido

1ª Edição
Maringá - 2024
UNIVERSIDADE CESUMAR
Avenida Guedner, 1610
Maringá, PR – CEP: 87050-390
Telefone: (44) 3027 6360

Jornada Acadêmica de Educação Continuada

Equipe Multidisciplinar da Pós-graduação EAD:


Victor Vinicius Biazon
Rodislaine Adriana Lourenco Pimenta
Liana Gomes Netto
José Tiago de Moraes
Paulo Alexsandro Naruishi
Manoel Arthur Roque De Oliveira
Fernanda Sutkus de Oliveira Mello
Alana Beatriz Lemos Ribeiro Longhi
Daniele Cristine Correia
Matheus Tahnan França Hammes

Copyright © UNICESUMAR

C XXX Universidade Cesumar - UniCesumar


Programação em Python para Machine Learning / Marcos Candido - Florianó-
polis, Sc: Arqué, 2024.

ISBN xxxxxxxxx
Educação continuada
CDD - XXXXX

Núcleo de Educação à Distância


Bibliotecária: Leila Regina do Nascimento - CRB-9/1722.
Ficha catalográfica elaborada de acordo com os dados fornecidos pelo(a) autor(a).
SUMÁRIO

Capítulo 1.............................6
Como ser criativo nas mídias sociais

Capítulo 2............................72
MANIPULAÇÃO DE DADOS COM NUMPY E PANDAS

Capítulo 3............................132
INTRODUÇÃO AO MACHINE LEARNING COM SCIKIT-LEARN
APRESENTAÇÃO DA
DISCIPLINA

A disciplina Programação em Python para Machine Learning visa pro-


porcionar uma compreensão sólida dos conceitos e ferramentas essen-
ciais da linguagem Python, focando em sua aplicação no aprendizado de
máquina.

Primeiramente, veremos os Fundamentos da Linguagem Python,


onde você aprenderá sobre a história do Python, configuração de ambientes
de desenvolvimento, sintaxe básica, estruturas de controle, criação de fun-
ções e manipulação de listas, tuplas e dicionários. Este conteúdo também
também aborda operações de leitura e escrita de arquivos e o tratamento
de exceções.

Em seguida, veremos Manipulação de Dados com NumPy e Pandas,


que introduz o NumPy, focando em arrays, operações matemáticas e ma-
nipulação de arrays multidimensionais. Em seguida, você será apresentado
ao Pandas, explorando Series e DataFrames, operações básicas e limpeza
de dados, além de técnicas avançadas como junção de DataFrames e visua-
lização de dados.

Finalmente, veremos uma Introdução ao Machine Learning com Sci-


kit-Learn que cobre os fundamentos do aprendizado de máquina, incluindo
tipos de aprendizado, fluxo de trabalho de projetos, pré-processamento de
dados e modelos supervisionados, como regressão linear e classificação. O
conteúdo conclui com a avaliação de modelos, validação cruzada e uso de
pipelines para automação.

Ao final do curso, você estará apto a aplicar conhecimentos de pro-


gramação em Python, manipulação de dados e aprendizado de máquina,
habilidades altamente demandadas no mercado.

5
CAPÍTULO 1
COMO SER CRIATIVO NAS MÍDIAS
SOCIAIS

MINHAS METAS
• Compreender a sintaxe básica e as convenções da linguagem Python.

• Implementar programas simples usando variáveis, operadores e


estruturas de controle.

• Manipular listas, tuplas e dicionários em Python.

• Utilizar funções embutidas e criar funções personalizadas.

• Gerenciar arquivos (leitura e escrita) em Python.

• Executar loops e condicionais em um programa.

• Manipular exceções e erros de forma eficaz.

6
INICIE SUA JORNADA

Imagine que você é responsável por desenvolver uma aplicação para or-
ganizar e analisar grandes volumes de dados em uma pequena empresa de
tecnologia. Você enfrenta desafios como a crescente quantidade de dados, a
necessidade de garantir eficiência no processamento e a importância de ge-
rar insights estratégicos. Esses problemas são comuns na área de tecnologia
e ciência de dados, e dominar as ferramentas certas pode ser crucial para o
sucesso do projeto. A linguagem Python, com suas bibliotecas como NumPy e
Pandas, se destaca como uma solução prática para manipulação e análise de
dados, permitindo o desenvolvimento de soluções robustas de forma simples.

Ao longo da disciplina, você aprenderá a filtrar e limpar dados, criar


relatórios e aplicar algoritmos de aprendizado de máquina para prever
comportamentos. Cada conceito que você dominar será fundamental na
sua formação profissional. Ao refletir sobre a automação e o tratamento
eficiente de dados, questione-se sobre como aplicar essas ferramentas no
seu contexto atual ou futuro. Essa jornada não é apenas sobre aprender Py-
thon, mas também sobre adquirir uma mentalidade analítica que permitirá
resolver problemas complexos com clareza e eficiência.

VAMOS RECORDAR?
O que é o Python? Clique aqui e confira!

PLAY NO CONHECIMENTO
Clique aqui e confira um podcast sobre as diferenças
entre python e outras linguagens de programação.

7
1
DESENVOLVA SEU POTENCIAL
1. INTRODUÇÃO À LINGUAGEM
PYTHON

EM FOCO
Clique aqui e assista aqui a um vídeo sobre a
temática.

Após a introdução à linguagem Python, é hora de aprofundar o co-


nhecimento e aplicar conceitos na prática, explorando como estruturas de
controle, funções e manipulação de dados podem facilitar a resolução de
problemas complexos.

As estruturas de controle, como condicionais e loops, são essenciais


para criar fluxos lógicos e permitir que o código tome decisões automatica-
mente, proporcionando dinamismo no processamento de dados. A criação
de funções é fundamental, pois essas estruturas reutilizáveis organizam o
código e aumentam sua clareza. Funções embutidas e expressões lambda
oferecem flexibilidade adicional.

Dominar a manipulação de listas, tuplas e dicionários é crucial para ar-


mazenar e organizar informações, enquanto a habilidade de ler e escrever
arquivos é vital para lidar com grandes volumes de dados. O tratamento de
exceções garante a resiliência do programa, permitindo que ele lide com
erros sem falhar completamente.

Desenvolver essas habilidades cria uma base sólida para solucionar proble-
mas de programação. A reflexão sobre a aplicação de cada conceito no contexto
profissional é fundamental para o crescimento e a experimentação prática.

A linguagem Python é uma das mais populares no mundo da progra-


mação, especialmente devido à sua simplicidade e versatilidade. Criada por

8
Capítulo 1

Guido van Rossum no final dos anos 1980 e lançada oficialmente em 1991,
Python foi projetada para ser uma linguagem de fácil leitura e escrita, tor-
nando-a acessível tanto para iniciantes quanto para programadores expe-
rientes. Sua filosofia central, conhecida como The Zen of Python, enfatiza a
clareza, a simplicidade e o uso de convenções claras para escrever código
limpo e eficiente.

PLAY NO CONHECIMENTO
Clique aqui e confira o vídeo sobre a Filosofia do
Python.

Desde o seu lançamento, Python evoluiu consideravelmente, com


versões atualizadas que incorporam novos recursos e funcionalidades. A
linguagem oferece uma ampla gama de bibliotecas e frameworks que per-
mitem trabalhar com diversos tipos de aplicações, desde desenvolvimento
web e automação até inteligência artificial e ciência de dados. Com um am-
biente robusto e uma comunidade ativa, Python continua a ser uma das
escolhas mais populares entre programadores em todo o mundo.

Nesta seção, vamos explorar as origens do Python, os diferentes am-


bientes de desenvolvimento que podem ser utilizados para escrever código
e os primeiros passos com sua sintaxe básica.

1.1 HISTÓRIA E EVOLUÇÃO DO PYTHON


Python tem uma história que remonta ao final dos anos 1980, quando
Guido van Rossum começou a desenvolvê-la como uma linguagem simples
e poderosa, inspirada pela linguagem ABC. Lançada em 1991, Python já in-
cluía recursos fundamentais como funções, módulos e exceções, além da
inovação da indentação obrigatória para aumentar a legibilidade do código.

Durante os anos 1990, a linguagem ganhou popularidade, especial-


mente entre pesquisadores. A versão 2.0 (2000) trouxe avanços como list
comprehensions e coleta de lixo automática. No entanto, com o tempo,
surgiram limitações, levando ao lançamento do Python 3 em 2008, que fez
grandes mudanças na linguagem e não era retrocompatível.

Embora a transição para o Python 3 tenha sido lenta, ele se tornou


dominante após 2020, quando o suporte ao Python 2 foi descontinuado.
Python hoje é amplamente utilizado em desenvolvimento web, automação,

9
Capítulo 1

ciência de dados e inteligência artificial, com uma forte comunidade global e


um sistema aberto de desenvolvimento, mantendo-se relevante e inovador.

A simplicidade e a versatilidade da linguagem, junto com suas bibliote-


cas e frameworks como NumPy, Django e TensorFlow, consolidaram Python
como uma escolha popular entre desenvolvedores e cientistas de dados.

1.2 AMBIENTES DE DESENVOLVIMENTO PARA


PYTHON
A escolha do ambiente de desenvolvimento é um aspecto fundamental
para qualquer programador que deseja trabalhar com Python de maneira
eficiente e organizada. Os ambientes de desenvolvimento fornecem as fer-
ramentas necessárias para escrever, testar e depurar código de forma inte-
grada, ajudando a otimizar o fluxo de trabalho e melhorar a produtividade.
Existem várias opções de ambientes disponíveis para Python, que vão desde
editores de texto simples até complexos Integrated Development Environments
(IDEs) — em tradução livre, Ambientes de Desenvolvimento Integrados.

Os IDEs são a escolha preferida para desenvolvedores que necessitam


de ferramentas avançadas para gerenciar projetos complexos, oferecendo
recursos como depuração, terminal integrado, autocompletar e integração
com controle de versão, como Git. Entre as principais IDEs para Python es-
tão o PyCharm, desenvolvido pela JetBrains, que possui versões gratuitas e
pagas, suporte a frameworks como Django e recursos como autocompletar
inteligente e análise estática de código; o Visual Studio Code (VS Code), que é
um editor de texto que se transforma em IDE com extensões e é altamente
personalizável, ideal para colaboração e automação; o Spyder, voltado para
ciência de dados e integrado à distribuição Anaconda, que oferece uma in-
terface simples e recursos de análise de dados; e o Jupyter Notebook, que,
embora não seja uma IDE completa, é fundamental para cientistas de da-
dos, permitindo a criação de notebooks interativos que combinam código,
visualizações e texto, ideal para protótipos e relatórios.

1.2.1 Ambientes virtuais e gerenciamento de pacotes

Além da escolha de editores ou IDEs, a criação de ambientes virtuais


é fundamental no desenvolvimento em Python. Esses ambientes isolam as
dependências de cada projeto, evitando conflitos entre bibliotecas, espe-
cialmente em projetos de grande escala que requerem diferentes versões.

10
Capítulo 1

As ferramentas mais comuns para criar ambientes virtuais são o vir-


tualenv e o venv, com este último disponível nativamente no Python 3. O
venv permite criar um ambiente local para cada projeto, garantindo que as
dependências sejam específicas e corretas.

Para desenvolvedores em ciência de dados, o Conda é amplamente


utilizado, pois além de gerenciar ambientes virtuais, facilita a instalação de
pacotes com dependências complexas.

A escolha do ambiente de desenvolvimento varia conforme o projeto e


a experiência do desenvolvedor. Iniciantes podem preferir editores simples
ou IDEs como Thonny, enquanto desenvolvedores mais experientes podem
optar por ferramentas como PyCharm ou Visual Studio Code. Ferramen-
tas on-line como Google Colab e Kaggle são ideais para ciência de dados e
aprendizado de máquina, enquanto ambientes virtuais são essenciais para
manter a organização e a consistência das dependências.

1.3 PRIMEIROS PASSOS COM A SINTAXE DA


LINGUAGEM
Python é conhecida por sua simplicidade e legibilidade, o que o torna
uma linguagem acessível tanto para iniciantes quanto para programadores
experientes. Ao contrário de outras linguagens, Python possui uma sintaxe
limpa e intuitiva, que prioriza a clareza e a facilidade de leitura. Antes de mer-
gulharmos em estruturas de controle e funções, é importante compreender
os fundamentos básicos da sintaxe de Python. Isso inclui como Python trata
variáveis, operadores, tipos de dados e convenções de codificação.

1.3.1 Convenções de formatação

Um dos aspectos mais distintivos da sintaxe do Python é o uso da in-


dentação para definir blocos de código. Ao contrário de linguagens como
C ou Java, nas quais chaves {} são usadas para delimitar blocos de código,
Python utiliza o espaço em branco (indentação) para essa função. Essa ca-
racterística força uma estrutura clara no código, tornando-o mais legível e
fácil de manter.

11
Capítulo 1

APROFUNDANDO
Indentação: por padrão, Python exige que cada bloco de código
seja indentado pelo menos uma vez. A convenção é usar 4 espa-
ços por nível de indentação, embora o uso de tabulações também
seja aceito (mas deve-se evitar misturar tabulações e espaços no
mesmo projeto).

Figura 1. Exemplo de indentação

Fonte: elaboração própria (2024).


#PraTodosVerem: A imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é: if True: print(“Isso está dentro do bloco”).

Se a indentação não for usada corretamente, Python levantará um erro


de sintaxe.

1.3.2 Comentários

Comentários são essenciais para a documentação do código. Em Py-


thon, os comentários são indicados pelo caractere #. Todo o texto à direi-
ta do # em uma linha é considerado um comentário e será ignorado pelo
interpretador.

12
Capítulo 1

Comentários de uma linha:

Figura 2. – Exemplo de comentários de uma linha

Fonte: elaboração própria (2024).


#PraTodosVerem: A imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
Este é um comentário simples de uma linha print(“Comentários são ignorados pelo interpretador”)

Comentários de múltiplas linhas: Não há um marcador específico


para comentários de múltiplas linhas, mas a convenção é usar várias linhas
começando com #. Outra opção é usar strings multilinhas não atribuídas a
uma variável (docstrings):

Figura 3. Exemplo de comentários em múltiplas linhas

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
Este é um comentário de múltiplas linhas
Pode ser usado para explicar blocos de código complexos

13
Capítulo 1

1.3.3 Variáveis e atribuições

Atribuição de variáveis: As variáveis em Python são criadas no mo-


mento da atribuição, e não é necessário declarar seu tipo explicitamente. A
atribuição é feita com o operador =.

Figura 4. Exemplo de atribuição de variáveis

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
x = 10 # Variável inteira
y = 3.14 # Variável float
nome = “Ana” # Variável string

Atribuição múltipla: Python permite atribuir múltiplas variáveis de


uma vez.

Figura 5. Exemplo de atribuição múltipla

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

14
Capítulo 1

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
a, b, c = 1, 2, 3

Troca de valores: Uma característica interessante é a troca de valores


entre variáveis, que pode ser feita de maneira direta e intuitiva.

Figura 6. Exemplo de troca de valores

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
a, b = b, a

1.3.4 Tipos de dados


Python oferece uma variedade de tipos de dados incorporados que são
usados com frequência. Aqui estão alguns dos principais tipos de dados:

Inteiros (int): Representam números inteiros.

Figura 7. Exemplo de inteiros

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

15
Capítulo 1

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
x = 42

Pontos flutuantes (float): Usados para representar números com ca-


sas decimais.

Figura [Link] de pontos flutuantes

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
pi = 3.14159

Strings (str): Sequências de caracteres usadas para representar texto.


Strings podem ser delimitadas por aspas simples (‘) ou aspas duplas (“).

Figura 9. Exemplo de strings

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
saudacao = “Olá, mundo!”

16
Capítulo 1

Booleanos (bool): Representam valores de verdade, True ou False.

Figura 10. Exemplo de booleanos

Fonte: elaboração própria (2024).


#ParaTodosVEREM: a imagem mostra um trecho de código em Python em um fundo escuro.
No canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmen-
te representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
verdadeiro = True
falso = False

None: Representa a ausência de valor, equivalente ao null em outras


linguagens.

Figura 11. Exemplo de none

Fonte: elaboração própria (2024).


#PARATODOSVEREM#: a imagem mostra um trecho de código em Python em um fundo escuro.
No canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmen-
te representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
nada = None

Python também suporta tipos de dados compostos, como listas, tu-


plas, conjuntos e dicionários, que veremos mais adiante.

17
Capítulo 1

1.3.5 Operadores

Operadores são símbolos que realizam operações em variáveis e valo-


res. Python suporta uma ampla gama de operadores:

Operadores aritméticos:

Figura 12. Exemplo de operadores aritméticos

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#Adição: +
resultado = 3 + 2 # 5
#Subtração: -
resultado = 3 - 2 # 1
#Multiplicação: *
resultado = 3 * 2 # 6
#Divisão: /
resultado = 3 / 2 # 1.5
#Divisão inteira: //
resultado = 3 // 2 # 1
#Módulo (resto da divisão): %
resultado = 3 % 2 # 1

18
Capítulo 1

#Exponenciação: **
resultado = 3 ** 2 # 9

Operadores de comparação:

Figura 13. Exemplo de operadores de comparação

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#Igualdade: ==
5 == 5 # True
#Diferente: !=
5 != 3 # True
#Maior que: >
5 > 3 # True
#Menor que: <
5 < 3 # False
#Maior ou igual: >=
5 >= 5 # True
#Menor ou igual: <=
5 <= 3 # False

19
Capítulo 1

Operadores lógicos: Python usa as palavras-chave and, or, e not para


realizar operações lógicas.

Figura 14. Exemplo de operadores lógicos

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
True and False # False
True or False # True
not True # False

Operadores de atribuição:

Figura 15. Exemplo de operadores de atribuição

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#Simples: =
x = 10
Incremento: +=
x += 1 # Equivalente a x = x + 1

20
Capítulo 1

1.3.6 Strings

Strings em Python são uma sequência de caracteres e oferecem várias


maneiras de manipulação e formatação:

Concatenação: As strings podem ser concatenadas usando o operador +.

Figura 16. Exemplo de concatenação de strings

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
saudacao = “Olá” + “, “ + “mundo!”

Interpolação (f-strings): A partir do Python 3.6, é possível usar f-strings


para inserir variáveis dentro de strings de maneira mais clara.

Figura 17. Exemplo de interpolação

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
nome = “Ana”
idade = 28
mensagem = f”Meu nome é {nome} e eu tenho {idade} anos.”

21
Capítulo 1

Métodos de string: Python oferece diversos métodos para manipula-


ção de strings, como upper(), lower(), strip(), replace(), etc.

Figura 18. Exemplo de método de string strip

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
texto = “ Olá Mundo “
print([Link]()) # Remove espaços em branco nas extremidades

1.3.7 Entrada e saída de dados

Python oferece funções simples para interagir com o usuário via entra-
da e saída de dados:

Função print(): Utilizada para exibir dados no console.

Figura 19. Exemplo de função print

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
print(“Olá, mundo!”)

22
Capítulo 1

Função input(): Usada para capturar entrada do usuário. A entrada


é sempre tratada como string, sendo necessário converter para outro tipo
quando necessário.

Figura 20. Exemplo de função input

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
nome = input(“Qual é o seu nome? “)
idade = int(input(“Qual é a sua idade? “))
print(f”Olá {nome}, você tem {idade} anos.”)

23
2
2. ESTRUTURAS DE CONTROLE E
FUNÇÕES

Nesta seção, exploraremos conceitos fundamentais da programação:


estruturas de controle e funções. As estruturas de controle, como condi-
cionais e laços, permitem que o programa tome decisões e execute ações
repetidamente com base em condições específicas, tornando-o dinâmico e
interativo. Aprenderemos a criar e utilizar funções, que são blocos de códi-
go reutilizáveis para realizar tarefas específicas. Iremos desde a elaboração
de funções simples até o uso de funções nativas do Python e funções anô-
nimas, como as expressões lambda, que possibilitam uma implementação
concisa e eficiente.

2.1 CONDICIONAIS E LOOPS EM PYTHON


Condicionais são estruturas de controle que permitem que o programa
tome decisões com base em condições avaliadas. Em Python, a estrutura de
condicional é implementada principalmente com o comando if, acompa-
nhado de elif (abreviação de else if) e else. Essas estruturas avaliam expres-
sões lógicas (verdadeiras ou falsas) e executam blocos de código diferentes,
dependendo do resultado da avaliação.

Estrutura básica do if

O comando if avalia uma expressão booleana (ou seja, uma condição


que retorna True ou False). Se a condição for True, o bloco de código asso-
ciado ao if será executado. Se for False, o programa pula esse bloco e segue
em frente.

24
Capítulo 1

Figura 21. Exemplo de estrutura do if

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
idade = 18
if idade >= 18:
print(“Você é maior de idade.”)

Nesse exemplo, a variável idade é comparada ao valor 18. Se idade


for maior ou igual a 18, o programa exibirá a mensagem “Você é maior de
idade.”.

O papel do else

O else é utilizado para definir uma ação que será executada quando
a condição do if for False. Ele funciona como uma alternativa ao bloco if,
sendo acionado apenas quando a primeira condição não é atendida.

Figura 22. Exemplo de estrutura do else

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

25
Capítulo 1

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
idade = 16
if idade >= 18:
print(“Você é maior de idade.”)
else:
print(“Você é menor de idade.”)

Aqui, como idade é 16 (menor que 18), o bloco dentro do else será
executado, imprimindo “Você é menor de idade.”.

Usando o elif para múltiplas condições

O elif permite adicionar mais de uma condição em uma estrutura con-


dicional. Se a condição do if falhar, o Python verifica a próxima condição
definida pelo elif, e assim por diante. Se todas as condições falharem, o
bloco else (se presente) será executado.

Figura 23. Exemplo de estrutura de elif

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
nota = 85
if nota >= 90:
print(“Aprovado com excelência!”)
elif nota >= 60:
print(“Aprovado.”)
else:
print(“Reprovado.”)

26
Capítulo 1

Aqui, a condição if verifica se a nota é maior ou igual a 90. Caso contrá-


rio, a próxima condição, elif nota >= 60, é avaliada. Se nenhuma das duas
condições for verdadeira, o else será executado, exibindo “Reprovado.”.

Operadores lógicos em condicionais

Em muitos casos, você precisará verificar mais de uma condição ao


mesmo tempo. Python oferece os operadores lógicos and, or, e not para
combinar várias expressões.

• and: Retorna True se ambas as condições forem verdadeiras.

• or: Retorna True se pelo menos uma das condições for verdadeira.

• not: Inverte o valor de uma expressão booleana. Se a expressão for


True, ela se torna False, e vice-versa.

Exemplo usando and:

Figura 24. Exemplo de uso do and

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
idade = 20
cnh = True
if idade >= 18 and cnh:
print(“Você pode dirigir.”)
else:
print(“Você não pode dirigir.”)

27
Capítulo 1

Neste caso, o programa verifica se a pessoa tem 18 anos ou mais e


possui a CNH (CNH é True). Se ambas as condições forem verdadeiras, a
mensagem “Você pode dirigir.” será exibida.

Loops

Loops permitem que você execute repetidamente um bloco de código


enquanto uma determinada condição for verdadeira ou enquanto houver
itens em uma sequência para percorrer. Python oferece dois tipos princi-
pais de loops: while e for.

O loop while

O loop while executa repetidamente o bloco de código dentro dele en-


quanto a condição especificada for True. Se a condição for False, o loop é
encerrado.

Figura 25. Exemplo de loop while

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
contador = 1
while contador <= 5:
print(“Contagem:”, contador)
contador += 1

Neste exemplo, o loop imprime os números de 1 a 5. O valor da variá-


vel contador começa em 1 e é incrementado em 1 a cada iteração. Quando
contador se torna maior que 5, o loop para.

É importante lembrar que loops while podem facilmente se tornar


loops infinitos se a condição nunca se tornar False. Por exemplo:

28
Capítulo 1

Figura 26. Exemplo de loop while infinito

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
contador = 1
while contador > 0:
print(“Este é um loop infinito!”)

Aqui, como contador nunca diminui, a condição contador > 0 será sem-
pre verdadeira, o que faz o loop nunca parar. Isso deve ser evitado.

O loop for

O loop for em Python é usado para iterar sobre uma sequência (como
uma lista, tupla ou string) ou outro objeto iterável. Ao contrário de algumas
outras linguagens, o for em Python não precisa de um contador manual,
pois ele “caminha” diretamente pelos itens da sequência.

Figura 27 – Exemplo de loop for

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
frutas = [“maçã”, “banana”, “laranja”]
for fruta in frutas:
print(fruta)

29
Capítulo 1

Neste exemplo, o loop percorre a lista frutas e imprime cada item. O


loop for itera automaticamente pelos itens da lista até o final.

Outro uso comum do for é com a função range(), que gera uma se-
quência de números. É particularmente útil quando você precisa de um
contador.

Figura 28. Exemplo de uso do range

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
for i in range(5):
print(“Número:”, i)

Aqui, o range(5) gera os números de 0 a 4, e o loop for imprime esses


números.

Interrompendo loops com break e continue

O comando break é usado para sair completamente de um loop antes


que ele termine normalmente.

Figura 29. Exemplo de comando break

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código

30
Capítulo 1

apresentado na imagem é:
for numero in range(1, 10):
if numero == 5:
break
print(numero)

Neste exemplo, o loop será interrompido assim que o valor numero


atingir 5. O break força a saída do loop, e nenhum número após 5 será
impresso.

O comando continue pula a iteração atual e continua com a próxima.

Figura 30. Exemplo de comando continue

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
for numero in range(1, 10):
if numero == 5:
continue
print(numero)

Aqui, quando numero é 5, o comando continue faz com que o loop


pule para a próxima iteração, e o número 5 não será impresso, mas os
outros números sim.

Loops aninhados

Em Python, você pode aninhar loops, ou seja, usar um loop dentro de


outro. Isso é útil quando você precisa percorrer estruturas de dados mais
complexas, como listas de listas (ou matrizes).

31
Capítulo 1

Figura 31. Exemplo de loops aninhados

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for linha in matriz:
for elemento in linha:
print(elemento, end=” “)
print()

Este código percorre cada linha da matriz e, em seguida, cada elemen-


to dentro da linha. A saída será:

123

456

789

Loops aninhados são poderosos, mas podem se tornar ineficientes


com grandes volumes de dados, então devem ser usados com cuidado.

2.2 CRIAÇÃO E USO DE FUNÇÕES


As funções são blocos de código reutilizáveis que realizam uma tarefa
específica. Em Python, funções permitem que você escreva um código mo-
dular, mais organizado e mais fácil de manter. Ainda, funções podem ser
chamadas em diferentes momentos do programa, evitando a repetição de
código. Elas podem receber entradas (chamadas de parâmetros) e retornar
saídas.

32
Capítulo 1

Para definir uma função em Python, usa-se a palavra-chave def seguida


pelo nome da função, parênteses (que podem conter parâmetros ou não) e
dois pontos :. O bloco de código da função é identado e pode conter qual-
quer operação. Uma função pode opcionalmente retornar um valor usando
a palavra-chave return.

Exemplo simples de uma função sem parâmetros e sem retorno

Figura 32. Exemplo de função sem parâmetros

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def saudacao():
print(“Olá, bem-vindo!”)

Neste exemplo, a função saudacao simplesmente imprime uma men-


sagem de boas-vindas. Ela não recebe nenhum argumento e não retorna
nenhum valor.

Para chamar essa função e executá-la, basta usar o nome da função


seguido de parênteses: saudacao(). A saída será:

Olá, bem-vindo!

As funções podem receber parâmetros, que são valores passados para


a função no momento da sua chamada. Esses parâmetros podem ser usa-
dos dentro da função para realizar operações mais dinâmicas.

Exemplo de função com parâmetros

33
Capítulo 1

Figura 33. Exemplo de função com parâmetros

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def saudacao(nome):
print(f”Olá, {nome}, bem-vindo!”)
saudacao(“Maria”)

Aqui, a função saudacao aceita um parâmetro nome. Ao chamar a fun-


ção, você pode fornecer o valor desse parâmetro. A saída será:

Olá, Maria, bem-vindo!

Uma função pode receber quantos parâmetros forem necessários. Eles


são separados por vírgulas na definição da função.

Figura 34. Exemplo de função com múltiplos parâmetros

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def somar(a, b):
resultado = a + b

34
Capítulo 1

print(f”A soma de {a} e {b} é {resultado}”)


somar(5, 3)

Neste exemplo, a função somar aceita dois parâmetros, a e b, e impri-


me a soma desses números. A saída será:

A soma de 5 e 3 é 8

Funções também podem retornar valores usando a palavra-chave re-


turn. O valor retornado pode ser armazenado em uma variável ou usado
diretamente em outras operações.

Exemplo de função com retorno:

Figura 35. Exemplo de função com retorno

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def somar(a, b):
return a + b

resultado = somar(5, 3)
print(f”O resultado da soma é {resultado}”)

Aqui, a função somar calcula a soma de a e b e retorna o resultado. Para


capturar esse resultado, podemos fazer: resultado = somar(5, 3) e print(f”O
resultado da soma é {resultado}”). Linhas 4 e 5 respectivamente. A saída será:

O resultado da soma é 8

35
Capítulo 1

O uso de return é importante porque ele encerra a execução da função


e retorna um valor ao ponto de chamada. Se uma função não tiver um re-
turn, ela retorna implicitamente o valor none.

Python permite que você defina valores padrão para os parâmetros.


Isso significa que, se nenhum valor for passado para o parâmetro ao cha-
mar a função, o valor padrão será usado.

Exemplo com parâmetro padrão

Figura 36. Exemplo de função com parâmetro padrão

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def saudacao(nome=”Visitante”):
print(f”Olá, {nome}, bem-vindo!”)
saudacao() #Chamada sem passagem de argumento
saudacao(“João”) #Chamada com passagem de argumento

Aqui, se a função for chamada sem argumentos, o valor padrão “Visi-


tante” será usado, saudacao(). A saída será:

Olá, Visitante, bem-vindo!

E se você passar um argumento, ele será usado no lugar do valor pa-


drão, saudacao(“João”). A saída será:

Olá, João, bem-vindo!

Parâmetros nomeados

36
Capítulo 1

Em Python, você pode chamar uma função passando os valores dos


parâmetros por nome, o que melhora a legibilidade do código e permite al-
terar a ordem dos argumentos. Ao chamar a função, você pode especificar
os parâmetros pelo nome:

Exemplo de parâmetros nomeados

Figura 37. Exemplo de função com parâmetros nomeados

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def calcular_pagamento(valor_hora, horas_trabalhadas):
return valor_hora * horas_trabalhadas
salario = calcular_pagamento(valor_hora=50, horas_trabalhadas=40)
print(salario)

Mesmo que a ordem seja diferente da declaração original, o Python


ainda consegue identificar corretamente os valores dos parâmetros. A saí-
da será:

2000

Às vezes, pode ser útil permitir que uma função aceite um número
indefinido de argumentos. Em Python, isso é feito usando *args para uma
lista de argumentos posicionais e **kwargs para um dicionário de argu-
mentos nomeados.

• *args: Permite que a função receba um número variável de


argumentos.

• **kwargs: Permite que a função receba um número variável de ar-


gumentos nomeados.

37
Capítulo 1

Exemplo com *args

Figura 38. Exemplo de *args

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def somar_todos(*numeros):
return sum(numeros)
resultado = somar_todos(1, 2, 3, 4)
print(resultado)

A função somar_todos pode receber quantos números forem passa-


dos na chamada. A saída será:

10

Exemplo com **kwargs

Figura 39. Exemplo de *kwargs

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código

38
Capítulo 1

apresentado na imagem é:
def apresentar(**dados):
for chave, valor in [Link]():
print(f”{chave}: {valor}”)
apresentar(nome=”Maria”, idade=30, cidade=”São Paulo”)

Aqui, você pode passar pares de chave-valor como argumentos no-


meados. A saída será:

nome: Maria

idade: 30

cidade: São Paulo

O escopo de uma variável refere-se à região do código na qual a va-


riável pode ser acessada. Variáveis definidas dentro de uma função têm
escopo local, ou seja, só podem ser acessadas dentro dessa função.

Exemplo de escopo local

Figura 40. Exemplo de variável de escopo local

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
def funcao():
x = 10
print(x)
funcao()
print(x) # Isso causará um erro, pois x está fora do escopo

39
Capítulo 1

Aqui, a variável x é criada e utilizada apenas dentro da função funcao.


Tentar acessar x fora da função resultará em um erro, pois ela não existe
no escopo global.

Se uma variável for definida fora de qualquer função, ela é considerada


de escopo global e pode ser acessada em qualquer parte do código, inclu-
sive dentro das funções (a menos que você crie uma variável com o mesmo
nome dentro da função).

Figura 41. Exemplo de variável de escopo global

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
y=5
def funcao():
print(y)
funcao() # Isso funcionará

Funções são essenciais em Python para organizar o código de forma


mais eficiente, modularizando tarefas específicas. Elas permitem reutiliza-
ção, clareza, e tornam o código mais fácil de manter. Parâmetros permitem
que as funções sejam flexíveis e possam lidar com diferentes tipos de entra-
da, enquanto o retorno de valores permite que os resultados das operações
sejam usados em outras partes do programa.

40
Capítulo 1

2.3 FUNÇÕES EMBUTIDAS E FUNÇÕES


ANÔNIMAS (LAMBDA)
Python oferece um vasto conjunto de funções embutidas (ou funções
built-in), que são aquelas que já vêm prontas para uso na linguagem, sem
a necessidade de importar módulos ou bibliotecas externas. Além disso,
Python também suporta funções anônimas (também conhecidas como
funções lambda), que são úteis para criar pequenas funções sem nome,
geralmente para uso imediato em operações rápidas e simples.

As funções embutidas são funções prontas para uso, que facilitam


muitas operações comuns. Algumas dessas funções são usadas para mani-
pulação de tipos de dados, outras para operações matemáticas, de entrada
e saída, entre outras. Vamos explorar algumas das mais comuns e úteis:

Exemplos de funções embutidas

1. print()

Função usada para exibir informações no console.

Figura 42. Exemplo de função print

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
print(“Hello, World!”)

Saída:

Hello, World!

41
Capítulo 1

1. len()

Retorna o comprimento (número de itens) de um objeto como strings,


listas ou dicionários.

Figura 43. Exemplo de função len

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
frase = “Python é incrível!”
print(len(frase)) # Saída: 17

2. type()

Retorna o tipo do objeto passado como argumento.

Figura 44. Exemplo de função type

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
x = 10
print(type(x)) # Saída: <class ‘int’>

42
Capítulo 1

3. sum()

Soma os elementos de um iterável (lista, tupla, etc.).

Figura 45. Exemplo de função sum

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
numeros = [1, 2, 3, 4, 5]
print(sum(numeros)) # Saída: 15

4. input()

Lê uma linha de entrada do usuário.

Figura 46. Exemplo de função input

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
nome = input(“Digite seu nome: “)
print(f”Olá, {nome}!”)

43
Capítulo 1

5. max() e min()

Retornam o maior e o menor valor de um iterável, respectivamente.

Figura 47. Exemplo de função max e min

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
numeros = [10, 20, 30, 5, 40]
print(max(numeros)) # Saída: 40
print(min(numeros)) # Saída: 5

6. sorted()

Retorna uma nova lista com os elementos de um iterável ordenados.

Figura 48. Exemplo de função sorted

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
numeros = [3, 1, 4, 2]
print(sorted(numeros)) # Saída: [1, 2, 3, 4]

44
Capítulo 1

7. range()

Gera uma sequência de números.

Figura 49. Exemplo de função range

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
for i in range(5):
print(i)

Saída:

8. map()

Aplica uma função a todos os itens de um iterável (como uma lista).

45
Capítulo 1

Figura 50. Exemplo de função map

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
numeros = [1, 2, 3, 4]
dobrados = list(map(lambda x: x * 2, numeros))
print(dobrados) # Saída: [2, 4, 6, 8]

Funções anônimas (lambda)

Além das funções convencionais, Python suporta a criação de funções


anônimas, chamadas de funções lambda. Elas são pequenas expressões
que podem ser usadas para definir funções de forma rápida e sem a ne-
cessidade de nomeá-las formalmente com def. A principal característica das
funções lambda é que elas são compostas por uma única linha de código.

Sintaxe das funções lambda

A sintaxe de uma função lambda é simples:

lambda argumentos: expressão

Argumentos: São os parâmetros da função.

São os parâmetros da função.

Expressão

É a operação realizada pela função, que deve ser uma única expressão.

46
Capítulo 1

Exemplo simples de função lambda

Figura 51. Exemplo de função lambda

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
soma = lambda a, b: a + b
print(soma(5, 3)) # Saída: 8

Neste exemplo, soma é uma função anônima que recebe dois parâme-
tros, a e b, e retorna a soma deles.

Quando usar uma função lambda?

As funções lambda são usadas quando uma função pequena é neces-


sária apenas temporariamente, como em funções de ordem superior que
recebem outras funções como argumentos (por exemplo, map(), filter(), e
sorted()).

Exemplo com lambda no sorted()

Suponha que você tenha uma lista de tuplas e queira ordená-las pelo
segundo elemento:

47
Capítulo 1

Figura 52. Exemplo de função lambda no sorted

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
pares = [(1, 4), (3, 1), (5, 2)]
ordenado = sorted(pares, key=lambda x: x[1])
print(ordenado)

A função lambda x: x[1] é usada como a chave de ordenação para clas-


sificar as tuplas pelo segundo elemento. A saída será:

[(3, 1), (5, 2), (1, 4)]

Exemplo com lambda no map()

Usando map(), você pode aplicar uma função a todos os elementos de


um iterável:

Figura 53. Exemplo de função lambda no map

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
numeros = [1, 2, 3, 4]
quadrados = list(map(lambda x: x ** 2, numeros))
print(quadrados)

48
Capítulo 1

Aqui, a função lambda x: x ** 2 é aplicada a cada elemento da lista


numeros, retornando os quadrados de cada número. A saída será:

[1, 4, 9, 16]

Exemplo mais complexo de uso de lambda com filter()

A função filter() é usada para filtrar elementos de um iterável com base


em uma condição. Podemos usar lambda para definir essa condição.

Figura 54. Exemplo de função filter

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
numeros = [1, 2, 3, 4, 5, 6, 7, 8]
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(pares)

Aqui, a função lambda x: x % 2 == 0 retorna True para números pares, e


o filter() mantém apenas os números que atendem a essa condição. A saída
será:

[2, 4, 6, 8]

49
3
3. ESTRUTURAS DE DADOS E
MANIPULAÇÃO DE ARQUIVOS

Nesta seção, examinaremos as principais estruturas de dados do Py-


thon, como listas, tuplas e dicionários, além de suas manipulações e ope-
rações, que são essenciais para armazenar e organizar dados de forma efi-
ciente. Em seguida, abordaremos as operações básicas de leitura e escrita
de arquivos, fundamentais para a manipulação de dados persistentes. Por
fim, discutiremos o tratamento de exceções, que permite lidar com erros
de execução de maneira controlada, assegurando que o programa continue
funcionando corretamente, mesmo diante de imprevistos.

3.1 MANIPULAÇÃO DE LISTAS, TUPLAS E


DICIONÁRIOS
As listas, tuplas e dicionários são as estruturas de dados mais utilizadas
em Python. Cada uma dessas estruturas tem suas próprias características,
usos específicos e métodos de manipulação. Vamos explorar essas estrutu-
ras em detalhes, entender como manipulá-las e ver exemplos práticos para
consolidar o aprendizado.

Listas

Listas em Python são coleções ordenadas e mutáveis, o que significa


que podemos alterar seus elementos após a criação. Elas são muito fle-
xíveis, podendo conter elementos de diferentes tipos de dados (inteiros,
strings, objetos, etc.) e permitem operações diversas como adição, remoção
e modificação de itens.

• Criando uma lista: Para criar uma lista, usamos colchetes []:

50
Capítulo 1

minha_lista = [1, 2, 3, “quatro”, True]

Essa lista contém inteiros, uma string e um valor booleano.

• Acessando elementos: os elementos de uma lista podem ser aces-


sados por seus índices, começando do 0:

Figura 55. Exemplo de acesso a elementos de uma lista

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
print(minha_lista[0]) # Saída: 1
print(minha_lista[3]) # Saída: quatro

• Modificando uma lista: como listas são mutáveis, podemos alterar


os elementos diretamente:

Figura 56. Exemplo de modificação de lista

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
minha_lista[1] = “dois”
print(minha_lista) # Saída: [1, ‘dois’, 3, ‘quatro’, True]

51
Capítulo 1

• Métodos comuns de lista:

Figura 57. Exemplo de métodos comuns em lista

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#append(item): Adiciona um item ao final da lista.
minha_lista.append(5)
print(minha_lista) # Saída: [1, ‘dois’, 3, ‘quatro’, True, 5]
#insert(posição, item): Insere um item em uma posição específica.
minha_lista.insert(2, “novo”)
print(minha_lista) # Saída: [1, ‘dois’, ‘novo’, 3, ‘quatro’, True, 5]
#remove(item): Remove a primeira ocorrência de um item.
minha_lista.remove(“dois”)
print(minha_lista) # Saída: [1, ‘novo’, 3, ‘quatro’, True, 5]
#pop(): Remove e retorna o último item da lista (ou de uma posição específica).
ultimo_item = minha_lista.pop()

52
Capítulo 1

print(ultimo_item) # Saída: 5
print(minha_lista) # Saída: [1, ‘novo’, 3, ‘quatro’, True]
#sort(): Ordena a lista (funciona apenas em listas com tipos de dados compatíveis).
numeros = [5, 1, 3, 2, 4]
[Link]()
print(numeros) # Saída: [1, 2, 3, 4, 5]
#len(lista): Retorna o número de elementos da lista.
print(len(minha_lista)) # Saída: 5

• Slicing em listas: podemos obter sublistas utilizando slicing, que per-


mite extrair uma porção da lista.

Figura 58. Exemplo de slicing

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
sub_lista = minha_lista[1:3] # Do índice 1 ao 2 (exclui o índice 3)
print(sub_lista) # Saída: [‘novo’, 3]

Tuplas

Tuplas são semelhantes às listas, mas são imutáveis, o que significa


que, após serem criadas, seus elementos não podem ser alterados. Elas são
úteis quando queremos garantir que os dados permanecem inalterados.

Para criar uma tupla, usamos parênteses ():

minha_tupla = (1, 2, 3, “quatro”, True)

Assim como as listas, as tuplas podem conter diferentes tipos de dados.

Os elementos de uma tupla também podem ser acessados por seus


índices:

53
Capítulo 1

Figura 59. Exemplo de tupla

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
minha_tupla = (1, 2, 3, “quatro”, True)
print(minha_tupla[0]) # Saída: 1
print(minha_tupla[3]) # Saída: quatro

Métodos e operações com tuplas: tuplas possuem menos métodos que


listas devido à sua imutabilidade, mas podemos realizar algumas operações:

Figura 60. Exemplo de métodos e operações com tuplas

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#count(item): Conta quantas vezes um item aparece na tupla.
print(minha_tupla.count(1)) # Saída: 1
#index(item): Retorna o índice da primeira ocorrência de um item.
print(minha_tupla.index(“quatro”)) # Saída: 3

54
Capítulo 1

Dicionários

Dicionários são coleções de pares chave-valor. Ao contrário de listas


e tuplas, que são indexadas por números, dicionários permitem que aces-
semos seus valores usando chaves, que podem ser strings, números ou
outros tipos de dados imutáveis.

Dicionários são criados usando chaves {}:

meu_dict = {“nome”: “Ana”, “idade”: 25, “profissão”: “Engenheira”}

Aqui, “nome”, “idade” e “profissão” são as chaves, e “Ana”, 25 e “En-


genheira” são os valores associados a essas chaves. Podemos acessar os
valores do dicionário usando as chaves correspondentes:

Figura 61. Exemplo de dicionário

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
print(meu_dict[“nome”]) # Saída: Ana
print(meu_dict[“idade”]) # Saída: 25

Os valores de um dicionário podem ser modificados facilmente:

Figura 62. Exemplo de modificação de dicionário

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código

55
Capítulo 1

apresentado na imagem é:
meu_dict[“idade”] = 26
print(meu_dict) # Saída: {‘nome’: ‘Ana’, ‘idade’: 26, ‘profissão’: ‘Engenheira’}

Adicionando e removendo pares:

Figura 63. Exemplo de adição e remoção em dicionário

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#Para adicionar um novo par chave-valor:
meu_dict[“cidade”] = “São Paulo”
print(meu_dict) # Saída: {‘nome’: ‘Ana’, ‘idade’: 26, ‘profissão’: ‘Engenheira’, ‘cidade’: ‘São Paulo’}
#Para remover um par:
del meu_dict[“profissão”]
print(meu_dict) # Saída: {‘nome’: ‘Ana’, ‘idade’: 26, ‘cidade’: ‘São Paulo’}

56
Capítulo 1

Métodos comuns de dicionários

Figura 64. Exemplo de métodos comuns de dicionários

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#keys(): Retorna todas as chaves do dicionário.
print(meu_dict.keys()) # Saída: dict_keys([‘nome’, ‘idade’, ‘cidade’])
values(): Retorna todos os valores do dicionário.
print(meu_dict.values()) # Saída: dict_values([‘Ana’, 26, ‘São Paulo’])
items(): Retorna todos os pares chave-valor como tuplas.
print(meu_dict.items()) # Saída: dict_items([(‘nome’, ‘Ana’), (‘idade’, 26), (‘cidade’, ‘São Paulo’)])

3.2 OPERAÇÕES COM ARQUIVOS: LEITURA E


ESCRITA
Manipular arquivos é uma tarefa comum em muitas aplicações. Em
Python, isso é feito de forma simples e eficiente usando funções embutidas.
Os arquivos podem ser lidos, escritos e manipulados em diferentes modos,
como texto ou binário, permitindo grande flexibilidade ao interagir com da-
dos persistentes.

Antes de realizar qualquer operação, é necessário abrir o arquivo. O


método padrão para isso é usando a função open(). O formato básico da
função é:

arquivo = open(“nome_do_arquivo”, “modo”)

57
Capítulo 1

Após manipular um arquivo, ele deve ser fechado para liberar os recur-
sos do sistema. Isso é feito com o método close():

[Link]()

No entanto, uma prática recomendada é usar o gerenciador de con-


texto with ao trabalhar com arquivos. Ele garante que o arquivo seja fe-
chado automaticamente ao término da operação, mesmo que ocorra uma
exceção:

Figura 65. Exemplo de leitura de arquivo com with

Fonte: elaboração própria (2024).


#ParaTodosVerem: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
with open(“nome_do_arquivo.txt”, “r”) as arquivo:
conteudo = [Link]()

Com o uso do with, o arquivo é fechado automaticamente ao sair do


bloco.

Há várias formas de ler o conteúdo de um arquivo em Python:

1. read()

Lê o conteúdo inteiro do arquivo como uma única string.

58
Capítulo 1

Figura 66. Exemplo de leitura de arquivo

Fonte: Autor
#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
with open(“[Link]”, “r”) as arquivo:
conteudo = [Link]()
print(conteudo)

2. readline()

Lê uma linha do arquivo por vez.

Figura 67. Exemplo de leitura de arquivo

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
with open(“[Link]”, “r”) as arquivo:
linha = [Link]()
while linha:
print([Link]()) # O strip remove quebras de linha
linha = [Link]()

59
Capítulo 1

3. readlines()

Lê todas as linhas e as retorna como uma lista.

Figura 68. Exemplo de leitura de arquivo

Fonte: Autor
#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
with open(“[Link]”, “r”) as arquivo:
linhas = [Link]()
for linha in linhas:
print([Link]())

Assim como na leitura, há várias formas de escrever em arquivos, de-


pendendo do modo de abertura.

1. write()

Escreve uma string no arquivo. Se o arquivo for aberto em modo “w”, o


conteúdo existente será sobrescrito. Caso o arquivo seja aberto em modo
“a”, o conteúdo será adicionado ao final.

Figura 69. Exemplo de escrita em arquivo

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

60
Capítulo 1

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
with open(“novo_arquivo.txt”, “w”) as arquivo:
[Link](“Escrevendo no arquivo\n”)
[Link](“Mais uma linha”)

2. writelines()

Escreve uma lista de strings no arquivo. Cada elemento da lista é inse-


rido como uma linha.

Figura 70. Exemplo de escrita em arquivo

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
linhas = [“Linha 1\n”, “Linha 2\n”, “Linha 3\n”]
with open(“arquivo_linhas.txt”, “w”) as arquivo:
[Link](linhas)

Além de arquivos de texto, também é possível ler e escrever arquivos


binários (como imagens, arquivos executáveis, etc.). Para isso, utilizamos o
modo binário, como “rb” (leitura binária) e “wb” (escrita binária).

61
Capítulo 1

Figura 71. Exemplo de leitura binária

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
#Exemplo de leitura binária:
with open(“[Link]”, “rb”) as arquivo_binario:
dados = arquivo_binario.read()
#Exemplo de escrita binária:
with open(“copia_imagem.jpg”, “wb”) as novo_arquivo_binario:
novo_arquivo_binario.write(dados)

Ao lidar com arquivos, é importante estar atento a possíveis erros,


como tentar abrir um arquivo que não existe. O tratamento de exceções
ajuda a evitar que o programa quebre ao encontrar esses problemas.

Exemplo de tratamento de exceção:

Figura 72. Exemplo de tratamento de exceção

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:

62
Capítulo 1

try:
with open(“arquivo_inexistente.txt”, “r”) as arquivo:
conteudo = [Link]()
except FileNotFoundError:
print(“O arquivo não foi encontrado.”)

APROFUNDANDO
A manipulação de arquivos é uma parte fundamental da progra-
mação, especialmente para programas que precisam ler ou ar-
mazenar dados de forma persistente. Com as funções e métodos
embutidos de Python, a leitura e escrita de arquivos, tanto de
texto quanto binários, é feita de maneira simples e eficiente. En-
tender como abrir, ler, escrever e fechar arquivos corretamente é
uma habilidade essencial para qualquer desenvolvedor.

3.3 TRATAMENTO DE EXCEÇÕES


O tratamento de exceções em Python é uma técnica que gerencia er-
ros durante a execução de um programa, evitando interrupções abruptas.
Exceções são eventos inesperados, como divisão por zero ou acesso a ar-
quivos inexistentes. Em vez de interromper o fluxo normal do programa,
essa técnica permite interceptar e lidar com erros adequadamente. Quan-
do uma exceção ocorre, a execução é interrompida e o Python procura um
manipulador de exceção. Se não houver tratamento definido, o programa
exibirá uma mensagem de erro e será encerrado.

Exemplo simples de exceção não tratada:

print(10/0) # ZeroDivisionError

Isso resulta em:

ZeroDivisionError: division by zero

Para evitar que o programa seja interrompido, podemos capturar a


exceção usando as construções try, except, else e finally.

A sintaxe básica para o tratamento de exceções em Python envolve o


uso do bloco try-except. O bloco try contém o código que pode gerar uma
exceção, enquanto o bloco except captura e lida com a exceção, permitindo
que o programa continue a execução.

63
Capítulo 1

Exemplo de uso básico do try-except:

Figura 73. Exemplo de try-except

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
try:
resultado = 10 / 0
except ZeroDivisionError:
print(“Erro: Divisão por zero não permitida.”)

Neste exemplo, o código dentro do bloco try gera um ZeroDivisionEr-


ror, e o bloco except captura essa exceção, impedindo que o programa seja
interrompido.

Se não soubermos exatamente que tipo de erro pode ocorrer, pode-


mos capturar todas as exceções possíveis usando uma exceção genérica:

Figura 74. Exemplo de captura de exceção

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:

64
Capítulo 1

try:
resultado = 10 / 0
except Exception as e:
print(f”Ocorreu um erro: {e}”)

Neste caso, qualquer exceção será capturada e tratada. A variável e


contém o objeto da exceção, que pode ser usado para imprimir detalhes
sobre o erro.

Figura 75. Exemplo de captura de múltiplas exceções

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
try:
valor = int(input(“Digite um número: “))
resultado = 10 / valor
except ValueError:
print(“Erro: Entrada inválida. Digite um número.”)
except ZeroDivisionError:
print(“Erro: Não é possível dividir por zero.”)

Aqui, dois tipos de exceções são tratados: ValueError, que ocorre quan-
do o usuário digita algo que não é um número, e ZeroDivisionError, quando
o número inserido é zero.

ZOOM NO CONHECIMENTO
O bloco else pode ser usado após os blocos except. Ele é exe-
cutado se o código dentro do bloco try não gerar exceção. Ele
é útil para diferenciar o código que depende de uma execução
bem-sucedida.

65
Capítulo 1

Figura 76. Exemplo de else em try-except

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
try:
valor = int(input(“Digite um número: “))
resultado = 10 / valor
except ZeroDivisionError:
print(“Erro: Divisão por zero.”)
except ValueError:
print(“Erro: Entrada inválida.”)
else:
print(f”Resultado: {resultado}”)

Se nenhuma exceção for gerada, o bloco else será executado e exibirá


o resultado da divisão.

ZOOM NO CONHECIMENTO
O bloco finally é executado sempre, independentemente de uma
exceção ter ocorrido ou não. Ele é geralmente usado para limpar
recursos ou executar ações que devem ocorrer mesmo que uma
exceção seja gerada, como fechar arquivos ou liberar conexões.

66
Capítulo 1

Figura 77. Exemplo de finally

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
try:
arquivo = open(“[Link]”, “r”)
conteudo = [Link]()
except FileNotFoundError:
print(“Erro: Arquivo não encontrado.”)
finally:
[Link]()
print(“Arquivo fechado.”)

Neste exemplo, o arquivo será fechado independentemente de uma


exceção ocorrer ou não.

67
NOVOS DESAFIOS

É hora de conectar o conhecimento adquirido à realidade do


mercado de trabalho. Você explorou conceitos fundamentais de
programação e desenvolvimento de soluções tecnológicas, enten-
dendo como a lógica e a prática se interligam para resolver proble-
mas. Agora, é crucial refletir sobre a aplicação dessas habilidades
em sua futura carreira.

As empresas estão cada vez mais em busca de profissionais


que não apenas saibam programar, mas que também utilizem a pro-
gramação para otimizar processos, criar automações e desenvolver
soluções inovadoras. As competências que você desenvolveu, como
o uso eficiente de estruturas de controle, funções, manipulação de
dados e tratamento de exceções, são diferenciais importantes no
cenário atual.

No ambiente corporativo, a capacidade de identificar proble-


mas e propor soluções ágeis é essencial. A clareza na organização
do código e a reutilização de blocos de código também serão dife-
renciais competitivos. O aprendizado em programação é contínuo, e
os desafios enfrentados nesta temática são apenas uma introdução
ao que o mercado espera.

Além disso, a experiência em lidar com exceções reflete a ha-


bilidade de resolver problemas reais, mantendo a operação fluida e
eficiente. Pergunte a si mesmo como pode continuar a desenvolver
suas habilidades e aplicar o que aprendeu para melhorar processos
no trabalho atual ou em futuras posições. Essa reflexão permitirá
enxergar o potencial de crescimento em sua carreira e a conexão
das competências técnicas com o futuro do trabalho.

68
ATIVIDADES

1. Durante o desenvolvimento de um programa, é essencial a cria-


ção de funções para organizar e reutilizar o código. Qual é o prin-
cipal benefício de utilizar funções em um projeto de software?

a. Funções facilitam o uso de código de terceiros.


b. Funções permitem a execução simultânea de tarefas.
c. Funções ajudam a dividir o programa em blocos reutilizáveis,
melhorando a organização e manutenção.
d. Funções evitam a necessidade de testar o código.
e. Funções aumentam automaticamente a performance do
programa.

2. Um dos conceitos fundamentais da programação é o tratamen-


to de exceções. Qual das alternativas descreve corretamente o
uso de exceções em um programa?

a. Exceções permitem que o código funcione sem a necessidade de


variáveis.
b. Exceções são utilizadas para controlar o fluxo de loops e
condicionais.
c. Exceções são usadas para capturar e tratar erros durante a
execução do programa, evitando que ele pare de funcionar
inesperadamente.
d. Exceções substituem a necessidade de estruturas condicionais
no código.
e. Exceções permitem que o programa ignore erros automatica-
mente e continue funcionando sem alterações.

69
Capítulo 1

3. Ao manipular grandes quantidades de dados em um programa,


qual das estruturas a seguir é a mais apropriada para armazenar
pares de chave-valor, como uma lista de contatos com nome e
número de telefone?

a. Lista.
b. Tupla.
c. Dicionário.
d. Conjunto.
e. String.

70
REFERÊNCIAS

VANDERPLAS, J. Python data science handbook: essential tools for wor-


king with data. Sebastopol: O’Reilly Media, 2016.

NETTO, A.; MACIEL, F. Python para data science: e machine learning descom-
plicado. Rio de Janeiro: Alta Books, 2021.

71
CAPÍTULO 2
MANIPULAÇÃO DE DADOS COM
NUMPY E PANDAS

MINHAS METAS
• Compreender o funcionamento de arrays NumPy.

• Realizar operações matemáticas com arrays e funções NumPy.

• Compreender a estrutura e manipulação de DataFrames no Pandas.

• Importar, limpar e manipular grandes conjuntos de dados usando


Pandas.

• Realizar agregações, fusões e filtragem de dados em DataFrames.

• Criar visualizações básicas de dados usando Pandas.

• Salvar e carregar dados em diferentes formatos (CSV, Excel, JSON).

72
INICIE SUA JORNADA

Imagine que você trabalha como analista de dados em uma empresa


de tecnologia que coleta grandes quantidades de informações diariamente.
Você precisa analisar esses dados e extrair ideias valiosas, como padrões
de consumo ou tendências de mercado. No entanto, quando você recebe
os arquivos de dados, percebe que há milhares de linhas com informações
desorganizadas, valores ausentes e dados duplicados. Como lidar com essa
imensa quantidade de dados e transformá-los em algo útil e organizado
para a tomada de decisões da empresa?

A resolução dessa problemática é essencial para que as empresas pos-


sam tomar decisões embasadas em dados e otimizar suas estratégias. A ha-
bilidade de manipular dados de maneira eficiente, extraindo insights rapi-
damente, é uma das mais requisitadas no mercado atual. Profissionais que
dominam ferramentas de análise e manipulação de dados são capazes de
resolver esses desafios com agilidade, otimizando processos e aumentando
a produtividade. Além disso, a correta interpretação e limpeza dos dados
pode ter impactos diretos na qualidade dos resultados apresentados.

Agora, imagine-se trabalhando em projetos reais nos quais será ne-


cessário lidar com grandes volumes de dados. Ferramentas como NumPy
e Pandas serão suas grandes aliadas. Com elas, você poderá realizar ope-
rações matemáticas avançadas, limpar e organizar dados, realizar junções
de diferentes bases e até mesmo visualizar os resultados de forma gráfica,
facilitando a comunicação com sua equipe ou seus clientes. No dia a dia,
você poderá enfrentar situações como preparar relatórios de vendas, orga-
nizar dados de pesquisa de mercado, ou até mesmo construir um modelo
preditivo a partir de dados limpos e estruturados.

A partir desses exemplos práticos, você começará a refletir sobre


a importância de saber manipular dados de maneira eficiente. Como os

73
Capítulo 2

dados brutos podem esconder informações preciosas que apenas técnicas


corretas de análise podem revelar? Qual a importância de dominar essas
ferramentas para o seu crescimento profissional em um mercado no qual o
“Big Data” e a ciência de dados têm se tornado essenciais? Essas reflexões
te acompanharão ao longo de todo o processo de aprendizado, ajudando
a identificar oportunidades e desafios que surgem com o uso de NumPy e
Pandas no seu desenvolvimento profissional.

VAMOS RECORDAR?
Qual é a diferença entre dados e informações? Vamos recordar?
Clique aqui e confira!

PLAY NO CONHECIMENTO
Clique aqui e confira um podcast sobre o impacto
do machine learning em diversas indústrias.

74
1
DESENVOLVA SEU POTENCIAL
1. INTRODUÇÃO A NUMPY

EM FOCO
Clique aqui e assista aqui a um vídeo sobre a
temática.

Agora que você já teve o primeiro contato com a importância da mani-


pulação de dados e a relevância de ferramentas como NumPy e Pandas, é
hora de aprofundar seus conhecimentos. Imagine que você está prestes a
analisar um grande conjunto de dados para uma apresentação importan-
te. Como você pode garantir que os dados estejam limpos, organizados e
prontos para gerar insights valiosos? É exatamente aqui que o NumPy e o
Pandas entram em cena, transformando grandes volumes de dados brutos
em informações estruturadas, acessíveis e precisas.

Vamos começar pelo NumPy. Essa biblioteca é essencial quando fa-


lamos de processamento numérico. Ao contrário de listas tradicionais do
Python, que são ótimas para armazenar dados de forma geral, o NumPy foi
criado com foco em desempenho e eficiência. Seus arrays permitem opera-
ções vetorizadas, ou seja, você pode realizar cálculos matemáticos em múl-
tiplos elementos de uma só vez, sem a necessidade de loops demorados.
Pense em como isso impacta seu trabalho: cálculos que levariam minutos
ou horas podem ser feitos em segundos. Não é apenas sobre rapidez, é
sobre produtividade e precisão.

Mas e quanto aos dados mais complexos e organizados em forma de


tabelas, como planilhas ou bancos de dados? É aqui que o Pandas brilha.
Ele não só facilita o carregamento de arquivos CSV ou Excel, mas também
oferece poderosas ferramentas de manipulação. Imagine que você precise
filtrar todas as vendas acima de um certo valor ou agrupar os dados por

75
Capítulo 2

categorias de produtos. Com apenas algumas linhas de código, o Pandas


permite que você faça isso de maneira intuitiva e eficiente, tornando a aná-
lise de dados algo simples e prático. Além disso, suas funcionalidades de
limpeza de dados permitem que você trate valores ausentes e inconsistên-
cias com facilidade.

Agora que você entende o potencial dessas ferramentas, pense em


como elas se aplicam à sua realidade. No dia a dia, você pode estar tra-
balhando com dados de vendas, pesquisas de mercado, ou até mesmo
análises financeiras. Com NumPy e Pandas, você pode transformar esses
dados em insights poderosos que orientam decisões importantes. Então,
está pronto para explorar essas ferramentas em profundidade e elevar sua
capacidade de análise a um novo nível? Este é o momento de desenvolver
seu potencial ao máximo.

O Numerical Python (NumPy) é uma das bibliotecas mais fundamen-


tais para a computação científica em Python. Ele permite a criação e ma-
nipulação de arrays multidimensionais, além de fornecer uma série de
funções para realizar operações matemáticas e lógicas sobre esses arrays.
Arrays são estruturas de dados que podem armazenar grandes volumes
de informações de forma eficiente e compacta, permitindo a execução de
operações vetoriais de forma rápida. Ao longo desta seção, vamos explorar
os conceitos básicos de arrays, suas propriedades e as principais operações
que podem ser realizadas com eles.

1.1 ARRAYS E SUAS PROPRIEDADES


No NumPy, o conceito central é o array multidimensional, que é a base
para todas as operações dessa biblioteca. Um array em NumPy é semelhan-
te a uma lista do Python, porém muito mais eficiente em termos de per-
formance e versatilidade. Os arrays do NumPy são chamados de ndarray,
que significa “array N-dimensional”. Eles podem ser de qualquer dimensão,
desde um simples array unidimensional até arrays complexos com várias
dimensões.

Criação de arrays

A criação de um array no NumPy é bastante simples e pode ser feita a


partir de várias fontes, como listas ou tuplas. A função [Link]() con-
verte essas estruturas nativas do Python em arrays do NumPy. Por exemplo:

76
Capítulo 2

Figura 1. Exemplo de uso de Numpy

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
arr = [Link]([1, 2, 3, 4, 5])
print(arr)

Isso criará um array unidimensional com cinco elementos. Além disso,


podemos especificar o tipo de dados do array (por exemplo, inteiros, núme-
ros de ponto flutuante, etc.) usando o parâmetro dtype.

Propriedades dos arrays

Os arrays em NumPy possuem várias propriedades importantes que


facilitam a manipulação e a compreensão dos dados neles armazenados.
Algumas das mais relevantes são:

Forma (shape) Dimensão (ndim)

A propriedade shape indica o nú- A propriedade ndim informa a


mero de elementos em cada di- quantidade de dimensões do ar-
mensão do array. Por exemplo, um ray. Um array unidimensional tem
array com forma (3, 2) tem 3 linhas ndim = 1, enquanto um array bidi-
e 2 colunas. mensional, como uma matriz, tem
ndim = 2.

77
Capítulo 2

Tipo de Dados (dtype) Tamanho (size)

O dtype especifica o tipo de dados A propriedade size retorna o nú-


de cada elemento no array. Num- mero total de elementos no array.
Py suporta tipos de dados como Por exemplo, um array de forma
int32, float64, entre outros, e o (3, 2) terá size = 6.
tipo pode ser especificado duran-
te a criação do array ou inferido
automaticamente.

Alocação de Memória (itemsize)

Cada elemento no array ocupa


uma certa quantidade de memó-
ria, e o itemsize indica o número
de bytes que cada elemento ocu-
pa. Isso é especialmente útil ao
lidar com grandes conjuntos de
dados, nos quais a eficiência de
memória é crucial.

Essas propriedades podem ser acessadas diretamente em qualquer


array. Veja um exemplo:

Figura 2. Propriedades no array

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código

78
Capítulo 2

apresentado na imagem é:
import numpy as np
arr = [Link]([[1, 2, 3], [4, 5, 6]])
print(“Forma:”, [Link])
print(“Dimensão:”, [Link])
print(“Tipo de dados:”, [Link])
print(“Tamanho:”, [Link])
print(“Alocação de memória de cada item:”, [Link], “bytes”)

Diferença entre arrays e listas

Embora arrays do NumPy e listas do Python possam parecer seme-


lhantes em alguns aspectos, há diferenças fundamentais entre eles. Primei-
ramente, os arrays são mais eficientes em termos de armazenamento, pois
ocupam menos espaço de memória. Além disso, o NumPy permite opera-
ções vetorizadas, ou seja, operações realizadas sobre todos os elementos
de um array de uma só vez, sem a necessidade de loops explícitos. Isso
resulta em ganhos substanciais de desempenho. Por exemplo:

Figura 3. Diferença entre arrays e listas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
arr = [Link]([1, 2, 3, 4, 5])
print(arr * 2) # Multiplica cada elemento do array por 2

Aqui, todos os elementos do array são multiplicados por 2 de uma vez,


o que não é possível com uma lista comum.

79
Capítulo 2

Indexação e fatiamento de arrays

Assim como em listas do Python, é possível acessar e modificar ele-


mentos de um array NumPy utilizando indexação. NumPy também permi-
te fatiamento (slicing), que é a extração de subconjuntos de dados de um
array. A indexação em arrays NumPy começa do zero e pode ser feita em
múltiplas dimensões. Por exemplo:

Figura 4. Indexação de arrays

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
arr = [Link]([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # Acessa o elemento na primeira linha e segunda coluna (valor 2)

O fatiamento também segue a mesma lógica de listas:

Figura 5. Fatiamento de arrays

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
print(arr[:, 1]) # Acessa todos os elementos da segunda coluna

A flexibilidade e a eficiência na manipulação de arrays tornam o NumPy


uma ferramenta poderosa para qualquer cientista de dados ou programa-
dor que lide com grandes quantidades de informação.

80
Capítulo 2

Compreender essas propriedades básicas dos arrays é essencial para


aproveitar todo o potencial que o NumPy oferece em termos de processa-
mento de dados de alta performance. Na próxima seção, exploraremos as
operações matemáticas e vetoriais que fazem do NumPy uma das bibliote-
cas mais eficientes para cálculos numéricos.

1.2: OPERAÇÕES MATEMÁTICAS E VETORIAIS EM


NUMPY
Uma das maiores vantagens do NumPy em relação às listas e estrutu-
ras nativas do Python é sua capacidade de realizar operações matemáticas
e vetoriais de forma eficiente. Com o NumPy, é possível aplicar operações
matemáticas elementares a arrays inteiros sem a necessidade de loops ex-
plícitos, o que melhora significativamente o desempenho quando trabalha-
mos com grandes volumes de dados.

Operações aritméticas básicas

O NumPy permite realizar operações aritméticas como adição, sub-


tração, multiplicação e divisão diretamente entre arrays ou entre arrays e
escalares. Essas operações são realizadas elemento por elemento, e o re-
sultado é um novo array com o mesmo formato.

81
Capítulo 2

Exemplo:

Figura 6. Operações aritméticas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando arrays
a = [Link]([1, 2, 3])
b = [Link]([4, 5, 6])
# Operações aritméticas
soma = a + b # [5, 7, 9]
subtracao = a - b # [-3, -3, -3]
multiplicacao = a * b # [4, 10, 18]
divisao = a / b # [0.25, 0.4, 0.5]
potencia = a ** 2 # [1, 4, 9]

82
Capítulo 2

# Operações com escalares


dobro = a * 2 # [2, 4, 6]
metade = a / 2 # [0.5, 1, 1.5]
print(soma)
print(subtracao)
print(multiplicacao)
print(divisao)
print(potencia)
print(dobro)
print(metade)

Essas operações são chamadas de vetorizadas, pois o NumPy realiza


as operações diretamente sobre os arrays sem a necessidade de iterar ele-
mento por elemento, o que torna o processo muito mais rápido em compa-
ração com uma implementação tradicional em Python.

Funções matemáticas avançadas

Além das operações básicas, o NumPy oferece diversas funções mate-


máticas avançadas, como exponenciais, logaritmos e funções trigonométri-
cas. Essas funções também são aplicadas elemento por elemento nos arrays.

Exemplo:

Figura 7. Funções matemáticas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

83
Capítulo 2

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
import numpy as np
# Criando um array
a = [Link]([0, [Link] / 2, [Link]])
# Funções trigonométricas
seno = [Link](a) # [0, 1, 0]
cosseno = [Link](a) # [1, 0, -1]
# Funções exponenciais e logaritmos
expo = [Link](a) # [1, 4.81047738, 23.14069263]
logaritmo = [Link]([Link]([1, np.e, np.e**2])) # [0, 1, 2]
print(seno)
print(cosseno)
print(expo)
print(logaritmo)

Essas funções são extremamente úteis em problemas científicos e ma-


temáticos, permitindo cálculos complexos de forma eficiente.

Operações vetoriais e de matrizes

O NumPy também suporta operações vetoriais e matriciais, sendo uma


das bibliotecas mais eficientes para essas tarefas. Uma operação comum é
o produto de matrizes, que pode ser feito usando a função dot() ou o ope-
rador @.

84
Capítulo 2

Exemplo:

Figura 8. Operações vetoriais

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando matrizes
A = [Link]([[1, 2], [3, 4]])
B = [Link]([[5, 6], [7, 8]])
# Produto de matrizes
produto_matriz = [Link](A, B) # ou A @ B
print(produto_matriz) # [[19, 22], [43, 50]]
# Produto escalar (dot product)
v1 = [Link]([1, 2])
v2 = [Link]([3, 4])
produto_escalar = [Link](v1, v2) # 11
print(produto_matriz)
print(produto_escalar)

O produto escalar (dot product) é amplamente utilizado em álgebra


linear e em aplicações de machine learning, e o NumPy oferece uma imple-
mentação altamente otimizada para essa operação.

85
Capítulo 2

Reduções e estatísticas

Além das operações matemáticas, o NumPy oferece funções para re-


duzir arrays a valores únicos, como somar todos os elementos (sum()), en-
contrar o valor máximo (max()) ou calcular a média (mean()).

Exemplo:

Figura 9. Reduções estatísticas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array
a = [Link]([1, 2, 3, 4, 5])
# Operações de redução
soma_total = [Link](a) # 15
maximo = [Link](a) #5
minimo = [Link](a) #1
media = [Link](a) # 3.0
variancia = [Link](a) # 2.0

86
Capítulo 2

desvio_padrao = [Link](a) # 1.41421356237


print(soma_total)
print(maximo)
print(minimo)
print(media)
print(variancia)
print(desvio_padrao)

Essas funções são extremamente úteis para análise de dados, permi-


tindo realizar cálculos estatísticos com arrays de maneira rápida e simples.

Operações lógicas

O NumPy também suporta operações lógicas, que permitem realizar


comparações entre arrays. Essas operações retornam arrays booleanos,
nos quais cada valor indica se a condição foi atendida ou não.

Exemplo:

Figura 10. Operações lógicas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando arrays
a = [Link]([1, 2, 3, 4, 5])

87
Capítulo 2

# Comparações
maior_que_dois = a > 2 # [False, False, True, True, True]
igual_a_tres = a == 3 # [False, False, True, False, False]
# Seleção condicional
selecionados = a[a > 2] # [3, 4, 5]
print(maior_que_dois)
print(igual_a_tres)
print(selecionados)

Essas operações são úteis em casos nos quais é necessário filtrar ou


processar elementos com base em condições lógicas. As operações mate-
máticas e vetoriais no NumPy são extremamente poderosas, permitindo a
execução de cálculos complexos de forma rápida e eficiente. Com suporte
a operações vetorizadas, funções matemáticas avançadas e operações
matriciais, o NumPy se torna uma ferramenta indispensável para qualquer
aplicação que envolva processamento numérico e manipulação de grandes
volumes de dados.

1.3 FUNÇÕES ÚTEIS E MANIPULAÇÃO DE ARRAYS


MULTIDIMENSIONAIS
Além das operações matemáticas e vetoriais, o NumPy oferece uma
vasta gama de funções úteis para a manipulação e transformação de ar-
rays. Essas funções permitem alterar a forma dos arrays, concatenar múl-
tiplos arrays, realizar operações estatísticas e muito mais. Nesta seção,
exploraremos algumas das funções mais usadas para trabalhar com arrays
multidimensionais.

Arrays multidimensionais

Arrays multidimensionais são essenciais para o trabalho com dados


que possuem mais de uma dimensão, como imagens (2D), vídeos (3D) ou
séries temporais. O NumPy facilita a criação e manipulação de arrays com
várias dimensões.

Exemplo de criação de arrays multidimensionais:

88
Capítulo 2

Figura 11. Arrays multidimensionais

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array 2D (matriz)
matriz = [Link]([[1, 2, 3], [4, 5, 6]])
# Criando um array 3D
array_3d = [Link]([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(matriz)
print(array_3d)

Alterando a forma de arrays

O NumPy permite que você altere a forma (shape) de um array sem


alterar seus dados. A função reshape() é uma das mais utilizadas para essa
finalidade, e você pode usá-la para transformar um array unidimensional
em multidimensional ou vice-versa.

89
Capítulo 2

Figura 12. Exemplo de reshape

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array de 1D
array = [Link](12)
# Alterando a forma do array para 3x4
array_reshape = [Link](3, 4)
print(array)
print(array_reshape)

Nesse exemplo, o array unidimensional original é transformado em


uma matriz de 3 linhas e 4 colunas.

Transposição de arrays

A transposição de arrays troca suas linhas por colunas, o que pode ser
feito facilmente com a função transpose() ou usando o atalho .T.

90
Capítulo 2

Figura 13. Exemplo de transposição

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array 2D
array_2d = [Link]([[1, 2, 3], [4, 5, 6]])
# Transpondo o array
transposto = array_2d.T
print(array_2d)
print(transposto)

Concatenando arrays

O NumPy permite combinar múltiplos arrays usando funções como


concatenate(), que pode ser aplicada tanto em arrays unidimensionais
quanto multidimensionais.

91
Capítulo 2

Figura 14. Exemplo de concatenate

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando dois arrays 1D
a = [Link]([1, 2, 3])
b = [Link]([4, 5, 6])
# Concatenando os arrays
concatenado = [Link]((a, b))
# Concatenando arrays 2D ao longo de eixos diferentes
array1 = [Link]([[1, 2], [3, 4]])
array2 = [Link]([[5, 6], [7, 8]])
concatenado_0 = [Link]((array1, array2), axis=0) # concatena nas linhas
concatenado_1 = [Link]((array1, array2), axis=1) # concatena nas colunas
print(concatenado)
print(concatenado_0)
print(concatenado_1)

Nesse exemplo, concatenamos dois arrays unidimensionais e, em se-


guida, concatenamos arrays bidimensionais ao longo de diferentes eixos
(linhas e colunas).

92
Capítulo 2

Dividindo arrays

Assim como é possível concatenar arrays, o NumPy também permite


dividi-los em sub-arrays usando funções como split().

Figura 15. Exemplo de split

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array 1D
array = [Link](10)
# Dividindo o array em 5 partes
dividido = [Link](array, 5)
print(dividido)

Funções estatísticas

O NumPy oferece uma série de funções para realizar cálculos estatísti-


cos em arrays, como somar os elementos, calcular a média, desvio padrão,
entre outros.

93
Capítulo 2

Figura 16. Exemplo de funções estatísticas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array 2D
array_2d = [Link]([[1, 2, 3], [4, 5, 6]])
# Somando os elementos do array
soma = [Link](array_2d)
# Calculando a média
media = [Link](array_2d)
# Encontrando o valor máximo e mínimo
maximo = [Link](array_2d)
minimo = [Link](array_2d)
# Calculando o desvio padrão
desvio_padrao = [Link](array_2d)
print(f”Soma: {soma}”)

94
Capítulo 2

print(f”Média: {media}”)
print(f”Máximo: {maximo}, Mínimo: {minimo}”)
print(f”Desvio Padrão: {desvio_padrao}”)

Essas funções são extremamente úteis em análises de dados, permi-


tindo a obtenção rápida de informações estatísticas sobre um dataset.

Indexação e fatiamento em arrays multidimensionais

Outra característica poderosa do NumPy é a capacidade de realizar


indexação e fatiamento em arrays multidimensionais, permitindo a seleção
de subconjuntos de dados de maneira eficiente.

Figura 17. Exemplo de indexação e fatiamento

Fonte: Elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import numpy as np
# Criando um array 2D
array_2d = [Link]([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Selecionando um elemento específico

95
Capítulo 2

elemento = array_2d[1, 2] # Elemento na linha 1, coluna 2 (valor 6)


# Fatiando a primeira coluna
primeira_coluna = array_2d[:, 0]
# Fatiando as duas primeiras linhas
duas_primeiras_linhas = array_2d[:2, :]
print(f”Elemento selecionado: {elemento}”)
print(f”Primeira coluna: {primeira_coluna}”)
print(f”Duas primeiras linhas:\n{duas_primeiras_linhas}”)

Neste exemplo, selecionamos um elemento específico, uma coluna in-


teira e as duas primeiras linhas de um array bidimensional.

O NumPy oferece uma vasta gama de funções para manipulação de


arrays multidimensionais. Desde a alteração da forma de um array até ope-
rações de transposição, concatenação e divisão, o NumPy simplifica essas
tarefas, tornando o trabalho com dados complexos mais eficiente e intui-
tivo. Além disso, com seu suporte a funções estatísticas e a capacidade de
indexação e fatiamento avançados, ele se torna uma ferramenta poderosa
para análise de dados e cálculos científicos.

96
2
2. INTRODUÇÃO AO PANDAS

O Pandas é uma das bibliotecas mais poderosas e amplamente utiliza-


das em Python para manipulação e análise de dados. Ele oferece estruturas
de dados de alto desempenho, como Series e DataFrames, que permitem
trabalhar com dados de maneira eficiente e intuitiva. Enquanto o NumPy é
focado principalmente em operações numéricas, o Pandas é voltado para
manipulação de dados tabulares, facilitando o trabalho com grandes volu-
mes de informações, incluindo dados estruturados e semiestruturados.

2.1 ESTRUTURAS DE DADOS NO PANDAS: SERIES


E DATAFRAMES
O Pandas oferece duas principais estruturas de dados: Series e Data-
Frames. Cada uma tem suas particularidades e usos específicos.

Series

APROFUNDANDO
Uma Series é uma estrutura de dados unidimensional, semelhante
a um array unidimensional do NumPy, porém com a vantagem de
que cada elemento é associado a um rótulo, chamado de índice.
Isso permite acesso rápido aos dados com base nesses rótulos.

97
Capítulo 2

Figura 18. Exemplo de criação de uma Series

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando uma Series a partir de uma lista
dados = [10, 20, 30, 40]
serie = [Link](dados, index=[‘a’, ‘b’, ‘c’, ‘d’])
print(serie)

No exemplo acima, a Series tem quatro elementos, cada um associado


a um rótulo específico (‘a’, ‘b’, ‘c’, ‘d’). Isso permite acessar os valores pelo
índice, como em um dicionário.

A Series também é muito flexível, podendo armazenar diferentes tipos


de dados, como inteiros, floats ou strings:

98
Capítulo 2

Figura 19. Exemplo de criação de uma Series com diferentes tipos de dados

Fonte: elaboração própria (2024)


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando uma Series com diferentes tipos de dados
dados = [‘banana’, 3.5, 10]
serie = [Link](dados, index=[‘fruta’, ‘preço’, ‘quantidade’])
print(serie)

DataFrames

APROFUNDANDO
O DataFrame é a principal estrutura de dados do Pandas. Ele é bi-
dimensional, semelhante a uma planilha de Excel ou a uma tabe-
la em um banco de dados, em que os dados são organizados em
linhas e colunas. Um DataFrame é composto por múltiplas Series,
em que cada coluna pode conter diferentes tipos de dados.

99
Capítulo 2

Figura 20. Exemplo de criação de um DataFrame

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame a partir de um dicionário
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’],
‘Idade’: [23, 34, 45],
‘Cidade’: [‘São Paulo’, ‘Rio de Janeiro’, ‘Belo Horizonte’]
}
df = [Link](dados)
print(df)

Nesse exemplo, criamos um DataFrame no qual cada chave do dicioná-


rio representa o nome de uma coluna e os valores associados representam
os dados das linhas.

Além de criar um DataFrame a partir de dicionários, também é possível


carregá-lo de fontes externas, como arquivos CSV, bancos de dados SQL ou
até mesmo planilhas Excel, o que faz do Pandas uma ferramenta poderosa
para análise e processamento de dados de várias fontes.

100
Capítulo 2

Figura 21. Exemplo de leitura de um arquivo CSV

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Lendo dados de um arquivo CSV
df = pd.read_csv(‘[Link]’)
print([Link]()) # Mostra as primeiras 5 linhas do DataFrame

ZOOM NO CONHECIMENTO
As estruturas de dados Series e DataFrames formam a base do
Pandas. Enquanto a Series representa dados unidimensionais
com rótulos, o DataFrame oferece uma maneira mais rica de
organizar e manipular dados bidimensionais. Essas estruturas
permitem que o Pandas seja extremamente flexível e eficiente
na manipulação de dados tabulares, possibilitando uma série de
operações que facilitam a análise e o processamento.

2.2 OPERAÇÕES BÁSICAS COM DATAFRAMES


(FILTRAGEM, AGREGAÇÃO E ORDENAÇÃO)
Os DataFrames no Pandas oferecem uma variedade de operações que
facilitam o processamento de dados. Entre as mais comuns estão a filtra-
gem, agregação e ordenação de dados. Essas operações permitem extrair
subconjuntos de dados, realizar cálculos e organizar os dados de maneira
mais conveniente para análise.

101
Capítulo 2

Filtragem de Dados

APROFUNDANDO
A filtragem em DataFrames permite selecionar subconjuntos de
dados com base em condições específicas. Você pode aplicar fil-
tros usando condições lógicas para acessar apenas as linhas que
atendem a determinados critérios.

Figura 22. – Exemplo de filtragem de dados

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, 34, 45, 28],
‘Cidade’: [‘São Paulo’, ‘Rio de Janeiro’, ‘Belo Horizonte’, ‘Curitiba’]
}
df = [Link](dados)
# Filtrando pessoas com idade maior que 30
df_filtrado = df[df[‘Idade’] > 30]
print(df_filtrado)

102
Capítulo 2

APROFUNDANDO
No exemplo acima, estamos filtrando o DataFrame para mostrar ape-
nas as pessoas
A cuja idadepermite
agregação é superior a 30.
aplicar funções matemáticas, como soma,
média ou contagem, a grupos de dados. Isso é útil para resumir
Agregação
ou de Dados
analisar grandes quantidades de informações.

A agregação permite aplicar funções matemáticas, como soma, média


ou contagem, a grupos de dados. Isso é útil para resumir ou analisar gran-
des quantidades de informações.

Figura 23. Exemplo de agregação de dados

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, 34, 45, 28],
‘Salario’: [5000, 8000, 12000, 7500]
}

103
Capítulo 2

df = [Link](dados)
# Calculando a média dos salários
media_salarios = df[‘Salario’].mean()
print(f”Média dos salários: {media_salarios}”)

No exemplo, utilizamos o método .mean() para calcular a média dos


salários no DataFrame.

Ordenação de Dados

APROFUNDANDO
A ordenação é o processo de organizar os dados em uma sequên-
cia específica, como crescente ou decrescente. O Pandas permite
ordenar os dados por uma ou mais colunas.

Figura 24. Exemplo de ordenação de dados

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd

104
Capítulo 2

# Criando um DataFrame
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, 34, 45, 28],
‘Salario’: [5000, 8000, 12000, 7500]
}
df = [Link](dados)
# Ordenando por idade de forma crescente
df_ordenado = df.sort_values(by=’Idade’)
print(df_ordenado)

Nesse exemplo, usamos o método .sort_values() para ordenar o Data-


Frame pela coluna ‘Idade’ em ordem crescente. Você também pode ordenar
em ordem decrescente adicionando o parâmetro ascending=False.

As operações básicas de filtragem, agregação e ordenação em Data-


Frames são ferramentas essenciais para manipular dados no Pandas. Elas
permitem que você extraia subconjuntos de dados, resuma informações
importantes e organize os dados de forma adequada para análise. Essas
funcionalidades tornam o Pandas extremamente eficiente para o tratamento
de grandes volumes de dados, facilitando o trabalho com dados tabulares
em diversos contextos.

2.3 MANIPULAÇÃO DE DADOS FALTANTES E


LIMPEZA DE DADOS
Em muitas situações do mundo real, conjuntos de dados podem conter
valores ausentes ou inconsistências que podem comprometer a análise. O
Pandas oferece várias ferramentas para lidar com dados faltantes e realizar
a limpeza dos dados de maneira eficiente. Esses recursos permitem que
você trate dados ausentes de maneira flexível, dependendo da natureza do
conjunto de dados e das necessidades da análise.

Identificando dados faltantes

No Pandas, os valores faltantes são normalmente representados como


NaN (Not a Number). Para identificar esses valores, você pode usar o méto-
do .isnull(), que retorna um DataFrame de valores booleanos indicando se o
valor está ausente (True) ou presente (False).

105
Capítulo 2

Figura 25. Exemplo de identificação de dados faltantes

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame com valores faltantes
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, None, 45, 28],
‘Cidade’: [‘São Paulo’, None, ‘Belo Horizonte’, ‘Curitiba’]
}
df = [Link](dados)
# Identificando valores faltantes
faltantes = [Link]()
print(faltantes)

O método .isnull() permite visualizar onde os valores faltantes estão


localizados no DataFrame.

Removendo dados faltantes

Se os valores ausentes forem considerados irrelevantes ou insignifican-


tes, uma opção é remover as linhas ou colunas que contêm esses valores. O
método .dropna() remove as linhas ou colunas com qualquer valor ausente.

106
Capítulo 2

Figura 26. Exemplo de remoção de dados faltantes

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame com valores faltantes
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, None, 45, 28],
‘Cidade’: [‘São Paulo’, None, ‘Belo Horizonte’, ‘Curitiba’]
}
df = [Link](dados)
# Removendo linhas com valores faltantes
df_limpo = [Link]()
print(df_limpo)

Nesse exemplo, o método .dropna() remove as linhas que contêm


qualquer valor faltante. O resultado é um DataFrame sem dados ausentes.

Preenchendo dados faltantes

Outra abordagem para lidar com dados ausentes é preencher esses


valores com uma estimativa ou um valor padrão. O método .fillna() permite
substituir os valores NaN por um valor especificado.

107
Capítulo 2

Figura 27. Exemplo de preenchimento de dados faltantes

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame com valores faltantes
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, None, 45, 28],
‘Cidade’: [‘São Paulo’, None, ‘Belo Horizonte’, ‘Curitiba’]
}
df = [Link](dados)
# Preenchendo valores faltantes com um valor padrão
df_preenchido = [Link](‘Desconhecido’)
print(df_preenchido)

Aqui, usamos .fillna() para substituir os valores NaN por ‘Desconheci-


do’. Essa técnica é útil quando a ausência de dados pode ser substituída por
um valor padrão ou uma média, dependendo da análise.

Substituindo dados faltantes com estatísticas

Também é comum substituir dados ausentes por valores calculados,


como a média ou a mediana da coluna, em vez de um valor fixo. Isso pode
ser feito utilizando os métodos de agregação do Pandas junto com o .fillna().

108
Capítulo 2

Figura 28. Exemplo de substituição de dados faltantes com a média

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame com valores faltantes
dados = {
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’],
‘Idade’: [23, None, 45, 28],
‘Cidade’: [‘São Paulo’, None, ‘Belo Horizonte’, ‘Curitiba’]
}
df = [Link](dados)
# Preenchendo valores faltantes na coluna ‘Idade’ com a média
media_idade = df[‘Idade’].mean()
df[‘Idade’] = df[‘Idade’].fillna(media_idade)
print(df)

Nesse exemplo, calculamos a média das idades e a utilizamos para


preencher os valores ausentes na coluna ‘Idade’. Esse tipo de preenchi-
mento pode ajudar a manter a integridade dos dados ao realizar análises
estatísticas.

109
Capítulo 2

A manipulação de dados faltantes e a limpeza de dados são etapas es-


senciais no pré-processamento de qualquer conjunto de dados. O Pandas
oferece métodos eficientes para identificar, remover ou preencher valores
ausentes, permitindo que os dados sejam preparados adequadamente para
a análise. Ao aplicar essas técnicas, você pode melhorar a qualidade dos da-
dos, garantindo que as análises subsequentes sejam precisas e confiáveis.

110
3
3. MANIPULAÇÃO AVANÇADA DE
DADOS NO PANDA

A manipulação avançada de dados é uma etapa essencial em análises


complexas. No Pandas, além das operações básicas, podemos realizar jun-
ções entre diferentes conjuntos de dados, agrupá-los para análises mais
detalhadas e, até mesmo, gerar visualizações diretamente a partir dos da-
dos. Esta seção aborda como realizar junções (merge e concatenação) de
DataFrames, técnicas para agrupamento e agregação, além de explorar as
funcionalidades básicas de visualização de dados no Pandas.

3.1 JUNÇÃO DE DATAFRAMES (MERGE E CONCAT)


Ao trabalhar com múltiplos conjuntos de dados, é comum que você
precise combiná-los de diferentes maneiras. O Pandas oferece duas prin-
cipais formas de realizar a junção de DataFrames: o merge, que combina
DataFrames de maneira semelhante ao funcionamento de um join em ban-
cos de dados, e o concat, que concatena DataFrames ao longo de um eixo
(linha ou coluna).

Merge

O método merge permite combinar dois DataFrames com base em


uma ou mais colunas-chave, semelhante a um join em SQL. Ele suporta di-
ferentes tipos de junções: inner, outer, left e right, permitindo flexibilidade
no modo como os dados são combinados.

111
Capítulo 2

Figura 29. Exemplo de uso do merge

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando dois DataFrames
df1 = [Link]({
‘ID’: [1, 2, 3, 4],
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’, ‘Maria’]
})
df2 = [Link]({
‘ID’: [1, 2, 3, 5],
‘Cidade’: [‘São Paulo’, ‘Curitiba’, ‘Belo Horizonte’, ‘Porto Alegre’]
})
# Realizando um merge usando a coluna ‘ID’ como chave
df_merged = [Link](df1, df2, on=’ID’, how=’inner’)
print(df_merged)

Nesse exemplo, utilizamos o merge para combinar dois DataFrames


com base na coluna ‘ID’. O tipo de junção especificado é o inner, que retorna
apenas as linhas nas quais os valores da chave ‘ID’ coincidem em ambos os
DataFrames. O parâmetro how pode ser alterado para left, right ou outer
para diferentes comportamentos de junção.

112
Capítulo 2

Tipos de junções suportados:

Inner join (how=’ inner’)

Mantém apenas as linhas com valores de chave correspondentes em ambos os


DataFrames.

Left join (how=’left’)

Mantém todas as linhas do DataFrame da esquerda e adiciona os valores cor-


respondentes da direita. Se não houver correspondência, preenche com NaN.

Right join (how=’right’)

Mantém todas as linhas do DataFrame da direita e adiciona os valores corres-


pondentes da esquerda.

Outer join (how=’outer’)

Mantém todas as linhas de ambos os DataFrames, preenchendo os valores


ausentes com NaN.

Concat

O método concat permite concatenar DataFrames ao longo de um


eixo, seja empilhando-os verticalmente (linhas) ou unindo-os horizontal-
mente (colunas). Isso é útil quando você deseja unir conjuntos de dados
que possuem a mesma estrutura ou quando precisa adicionar novas linhas
ou colunas a um DataFrame existente.

113
Capítulo 2

Figura 30. Exemplo de uso do concat

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando dois DataFrames
df1 = [Link]({
‘ID’: [1, 2, 3],
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’]
})
df2 = [Link]({
‘ID’: [4, 5, 6],
‘Nome’: [‘Maria’, ‘João’, ‘Luiza’]
})
# Concatenando os DataFrames verticalmente (eixo 0)
df_concatenado = [Link]([df1, df2], axis=0)
print(df_concatenado)

Nesse exemplo, os dois DataFrames são concatenados verticalmente,


resultando em um novo DataFrame que empilha as linhas de df1 e df2.
O parâmetro axis define o eixo ao longo do qual a concatenação será

114
Capítulo 2

realizada. Se axis=0, a concatenação ocorre ao longo das linhas (empilha-


mento vertical). Se axis=1, os DataFrames são concatenados ao longo das
colunas (união horizontal).

Figura 31. Exemplo de concatenação horizontal

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando dois DataFrames
df1 = [Link]({
‘ID’: [1, 2, 3],
‘Nome’: [‘Ana’, ‘Carlos’, ‘Pedro’]
})
df2 = [Link]({
‘Cidade’: [‘São Paulo’, ‘Curitiba’, ‘Belo Horizonte’],
‘País’: [‘Brasil’, ‘Brasil’, ‘Brasil’]
})
# Concatenando os DataFrames horizontalmente (eixo 1)
df_concatenado_horizontal = [Link]([df1, df2], axis=1)
print(df_concatenado_horizontal)

115
Capítulo 2

Aqui, os dois DataFrames são concatenados ao longo das colunas,


resultando em um novo DataFrame que une as informações lado a lado.
Para a concatenação ser coerente, o número de linhas deve ser o mesmo
em ambos os DataFrames.

A junção e concatenação de DataFrames são operações essenciais para


o processamento de dados em situações nas quais diferentes fontes de
dados precisam ser combinadas. O Pandas oferece ferramentas poderosas
e flexíveis para realizar essas operações, permitindo a integração eficiente
de dados estruturados.

3.2 AGRUPAMENTO E AGREGAÇÃO DE DADOS


O agrupamento e a agregação de dados são processos importantes na
análise de grandes volumes de dados. Esses métodos permitem que você
resuma e analise dados de maneira eficiente, identificando padrões e insi-
ghts de forma mais estruturada. No Pandas, a função groupby é a principal
ferramenta para realizar esses tipos de operações, permitindo agrupar da-
dos com base em uma ou mais colunas e, em seguida, aplicar funções de
agregação como soma, média, contagem, entre outras.

Agrupamento com groupby

A função groupby é utilizada para dividir um DataFrame em grupos


de acordo com os valores de uma ou mais colunas. Após o agrupamento,
podemos aplicar funções de agregação para gerar resumos de cada grupo.

116
Capítulo 2

Figura 32. Exemplo básico de groupby

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pandas as pd
# Criando um DataFrame de exemplo
data = {
‘Produto’: [‘A’, ‘B’, ‘A’, ‘B’, ‘A’, ‘B’],
‘Vendas’: [100, 150, 200, 50, 300, 250],
‘Região’: [‘Norte’, ‘Norte’, ‘Sul’, ‘Sul’, ‘Leste’, ‘Leste’]
}
df = [Link](data)
# Agrupando por ‘Produto’ e calculando a soma das ‘Vendas’
grouped = [Link](‘Produto’).sum()
print(grouped)

No exemplo acima, o DataFrame foi agrupado pela coluna ‘Produto’, e


a soma das colunas numéricas (neste caso, ‘Vendas’) foi calculada para cada
grupo. O Pandas realiza automaticamente a agregação em todas as colunas
numéricas após o agrupamento.

Aplicando funções de agregação

Depois de agrupar os dados, você pode aplicar diferentes funções de


agregação para obter estatísticas ou resumos dos grupos. As funções mais
comuns incluem:

117
Capítulo 2

Sum()

Soma os valores de cada grupo.

Mean()

Calcula a média dos valores de cada grupo.

Count()

Conta o número de elementos em cada grupo.

Min() e max()

Encontram os valores mínimo e máximo de cada grupo.

Figura 33. Exemplo de diferentes funções de agregação

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Agrupando por ‘Produto’ e calculando várias funções de agregação
grouped_stats = [Link](‘Produto’).agg({
‘Vendas’: [‘sum’, ‘mean’, ‘count’]

118
Capítulo 2

})
print(grouped_stats)

Neste exemplo, usamos o método agg() para aplicar múltiplas funções


de agregação à coluna ‘Vendas’. Para cada produto, ele calcula a soma, a
média e a contagem das vendas.

Agrupamento por múltiplas colunas

Também é possível agrupar os dados por mais de uma coluna, permi-


tindo realizar análises mais detalhadas e específicas.

Figura 34. Exemplo de agrupamento por múltiplas colunas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Agrupando por ‘Produto’ e ‘Região’ e calculando a soma das ‘Vendas’
grouped_multi = [Link]([‘Produto’, ‘Região’]).sum()
print(grouped_multi)

Aqui, o DataFrame foi agrupado primeiro por ‘Produto’ e, dentro de


cada produto, pelos valores da coluna ‘Região’. A soma das vendas foi calcu-
lada para cada combinação de produto e região.

Função transform e agrupamento

Além de agregar dados, o Pandas permite aplicar transformações a


cada grupo individualmente, sem necessariamente reduzir o DataFrame
para um conjunto de resumos. Isso é feito com a função transform.

119
Capítulo 2

Figura 35. Exemplo de uso de transform

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Calculando a média das vendas para cada produto e subtraindo-a de cada valor
df[‘Vendas_Ajustadas’] = [Link](‘Produto’)[‘Vendas’].transform(lambda x: x - [Link]())
print(df)

Neste caso, para cada grupo de produtos, calculamos a média das


vendas e subtraímos esse valor de cada entrada individual. O resultado é
armazenado em uma nova coluna chamada ‘Vendas_Ajustadas’.

Agrupamento com funções personalizadas

Se as funções de agregação padrão não são suficientes, você pode


aplicar funções personalizadas durante o processo de agregação. O Pandas
facilita isso através da aplicação de funções definidas pelo usuário.

Figura 36. Exemplo de função personalizada

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:

120
Capítulo 2

# Definindo uma função que calcula o intervalo (máximo - mínimo)


def range_func(x):
return [Link]() - [Link]()
# Agrupando por ‘Produto’ e aplicando a função personalizada nas vendas
grouped_custom = [Link](‘Produto’)[‘Vendas’].agg(range_func)
print(grouped_custom)

Aqui, criamos uma função personalizada chamada range_func, que


calcula a diferença entre o valor máximo e o valor mínimo de um grupo.
Aplicamos essa função à coluna ‘Vendas’ de cada grupo de produto.

O agrupamento e a agregação de dados são ferramentas poderosas


para a análise de grandes volumes de dados. Usando o método groupby do
Pandas, você pode dividir seu conjunto de dados em grupos significativos
e aplicar funções de agregação e transformações para obter insights valio-
sos. O Pandas oferece uma ampla flexibilidade para aplicar tanto funções
predefinidas quanto personalizadas, tornando-o uma ferramenta essencial
para qualquer cientista de dados.

3.3 VISUALIZAÇÃO DE DADOS COM PANDAS


(GRÁFICOS BÁSICOS)
A visualização de dados é uma parte essencial da análise, pois facilita a
interpretação de padrões, tendências e insights de maneira visual. O Pandas
integra funcionalidades para criar gráficos simples, usando internamente a
biblioteca Matplotlib. Com o Pandas, é possível gerar gráficos diretamente
a partir de DataFrames ou Series com poucos comandos.

Configurando o Matplotlib

Para garantir que os gráficos sejam exibidos corretamente, é importan-


te importar a biblioteca Matplotlib. Embora o Pandas utilize a Matplotlib in-
ternamente, precisamos explicitamente configurá-la para exibir os gráficos.

121
Capítulo 2

Figura 37. Importação do Pandas e Matplotlib

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro.
No canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geral-
mente representam os botões de fechar, minimizar e maximizar de uma janela de software.
O código apresentado na imagem é:
import pandas as pd
import [Link] as plt

Depois de configurar a Matplotlib, estamos prontos para criar gráficos


diretamente a partir dos nossos dados.

Gráfico de linhas

O gráfico de linhas é uma das representações mais comuns de dados


temporais ou contínuos. O Pandas permite criar gráficos de linhas com o
método plot() aplicado a um DataFrame ou Series.

Figura 38 .Exemplo de gráfico de linhas

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No

122
Capítulo 2

canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Criando um DataFrame de exemplo
data = {
‘Mês’: [‘Jan’, ‘Fev’, ‘Mar’, ‘Abr’, ‘Mai’, ‘Jun’],
‘Vendas’: [200, 220, 250, 270, 300, 330]
}
df = [Link](data)
# Definindo o índice como a coluna ‘Mês’
df.set_index(‘Mês’, inplace=True)
# Gerando o gráfico de linha para a coluna ‘Vendas’
df[‘Vendas’].plot(kind=’line’, title=’Vendas Mensais’)
[Link](‘Vendas’)
[Link]()

Neste exemplo, o gráfico de linhas exibe a evolução das vendas ao lon-


go dos meses. O método plot() cria o gráfico, e [Link]() exibe o gráfico na
tela.

Gráfico de barras

Os gráficos de barras são úteis para comparar diferentes categorias. O


Pandas permite criar gráficos de barras verticais e horizontais utilizando o
mesmo método plot(), com o argumento kind=’bar’ para barras verticais e
kind=’barh’ para barras horizontais.

Figura 39. Exemplo de gráfico de barras

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Gerando um gráfico de barras para as vendas
df[‘Vendas’].plot(kind=’bar’, title=’Vendas Mensais’)
[Link](‘Vendas’)
[Link]()

123
Capítulo 2

Figura 40. Exemplo de gráfico de barras horizontais

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Gerando um gráfico de barras horizontais para as vendas
df[‘Vendas’].plot(kind=’barh’, title=’Vendas Mensais’)
[Link](‘Vendas’)
[Link]()

Gráfico de pizza

Os gráficos de pizza são utilizados para mostrar a proporção que cada


categoria representa em relação ao total. No Pandas, esse tipo de gráfico
pode ser gerado utilizando kind=’pie’.

Figura 41. Exemplo de gráfico de pizza

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Gerando um gráfico de pizza para as vendas
df[‘Vendas’].plot(kind=’pie’, autopct=’%1.1f%%’, title=’Distribuição de Vendas’)
[Link](‘’) # Remove o rótulo do eixo Y
[Link]()

124
Capítulo 2

O argumento autopct=’%1.1f%%’ adiciona os valores percentuais ao


gráfico, facilitando a interpretação.

Gráfico de dispersão

Gráficos de dispersão são usados para observar a relação entre duas


variáveis. O Pandas permite criar gráficos de dispersão utilizando o método
[Link]().

Figura 42. Exemplo de gráfico de dispersão

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Criando um DataFrame de exemplo com duas variáveis
data = {
‘Tamanho da Loja (m²)’: [50, 100, 150, 200, 250],
‘Vendas’: [100, 200, 300, 400, 500]
}
df = [Link](data)
# Gerando um gráfico de dispersão
[Link](x=’Tamanho da Loja (m²)’, y=’Vendas’, title=’Relação entre Tamanho da Loja e Vendas’)
[Link]()

Neste exemplo, o gráfico de dispersão mostra a relação entre o tama-


nho da loja e as vendas, permitindo observar se há uma correlação entre
essas variáveis.

Histograma

Um histograma mostra a distribuição de uma variável ao longo de di-


ferentes intervalos. É útil para entender a frequência de diferentes valores
em um conjunto de dados.

125
Capítulo 2

Figura 43. Exemplo de histograma

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Criando um DataFrame de exemplo com dados aleatórios
import numpy as np
data = {
‘Vendas’: [Link](50, 500, size=100)
}
df = [Link](data)
# Gerando um histograma
df[‘Vendas’].plot(kind=’hist’, bins=10, title=’Distribuição de Vendas’)
[Link](‘Vendas’)
[Link]()

No exemplo acima, o histograma mostra a distribuição das vendas em


diferentes faixas de valores. O parâmetro bins define o número de interva-
los no gráfico.

O Pandas, em conjunto com a Matplotlib, oferece uma maneira simples


e rápida de criar gráficos básicos para visualizar dados. Embora existam
bibliotecas mais especializadas para visualizações avançadas, como o Sea-
born, a capacidade nativa do Pandas é suficiente para muitas necessidades
analíticas. Seja para gráficos de linhas, barras, pizza ou dispersão, o Pandas
fornece uma interface intuitiva para gerar gráficos informativos diretamen-
te a partir de DataFrames e Series.

126
Capítulo 2

PLAY NO CONHECIMENTO
Clique aqui e confira o vídeo sobre manipulação de
Dados com NumPy e Pandas.

À medida que nos aproximamos do final deste conteúdo, é importante


refletir sobre como tudo o que você aprendeu até agora se conecta com
o ambiente profissional que você encontrará em breve. NumPy e Pandas,
as duas ferramentas que exploramos, são amplamente usadas em pratica-
mente todas as indústrias que lidam com grandes volumes de dados. Quer
você trabalhe em uma startup de tecnologia, uma empresa de e-commerce,
ou até mesmo no setor financeiro, a manipulação de dados é uma habilida-
de essencial. No mercado atual, os profissionais que conseguem transfor-
mar dados brutos em insights valiosos estão em alta demanda.

Quando você começou esta jornada, falamos sobre a importância de


lidar com grandes volumes de dados e como ferramentas eficientes po-
dem acelerar esse processo. Agora, você está equipado para aplicar essas
técnicas na prática. Você aprendeu a organizar, limpar e preparar dados,
habilidades que são cruciais quando se trata de construir modelos de ma-
chine learning, gerar relatórios para tomadas de decisão ou até mesmo oti-
mizar processos operacionais. No mercado de trabalho, esses são os tipos
de desafios que você enfrentará, e saber utilizar bibliotecas como NumPy e
Pandas vai colocá-lo à frente da concorrência.

Ao longo da leitura, você percebeu que a teoria e a prática se entrela-


çam constantemente. A matemática que sustenta o NumPy, por exemplo,
está diretamente ligada às otimizações que você fará no seu dia a dia, es-
pecialmente ao trabalhar com grandes volumes de dados. Já no Pandas, a
organização de DataFrames e a limpeza de dados refletem a necessidade
do mundo real de lidar com informações fragmentadas, de fontes diferen-
tes, que precisam ser integradas para gerar insights úteis. O mercado exige
não apenas habilidades técnicas, mas também a capacidade de interpretar
esses dados e tomar decisões com base neles.

Para facilitar sua transição para o mercado de trabalho, as situações


que você experimentou aqui são apenas o começo. A resolução de pro-
blemas envolvendo arrays, a organização de DataFrames e a visualização
de dados são partes fundamentais do que você encontrará em seu futuro
profissional. Cada novo desafio será uma oportunidade de aplicar os conhe-
cimentos adquiridos aqui, adaptando-os a diferentes contextos e setores.
Com isso em mente, ao encarar novos projetos ou entrevistas de emprego,

127
NOVOS DESAFIOS

você pode falar com confiança sobre suas habilidades com NumPy e
Pandas, sabendo que possui uma base sólida para seguir em frente.

Agora, para ajudá-lo a avaliar seu progresso, temos algumas


questões de autoavaliação que o ajudarão a refletir sobre seu de-
sempenho neste tema.

1. Durante a análise de grandes conjuntos de dados, mui-


tas vezes os profissionais de ciência de dados utilizam o
NumPy para realizar operações matemáticas e manipular
dados de forma eficiente. Imagine que você está traba-
lhando em um projeto no qual precisa lidar com um con-
junto de dados que representa medições de temperatura
em diferentes locais. Qual das seguintes características
não é uma propriedade dos arrays do NumPy que você
deve considerar ao usar essa biblioteca?

a. Podem ser multidimensionais.


b. Permitem operações matemáticas de forma vetorial.
c. São limitados a valores numéricos inteiros.
d. Possuem um tipo de dado homogêneo.
e. São automaticamente compatíveis com objetos do tipo
DataFrame do Pandas sem conversões.

2. Ao lidar com um DataFrame no Pandas, é comum en-


contrar valores ausentes que podem afetar a análise dos
dados. Suponha que você esteja avaliando um conjunto de

128
Capítulo 2

dados de vendas em que algumas transações não possuem


informações sobre o preço. Qual dos seguintes métodos
você utilizaria para lidar com esses valores ausentes de
maneira eficaz?

a. merge().
b. fillna().
c. concat().
d. drop().
e. pivot().

3. Ao analisar dados de vendas por categoria em um


DataFrame do Pandas, você deseja entender melhor como
as vendas variam entre diferentes categorias de produtos.
Para isso, você decide agrupar os dados e calcular a soma
total das vendas em cada categoria. Qual é a principal
vantagem de usar o método groupby() na análise de dados
para atingir esse objetivo?

a. Permite a manipulação direta de arrays.


b. Facilita a visualização de dados em gráficos.

129
ATIVIDADES

c. Possibilita a aplicação de funções de agregação a diferentes ca-


tegorias de dados.
d. Acelera o processo de leitura de arquivos CSV.
e. Permite filtrar dados por valores únicos sem realizar cálculos
adicionais.

NETTO, Amilcar; MACIEL, Francisco. Python para Data Science: e Machine


Learning Descomplicado. Rio de Janeiro: Alta Books, 2021. 384 p.

MCKINNEY, Wes. Python for Data Analysis: Data Wrangling with Pandas,
NumPy, and IPython. 2. ed. Sebastopol: O’Reilly Media, 2017.

MULLER, Andreas C.; GUIDO, Sarah. Introduction to Machine Learning


with Python: A Guide for Data Scientists. Sebastopol: O’Reilly Media, 2016.

OLIPHANT, Travis E. Guide to NumPy. 2. ed. USA: CreateSpace Independent


Publishing Platform, 2015.

VANDERPLAS, Jake. Python Data Science Handbook: Essential Tools for


Working with Data. Sebastopol: O’Reilly Media, 2016.

RASCHKA, Sebastian; MIRJALILI, Vahid. Python Machine Learning: Machi-


ne Learning and Deep Learning with Python, Scikit-learn, and Tensor-
Flow 2. 4. ed. Birmingham: Packt Publishing, 2023.

130
Capítulo 2

KOZA, Giovanni; SMITH, Michael. Hands-On Machine Learning with Sciki-


t-Learn, Keras, and TensorFlow. 3. ed. Sebastopol: O’Reilly Media, 2023.

HEARTY, John. Advanced Machine Learning with Python. 2. ed. Birming-


ham: Packt Publishing, 2023.

131
REFERÊNCIAS

132
CAPÍTULO 3
INTRODUÇÃO AO MACHINE
LEARNING COM SCIKIT-LEARN

MINHAS METAS
• Compreender o fluxo básico de um projeto de machine learning.

• Aplicar técnicas de pré-processamento de dados com Scikit-Learn.

• Implementar modelos de aprendizado supervisionado, como re-


gressão linear e classificação.

• Avaliar o desempenho de modelos utilizando métricas adequadas.

• Aplicar técnicas de validação cruzada.

• Utilizar pipelines para automatizar processos de machine learning.

• Salvar e carregar modelos treinados.

133
INICIE SUA JORNADA

Imagine que você trabalha em uma clínica médica que atende milhares
de pacientes mensalmente. Com o avanço tecnológico, seus supervisores
buscam melhorar o atendimento, tornando o diagnóstico mais rápido e
preciso. Eles têm acesso a um grande volume de dados sobre a saúde dos
pacientes e agora você foi encarregado de encontrar uma maneira de usar
essas informações para prever doenças durante as consultas. O objetivo é
transformar esses dados em algo útil para otimizar o trabalho dos médicos
e melhorar os diagnósticos e tratamentos.

A resolução desse problema traria grandes benefícios, reduzindo a car-


ga de trabalho dos médicos e aumentando a precisão dos diagnósticos. Um
sistema de machine learning pode analisar padrões nos dados de saúde e
sugerir diagnósticos baseados em histórico e sintomas, salvando vidas e
otimizando o tempo de atendimento. Para você, como futuro especialista,
dominar essas ferramentas é fundamental para se destacar no mercado e
enfrentar desafios complexos.

Ao receber os dados de centenas de pacientes contendo informações


como idade, histórico médico e resultados de exames, você pode usar ma-
chine learning para criar um modelo que prevê a probabilidade de uma
doença. Utilizando ferramentas como Scikit-Learn, seria possível pré-pro-
cessar esses dados, treinar modelos, e identificar padrões para fazer previ-
sões precisas. Neste processo, você aprimora suas habilidades técnicas e se
prepara para resolver problemas reais, como previsão de vendas ou análise
de comportamento de clientes, além de automatizar decisões em sistemas
financeiros.

Essa jornada no aprendizado de machine learning é o início para do-


minar ferramentas poderosas que podem transformar diferentes áreas. O

134
Capítulo 3

potencial é enorme, e você pode começar agora, explorando todas essas


oportunidades.

VAMOS RECORDAR?
O que é Maching learning? Vamos recordar? Clique aqui e confira!

Clique aqui e confira um podcast sobre os Princi-


pais Desafios no Treinamento de Modelos de Ma-
chine Learning.

135
1
DESENVOLVA SEU POTENCIAL
1. FUNDAMENTOS DE MACHINE
LEARNING

EM FOCO
Clique aqui e assista aqui um vídeo sobre a temática.

Agora que você teve um primeiro contato com machine learning, é


hora de aprofundar os conceitos que apoiarão seu desenvolvimento como
futuro desenvolvedor. Machine learning envolve a criação de algoritmos
que aprendem com dados para fazer previsões ou tomar decisões, e há di-
ferentes tipos de aprendizado, como o supervisionado, não supervisionado
e por reforço. Compreender essas abordagens é essencial para saber qual
delas aplicar conforme o problema que precisa ser resolvido.

O aprendizado supervisionado é útil quando você tem dados etiqueta-


dos, como históricos de vendas, e deseja fazer previsões. Já o aprendizado
não supervisionado é utilizado quando você deseja explorar dados sem sa-
ber exatamente o que está procurando, como ao agrupar informações. O
desenvolvimento de uma solução de machine learning vai além de aplicar
um algoritmo; envolve um fluxo de trabalho que começa com a coleta de
dados, passa pela sua preparação, e culmina na avaliação do modelo. A
limpeza e organização dos dados, que podem ser automatizadas com pipe-
lines, são etapas cruciais, pois dados mal processados resultam em previ-
sões imprecisas.

O pré-processamento de dados é fundamental para lidar com infor-


mações incompletas ou inconsistentes. Usando ferramentas como Pandas,
você aprenderá a corrigir e normalizar esses dados. A escolha das métricas
de avaliação corretas, como acurácia, precisão e recall, garantirá que seu
modelo seja eficaz. Modelos supervisionados populares, como Regressão

136
Capítulo 3

Linear e KNN, são amplamente aplicáveis no dia a dia de um desenvolvedor.


Por exemplo, você pode usar esses modelos para criar sistemas que suge-
rem novos produtos para usuários com base em comportamentos anterio-
res, utilizando Scikit-Learn para implementar essas soluções.

Machine learning é uma subárea da inteligência artificial que se con-


centra no desenvolvimento de algoritmos e modelos que permitem que
os computadores aprendam a partir de dados. Essa aprendizagem pode
ocorrer de diversas maneiras, dependendo do tipo de problema e da natu-
reza dos dados disponíveis. Os principais tipos de aprendizado em machine
learning incluem o aprendizado supervisionado, não supervisionado e por
reforço, cada um com suas características e aplicações específicas, que se-
rão explorados a seguir.

3.1 DEFINIÇÃO DE MACHINE LEARNING E TIPOS


DE APRENDIZADO
Machine learning (ML) é uma subárea da inteligência artificial que foca
no desenvolvimento de algoritmos e técnicas que permitem aos sistemas
computacionais aprenderem a partir de dados. Ao invés de serem explicita-
mente programados com instruções detalhadas para executar tarefas espe-
cíficas, os modelos de ML utilizam dados históricos para identificar padrões,
tomar decisões ou fazer previsões de forma autônoma. Em termos simples,
machine learning permite que as máquinas melhorem seu desempenho à
medida que recebem mais informações.

A principal ideia por trás do machine learning é permitir que os siste-


mas façam previsões ou inferências baseadas em dados de treinamento,
ajustando automaticamente seu comportamento para melhorar os resul-
tados ao longo do tempo. Isso é especialmente útil em cenários em que as
regras ou padrões são complexos demais para serem definidos de maneira
precisa, mas em locais em que grandes volumes de dados oferecem infor-
mações suficientes para que o sistema “aprenda”.

Existem três principais tipos de aprendizado em machine learning:


supervisionado, não supervisionado e por reforço, cada um adequado a
diferentes cenários.

137
Capítulo 3

Aprendizado supervisionado

Neste método, o modelo é treinado com dados rotulados, aprendendo a ma-


pear entradas para saídas corretas. Após o treinamento, pode prever saídas
para novos dados. Exemplos de algoritmos incluem regressão linear, k-Nearest
Neighbors (KNN) e Support Vector Machines (SVM), com aplicações em previ-
sões financeiras, diagnósticos médicos e classificação de imagens.

Aprendizado não supervisionado

Diferentemente do aprendizado supervisionado, aqui os dados não são ro-


tulados, e o modelo identifica padrões ou relações sem orientação. É usado
em tarefas de agrupamento, como K-means, e redução de dimensionalidade,
mantendo as características mais relevantes dos dados.

Aprendizado por reforço

Neste tipo, o modelo interage com o ambiente, aprendendo por tentativa e


erro, recebendo recompensas ou penalidades. O objetivo é maximizar a re-
compensa ao longo do tempo, sendo útil em áreas como jogos, controle de ro-
bôs e sistemas de recomendação. Ao contrário dos outros métodos, não exige
dados rotulados, mas sim uma definição clara de recompensa.

Diferenças fundamentais entre os tipos de aprendizado

• Supervisionado vs. não supervisionado: A principal diferença


entre aprendizado supervisionado e não supervisionado reside no
fato de que, no primeiro, o modelo tem acesso a rótulos corretos
durante o treinamento, enquanto no segundo, o modelo precisa in-
ferir padrões sem informações sobre as respostas corretas.

138
Capítulo 3

• Aprendizado por reforço: Esse tipo de aprendizado difere dos ou-


tros dois por ser orientado a ações e recompensas, e geralmente
é empregado em cenários em que a interação contínua com o am-
biente é necessária, como controle de robôs ou jogos complexos.

Esses três paradigmas formam a base do machine learning, cada um


adequado a diferentes tipos de problemas e tipos de dados. Para escolher o
tipo de aprendizado apropriado, é necessário considerar as características
do conjunto de dados e os objetivos do projeto.

3.2 O FLUXO DE TRABALHO DE UM PROJETO DE


MACHINE LEARNING
O processo de criação e implementação de um modelo de machine
learning segue um fluxo de trabalho bem estruturado, que pode ser divi-
dido em várias etapas. Esse fluxo ajuda a garantir que o modelo final seja
robusto, eficiente e capaz de gerar insights precisos a partir dos dados. Em-
bora cada projeto possa ter variações dependendo do contexto e da área
de aplicação, os principais passos de um fluxo de trabalho típico de machine
learning são os seguintes:

1. Definição do problema

A primeira etapa em qualquer projeto de machine learning é entender


e definir claramente o problema que se deseja resolver. Isso envolve a iden-
tificação de metas e perguntas-chave, como:

• Qual é o objetivo do projeto? Previsão, classificação, recomendação


etc.?

• Qual será a métrica de sucesso?

• Quais dados estão disponíveis ou podem ser coletados para ajudar


a resolver o problema?

2. Coleta e preparação de dados

A qualidade dos dados é fundamental para o sucesso de qualquer


projeto de machine learning. Nesta etapa, são coletados os dados que o
modelo irá utilizar. Isso pode envolver fontes internas (bancos de dados da
empresa) ou externas (APIs, dados públicos etc.).

139
Capítulo 3

Após a coleta, é necessário preparar os dados para o uso. Isso pode


incluir:

• Limpeza de dados: Remoção ou correção de dados ausentes, in-


consistentes ou errados.

• Transformação de dados: Conversão de variáveis categóricas em


numéricas, normalização e escalonamento dos dados, entre outras
transformações.

• Criação de novas features (engenharia de features): Às vezes,


criar atributos (features) a partir dos dados existentes pode melho-
rar o desempenho do modelo.

Essa etapa de preparação dos dados é uma das mais demoradas em


todo o processo, pois exige um trabalho cuidadoso para garantir que os
dados estejam prontos para serem processados pelo modelo.

3. Divisão dos dados em conjuntos de treinamento e teste

Uma prática comum em machine learning é dividir os dados em dois


ou três conjuntos:

• Conjunto de treinamento: Usado para treinar o modelo.

• Conjunto de teste (ou validação): Usado para avaliar o desempe-


nho do modelo em dados que ele ainda não viu.

A divisão dos dados em treinamento e teste é importante para garantir


que o modelo não apenas memorize os dados de treinamento, mas tam-
bém consiga generalizar bem para novos dados. Uma boa regra prática é
utilizar 70-80% dos dados para o treinamento e 20-30% para o teste.

4. Escolha do modelo e treinamento

Com os dados preparados e divididos, o próximo passo é escolher um


algoritmo de machine learning adequado para o problema. A escolha do
modelo depende da natureza do problema:

• Para problemas de regressão, em que se deseja prever um valor


contínuo (por exemplo, o preço de uma casa), modelos como a re-
gressão linear ou árvores de decisão podem ser usados.

140
Capítulo 3

• Para problemas de classificação, em que o objetivo é classificar as


entradas em categorias (por exemplo, classificar e-mails como spam
ou não spam), algoritmos como K-Nearest Neighbors (KNN), Su-
pport Vector Machines (SVM) ou redes neurais são comumente
utilizados.

Após a escolha do algoritmo, o modelo é treinado utilizando o conjunto


de dados de treinamento. Durante o treinamento, o modelo ajusta seus
parâmetros internos para minimizar o erro nas previsões.

5. Avaliação do modelo

Depois de treinar o modelo, é essencial avaliar seu desempenho. Isso


é feito aplicando o modelo aos dados de teste, que o modelo ainda não viu.
Algumas métricas comuns para avaliar o desempenho de um modelo são
acurácia, precisão e recall e erro quadrático médio (MSE).

Nessa etapa, também é importante verificar se o modelo está sofrendo


de overfitting (quando o modelo aprende muito bem os dados de treina-
mento, mas tem dificuldade em generalizar para novos dados).

6. Ajuste de hiperparâmetros e melhorias

Se o desempenho inicial do modelo não for satisfatório, ajustes adicio-


nais podem ser feitos. Uma maneira comum de melhorar o desempenho
do modelo é ajustar os hiperparâmetros, que são configurações do mode-
lo que não são ajustadas durante o treinamento (como a profundidade de
uma árvore de decisão ou o número de vizinhos no KNN).

7. Validação cruzada

A validação cruzada é uma técnica importante para garantir que o mo-


delo generaliza bem. Nessa técnica, os dados são divididos em vários sub-
conjuntos (ou “folds”) e o modelo é treinado várias vezes, cada vez usando
um subconjunto diferente como dados de teste. Isso ajuda a evitar proble-
mas com uma divisão específica dos dados de treinamento e teste.

8. Implementação e monitoramento

Após a validação e ajuste do modelo, ele pode ser implementado em


um ambiente de produção. Isso pode envolver o desenvolvimento de uma
API que permita que o modelo seja acessado por outros sistemas, ou a
incorporação do modelo em uma aplicação já existente.

141
Capítulo 3

Mesmo após a implementação, é importante monitorar o desempe-


nho do modelo ao longo do tempo. Modelos de machine learning podem
degradar se os dados mudarem significativamente (um fenômeno conheci-
do como drift de dados). Portanto, o monitoramento contínuo e a eventual
re-treinamento do modelo podem ser necessários.

9. Atualização contínua

O ciclo de vida de um modelo de machine learning não termina com


sua implementação. Conforme novos dados são gerados, o modelo pode
ser re-treinado periodicamente para incorporar novas informações e me-
lhorar seu desempenho.

3.3 PRÉ-PROCESSAMENTO DE DADOS COM


SCIKIT-LEARN
O pré-processamento de dados é uma etapa fundamental em projetos
de machine learning, pois garante que os dados estejam no formato corre-
to para serem utilizados pelos algoritmos de aprendizado. Dados do mun-
do real raramente vêm prontos para uso imediato: podem conter valores
ausentes, características em diferentes escalas ou precisar de conversão
para formatos compatíveis com os modelos de machine learning. O Scikit-
-Learn, uma das bibliotecas mais populares para aprendizado de máquina
em Python, oferece uma variedade de ferramentas para o pré-processa-
mento de dados.

1. Tratamento de dados faltantes

Em muitos casos, os conjuntos de dados contêm valores ausentes (mis-


sing values). Esses dados faltantes podem comprometer o desempenho do
modelo, pois a maioria dos algoritmos de machine learning não sabe como
lidar com valores nulos. Existem diversas abordagens para tratar esse pro-
blema, como remover os dados faltantes ou preenchê-los com um valor
apropriado (imputação).

142
Capítulo 3

Com o Scikit-Learn, é possível utilizar o objeto SimpleImputer para li-


dar com dados faltantes de maneira eficiente. Algumas das estratégias mais
comuns incluem:

Preenchimento com a média Preenchimento com a mediana

Usado para variáveis numéricas. Também usado para variáveis nu-


méricas, especialmente se os da-
dos estiverem enviesados.

Preenchimento com a moda

Utilizado para variáveis categó-


ricas, substituindo os valores
ausentes pela categoria mais
frequente.

Figura 1. Exemplo de código com SimpleImputer

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

143
Capítulo 3

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
from [Link] import SimpleImputer
import numpy as np
import pandas as pd
# Exemplo de conjunto de dados com valores ausentes
dados = [Link]({
‘idade’: [25, [Link], 35, 40, [Link]],
‘salario’: [50000, 60000, [Link], 80000, 75000]
})
# Imputação dos valores ausentes com a média
imputer = SimpleImputer(strategy=’mean’)
dados_imputados = imputer.fit_transform(dados)
print(dados_imputados)

Neste exemplo, o SimpleImputer preenche os valores ausentes da


coluna idade e salário com a média dos valores existentes.

2. Escalonamento e normalização de dados

Muitos algoritmos de machine learning, especialmente aqueles basea-


dos em distância (como K-Nearest Neighbors e Support Vector Machi-
nes), são sensíveis à escala dos dados. Se os atributos têm magnitudes dife-
rentes, isso pode afetar o desempenho do modelo. Por exemplo, variáveis
com valores muito maiores podem dominar o comportamento do modelo,
enquanto variáveis menores podem ser negligenciadas.

As técnicas mais comuns para ajustar as escalas dos dados são:

• Normalização: Escalona os dados de forma que cada valor esteja


entre 0 e 1.

• Padronização (Standardization): Centraliza os dados em torno de


uma média de 0 e com desvio padrão 1. Essa técnica é útil quando
os dados seguem uma distribuição normal.

144
Capítulo 3

O Scikit-Learn oferece o objeto StandardScaler para padronizar os da-


dos e MinMaxScaler para normalização.

Figura 2. Exemplo de escalonamento com o StandardScaler

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from [Link] import StandardScaler
# Conjunto de dados
dados = [Link]({
‘altura’: [1.70, 1.75, 1.80, 1.65, 1.60],
‘peso’: [65, 70, 80, 60, 55]
})
# Padronizando os dados
scaler = StandardScaler()
dados_escalonados = scaler.fit_transform(dados)
print(dados_escalonados)

Neste exemplo, os dados de altura e peso são escalonados para uma


média de 0 e um desvio padrão de 1, garantindo que ambos os atributos
sejam tratados de forma equilibrada.

3. Codificação de variáveis categóricas

Muitas vezes, os dados incluem variáveis categóricas, como gênero ou


estado civil, que precisam ser convertidas em uma representação numérica

145
Capítulo 3

antes de serem usadas pelos algoritmos de machine learning. Duas das


abordagens mais comuns são:

• Label Encoding: Atribui um número inteiro para cada categoria.


Isso pode ser problemático para variáveis que não têm uma ordem
natural entre os valores.

• One-Hot Encoding: Cria uma coluna binária separada para cada ca-
tegoria. Cada coluna indica se um registro pertence ou não àquela
categoria.

O Scikit-Learn oferece a função OneHotEncoder para realizar o One-


-Hot Encoding, que é amplamente utilizado porque evita atribuir um peso
arbitrário às categorias.

Figura 3. Exemplo de One-Hot Encoding com Scikit-Learn

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from [Link] import OneHotEncoder
# Exemplo de dados categóricos
dados = [Link]({
‘cidade’: [‘São Paulo’, ‘Rio de Janeiro’, ‘São Paulo’, ‘Belo Horizonte’]
})
# One-Hot Encoding
encoder = OneHotEncoder(sparse=False)
dados_encoded = encoder.fit_transform(dados)
print(dados_encoded)

146
Capítulo 3

Nesse exemplo, a variável cidade é transformada em três colunas, cada


uma representando uma cidade, com valores 1 ou 0 indicando a presença
ou ausência de cada cidade no registro.

4. Divisão do conjunto de dados (Train-Test Split)

Uma prática comum no pré-processamento é dividir o conjunto de da-


dos em dois subconjuntos: conjunto de treinamento e conjunto de tes-
te. O conjunto de treinamento é usado para treinar o modelo, enquanto o
conjunto de teste é reservado para avaliar seu desempenho em dados que
ele não viu durante o treinamento. O Scikit-Learn oferece a função train_
test_split para realizar essa divisão de forma aleatória e eficiente.

Figura 4. Exemplo de divisão de dados

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from sklearn.model_selection import train_test_split
# Exemplo de conjunto de dados
X = [[1, 2], [3, 4], [5, 6], [7, 8]]
y = [0, 1, 0, 1]
# Dividindo os dados em 75% para treinamento e 25% para teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
print(“Treinamento:”, X_train, y_train)
print(“Teste:”, X_test, y_test)

Aqui, o conjunto de dados X e os rótulos y são divididos em dados de


treinamento (75%) e teste (25%). Isso garante que o modelo tenha uma ava-
liação justa em dados novos e não vistos durante o processo de aprendizado.

147
2
2. MODELOS SUPERVISIONADOS

Os modelos supervisionados são uma das abordagens mais


amplamente utilizadas em machine learning. Nessa classe de modelos, o
aprendizado ocorre a partir de um conjunto de dados rotulado, em que
tanto as entradas quanto as saídas desejadas são conhecidas.

APROFUNDANDO
A tarefa do algoritmo é aprender uma função de mapeamento que
relacione as entradas (features) às saídas (rótulos), de modo que
ele possa prever com precisão o resultado para novos dados. Os
modelos supervisionados são divididos em dois grandes grupos:
regressão, quando a saída é um valor contínuo, e classificação,
quando a saída é uma categoria ou rótulo.

2.1 REGRESSÃO LINEAR E SUAS APLICAÇÕES


A regressão linear é um dos algoritmos mais simples e conhecidos
no campo de machine learning. Seu objetivo é modelar a relação entre
uma variável dependente (ou variável de resposta) e uma ou mais variáveis
independentes (ou features) usando uma equação linear. Em essência, o
modelo de regressão linear busca encontrar a linha reta que melhor ajusta
os dados, minimizando a soma dos erros quadrados.

A equação da regressão linear

A equação da regressão linear simples pode ser representada da se-


guinte forma:

148
Capítulo 3

y = β 0 + β1 x + ∈

Na qual:

• γ é a variável dependente (a saída ou target).

• x é a variável independente (a entrada ou feature).

• β 0 é o intercepto da linha no eixo y (quando x = 0 ).

• β1 é o coeficiente angular, ou seja, a inclinação da linha que mostra


o quanto x muda quando y muda.

• ∈ é o termo de erro, que representa a variação nos dados que o


modelo não consegue explicar.

A equação acima representa o caso de regressão linear simples, em


que há apenas uma variável independente. No caso de regressão linear
múltipla, em que há mais de uma variável independente, a equação se
expande para:

y = β 0 + β1 x1 + β 2 x2 + ⋯ + β n xn + ∈

Aqui x1 , x2 , …, xn representam as diferentes variáveis independentes, e


β1 , β 2 ,…, β n são os coeficientes associados a cada uma delas.

Aplicações da regressão linear

A regressão linear tem muitas aplicações práticas em diversas áreas.


Algumas das mais comuns incluem:

Previsão de preços imobiliários

A regressão linear pode ser usada para prever o preço de uma casa com base
em variáveis como tamanho, localização e número de quartos. Por exemplo,
a variável dependente y seria o preço da casa, e as variáveis independentes
x1,x2,… seriam as características da casa (tamanho em metros quadrados, nú-
mero de quartos etc.).

149
Capítulo 3

Análise de vendas

Empresas podem utilizar regressão linear para prever o volume de vendas


com base em fatores como gasto em marketing, sazonalidade e condições
econômicas.

Estimativa de risco de seguro

Companhias de seguro podem usar regressão linear para calcular o valor do


prêmio de seguro com base em variáveis como idade, histórico de saúde, tipo
de veículo, entre outros.

Modelagem de rendimento escolar

A regressão linear também pode ser aplicada para prever o desempenho aca-
dêmico de um estudante com base em variáveis como horas de estudo, parti-
cipação em atividades extracurriculares, e frequência escolar.

Métricas para avaliar modelos de regressão linear

Avaliar o desempenho de um modelo de regressão linear é um passo


crucial para entender o quão bem ele se ajusta aos dados. As métricas mais
comuns utilizadas incluem:

APROFUNDANDO
Erro quadrático médio (MSE): Mede a média dos quadrados dos er-
ros, ou seja, a diferença entre os valores previstos e os valores reais.

150
Capítulo 3

Em que são os valores reais e são os valores previstos pelo


modelo.

1. Coeficiente de determinação R2: Mede a proporção da variabili-


dade total de y que é explicada pelo modelo. Um R2 próximo de 1
indica que o modelo explica a maior parte da variação nos dados.

Em que é a média dos valores de

Implementando regressão linear com Scikit-Learn

O Scikit-Learn torna extremamente simples implementar a regressão


linear. A seguir, um exemplo de como treinar e avaliar um modelo de re-
gressão linear utilizando esta biblioteca.

151
Capítulo 3

Figura 5. Exemplo de regressão linear

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from [Link] import mean_squared_error, r2_score
import numpy as np
import pandas as pd
# Exemplo de conjunto de dados fictício
dados = [Link]({
‘tamanho’: [50, 60, 70, 80, 90],
‘preco’: [150000, 180000, 210000, 240000, 270000]
})
X = dados[[‘tamanho’]] # Variável independente (tamanho da casa)

152
Capítulo 3

y = dados[‘preco’] # Variável dependente (preço da casa)


# Dividindo os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Criando o modelo de regressão linear
modelo = LinearRegression()
# Treinando o modelo
[Link](X_train, y_train)
# Fazendo previsões no conjunto de teste
y_pred = [Link](X_test)
# Avaliando o modelo
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f’Erro Quadrático Médio (MSE): {mse}’)
print(f’Coeficiente de Determinação (R^2): {r2}’)

Neste exemplo, criamos um modelo de regressão linear para prever


o preço de uma casa com base em seu tamanho. Dividimos o conjunto de
dados em treino e teste, treinamos o modelo, e avaliamos seu desempenho
com as métricas de MSE e R 2 .

2.2 ALGORITMOS DE CLASSIFICAÇÃO (KNN E


SVM)
A classificação é uma tarefa fundamental em machine learning supervi-
sionado, focada em prever uma categoria ou classe para novas amostras de
dados com base em exemplos rotulados. Diferente da regressão, que gera
valores contínuos, a classificação resulta em classes ou rótulos discretos.
Entre os diversos algoritmos de classificação, os mais populares incluem o
K-Nearest Neighbors (KNN) e o Support Vector Machine (SVM).

K-Nearest Neighbors (KNN)

APROFUNDANDO
O K-Nearest Neighbors é um algoritmo simples e intuitivo que clas-
sifica uma amostra com base nas classes de seus vizinhos mais pró-
ximos no espaço de características. A premissa central do KNN é que
amostras semelhantes estão localizadas próximas umas das outras,
permitindo que a classe de uma nova amostra seja determinada
pela observação das classes das amostras vizinhas.

153
Capítulo 3

Funcionamento do KNN

1. Armazenamento dos dados: O KNN é um algoritmo lazy, o que


significa que ele não treina um modelo propriamente dito, mas ar-
mazena todas as amostras do conjunto de treinamento.

2. Cálculo da distância: Para classificar uma nova amostra, o algorit-


mo calcula a distância entre essa amostra e todas as amostras no
conjunto de treinamento. As distâncias mais comuns incluem:

• Distância euclidiana:

Em que é a nova amostra e é uma amostra do conjunto de treinamento.

• Distância de Manhattan:

1. Identificação dos K vizinhos mais próximos: Depois de calcular a


distância, o algoritmo seleciona os K vizinhos mais próximos, ou
seja, as amostras com as menores distâncias.

2. Votação: Entre os vizinhos mais próximos, o algoritmo verifica quais


são as classes predominantes e classifica a nova amostra com a
classe mais frequente (maioria).

154
Capítulo 3

Escolha do Valor de K

APROFUNDANDO
A seleção do valor de K (número de vizinhos) é essencial para o
desempenho do KNN. Valores pequenos de K podem resultar em
um modelo sensível a ruídos (overfitting), enquanto valores gran-
des podem suavizar excessivamente a fronteira entre as classes
(underfitting). Para determinar o valor ideal de K, é comum testar
diferentes opções e usar técnicas como validação cruzada.

Aplicações do KNN

• Reconhecimento de padrões: Utilizado em reconhecimento facial


e de escrita manual, em que novas amostras são classificadas com
base em padrões anteriores.

• Sistemas de recomendação: O KNN pode sugerir produtos ou fil-


mes com base nas preferências de usuários semelhantes.

• Detecção de anomalias: Em sistemas de detecção de fraudes, é


possível identificar comportamentos anômalos em comparação
com vizinhos próximos.

155
Capítulo 3

Implementação do KNN com Scikit-Learn

Figura 6. Exemplo do KNN

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from [Link] import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from [Link] import accuracy_score
# Exemplo de conjunto de dados
X = [[1.0, 1.2], [2.3, 2.1], [1.5, 1.8], [3.0, 3.5], [3.2, 3.0]]
y = [0, 1, 0, 1, 1]
# Dividindo os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Criando e treinando o modelo KNN
knn = KNeighborsClassifier(n_neighbors=3)
[Link](X_train, y_train)
# Fazendo previsões
y_pred = [Link](X_test)
# Avaliando a acurácia do modelo
print(f’Acurácia: {accuracy_score(y_test, y_pred)}’)

156
Capítulo 3

Support Vector Machine (SVM)

APROFUNDANDO
O Support Vector Machine (SVM) é um algoritmo de classificação
poderoso que busca encontrar a hiperplano de separação ótimo
que maximiza a margem entre duas classes no espaço de carac-
terísticas. O SVM é especialmente útil em problemas de alta di-
mensionalidade e quando as classes são separáveis linearmente
(ou quase linearmente).

Funcionamento do SVM

1. Hiperplano de separação: Em um espaço de duas dimensões,


o SVM tenta encontrar uma linha (ou hiperplano, em espaços de
maior dimensão) que separe as amostras de duas classes. O obje-
tivo é maximizar a margem, que é a distância entre o hiperplano e
os exemplos mais próximos de cada classe (chamados de vetores
de suporte).

A equação de um hiperplano em um espaço de duas dimensões é dada


por:
w1 x1 + w2 x2 + b = 0

Em que w1 e w2 são os pesos, x1 e x2 são as variáveis de entrada, e b


é o termo de bias.

1. Maximização da margem: O SVM busca maximizar a margem en-


tre as duas classes. A maximização é feita resolvendo o seguinte
problema de otimização:

( )
min1/ 2 || w ||2 com a restrição y i wT xi + b ≥ 1

Em que yi representa o rótulo da classe (1 ou -1) e são as amostras de


treinamento.

1. Casos não linearmente separáveis: Para casos em que os dados


não são linearmente separáveis, o SVM utiliza a função kernel para
mapear os dados para um espaço de maior dimensão, em que uma
separação linear pode ser encontrada. O kernel mais utilizado é o
RBF (Radial Basis Function), cuja fórmula é:

157
Capítulo 3

(
K ( x, x′ ) = exp −γ | | x − x′ ||2 )

Em que y é um parâmetro que controla o alcance da influência de


uma única amostra.

Aplicações do SVM

• Classificação de imagens: O SVM é amplamente utilizado em pro-


blemas de classificação de imagens, como detecção de objetos e
reconhecimento facial.

• Bioinformática: Aplicado em problemas de classificação de genes,


proteínas e dados biomédicos.

• Sistemas de diagnóstico médico: Pode ser utilizado para classifi-


car imagens de exames médicos (por exemplo, radiografias) para
detecção de doenças.

Implementação do SVM com Scikit-Learn

Figura 7. Exemplo do SVM

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código

158
Capítulo 3

apresentado na imagem é:
from [Link] import SVC
from sklearn.model_selection import train_test_split
from [Link] import accuracy_score
# Exemplo de conjunto de dados
X = [[1.0, 1.2], [2.3, 2.1], [1.5, 1.8], [3.0, 3.5], [3.2, 3.0]]
y = [0, 1, 0, 1, 1]
# Dividindo os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Criando e treinando o modelo SVM
svm = SVC(kernel=’linear’)
[Link](X_train, y_train)
# Fazendo previsões
y_pred = [Link](X_test)
# Avaliando a acurácia do modelo
print(f’Acurácia: {accuracy_score(y_test, y_pred)}’)

Tanto o KNN quanto o SVM são algoritmos de classificação eficientes


que podem ser aplicados a uma ampla variedade de problemas. O KNN é
intuitivo e fácil de implementar, mas pode ser ineficiente para grandes con-
juntos de dados. O SVM, por outro lado, oferece uma solução mais robusta,
especialmente em problemas com alta dimensionalidade, sendo altamente
eficaz em encontrar fronteiras de decisão ótimas.

2.3 AVALIAÇÃO DE MODELOS: ACURÁCIA,


PRECISÃO E RECALL
A avaliação de modelos é uma etapa fundamental no fluxo de traba-
lho de machine learning, pois permite verificar a eficácia do modelo em
realizar previsões corretas e identificar áreas de melhoria. As métricas mais
utilizadas para avaliar a performance de modelos de classificação incluem
acurácia, precisão e recall, cada uma fornecendo uma visão específica so-
bre o desempenho do modelo em diferentes aspectos.

Antes de detalharmos as métricas, é importante entender a matriz de


confusão, uma ferramenta que organiza os resultados de previsão de um
modelo de classificação em quatro categorias:

• Verdadeiros positivos (TP): O modelo previu corretamente a classe


positiva.

159
Capítulo 3

• Falsos positivos (FP): O modelo previu a classe positiva, mas a clas-


se verdadeira era negativa (falso alarme).

• Verdadeiros negativos (TN): O modelo previu corretamente a clas-


se negativa.

• Falsos negativos (FN): O modelo previu a classe negativa, mas a


classe verdadeira era positiva (erro de omissão).

A partir dessa matriz de confusão, as métricas de avaliação podem ser


derivadas.

Acurácia

APROFUNDANDO
A acurácia é uma das métricas mais simples e intuitivas. Ela repre-
senta a proporção de previsões corretas (tanto positivas quanto
negativas) em relação ao número total de previsões. Ou seja, a
acurácia indica quão bem o modelo classificou corretamente as
amostras no geral.

A fórmula da acurácia é:

Acurácia=(TP+TN)\/(TP+TN+FP+FN)

Embora seja uma métrica amplamente utilizada, a acurácia pode ser


APROFUNDANDO
enganosa quando as classes estão desbalanceadas. Por exemplo, em um
A precisão
problema no qual mede
95% das a proporção
amostras de verdadeiros
pertencem a umapositivos
classe eem
5%relação
a outra,
ao total
um modelo que de previsões
sempre prevê apositivas feitas pelo modelo.
classe majoritária terá uma Ela acurácia
é particu-de
larmente
95%, mesmo sem útil quando
identificar o foco estáa em
corretamente reduzir
classe falsos positivos, ou
minoritária.
seja, em problemas em que um falso alarme pode ser prejudicial
Precisão(como em diagnósticos médicos).

A fórmula da precisão é:

Precisão=TP\/(FP+TP)

Se um modelo tem alta precisão, isso significa que a maioria das


amostras que ele classificou como positivas realmente pertencem à classe

160
Capítulo 3

positiva. No entanto, ele não informa o quão bem o modelo está identifi-
cando todos os exemplos positivos presentes no conjunto de dados.

Recall (sensibilidade ou taxa de verdadeiros positivos)

APROFUNDANDO
O recall mede a capacidade do modelo de identificar correta-
mente todas as amostras positivas. Ele representa a proporção
de verdadeiros positivos em relação ao total de amostras que
realmente pertencem à classe positiva (a soma de verdadeiros
positivos e falsos negativos).

A fórmula do recall é:

Recall=TP/(FP+FN)

Um recall alto indica que o modelo está capturando a maioria das


amostras positivas, embora isso possa ocorrer às custas de um aumento
nos falsos positivos (o que reduziria a precisão).

Relação entre precisão e recall

APROFUNDANDO
Em muitos casos, há um trade-off entre precisão e recall. Se um
modelo é ajustado para aumentar a precisão, pode haver uma
queda no recall, e vice-versa. Esse equilíbrio é frequentemente
representado por uma métrica chamada F1-score, que é a média
harmônica entre precisão e recall. O F1-score é útil para avaliar
modelos em que é importante encontrar um equilíbrio entre es-
sas duas métricas.

A fórmula do F1-score é:

F1=2×(Precisão×Recall)/(Precisão+Recall)

161
Capítulo 3

Exemplos de Aplicações

Acurácia

Em tarefas de classificação nas quais as classes são balanceadas e o custo de


uma previsão incorreta é o mesmo para ambas as classes, a acurácia é uma
métrica adequada.

Precisão

É usada em problemas como detecção de spam ou fraudes, nos quais é mais


importante minimizar o número de falsos positivos (ou seja, mensagens legíti-
mas sendo classificadas como spam).

Recall

É usada em problemas como diagnósticos médicos, nos quais a prioridade


é capturar todos os casos positivos, mesmo que ocasionalmente haja falsos
positivos.

Implementação de avaliação com Scikit-Learn

O Scikit-Learn oferece várias funções para calcular essas métricas de


avaliação a partir dos resultados de previsão de um modelo.

162
Capítulo 3

Figura 8. Exemplo de avaliação

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from [Link] import accuracy_score, precision_score, recall_score, f1_score
from sklearn.model_selection import train_test_split
from [Link] import KNeighborsClassifier
# Exemplo de conjunto de dados
X = [[1.0, 1.2], [2.3, 2.1], [1.5, 1.8], [3.0, 3.5], [3.2, 3.0]]
y = [0, 1, 0, 1, 1]
# Dividindo os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Criando e treinando o modelo KNN
knn = KNeighborsClassifier(n_neighbors=3)
[Link](X_train, y_train)
# Fazendo previsões
y_pred = [Link](X_test)
# Avaliando o modelo
acuracia = accuracy_score(y_test, y_pred)

163
Capítulo 3

precisao = precision_score(y_test, y_pred)


recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f’Acurácia: {acuracia}’)
print(f’Precisão: {precisao}’)
print(f’Recall: {recall}’)
print(f’F1-Score: {f1}’)

164
3
3. VALIDAÇÃO DE MODELOS E
PIPELINES

A validação de modelos é uma etapa essencial em machine learning,


pois garante que o modelo treinado seja capaz de generalizar bem para no-
vos dados, evitando o overfitting (quando o modelo se ajusta demais aos
dados de treinamento) e o underfitting (quando o modelo é muito simples
para capturar os padrões do conjunto de dados). Uma técnica fundamental
para realizar essa validação é a validação cruzada. Nesta seção, também
abordaremos a importância da correta divisão dos dados entre conjuntos
de treinamento e teste.

3.1 VALIDAÇÃO CRUZADA E DIVISÃO DE


CONJUNTOS DE DADOS
Divisão de conjuntos de dados: treinamento, validação e teste

Ao treinar modelos de machine learning, os dados são geralmente di-


vididos em três subconjuntos:

1. Conjunto de treinamento: Utilizado para treinar o modelo e ajus-


tar seus parâmetros, identificando padrões nos dados.

2. Conjunto de validação: Empregado para ajustar hiperparâmetros


e monitorar a performance durante o treinamento, ajudando a evi-
tar overfitting.

3. Conjunto de teste: Serve para avaliar a performance final do


modelo em dados nunca vistos, verificando sua capacidade de
generalização.

165
Capítulo 3

A divisão típica é de 70%-80% para treinamento e 20%-30% para teste,


podendo ser ajustada conforme a disponibilidade de dados.

Figura 9. Exemplo de divisão

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro.
No canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geral-
mente representam os botões de fechar, minimizar e maximizar de uma janela de software.
O código apresentado na imagem é:
from sklearn.model_selection import train_test_split
# Exemplo de divisão do conjunto de dados em treino e teste
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
y = [0, 0, 1, 1, 0]
# Dividindo os dados em 80% treinamento e 20% teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f”Conjunto de Treinamento: {X_train}”)
print(f”Conjunto de Teste: {X_test}”)

Validação cruzada

APROFUNDANDO
A validação cruzada é uma técnica que melhora a avaliação de
modelos, especialmente com dados limitados. Ela divide os da-
dos em vários subconjuntos, ou “folds”, permitindo que o mode-
lo seja treinado em alguns folds e testado nos restantes. Isso é
repetido diversas vezes, garantindo que cada subconjunto seja
usado tanto para treinamento quanto para teste.

166
Capítulo 3

A forma mais comum é a k-fold cross-validation:

• Os dados são divididos em k folds.

• O modelo é treinado em k-1 folds e testado no fold restante.

• Esse processo se repete k vezes, com cada fold servindo uma vez
como conjunto de teste.

• As métricas de desempenho são calculadas como a média dos re-


sultados de cada fold.

Por exemplo, com k = 5, os dados são divididos em 5 partes, e o modelo


é treinado 5 vezes, cada vez com um fold diferente como teste. Essa aborda-
gem torna a avaliação mais robusta, utilizando todos os dados disponíveis.

k-fold Cross-Validation com Scikit-Learn

O Scikit-Learn facilita a implementação de validação cruzada com a


função cross_val_score, que automatiza o processo de divisão e avaliação
de k-fold.

Figura 10. Exemplo de k-fold Cross-Validation

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente

167
Capítulo 3

representam os botões de fechar, minimizar e maximizar de uma janela de software. O código


apresentado na imagem é:
from sklearn.model_selection import cross_val_score
from [Link] import RandomForestClassifier
# Exemplo de k-fold cross-validation com k=5
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
y = [0, 0, 1, 1, 0, 1]
# Modelo a ser validado
model = RandomForestClassifier()
# Aplicando k-fold cross-validation
scores = cross_val_score(model, X, y, cv=5)
print(f”Pontuações de cada fold: {scores}”)
print(f”Pontuação média: {[Link]()}”)

Validação cruzada estratificada

Em problemas de classificação com classes desbalanceadas, é crucial


manter a proporção de classes em cada fold. A validação cruzada estrati-
ficada (stratified k-fold) assegura que a distribuição de classes nos folds
seja semelhante à do conjunto de dados original, evitando a sub-represen-
tação ou ausência de classes, o que pode comprometer a avaliação.

No Scikit-Learn, a validação cruzada estratificada é implementada


usando a função StratifiedKFold, de forma semelhante à validação cruza-
da padrão.

168
Capítulo 3

Figura 11. Exemplo de validação cruzada

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
# Dados com classes desbalanceadas
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
y = [0, 0, 1, 1, 0, 0] # Classe 0 é majoritária
# Configurando stratified k-fold cross-validation
skf = StratifiedKFold(n_splits=3)
# Iterando pelos folds
for train_index, test_index in [Link](X, y):
X_train, X_test = [X[i] for i in train_index], [X[i] for i in test_index]
y_train, y_test = [y[i] for i in train_index], [y[i] for i in test_index]
model = LogisticRegression().fit(X_train, y_train)
print(f”Acurácia no fold: {[Link](X_test, y_test)}”)

A correta divisão dos dados entre conjuntos de treinamento, validação


e teste, combinada com a validação cruzada, é essencial para garantir que o
modelo de machine learning seja confiável e capaz de generalizar bem para
novos dados. Ao avaliar o modelo com diferentes subconjuntos de dados,
evitamos overfitting e garantimos que os resultados não sejam enviesados
por divisões aleatórias dos dados. A validação cruzada, especialmente a

169
Capítulo 3

k-fold e a estratificada, são ferramentas poderosas que permitem avalia-


ções robustas e precisas dos modelos.

3.2 PIPELINES EM SCIKIT-LEARN PARA


AUTOMAÇÃO DE FLUXO DE TRABALHO
Em projetos de machine learning, é comum realizar etapas sequen-
ciais, como pré-processamento de dados, extração de características e trei-
namento de modelos. Para garantir eficiência e replicabilidade, utilizamos
pipelines.

No Scikit-Learn, um pipeline encapsula todo o fluxo de trabalho em


um único objeto, permitindo a execução automatizada e organizada das
etapas de pré-processamento e treinamento.

Como funciona um pipeline

APROFUNDANDO
Um pipeline em Scikit-Learn é composto por uma sequência de
estágios, em que cada estágio é uma transformação ou um esti-
mador. O último estágio sempre é um estimador (um modelo de
aprendizado). Cada estágio anterior ao último deve implementar
um método fit e transform para que os dados possam ser proces-
sados e passados para o próximo estágio.

A sequência de um pipeline pode ser descrita da seguinte forma:

1. Transformações nos dados: Etapas de pré-processamento como


normalização, padronização, imputação de valores faltantes, codifi-
cação de variáveis categóricas etc.

2. Modelo de aprendizado: O último passo do pipeline é a aplicação


de um algoritmo de aprendizado supervisionado ou não supervisio-
nado para ajustar o modelo aos dados transformados.

Um exemplo típico pode incluir a padronização dos dados seguida por


um algoritmo de aprendizado como regressão logística.

170
Capítulo 3

Exemplo: Criando um pipeline

Aqui está um exemplo de pipeline com duas etapas: a primeira etapa


padroniza os dados (com StandardScaler), e a segunda aplica uma regres-
são logística.

Figura 12. Exemplo de pipeline

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from [Link] import Pipeline
from [Link] import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# Criando um conjunto de dados de exemplo
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
y = [0, 0, 1, 1, 0]
# Dividindo os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Definindo o pipeline com padronização e regressão logística
pipeline = Pipeline([

171
Capítulo 3

(‘scaler’, StandardScaler()), # Passo de pré-processamento


(‘log_reg’, LogisticRegression()) # Modelo de aprendizado
])
# Ajustando o Pipeline aos dados de treinamento
[Link](X_train, y_train)
# Fazendo previsões nos dados de teste
y_pred = [Link](X_test)
print(f”Previsões: {y_pred}”)

Detalhando as etapas do pipeline

1. Pre-processamento (StandardScaler):

• Padroniza os dados para que eles tenham média 0 e desvio


padrão 1. Isso é importante para modelos de machine learning
que são sensíveis às escalas dos atributos, como a regressão
logística e o SVM.

2. Treinamento do modelo (LogisticRegression):

• A regressão logística é ajustada com os dados transformados. O


modelo final é obtido após a padronização dos dados.

Com o pipeline, não precisamos nos preocupar em manualmente


transformar os dados de teste com o StandardScaler. O pipeline automa-
ticamente aplica as mesmas transformações de pré-processamento nos
dados de teste, garantindo consistência.

Integração com validação cruzada e Grid Search

Uma das grandes vantagens do pipeline é que ele pode ser facilmente
integrado com técnicas de validação cruzada e otimização de hiperparâme-
tros, como o Grid Search. Dessa forma, podemos otimizar não apenas o
modelo de aprendizado, mas também os parâmetros das transformações
de pré-processamento.

Exemplo: Otimizando o pipeline com Grid Search

No exemplo abaixo, vamos otimizar tanto o hiperparâmetro C da re-


gressão logística quanto o método de normalização (padronização ou nor-
malização MinMax).

172
Capítulo 3

Figura 13. Exemplo de otimização do pipeline

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
from sklearn.model_selection import GridSearchCV
from [Link] import MinMaxScaler
# Definindo o Pipeline com steps configuráveis
pipeline = Pipeline([
(‘scaler’, StandardScaler()), # Pode ser trocado por MinMaxScaler
(‘log_reg’, LogisticRegression())
])
# Definindo os hiperparâmetros a serem otimizados
param_grid = {
‘scaler’: [StandardScaler(), MinMaxScaler()], # Testando duas formas de normalização
‘log_reg__C’: [0.1, 1.0, 10.0] # Variando o parâmetro de regularização da regressão logística
}
# Configurando o GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
# Ajustando o GridSearchCV aos dados de treinamento
grid_search.fit(X_train, y_train)
# Melhor configuração de parâmetros

173
Capítulo 3

print(f”Melhor parâmetro: {grid_search.best_params_}”)


# Avaliando o melhor modelo nos dados de teste
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
print(f”Previsões com o melhor modelo: {y_pred}”)

Salvando e carregando pipelines

Após treinar um pipeline, podemos salvá-lo para uso posterior, o que


é útil quando queremos usar o modelo em produção ou em diferentes am-
bientes. Para isso, usamos bibliotecas como o joblib ou o pickle.

Salvando o pipeline:

Figura 14. Exemplo de salvar pipeline

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import joblib
# Salvando o pipeline treinado
[Link](pipeline, ‘pipeline_model.pkl’)

174
Capítulo 3

Carregando o pipeline:

Figura 15. Exemplo de carregar pipeline

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Carregando o pipeline previamente salvo
pipeline_loaded = [Link](‘pipeline_model.pkl’)
# Fazendo previsões com o pipeline carregado
y_pred_loaded = pipeline_loaded.predict(X_test)
print(f”Previsões com o pipeline carregado: {y_pred_loaded}”)

3.3: SALVANDO E CARREGANDO MODELOS


TREINADOS
Após o treinamento, teste e validação de um modelo de machine lear-
ning, é comum salvá-lo para uso em diferentes cenários, como produção.
Isso evita a necessidade de re-treinamento, que pode ser computacional-
mente caro, especialmente em grande escala.

Salvando um modelo com joblib

Vamos começar com um exemplo prático de como salvar um modelo


treinado usando o joblib. Suponha que temos um modelo de classificação
treinado com um conjunto de dados e gostaríamos de armazená-lo em um
arquivo para uso futuro.

175
Capítulo 3

Figura 16. Exemplo de salvar um modelo

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import joblib
from sklearn.linear_model import LogisticRegression
from [Link] import load_iris
from sklearn.model_selection import train_test_split
# Carregar o conjunto de dados Iris
data = load_iris()
X = [Link]
y = [Link]
# Dividir os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Treinar o modelo de Regressão Logística
model = LogisticRegression(max_iter=200)
[Link](X_train, y_train)
# Salvar o modelo treinado
[Link](model, ‘logistic_regression_model.pkl’)

No exemplo acima, o modelo de Regressão Logística foi treinado no


conjunto de dados Iris e salvo em um arquivo chamado logistic_regression_
[Link]. O formato .pkl é comum para arquivos serializados.

176
Capítulo 3

Carregando um modelo salvo

Depois de salvar o modelo, podemos carregá-lo a qualquer momento


para fazer previsões em novos dados, sem precisar treiná-lo novamente.
Aqui está como carregar o modelo salvo:

Figura 17. Exemplo de carregar um modelo

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
# Carregar o modelo treinado
loaded_model = [Link](‘logistic_regression_model.pkl’)

# Fazer previsões com o modelo carregado


predictions = loaded_model.predict(X_test)
print(f”Previsões: {predictions}”)

Ao carregar o modelo, ele se comporta exatamente como o modelo


original treinado, permitindo realizar previsões ou avaliações adicionais.

Salvando e carregando pipelines

Além de salvar modelos individuais, também podemos salvar pipeli-


nes inteiros, o que é muito útil quando seu modelo envolve várias etapas,
como pré-processamento, normalização e o algoritmo de aprendizado.
Salvar o pipeline garante que todas as transformações e o modelo sejam
carregados juntos, prontos para uso.

177
Capítulo 3

Figura 18. Exemplo de como salvar e carregar um pipeline

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro.
No canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geral-
mente representam os botões de fechar, minimizar e maximizar de uma janela de software.
O código apresentado na imagem é:
from [Link] import Pipeline
from [Link] import StandardScaler
# Definir um Pipeline com normalização e regressão logística
pipeline = Pipeline([
(‘scaler’, StandardScaler()), # Normalização dos dados
(‘log_reg’, LogisticRegression(max_iter=200)) # Regressão Logística
])
# Ajustar o Pipeline aos dados de treinamento
[Link](X_train, y_train)
# Salvar o Pipeline
[Link](pipeline, ‘pipeline_model.pkl’)
# Carregar o Pipeline salvo
loaded_pipeline = [Link](‘pipeline_model.pkl’)

# Fazer previsões com o Pipeline carregado


predictions = loaded_pipeline.predict(X_test)

178
Capítulo 3

print(f”Previsões com o Pipeline carregado: {predictions}”)

Neste exemplo, o pipeline contém tanto a etapa de normalização quan-


to o modelo de aprendizado. Salvá-lo como um único objeto garante que
todos os estágios do pipeline sejam mantidos intactos.

Usando pickle para salvar modelos

Embora o joblib seja mais eficiente para grandes objetos como mode-
los de aprendizado, o pickle também pode ser usado para salvar e carregar
modelos. O processo é bastante similar ao do joblib.

Figura 19. Exemplo com pickle

Fonte: elaboração própria (2024).


#ParaTodosVerem#: a imagem mostra um trecho de código em Python em um fundo escuro. No
canto superior esquerdo, há três pontos coloridos: vermelho, amarelo e verde, que geralmente
representam os botões de fechar, minimizar e maximizar de uma janela de software. O código
apresentado na imagem é:
import pickle
# Treinar o modelo de Regressão Logística
model = LogisticRegression(max_iter=200)
[Link](X_train, y_train)

179
Capítulo 3

# Salvar o modelo com Pickle


with open(‘logistic_regression_model.pkl’, ‘wb’) as file:
[Link](model, file)
# Carregar o modelo salvo com Pickle
with open(‘logistic_regression_model.pkl’, ‘rb’) as file:
loaded_model = [Link](file)
# Fazer previsões com o modelo carregado
predictions = loaded_model.predict(X_test)
print(f”Previsões: {predictions}”)

A principal diferença aqui é que o pickle usa um bloco with open() para
PLAY
abrir o arquivo, NOéCONHECIMENTO
o que um padrão mais comum ao trabalhar com arquivos
no Python. Clique aqui e confira o vídeo introdutório ao machi-
ne learning com Scikit-Learn .

180
NOVOS DESAFIOS

Aqui, ocê aprendeu que machine learning se tornou uma neces-


sidade para muitas empresas que buscam automatizar processos
e tomar decisões baseadas em dados. O conhecimento adquirido,
desde os tipos de aprendizado até a validação de modelos, tem apli-
cações práticas reais no mercado, como regressão linear e algorit-
mos de classificação (KNN, SVM).

Compreender o fluxo completo de um projeto de machine


learning – desde a coleta de dados até a modelagem – é essencial.
A demanda por profissionais que dominam não apenas a teoria,
mas também as ferramentas práticas (como Scikit-Learn, Pandas
e NumPy), está crescendo em setores como tecnologia, saúde e
finanças.

O futuro profissional é promissor, especialmente ao aplicar es-


ses conceitos em ambientes em nuvem, utilizando containers Doc-
ker e clusters Kubernetes. Com a base teórica e prática construída,
é hora de continuar praticando e enfrentando novos desafios no
mercado de trabalho.

181
ATIVIDADES

1. Ao trabalhar com algoritmos de aprendizado supervisionado,


é comum encontrar duas abordagens principais para treinar mo-
delos: aprendizado supervisionado e não supervisionado. Essas
abordagens têm finalidades distintas, dependendo do tipo de da-
dos e dos objetivos do projeto. Qual é a principal diferença entre o
aprendizado supervisionado e o aprendizado não supervisionado?

a. O aprendizado supervisionado utiliza rótulos conhecidos para


prever resultados, enquanto o aprendizado não supervisionado
agrupa dados sem rótulos.
b. O aprendizado supervisionado é mais rápido do que o aprendi-
zado não supervisionado.
c. O aprendizado supervisionado só funciona com grandes volu-
mes de dados, enquanto o aprendizado não supervisionado fun-
ciona com qualquer tamanho de dados.
d. O aprendizado supervisionado é utilizado para prever o futuro,
enquanto o aprendizado não supervisionado analisa o passado.
e. O aprendizado supervisionado funciona apenas com dados es-
truturados, enquanto o aprendizado não supervisionado é utili-
zado para dados não estruturados.

2. Antes de treinar um modelo de machine learning, os dados


precisam ser preparados e organizados. Isso é feito por meio do
pré-processamento de dados, que ajuda a eliminar ruídos e estru-
turar as informações corretamente. Qual é o principal objetivo
do pré-processamento de dados em machine learning?

a. Garantir que o algoritmo de machine learning tenha os dados


mais limpos e organizados possível para gerar modelos de

182
Capítulo 3

melhor qualidade.
b. Reduzir o tamanho dos dados para que o algoritmo de machine
learning funcione mais rapidamente.
c. Alterar os dados para que os resultados do modelo sejam
favoráveis.
d. Eliminar dados que não estejam relacionados diretamente com
o objetivo final do projeto.
e. Substituir a necessidade de validação do modelo ao organizar os
dados previamente.

3. Em projetos de classificação, como a detecção de fraudes em


cartões de crédito, há diferentes formas de avaliar a eficácia do
modelo. Dependendo do cenário, métricas como acurácia, pre-
cisão e recall podem ter relevâncias distintas. Qual métrica de
avaliação seria mais apropriada para um modelo de classificação
em um cenário em que os falsos negativos são muito prejudiciais,
como na detecção de doenças?

a. Precisão.
b. Acurácia.
c. Recall.
d. Erro médio absoluto.
e. F1-Score.

183
REFERÊNCIAS

NETTO, Amilcar; MACIEL, Francisco. Python para Data Science e Machine


Learning Descomplicado. Rio de Janeiro: Alta Books, 2021. 384 p.

MCKINNEY, Wes. Python for Data Analysis: Data Wrangling with Pandas,
NumPy, and IPython. 2. ed. Sebastopol: O’Reilly Media, 2017.

MULLER, Andreas C.; GUIDO, Sarah. Introduction to Machine Learning


with Python: A Guide for Data Scientists. Sebastopol: O’Reilly Media, 2016.

OLIPHANT, Travis E. Guide to NumPy. 2. ed. USA: CreateSpace Independent


Publishing Platform, 2015.

VANDERPLAS, Jake. Python Data Science Handbook: Essential Tools for


Working with Data. Sebastopol: O’Reilly Media, 2016.

RASCHKA, Sebastian; MIRJALILI, Vahid. Python Machine Learning: Machi-


ne Learning and Deep Learning with Python, Scikit-learn, and Tensor-
Flow 2. 4. ed. Birmingham: Packt Publishing, 2023.

KOZA, Giovanni; SMITH, Michael. Hands-On Machine Learning with Sciki-


t-Learn, Keras, and TensorFlow. 3. ed. Sebastopol: O’Reilly Media, 2023.

HEARTY, John. Advanced Machine Learning with Python. 2. ed. Birming-


ham: Packt Publishing, 2023.

184
GABARITO GERAL

CAPÍTULO 1
Questão 1
c) Funções ajudam a dividir o programa em blocos reutilizáveis, melhoran-
do a organização e manutenção.

Questão 2
c) Exceções são usadas para capturar e tratar erros durante a execução do
programa, evitando que ele pare de funcionar inesperadamente.

Questão 3
c) Dicionário.

CAPÍTULO 2
Questão 1
c) São limitados a valores numéricos inteiros.

Questão 2
b) fillna().

Questão 3
c) Possibilita a aplicação de funções de agregação a diferentes categorias de
dados.

185
Capítulo 3

CAPÍTULO 3
Questão 1
a) O aprendizado supervisionado utiliza rótulos conhecidos para prever re-
sultados, enquanto o aprendizado não supervisionado agrupa dados sem
rótulos.

Questão 2
a) Garantir que o algoritmo de machine learning tenha os dados mais lim-
pos e organizados possível para gerar modelos de melhor qualidade.

Questão 3
c) Erro médio absoluto.

186

Você também pode gostar