Introducao Analise de Dados
Introducao Analise de Dados
Introducao Analise de Dados
0
Vanessa Cadan Scheffer
Ver anotações
ESTRUTURA DE DADOS Imprimir
Pandas é um pacote Python que fornece estruturas de dados projetadas para facilitar o
trabalho com dados estruturados (tabelas) e de séries temporais.
Fonte: Shutterstock.
2008, tornando-se uma solução open source no final de 2009. Desde 2015, o
fundamental para uma análise prática, a dos dados do mundo real em Python.
Para utilizar a biblioteca pandas é preciso fazer a instalação, como mostra a Figura
4.1: pip install pandas (caso esteja usando conda, verificar documentação). No
127.0.0.1:8000 1/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
0
Figura 4.1 - Instalação do pandas
Ver anotações
Fonte: Pypi. Disponível em: https://pypi.org/project/pandas/.
Como uma ferramenta de alto nível, pandas possui duas estruturas de dados que
são as principais para a análise/manipulação de dados: a Series e o DataFrame.
Uma Series é um como um vetor de dados (unidimencional), capaz de armazenar
como grande característica, a indexação das linhas, ou seja, cada linha possui um
rótulo (nome) que o identifica, o qual pode ser uma string, uma inteiro, um decimal
ou uma data. A Figura 4.2 ilustra uma Series (A) e um DataFrame (B). Veja que uma
como uma planilha eletrônico, como o Excel (da Microsoft) ou o Calc (do Open
Office).
Agora que já temos essa visão inicial, vamos começar a colocar a mão na massa!
127.0.0.1:8000 2/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
vamos ver como como extrair informações estatísticas básicas, bem como extrair
0
DICA
Ver anotações
Na Internet você pode encontrar diversas "cheat sheet" (folha de dicas)
Vamos importar a biblioteca antes de começar nossa primeira linha de código. Por
convenção, a biblioteca é importada com o apelido (as) pd. Logo, para utilizar as
SERIES
uma Series com dados (se for uma Series sem dados, nenhum parâmetro é
obrigatório), o parâmetro data=XXXX. Esse parâmetro pode receber, um simples
exemplos.
127.0.0.1:8000 3/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
Out[2]: 0 5
dtype: int64
0
pd.Series(lista_nomes) # Cria uma Series com uma lista de nomes
Ver anotações
Out[3]: 0 Howard
1 Ian
2 Peter
3 Jonah
4 Kellie
dtype: object
In [4]: dados = {
'nome1': 'Howard',
'nome2': 'Ian',
'nome3': 'Peter',
'nome4': 'Jonah',
'nome5': 'Kellie',
}
Na entrada 2, criamos uma Series com um único valor, veja que aparece 0 como
índice e 5 como valor. Quando não deixamos explícito os rótulos (índices) que
queremos usar é construído um range de 0 até N-1, onde N é a quantidade de
valores. Outro detalhe interessante é o dtype (data type), que foi identificado como
Na entrada 3, criamos uma Series a partir de uma lista de nomes, veja que agora
os índices variam de 0 até 4 e o dtype é "object". Esse tipo de dado é usado para
desse tipo de dado na construção é que a chave do dicionário é usada como índice.
usar. Veja na entrada 5 essa construção, na qual utilizaoms uma lista de supostos
cpfs para rotular os valores da Series.
pd.Series(lista_nomes, index=cpfs)
127.0.0.1:8000 4/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
555.555.555-55 Kellie
dtype: object
0
localização e manipulação dos dados. Por exemplo, se quiséssemos saber o nome
da pessoa com cpf 111.111.111-11, poderíamos localizar facilmente essa
Ver anotações
informação com o atributo loc, usando a seguinte sintaxe:
series_dados.loc[rotulo], onde rótulo é índice a ser localizado. Veja o código a
seguir na entrada 6, criamos uma Series com a lista de nomes e guardados dentro
series_dados.loc['111.111.111-11']
Out[6]: 'Howard'
Já sabemos que estruturas de dados são utilizadas para armazenar dados e que,
dados com diferentes tipos. Já as informações das linhas 9 a 15, como se tratam de
funções matemáticas e estatísticas, podem fazer mais sentido quando utilizadas
para tipos numéricos. Verifique no comentário a frente de cada comando, o que
ele faz. Vale a pena ressaltar a diferença entre o atributo shape e o método count().
O primeiro verifica quantas linhas a Series possui (quantos índices), já o segundo,
conta quantos dados não nulos existem.
127.0.0.1:8000 5/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
0
print('Os valores são únicos?', series_dados.is_unique) # Verifica
se os valores são únicos (sem duplicações)
Ver anotações
print('Existem valores nulos?', series_dados.hasnans) # Verifica se
existem valores nulos
print('Quantos valores existem?', series_dados.count()) # Conta
quantas valores existem (excluí os nulos)
Resumo:
count 4.000000
mean 11.900000
std 10.184302
min -1.000000
25% 7.400000
50% 12.600000
75% 17.100000
max 23.400000
dtype: float64
DATAFRAME
127.0.0.1:8000 6/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
vejamos os exemplos.
0
Ver anotações
CONSTRUTOR DATAFRAME COM LISTA
Na entrada 8, criamos 4 listas, com mesmo tamanho (5 valores) que vamos usar
entrada 11, usamos a função zip() parar criar tuplas, cada uma composta por um
valor de cada lista, e a transformamos em uma lista de tuplas. Fizemos essa
construção para criar um DataFrame, no qual cada lista passe a ser uma coluna,
Out[9]: nome
0 Howard
1 Ian
2 Peter
3 Jonah
4 Kellie
Out[10]: nome
111.111.111-11 Howard
222.222.222-22 Ian
333.333.333-33 Peter
444.444.444-44 Jonah
555.555.555-55 Kellie
127.0.0.1:8000 7/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
tipo dicionário. Cada chave será uma coluna e pode ter atribuída uma lista de
0
valores. Obs: cada chave deve estar associada a uma lista de mesmo tamanho.
Na entrada 12, criamos nosso dicionário de dados, veja que cada chave possui
Ver anotações
uma lista de mesmo tamanho e criamos nosso DataFrame, passando o dicionário
como fonte de dados. Dessa forma o construtor já consegue identificar o nome das
colunas.
In [6]: dados = {
'nomes': 'Howard Ian Peter Jonah Kellie'.split(),
'cpfs' : '111.111.111-11 222.222.222-22 333.333.333-33
444.444.444-44 555.555.555-55'.split(),
'emails' : 'risus.varius@dictumPhasellusin.ca Nunc@vulputate.ca
fames.ac.turpis@cursusa.org non@felisullamcorper.org
eget.dictum.placerat@necluctus.co.uk'.split(),
'idades' : [32, 22, 25, 29, 38]
}
pd.DataFrame(dados)
quantas linhas e colunas existem. Também exibe o tipo de cada coluna e quanto
valores não nulos existem ali. Esse método também retorna uma informação sobre
a quantidade de memória RAM essa estrutura está ocupando. Faça a leitura dos
127.0.0.1:8000 8/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
print('\nInformações do DataFrame:\n')
print(df_dados.info()) # Apresenta informações sobre a estrutura do
DF
0
print('\nQuantidade de linhas e colunas = ', df_dados.shape) #
Retorna uma tupla com o número de linhas e colunas
Ver anotações
print('\nTipo de dados:\n', df_dados.dtypes) # Retorna o tipo de
dados, para cada coluna, se for misto será object
Informações do DataFrame:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
nomes 5 non-null object
cpfs 5 non-null object
emails 5 non-null object
idades 5 non-null int64
dtypes: int64(1), object(3)
memory usage: 240.0+ bytes
None
Tipo de dados:
nomes object
cpfs object
emails object
idades int64
dtype: object
127.0.0.1:8000 9/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
dtype: float64
Qual a mediana?
idades 29.0
dtype: float64
0
Resumo:
idades
Ver anotações
count 5.000000
mean 29.200000
std 6.220932
min 22.000000
25% 25.000000
50% 29.000000
75% 32.000000
max 38.000000
127.0.0.1:8000 10/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
Agora que você aprendeu como criar dataframes e extrair informações. Utilize o
0
Ver anotações
3
main.py Python3
in ammation-01.csv
Escolher arquivo Nenhum arquivo selecionado
Code Run Share
Remix
criar um novo objeto contendo somente as colunas que serão usadas em uma
determinada análise. Para selecionar uma coluna, as duas possíveis sintaxes são:
1. nome_df.nome_coluna
2. nome_df[nome_coluna]
porém ela não aceita colunas com espaços entre as palavras. Já a segunda
aplicar os atributos e métodos que aprendemos, por exemplo, para obter a média
aritmética de uma determinada coluna. Observe os códigos a seguir. Na entrada
14, fizemos a seleção de uma única coluna "idades", veja na impressão que o tipo
do objeto agora é uma Series. Na linha 4, a partir desse novo objeto, imprimimos a
média de idade. Já na entrada 15, criamos uma lista com as colunas que queremos
127.0.0.1:8000 11/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
df_uma_coluna
0
<class 'pandas.core.series.Series'>
Ver anotações
Média de idades = 29.2
Out[14]: 0 32
1 22
2 25
3 29
4 38
Name: idades, dtype: int64
<class 'pandas.core.frame.DataFrame'>
0 Howard 111.111.111-11
1 Ian 222.222.222-22
2 Peter 333.333.333-33
3 Jonah 444.444.444-44
4 Kellie 555.555.555-55
EXEMPLIFICANDO
notícia.
primeiros caracteres do texto que capturamos. Veja que foi lido o conteúdo
HTML da página.
texto_string =
requests.get('https://www.nytimes.com/interactive/2017/06/23/o
lies.html').text
print(texto_string[:100])
<!DOCTYPE html>
<!--[if (gt IE 9)|!(IE)]> <!--><html lang="en" class="no-js
page-interactive section
127.0.0.1:8000 12/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
0
passando o texto, em string, e o parâmetro 'html.parser'. Agora, com o
Ver anotações
objeto do tipo BeautifulSoup, podemos usar o método find_all() para buscar
uma lista do conteúdo. Obs: para saber qual tag buscar, antes é preciso
print(type(bsp_texto))
print(type(lista_noticias))
print(lista_noticias[5])
lista_noticias[5].contents
<class 'bs4.BeautifulSoup'>
<class 'bs4.element.ResultSet'>
<span class="short-desc"><strong>Jan. 25 </strong>“You had
millions of people that now aren't insured anymore.” <span
class="short-truth"><a
href="https://www.nytimes.com/2017/03/13/us/politics/fact-
check-trump-obamacare-health-care.html" target="_blank">(The
real number is less than 1 million, according to the Urban
Institute.)</a></span></span>
Na entrada 18, criamos uma estrutura de repetição que vai percorrer cada
posição 5.
127.0.0.1:8000 13/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
temos Jan. 25. Usamos a função strip() para eliminar espaço em branco
0
Linha 5: O código contents[1] retorna: "“You had millions of people that
Ver anotações
now aren't insured anymore.” " usamos o strip() para eliminar espaços em
mes.com/2017/03/13/us/politics/fact-check-trump-obamacare-health-care.h
tml" target="_blank"
>(The real number is less than 1 million, according to the Urban Institute.)</
os (The real number is less than 1 million, according to the Urban Institute.),
o qual ajustamos para elimar espaços e os parênteses.
com/2017/03/13/us/politics/fact-check-trump-obamacare-health-care.html
In [18]: dados = []
dados[1]
Agora que temos nossa lista de tuplas com os dados, podemos criar o
DataFrame e disponibilizar para um cientista de dados fazer a análise de
127.0.0.1:8000 14/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
de saber que foram extraídas 180 notícias e, que cada coluna possui o tipo
0
In [19]: df_noticias = pd.DataFrame(dados, columns=['data',
'comentário', 'explicação', 'url'])
Ver anotações
print(df_noticias.shape)
print(df_noticias.dtypes)
df_noticias.head()
(180, 4)
data object
comentário object
explicação object
url object
dtype: object
Jan.
I wasn't a fan of Iraq. I He was for an invasion https://www.buzzfeed.com/andrewkaczynski/in-
0 21,
didn't want to go in... before he was against it. 20...
2017
Jan.
Between 3 million and 5 There's no evidence of
2 23, https://www.nytimes.com/2017/01/23/us/politics...
million illegal votes ... illegal voting.
2017
Jan.
Now, the audience was the Official aerial photos show
3 25, https://www.nytimes.com/2017/01/21/us/politics...
biggest ever. But th... Obama's 2009 inaug...
2017
Jan.
Take a look at the Pew The report never mentioned
4 25, https://www.nytimes.com/2017/01/24/us/politics...
reports (which show vot... voter fraud.
2017
disponíveis.Para finalizar nossa aula, vamos ver como fazer a leitura de uma tabela
em uma página web, utilizando o método pandas.read_html(). A documentação
recebe a URL a ser usada. Esse método procura por tags <table> na estrutura do
código HTML e devolve uma lista de DataFrames contendo as tabelas que
localizou.
127.0.0.1:8000 15/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
0
resultado guardado na variável dfs, obtemos uma lista e ao verificarmos quantos
Ver anotações
DataFrames foram criados (len(dfs)), somente uma tabela foi encontrada, pois o
tamanho da lista é 1.
print(type(dfs))
print(len(dfs))
<class 'list'>
1
tabela que queremos, basta acessar a posição 0 da lista. Observe na entrada 21,
guardamos o único DataFrame da lista em uma nova variável, verificamos quantas
linhas existem e quais os tipos de cada coluna, com excessão da coluna CERT,
todas as demais são texto. Usamos o método head para ver os cinco primeiros
registros do DataFrame.
print(df_bancos.shape)
print(df_bancos.dtypes)
df_bancos.head()
(561, 6)
Bank Name object
City object
ST object
CERT int64
Acquiring Institution object
Closing Date object
dtype: object
0 The First State Bank Barboursville WV 14361 MVB Bank, Inc. April 3, 2020
1 Ericson State Bank Ericson NE 18265 Farmers and Merchants Bank February 14, 2020
2 City National Bank of New Jersey Newark NJ 21111 Industrial Bank November 1, 2019
3 Resolute Bank Maumee OH 58317 Buckeye State Bank October 25, 2019
4 Louisa Community Bank Louisa KY 58112 Kentucky Farmers Bank Corporation October 25, 2019
127.0.0.1:8000 16/17
20/08/2020 npf_ldkls202_u4s1_lin_pro
PyPI. Python Package Index. Disponível em: https://pypi.org/. Acesso em: 17 jun.
2020.
0
Leonard Richardson. Beautiful Soup Documentation. Disponível em: https://www.cr
Ver anotações
ummy.com/software/BeautifulSoup/bs4/doc/. Acesso em: 17 jun. 2020.
127.0.0.1:8000 17/17
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
0
Vanessa Cadan Scheffer
Ver anotações
WEB SCRAPING
Técnica de extração de dados utilizada para coletar dados de sites através de tags HTML
e atributos CSS.
Fonte: Shutterstock.
DESAFIO
autor fala sobre o profissional que deseja seguir a carreira de analista de dados, o
qual deve ter habilidades em: filtrar dados, construir APIs, web scraping e ter
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 1/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
conhecimento nas linguagens Git, MySQL e Python. (MOTIM, Raphael Bueno da.
Carreira de analista de dados oferece salários de até R$ 12,5 mil. 2019. Disponível
em: https://computerworld.com.br/2019/03/06/carreira-de-analista-de-dados-ofere
0
Como desenvolvedor em uma empresa de consultoria de software, você foi
Ver anotações
alocado em uma equipe de marketing analítico em uma marca esportiva, que
houver) publicação
até a extração
O grande desafio no trabalho de web scraping é descobrir qual o padrão nas tags
HTML e atributos CSS usados. Pois somente através deles é que conseguiremos
alcançar a informação solicitada. Como o cliente já trabalha com o portal de
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 2/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
0
O link que pode ser localizado pela tag "a" e pelo atributo "href".
Ver anotações
A descrição pode estar na terceira posição conteúdo ou dentro de uma div com
atributo 'class':'bstn-related'
Caso tente acessar o texto de uma tag não localizada, um erro é dado, para evitar
esses casos, os campos descrição, seção e time_delta devem ser tratados para
esses casos, retornando None (nulo). Agora é com você, faça a implementação e
gere um DataFrame com as informações solicitadas.
RESOLUÇÃO
import requests
from bs4 import BeautifulSoup
import pandas as pd
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 3/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
transformar essa string em formato html, para que possamos localizar as tags de
nosso interesse. Na linha 2, registramos o horário da extração. Na linha 5,
0
procuramos todas as tags div com o atributo que nos foi indicado. Essa linha
Ver anotações
retornará uma lista com cada notícia. Veja que na linha 6 imprimimos quantas
Quantidade de manchetes = 10
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 4/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
0
juventusita.ghtml">VICE SENHORA</a></div></div></div>,
<div class="_label_event"><div class="feed-post-body-resumo">Napoli
Ver anotações
vence Juventus nos pênaltis e leva Copa da Itália</div></div>,
<div class="feed-media-wrapper"><div class="_label_event"><a
class="feed-post-figure-link gui-image-hover"
href="https://globoesporte.globo.com/futebol/futebol-
internacional/futebol-italiano/jogo/17-06-2020/napoli-
juventusita.ghtml"><div class="bstn-fd-item-cover"><picture
class="bstn-fd-cover-picture"><img alt="Foto: (Alberto
Lingria/Reuters)" class="bstn-fd-picture-image"
src="https://s2.glbimg.com/BeTGAixT5O_Cvs4hQA88PdHiCsY=/0x0:5406x3041
06-17t212444z-1091152315-rc29bh9icqss-rtrmadp-3-soccer-italy-nap-
juv-report.jpg"
srcset="https://s2.glbimg.com/BeTGAixT5O_Cvs4hQA88PdHiCsY=/0x0:5406x3
06-17t212444z-1091152315-rc29bh9icqss-rtrmadp-3-soccer-italy-nap-
juv-report.jpg 1x,https://s2.glbimg.com/A6dTbIFD8sDl_t7eMHvA-
2ONF0Y=/0x0:5406x3041/810x456/smart/https://i.s3.glbimg.com/v1/AUTH_b
06-17t212444z-1091152315-rc29bh9icqss-rtrmadp-3-soccer-italy-nap-
juv-report.jpg 1.5x,https://s2.glbimg.com/n_XVqiX_3nn_wSar4FYy5I-
cPUw=/0x0:5406x3041/1080x608/smart/https://i.s3.glbimg.com/v1/AUTH_bc
06-17t212444z-1091152315-rc29bh9icqss-rtrmadp-3-soccer-italy-nap-
juv-report.jpg 2x" title="Foto: (Alberto Lingria/Reuters)"/>
</picture></div></a></div></div>,"
<div class="feed-post-metadata"><span class="feed-post-datetime">Há
3 horas</span><span class="feed-post-metadata-section"> futebol
italiano </span></div>]
Dentro dessa estrutura, procurando pelas tags corretas, vamos encontrar todas as
informações que foram solicitadas. Pela saída anterior podemos ver que a
devemos fazer:
In [24]: lista_noticias[0].contents[1].text.replace('"',"")
Para extração do link para notícia, como ele se encontra também na posição 1 da
lista, vamos utilizar o método find('a') para localizá-lo e extrair da seguinte forma:
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 5/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
In [25]: lista_noticias[0].find('a').get('href')
Out[25]: 'https://globoesporte.globo.com/futebol/futebol-
internacional/futebol-italiano/jogo/17-06-2020/napoli-
juventusita.ghtml'
0
Para a descrição, como ela pode estar na terceira posição ou em outra tag, vamos
Ver anotações
ter que testar em ambas e caso não esteja, então retornar None (nulo). Veja a
seguir.
time_delta = Há 3 horas
seção = futebol italiano
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 6/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
precisamos extrair de todas, portanto cada extração deve ser feita dentro de uma
estrutura de repetição. Para criar um DataFrame com os dados, vamos criar uma
lista vazia e a cada iteração apendar uma tupla com as informações extraídas. Com
0
essa lista, podemos criar nosso DataFrame, passando os dados e os nomes das
Ver anotações
colunas. Veja a seguir:
In [28]: dados = []
descricao = noticia.contents[2].text
if not descricao:
descricao = noticia.find('div', attrs={'class': 'bstn-
related'})
descricao = descricao.text if descricao else None
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 7/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
Napoli vence
Juventus nos futebol 17-06-2020 Há 3
0 VICE SENHORA https://globoesporte.globo.com/futebol/futebol...
pênaltis e leva italiano 18:58:17 horas
Copa...
Em noite trágica
ESPERA AÍ, de David Luiz, futebol 17-06-2020 Há 3
0
1 https://globoesporte.globo.com/futebol/futebol...
LIVERPOOL Manchester inglês 18:58:17 horas
Cit...
João Doria só
BASTIDORES campeonato 17-06-2020 Há 18
Ver anotações
2 libera volta aos https://globoesporte.globo.com/sp/futebol/camp...
CONTURBADOS paulista 18:58:17 horas
treinos a parti...
Maracanã
Na véspera de
passa por 17-06-2020 Há 2
3 Flamengo e Bangu, https://globoesporte.globo.com/futebol/noticia... futebol
processos de 18:58:17 horas
Ferj lança nov...
higienização e...
Partida em
Doutor na terra do
junho de 1984 17-06-2020 Há 2
4 Padim Ciço: as https://globoesporte.globo.com/ce/futebol/noti... futebol
marcou a 18:58:17 horas
memórias do ...
despedida de...
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 8/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
import requests
from bs4 import BeautifulSoup
import pandas as pd
0
class ExtracaoPortal:
def __init__(self):
Ver anotações
self.portal = None
dados = []
descricao = noticia.contents[2].text
if not descricao:
descricao = noticia.find('div', attrs={'class':
'bstn-related'})
descricao = descricao.text if descricao else None
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 9/10
11/22/23, 5:03 PM fmt_ldkls202_u4s1_lin_pro
In [30]: df = ExtracaoPortal().extrair("https://globoesporte.globo.com/")
df.head()
Napoli vence
Juventus nos futebol 17-06-2020 Há 3
0
0 VICE SENHORA https://globoesporte.globo.com/futebol/futebol...
pênaltis e leva italiano 18:58:18 horas
Copa...
Em noite trágica
Ver anotações
ESPERA AÍ, de David Luiz, futebol 17-06-2020 Há 3
1 https://globoesporte.globo.com/futebol/futebol...
LIVERPOOL Manchester inglês 18:58:18 horas
Cit...
João Doria só
BASTIDORES campeonato 17-06-2020 Há 18
2 libera volta aos https://globoesporte.globo.com/sp/futebol/camp...
CONTURBADOS paulista 18:58:18 horas
treinos a parti...
Maracanã
Na véspera de
passa por 17-06-2020 Há 2
3 Flamengo e Bangu, https://globoesporte.globo.com/futebol/noticia... futebol
processos de 18:58:18 horas
Ferj lança nov...
higienização e...
Partida em
Doutor na terra do
junho de 1984 17-06-2020 Há 2
4 Padim Ciço: as https://globoesporte.globo.com/ce/futebol/noti... futebol
marcou a 18:58:18 horas
memórias do ...
despedida de...
DESAFIO DA INTERNET
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 10/10
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Vanessa Cadan Scheffer
Ver anotações
MÉTODOS PARA MANIPULAÇÃO DE DADOS
Além dos métodos para carregar e salvar dados, a biblioteca pandas possui também métodos
para a transformação dos dados e a extração de informação.
Fonte: Shutterstock.
127.0.0.1:8000 1/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Todos os métodos capazes de fazer a leitura dos dados estruturados possuem
prefixo pd.read_XXX, onde pd é o apelido dado no momento da importação da
Ver anotações
biblioteca e XXX é o restante da sintaxe do método. Além de fazer a leitura a
biblioteca possui diversos métodos capazes de escrever o DataFrame em um
arquivo, em um banco ou ainda simplesmente copiar para a área de transferência
do sistema operacional. O Quadro 4.2, apresenta todos os métodos de leitura e
escrita. Veja que são suportados tanto a leitura de arquivos de texto, como
binários e de bancos.
127.0.0.1:8000 2/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
binário Parquet Format read_parquet to_parquet
Ver anotações
binário ORC Format read_orc
Dentre todos os possíveis métodos para leitura, nessa aula vamos estudar o
read_json, o read_csv e a função read_sql, que contempla a função read_sql_query.
127.0.0.1:8000 3/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
pipe (|), dentre outros. Por ser um arquivo de texto, é fácil de ser lido em qualquer
Ver anotações
sistema, por isso se tornou tão democrático.
127.0.0.1:8000 4/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
In [2]: pd.read_json("https://api.bcb.gov.br/dados/serie/bcdata.sgs.11/dados
formato=json").head()
0 04/06/1986 0.065041
0
1 05/06/1986 0.067397
2 06/06/1986 0.066740
Ver anotações
3 09/06/1986 0.068247
4 10/06/1986 0.067041
127.0.0.1:8000 5/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
que estão separados por vírgula. O parâmetro header, tem como valor padrão
'infer', que significa que o método realiza a inferência para os nomes das colunas a
partir da primeira linha de dados do arquivo.
0
Na entrada 3, estamos fazendo a leitura de uma fonte CSV, cujos campos são
separados por vírgula, logo não foi preciso especificar um delimitador diferente.
Ver anotações
In [3]: pd.read_csv("https://people.sc.fsu.edu/~jburkardt/data/csv/cities.csv
Out[3]: LatD "LatM" "LatS" "NS" "LonD" "LonM" "LonS" "EW" "City" "State"
EXEMPLIFICANDO
Para entender como essas duas etapas acontecem no dia a dia das
empresas, vamos utilizar os dados da taxa Selic. Selic, ou taxa Selic é a
referência base de juros da economia brasileira (https://blog.nubank.com.b
r/taxa-selic/). O valor da Selic influência todo o setor financeiro do Brasil,
127.0.0.1:8000 6/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Nacional são comprados e vendidos diariamente por instituições
Ver anotações
financeiras" (NUBANK, p. 1, 2020). Quem decide, de fato, o valor da Selic é o
Copom (Comitê de Política Monetária do Banco Central), que a cada 45 dias
se reúne para determinar se a taxa aumenta ou diminui. Na prática, se a
taxa está alta, os financiados podem ficar mais caros e o contrário também,
se a taxa está mais baixa, então os financiamentos ficam mais baratos.
Resumindo, quando a taxa Selic aumenta o economia desacelera, quando
ela abaixa a economia aquece, isso é preciso para controlar a inflação.
A extração dos dados pode ser realizada por meio do método read_json() e
guardando em um DataFrame (DF) pandas. Ao carregar os dados em um DF,
podemos visualizar quantas linhas e colunas, bem como, os tipos de dados em
cada coluna, com o método info(). Observe a entrada 4 e a saída do código a
seguir, o método retorna que o DF possui 8552 registros (entradas) e 2 colunas (A
quantidade de linhas certamente será diferente quando executar esse código). Os
índices são numéricos e variam de 0 a 8551 (N-1). Outras duas informações
relevantes que esse método retorna é sobre a quantidade de células sem valor
(non-null) e o tipo dos dados nas colunas. Como podemos ver, ambas colunas
possuem 8552 valores não nulos, como esse número é igual a quantidade de
127.0.0.1:8000 7/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
linhas, então não existem valores faltantes. Quanto ao tipo de dados, o "data" é um
object, ou seja, são todos do tipo strings ou existe mistura de tipos; "valor" é um
float.
0
In [4]: df_selic =
pd.read_json("https://api.bcb.gov.br/dados/serie/bcdata.sgs.11/dados
Ver anotações
formato=json")
print(df_selic.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8552 entries, 0 to 8551
Data columns (total 2 columns):
data 8552 non-null object
valor 8552 non-null float64
dtypes: float64(1), object(1)
memory usage: 133.7+ KB
None
127.0.0.1:8000 8/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
devemos fazer é remover os dados duplicados. Certamente, qual registro remover
depende da área de negócio e do problema a ser resolvido. Por exemplo,
Ver anotações
queremos manter o registro da compra atual, ou queremos manter a primeira
compra. Um DataFrame da bilioteca pandas possui o método
meu_df.drop_duplicates() que permite fazer essa remoção de dados duplicados.
A segunda transformação que veremos é como criar uma nova coluna. A sintaxe é
similar a criar uma nova chave em um dicionário: meu_df['nova_coluna'] = dado.
Vamos criar uma coluna que adiciona a data de extração das informações. Observe
a seguir, do módulo datetime, estamos usando a classe date e o método today().
Na entrada 6, guardamos a data em uma nova coluna, veja que a biblioteca pandas
"entende" que esse valor deve ser colocado em todas as linhas. Na linha 7,
estamos criando uma nova coluna com o nome do responsável pela extração, veja
que basta atribuir a string a uma nova coluna. Temos ainda um problema com o
127.0.0.1:8000 9/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
tipo de dados das datas, embora cada valor seja do tipo "date", veja que pelo info()
ainda obtemos uma coluna object, para que de fato, a biblioteca interprete como
um tipo data, vamos ter que utilizar o método da própria biblioteca para fazer a
conversão.
0
Ver anotações
In [6]: from datetime import date
from datetime import datetime as dt
data_extracao = date.today()
df_selic['data_extracao'] = data_extracao
df_selic['responsavel'] = "Autora"
print(df_selic.info())
df_selic.head()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 8552 entries, 0 to 8551
Data columns (total 4 columns):
data 8552 non-null object
valor 8552 non-null float64
data_extracao 8552 non-null object
responsavel 8552 non-null object
dtypes: float64(1), object(3)
memory usage: 334.1+ KB
None
Trabalhar com o tipo "data" pode trazer vantagens, como por exemplo, ordenar da
data mais recente para mais antiga, ou ainda verificar a variação da taxa selic em
um determinado período. Vamos utilizar os métodos pandas.to_datime() e
minha_series.astype() para fazer a conversão e transformar as colunas data e
127.0.0.1:8000 10/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Na entrada 7 (linha 1), o método recebe a coluna com os valores a serem alterados
(df_selic['data']) e um segundo parâmetro, indicando que no formato atual
Ver anotações
(antes da conversão) o dia está primeiro (dayfirst=True). Em seguida, na linha 2,
como a coluna "data_extracao" foi criada com o método today(), o formato já está
correto para a conversão. Nessa conversão usamos o método astype, que
In [7]:
df_selic['data'] = pd.to_datetime(df_selic['data'], dayfirst=True)
df_selic['data_extracao'] = df_selic['data_extracao'].astype('datetime64[ns]')
print(df_selic.info())
df_selic.head()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 8552 entries, 0 to 8551
Data columns (total 4 columns):
data 8552 non-null datetime64[ns]
valor 8552 non-null float64
data_extracao 8552 non-null datetime64[ns]
responsavel 8552 non-null object
dtypes: datetime64[ns](2), float64(1), object(1)
memory usage: 334.1+ KB
None
127.0.0.1:8000 11/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Ver anotações
SERIES.STR
df_selic.head()
127.0.0.1:8000 12/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
MÉTODO SORT_VALUES()
0
DF, de acordo com os valores de uma coluna. Esse método é do DataFrame, por
isso a notação meu_df.metodo(). Utilizamos três parâmetros do método sort_values,
Ver anotações
o primeiro informando qual coluna deve ser usada para ordenar, o segundo, para
que seja feito em ordem decrescente (do maior para o menor) e o terceiro
(inplace=True) significa que queremos modificar o próprio objeto, na prática
estamos sobrescrevendo o DF.
df_selic.head()
define novos índices. Veja o código na entrada 10, estamos usando o método
reset_index() para redefinir os índices padrão (sequência numérica). O primeiro
parâmetro (drop=True), diz que não queremos usar o índice que será substituído
127.0.0.1:8000 13/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
In [10]: df_selic.reset_index(drop=True, inplace=True)
Ver anotações
df_selic.head()
Durante a transformação dos dados, pode ser necessário definir novos valores
para os índices, ao invés de usar o range numérico. Essa transformação pode ser
feita usando o método meu_df.set_index(). O método permite especificar os novos
valores usando uma coluna já existente ou então passando uma lista, de tamanho
igual a quantidade de linhas.
Observe os códigos nas entradas 11 e 12. Na entrada 11, estamos criando uma
lista que usada os índices do DF, adicionando um prefixo para cada valor. Na linha
2 são impressos os cinco primeiros itens da nova lista. Na entrada 12, estamos
definindo o novo índice com base na lista criada. Veja que o parâmetros keys,
recebe como parâmetro uma lista de lista e o segundo parâmetro especifica que a
modificação deve ser salva no objeto. Na impressão das cinco primeiras linhas do
DF, podemos ver o novo índice.
print(lista_novo_indice[:5])
127.0.0.1:8000 14/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
df_selic.head()
0
selic_0 2020-07-17 0.008442 2020-07-19 AUTORA
Ver anotações
selic_2 2020-07-15 0.008442 2020-07-19 AUTORA
os exemplos a seguir.
In [13]: print(df_selic['valor'].idxmin())
print(df_selic['valor'].idxmax())
selic_7606
selic_7623
Um dos recursos mais utilizados por equipes das áreas de dados é a aplicação de
filtros. Imagine a seguinte situação, uma determinada pesquisa quer saber qual é a
média de idade de todas as pessoas na sua sala de aula, bem como a média de
idades somente das mulheres e somente dos homens. A distinção por gênero é
um filtro! Esse filtro vai possibilitar comparar a idade de todos, com a idade de
cada grupo e entender se as mulheres ou homens estão abaixo ou acima da média
geral.
127.0.0.1:8000 15/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Vamos começar explorando o filtro pelos índices. Entrada 14 estamos localizando
Ver anotações
(loc), o registro que possui índice 'selic_0', como resultado obtém-se uma Series. Na
entrada 15, foram filtrados três registros, para isso foi necessário passar uma lista
contendo os índices, como resultado obtivemos um novo DF. Na entrada 16,
fizemos um fatiamento (slice), procurando um intervalo de índices.
In [14]: df_selic.loc['selic_0']
In [16]: df_selic.loc[:'selic_5']
A propriedade loc, aceita um segundo argumento, que é a coluna (ou colunas) que
serão exibidas para os índices escolhidos. Na entrada 17 selecionamos uma única
coluna e na entrada 18 uma lista de colunas.
127.0.0.1:8000 16/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
Out[17]: selic_0 0.008442
selic_4 0.008442
Ver anotações
selic_200 0.020872
Name: valor, dtype: float64
Antes de vermos a criação de filtros para o loc com condições booleanas, vale
mencionar que existe também a propriedade iloc, a qual filtra as linhas
considerando a posição que ocupam no objeto. Veja no exemplo a seguir, estamos
usando o iloc para filtrar os 5 primeiros registros, usando a mesma notação do
fatiamento de listas. Essa propriedade não possui a opção de também selecionar
colunas. Veja um exemplo a seguir.
In [19]: df_selic.iloc[:5]
Podemos usar operadores relacionais e lógicos para fazer testes condicionais com
os valores das colunas de um DF. Ao criarmos um teste condicional, internamente,
a biblioteca testa todas as linhas do DF ou da Series, retornando uma Series
booleana, ou seja, composta por valores True ou False.
127.0.0.1:8000 17/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
resultados do teste lógico.
Ver anotações
In [20]: teste = df_selic['valor'] < 0.01
print(type(teste))
teste[:5]
<class 'pandas.core.series.Series'>
No código, entrada 21 a seguir, realizamos mais um teste lógico para ver se a data
da taxa é do ano de 2020. Para isso, utilizamos o método to_datetime() para
converter a string para data e então fazer a comparação.
print(type(teste2))
teste2[:5]
<class 'pandas.core.series.Series'>
127.0.0.1:8000 18/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
In [22]: teste3 = (df_selic['valor'] < 0.01) & (df_selic['data'] >=
pd.to_datetime('2020-01-01'))
Ver anotações
teste4 = (df_selic['valor'] < 0.01) | (df_selic['data'] >=
pd.to_datetime('2020-01-01'))
print("Resultado do AND:\n")
print(teste3[:3])
print("Resultado do OR:\n")
print(teste4[:3])
Resultado do AND:
selic_0 True
selic_1 True
selic_2 True
dtype: bool
Resultado do OR:
selic_0 True
selic_1 True
selic_2 True
dtype: bool
Agora que já sabemos criar as condições, basta aplicá-las no DataFrame para criar
o filtro. A construção é feita passando a condição para a propriedade loc. Observe
o código a seguir. Na linha 1 estamos criando a condição do filtro (que é uma
Series booleana) e na entrada 23, passamos como parâmetro para filtrar os
registros. Esse filtro retornou somente 4 registros.
df_selic.loc[filtro1]
127.0.0.1:8000 19/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
selic_10 2020-07-03 0.008442 2020-07-19 AUTORA
Ver anotações
selic_12 2020-07-01 0.008442 2020-07-19 AUTORA
que se sente mais a vontade. Nesse livro vamos adotar a sintaxe de criar os filtros
e guardar em variáveis por questões didáticas e de legibilidade do código.
Na entrada 24 (linha 1), criamos uma condição para exibir o registro das datas
apenas do mês de janeiro de 2020. Primeiro criamos duas variáveis para
armazenar as datas, na linha 4 criamos o filtro e na linha 6 o aplicamos no DF,
guardando o resultado (que é um DF) em um novo DF. Todo esse filtro poderia ter
sido escrito em uma única linha: df_selic.loc[(df_selic['data'] >=
pd.to_datetime('2020-01-01')) & (df_selic['data'] <= pd.to_datetime('2020-01-
31'))], mas veja como fica mais difícil ler e interpretar o filtro, ainda mais para
127.0.0.1:8000 20/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
df_janeiro_2020 = df_selic.loc[filtro_janeiro_2020]
df_janeiro_2020.head()
Ver anotações
Out[24]: data valor data_extracao responsavel
Vamos criar mais um filtro e um novo DF para que possamos ver a importância dos
filtros. No código a seguir, vamos criar um novo DF contendo as informações do
mês de janeiro do ano de 2019.
df_janeiro_2019 = df_selic.loc[filtro_janeiro_2019]
df_janeiro_2019.head()
Agora que temos três DFs, um completo e dois com filtros vamos utilizar métodos
da estatística descritiva para extrair informações sobre o valor da taxa selic em
cada DF. Queremos saber, qual o valor máximo e mínino registrado em cada caso
e qual a média.
Ao selecionar uma coluna, temos uma Series, então basta utilizar o método
solicitado, conforme códigos a seguir.
127.0.0.1:8000 21/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
print('Máximo janeiro de 2019 = ', df_janeiro_2019['valor'].max())
print('Máximo janeiro de 2020 = ',df_janeiro_2020['valor'].max(),
Ver anotações
'\n')
Veja como os filtros permitem começar a tirar respostas para áreas de negócios.
No ano de 2019 tanto a mínima quanto a máxima foram superiores que no ano de
2020. A máxima geral é bem superior a máxima desses meses, assim como a
média geral, que é bem superior, ou seja, nesses meses a taxa média foi inferior a
média geral, sendo que em janeiro de 2020 foi ainda pior.
In [27]: df_selic.to_csv('dados_selic.csv')
127.0.0.1:8000 22/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
3
main.py Python3
in ammation-01.csv
Escolher arquivo Nenhum arquivo selecionado
Code Run Share
Remix
0
Ver anotações
Poderíamos extrair diversas outras informações dos dados. Todo esse trabalho faz
parte do cotidiado nos engenheiros, cientistas e analistas de dados. Os
engenheiros de dados mais focados na preparação e disponibilização dos dados,
os cientistas focados em responder questões de negócio, inclusive utilizando
modelos de machine learning e deep learning e os analistas, também respondendo
a perguntas de negócios e apresentando resultados. Se você gostou do que
fizemos quem sabe não deva investir mais nessa área?!
SAIBA MAIS
Para finalizar nossa aula vamos aprender que além dos métodos para acessar
arquivos, a biblioteca pandas possui dois métodos que permitem executar
instruções SQL em banco de dados. Os métodos são:
127.0.0.1:8000 23/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
params=None, parse_dates=None, chunksize=None)
Ver anotações
O mínimo de parâmetros que ambos métodos exigem é a instrução SQL e uma
conexão com um banco de dados (con). A conexão com o banco de dados, deve
ser feita usando uma outra biblioteca, por exemplo, sqlalchemy (suporte para
diversos bancos), pyodbc para SQL Server, cx_Oracle para Oracle, psycopg2 para
Postgresql, dentre outras. Seguindo as recomendações da PEP 249 todas
bibliotecas precisam fornecer um método "connect", o qual recebe a string de
conexão. A síntaxe da string de conexão depende da biblioteca e do banco de
dados.
import psycopg2
host = 'XXXXX'
port = 'XXXXX'
database = 'XXXXX'
username = 'XXXXX'
password = 'XXXXX'
password='{password}' port='{port}'"
127.0.0.1:8000 24/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
conn = psycopg2.connect(conn_str)
0
Ver anotações
host = 'XXXXX'
port = 'XXXXX'
database = 'XXXXX'
username = 'XXXXX'
password = 'XXXXX'
{database}"
database="bd")
df = pd.read_sql(query, conn)
PyPI. Python Package Index. Disponível em: https://pypi.org/. Acesso em: 17 jun.
2020.
127.0.0.1:8000 25/26
20/08/2020 npf_ldkls202_u4s2_lin_pro
0
e/reference/api/pandas.Series.html . Acesso em: 17 jun. 2020.
Ver anotações
127.0.0.1:8000 26/26
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
0
Vanessa Cadan Scheffer
Ver anotações
TRANSFORMAÇÃO DOS DADOS E EXTRAÇÃO DE INFORMAÇÕES
A biblioteca pandas possui métodos capazes de fazer a leitura dos dados e o carregamento em
um DataFrame, além de recursos como a aplicação de filtros.
Fonte: Shutterstock.
DESAFIO
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 1/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
Brasil. Esse tipo de informação está disponível no site do governo brasileiro http://
No endereço http://www.dados.gov.br/dataset/importacoes-e-exportacoes-de-etan
0
ol é possível encontrar várias bases de dados (datasets), contendo informações de
Ver anotações
informações sobre a Exportação Etano Hidratado (barris equivalentes de petróleo)
Como parte das informações técnicas sobre o arquivo, foi lhe informado que se
RESOLUÇÃO
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 2/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
r/arquivos/dadosabertos/iee/exportacao-etanol-hidratado-2012-2020-bep.csv que
fará o download do arquivo de modo automático. Após obter o arquivo, basta
copiá-lo para a pasta do projeto.
0
Conforme orientações, o arquivo é delimitado, mas seu separador padrão é o ";" e
Ver anotações
esses dois parâmetros para a leitura do arquivo usando a biblioteca pandas, uma
vez que o delimitar padrão da biblioteca é o ",". No código a seguir, estamos
fazendo a importação dos dados. Veja que temos 9 linhas e 8 colunas.
df_etanol = pd.read_csv('exportacao-etanol-hidratado-2012-2020-
bep.csv', sep=';', encoding="ISO-8859-1")
print(df_etanol.info())
df_etanol.head(2)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 17 columns):
ANO 9 non-null int64
PRODUTO 9 non-null object
MOVIMENTO COMERCIAL 9 non-null object
UNIDADE 9 non-null object
JAN 9 non-null object
FEV 9 non-null object
MAR 9 non-null object
ABR 9 non-null object
MAI 8 non-null object
JUN 8 non-null object
JUL 8 non-null object
AGO 8 non-null object
SET 8 non-null object
OUT 8 non-null object
NOV 8 non-null object
DEZ 8 non-null object
TOTAL 9 non-null object
dtypes: int64(1), object(16)
memory usage: 1.3+ KB
None
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 3/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
Out[28]: MOVIMENTO
ANO PRODUTO UNIDADE JAN FEV MAR ABR MAI JUN
COMERCIAL
ETANOL
0 2012 HIDRATADO EXPORTACAO bep 87231,41132 141513,5186 122157,3385 98004,42926 153286,6078 144373,6894
(bep)
ETANOL
1 2013 HIDRATADO EXPORTACAO bep 673419,9767 387331,6487 96929,59201 54390,05046 115092,482 387498,3792
0
(bep)
Ver anotações
Agora que temos os dados, vamos dividir nossa solução em duas etapas: a de
ETAPA DE TRANSFORMAÇÕES
Vamos começar removendo as colunas que sabemos que não serão utilizadas,
afinal, quanto menos dados na memória RAM, melhor. Veja no código a seguir a
df_etanol.head(2)
Out[29]: ANO JAN FEV MAR ABR MAI JUN JUL AGO SET
0 2012 87231,41132 141513,5186 122157,3385 98004,42926 153286,6078 144373,6894 384743,6142 244861,0289 702267,5798
1 2013 673419,9767 387331,6487 96929,59201 54390,05046 115092,482 387498,3792 339162,21 354343,2858 434799,8585
Agora vamos redefinir os índices do DF, usando a coluna ANO. Esse passo será
df_etanol.head(2)
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 4/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
Out[30]: JAN FEV MAR ABR MAI JUN JUL AGO SET
ANO
2012 87231,41132 141513,5186 122157,3385 98004,42926 153286,6078 144373,6894 384743,6142 244861,0289 702267,5798 7
2013 673419,9767 387331,6487 96929,59201 54390,05046 115092,482 387498,3792 339162,21 354343,2858 434799,8585 6
0
Como os dados são de origem brasileira, a vírgula é usada como separador
Ver anotações
decimal, o que não condiz com o padrão da biblioteca pandas. Precisamos
converter todas as vírgulas em ponto. Para isso vamos utilizar uma estrutura de
repetição que filtra cada coluna, criando uma Series, o que nos habilita a utilizar a
In [31]: for mes in 'JAN FEV MAR ABR MAI JUN JUL AGO SET OUT NOV DEZ
TOTAL'.split():
df_etanol[mes] = df_etanol[mes].str.replace(',', '.')
print(df_etanol.dtypes)
df_etanol.head(2)
JAN object
FEV object
MAR object
ABR object
MAI object
JUN object
JUL object
AGO object
SET object
OUT object
NOV object
DEZ object
TOTAL object
dtype: object
Out[31]: JAN FEV MAR ABR MAI JUN JUL AGO SET
ANO
2012 87231.41132 141513.5186 122157.3385 98004.42926 153286.6078 144373.6894 384743.6142 244861.0289 702267.5798 7
2013 673419.9767 387331.6487 96929.59201 54390.05046 115092.482 387498.3792 339162.21 354343.2858 434799.8585
Mesmo trocando a vírgula por ponto, a biblioteca ainda não conseguiu identificar
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 5/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
df_etanol.head(2)
JAN float64
0
FEV float64
MAR float64
Ver anotações
ABR float64
MAI float64
JUN float64
JUL float64
AGO float64
SET float64
OUT float64
NOV float64
DEZ float64
TOTAL float64
dtype: object
Out[32]: JAN FEV MAR ABR MAI JUN JUL AGO SET
ANO
2012 87231.41132 141513.5186 122157.33850 98004.42926 153286.6078 144373.6894 384743.6142 244861.0289 702267.5798
2013 673419.97670 387331.6487 96929.59201 54390.05046 115092.4820 387498.3792 339162.2100 354343.2858 434799.8585
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 6/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
PESQUISE MAIS
0
ETAPA DE EXTRAÇÃO DE INFORMAÇÕES
Ver anotações
Agora que preparamos os dados, podemos começar a etapa de extração das
função loc para filtrar e então os métodos min() e max(). Para que a extração seja
feita para todos os anos, usamos uma estrutura de repetição.
impressão dos valores solicitados. Para que fique mais claro a leitura, formatamos
a exibição. O código minimo:,.0f faz com que seja exibida somente a parte inteira e
o separador de milhar seja feito por vírgula. Em seguida substituimos a vírgula por
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 7/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
Ano = 2012
Menor valor = 87.231
Maior valor = 4.078.157
--------------
Ano = 2013
Menor valor = 54.390
0
Maior valor = 4.168.543
--------------
Ver anotações
Ano = 2014
Menor valor = 74.303
Maior valor = 2.406.110
--------------
Ano = 2015
Menor valor = 31.641
Maior valor = 3.140.140
--------------
Ano = 2016
Menor valor = 75.274
Maior valor = 3.394.362
--------------
Ano = 2017
Menor valor = 2.664
Maior valor = 1.337.427
--------------
Ano = 2018
Menor valor = 4.249
Maior valor = 2.309.985
--------------
Ano = 2019
Menor valor = 14.902
Maior valor = 2.316.773
--------------
Ano = 2020
Menor valor = 83.838
Maior valor = 298.194
--------------
período de 2012 a 2019. Novamente, podemos usar o loc para filtrar os anos
requisitados e, para cada coluna, extrair a média. Na linha 5 fazemos a extração,
mas veja que está dentro de uma estrutura de repetição, mês a mês. Na linha 6
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 8/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
0
media = df_etanol.loc[2012:2019, mes].mean()
print(f"{mes} = {media:,.0f}".replace(',', '.'))
Ver anotações
Média mensal de rendimentos:
JAN = 248.380
FEV = 210.858
MAR = 135.155
ABR = 58.929
MAI = 106.013
JUN = 244.645
JUL = 295.802
AGO = 276.539
SET = 354.454
OUT = 376.826
NOV = 266.748
DEZ = 319.588
Agora é com você, que tal agora organizar as códigos em funções e deixar a
DESAFIO DA INTERNET
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 9/10
11/22/23, 5:04 PM fmt_ldkls202_u4s2_lin_pro
0
Ver anotações
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 10/10
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
Vanessa Cadan Scheffer
Ver anotações
BIBLIOTECAS E FUNÇÕES PARA CRIAÇÃO DE GRÁFICOS
Para a criação de gráficos em Python são utilizadas as bibliotecas matplotib e outras baseadas
na matplotlib, e também funções que permitem criar e personalizar os gráficos.
Fonte: Shutterstock.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 1/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
negócios seja feita de maneira visual, ou seja, por meio de gráficos. Um gráfico
bem elaborado "fala" por si só e ajuda aos que assistem a entenderem os
resultados.
0
A linguagem Python, conta com uma série de bibliotecas que permitem a criação
Ver anotações
de gráficos, os quais podem ser estáticos (sem iteração) ou dinâmicos, que
possibilidades.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 2/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
MATPLOTLIB
0
biblioteca matplotlib, pois diversas outras são construídas a partir desta. A criação
Ver anotações
e grande parte da evolução dessa biblioteca se deve a John Hunter, que a
desenvolveu como uma opção ao uso dos softwares gnuplot e MATLAB
(MCGREGGOR, 2015). Com a utilização da linguagem Python na área científica para
trabalhar com dados, após a extração dos resultados, o cientista precisava criar
seus gráficos nos outros softwares mencionados, o que se tornava incoveniente,
motivando a criação da biblioteca em Python.
A instalação da biblioteca pode ser feita via pip install: pip install matplotlib,
lembrando que em ambientes como o projeto Anaconta e o Colab esse recurso já
está disponível. O módulo pyplot possui uma coleção de funções que permitem
criar e personalizar os gráficos (https://matplotlib.org/api/_as_gen/matplotlib.pyplo
t.html). Existem duas sintaxes que são amplamente adotadas para importar essa
"inline", ou seja, no próprio notebook. Essa opção faz parte do "Built-in magic
commands", cuja documentação pode ser acessada no endereço https://ipython.re
adthedocs.io/en/stable/interactive/magics.html. Para habilitar utiliza-se a sintaxe:
%matplotlib inline. Portanto, projetos no jupyter notebook, que utilizem o
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 3/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
%matplotlib inline
0
Os gráficos são uma forma visual de "contar" a história dos dados. Em breve
contaremos várias histórias, mas como nosso primeiro gráfico, que tal um pouco
Ver anotações
de arte abstrata? Vamos criar duas listas aleatórias de valores inteiros com o
módulo random e então plotar um gráfico de linhas, com a função plt.plot() do
módulo pyplot. Veja a seguir, após criar duas listas com valores aleatórios, a função
plot() as recebe como parâmetros, utilizando-as para os valores dos eixos
horizontal (x) e vertical (y) e já cria o gráfico. Mágico não? Mas como "ele" sabia que
era para criar um gráfico de linhas? Por que colocou a cor azul? Por que fez desse
tamanho? Todos esses parâmetros e muitos outros, podem ser configurados!
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 4/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
No gráfico que criamos, nós utilizamos a opção 1, ou seja, foi o próprio módulo
que criou o ambiente da figura e do eixo. Ao utilizar a segunda opção, podemos
criar uma figura com ou sem eixos, com a função plt.subplots(), que quando
0
Ver anotações
FIGURA COM EIXO COMO VARIÁVEL
1 linha 2 duas colunas, ou seja, teremos dois eixos. Pense nos eixos como uma
matriz, na qual cada eixo é uma posição que pode ter uma figura alocada. Vale
ressaltar que sobre um eixo (sobre uma figura), podem ser plotados diversos
gráficos. Para criar essa estrutura usamos a sintaxe: fig, ax = plt.subplots(1, 2),
onde fig e ax são os nomes das variáveis escolhidas. A variável ax, é do tipo array
numpy, ou seja, os eixos nada mais são, que uma matriz de contêiners para se
criar os plots. Como a figura possui dois eixos, temos que especificar em qual
vamos plotar, para isso informamos qual contêiner vamos usar: ax[0] ou ax[1].
Veja o código a seguir. Na linha 6 criamos a figura, com 1 linha 2 colunas e o eixo
que vamos utilizar e ainda definimos o tamanho das figuras por meio do
parâmetro figsize. Nas linhas 8, 9 e 10, imprimimos algumas informações para
imprimimos 3 gráficos sobre o primeiro eixo (que será posicionado uma figura do
lado esquerdo), definimos os rótulos dos eixos, o título do gráfico e pedimos para
Das linhas 20 a 26, criamos novos 3 gráficos, mas agora sobre o segundo eixo (que
será posicionado uma figura do lado direito). Nesse novo conjunto de gráficos,
configuramos a aparência das linhas, com os parâmetros 'r--' (red tracejado), 'b--' Imprimir
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 5/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
(blue tracejado) e 'g--' (green tracejado). Observe o resultado dos gráficos. Ao criar
uma estrutura com 1 linha e 2 colunas, os gráficos ficam posicionados lado a lado,
0
In [3]: import numpy as np
Ver anotações
x = range(5)
x = np.array(x) # temos que converter para um array numpy, senão o
plot não consegue fazer operações.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 6/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
Ver anotações
FIGURA SEM EIXO COMO VARIÁVEL
Também podemos criar uma figura, sem atribuir o eixo a uma variável. Nesse caso,
temos que usar a função plt.subplot(n_rows, n_cols2, plot_number), para definir
onde será plotado o gráfico. Veja no código a seguir. Na linha 4 criamos uma figura,
mas agora sem eixo e sem especificar o grid. Na linha 5, estamos adicionando um
subplot com 1 linha, 2 colunas e o primeiro gráfico (121). O primeiro parâmetro do
variável, agora usamos o próprio para acessar a função plot(). Veja que na linha 14
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 7/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
In [4]: x = range(5)
x = np.array(x) # temos que converter para um array numpy, senão o
plot não consegue fazer operações.
0
colunas - Figura 1
plt.plot(x, x, label='eq_1')
Ver anotações
plt.plot(x, x**2, label='eq_2')
plt.plot(x, x**3, label='eq_3')
plt.title("Gráfico 1")
plt.xlabel('Eixo x')
plt.ylabel('Eixo y')
plt.legend()
estrutura com uma sintaxe diferente. Ao optar em utilizar eixos como variáveis ou
não, o desenvolvedor deve ficar atento somente as regras de sintaxe e as funções
disponíveis para cada opção. Podemos então resumir que:
otlib.org/api/_as_gen/matplotlib.pyplot.subplots.html#matplotlib.pyplot.subplot
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 8/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
s).
s://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplo
0
t.subplot).
Ver anotações
Que tal treinar e explorar utilizando o simulador a seguir. Veja os exemplos que a
BIBLIOTECA PANDAS
gráficos a partir dos dados nas estruturas. Vamos começar criando um DataFrame
a partir de um dicionário, com a quantidade de alunos em três turmas distintas.
dados = {
'turma':['A', 'B', 'C'],
'qtde_alunos':[33, 50, 45]
}
df = pd.DataFrame(dados)
df
0 A 33
1 B 50
2 C 45
existem três que são triviais: os nomes das colunas com os dados para os eixos x e
y, bem como o tipo de gráfico (kind). Veja o código a seguir, os valores da coluna
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 9/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
entretanto mudando o tipo de gráfico para barra na horizontal (barh) e linha (line).
0
In [6]: df.plot(x='turma', y='qtde_alunos', kind='bar')
Ver anotações
Out[6]: <matplotlib.axes._subplots.AxesSubplot at 0x1cf339fe7b8>
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 10/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
No endereço https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.
0
usados como legenda. Veja a seguir, fazemos a transformação no DF seguido do
Ver anotações
plot com o tipo pie. Esse tipo de sintaxe é chamado de encadeamento, pois ao
invés de fazermos a transformação, salvar em um novo objeto e depois plotar,
fazemos tudo em uma única linha, sem precisar criar o novo objeto.
Vale ressaltar que para todos os gráficos criados, a biblioteca oferece uma segunda
opção de sintaxe, que é invocar o tipo de gráfico como método, por exemplo:
df.plot.bar(x='turma', y='qtde_alunos')
df.plot.line(x='turma', y='qtde_alunos')
df.set_index('turma').plot.pie(y='qtde_alunos')
EXEMPLIFICANDO
anp.gov.br/arquivos/dadosabertos/iee/exportacao-etanol-hidratado-2012-2
020-bep.csv, para analisarmos e extrairmos informações de forma visual.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeD… 11/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
Para conseguir utilizar o método plot nessa base, teremos que transformar
0
In [10]: df_etanol = pd.read_csv('exportacao-etanol-hidratado-2012-
2020-bep.csv', sep=';', encoding="ISO-8859-1")
Ver anotações
# Apaga colunas que não usaremos
df_etanol.drop(columns=['PRODUTO', 'MOVIMENTO COMERCIAL',
'UNIDADE'], inplace=True)
df_etanol.head(2)
que, de forma visual, possamos identificar o ano que teve a menor e maior
arrecadação para o mês de janeiro. Veja o código a seguir. No eixo x, vamos
usar a informação de ano, e no y todos os valores da coluna 'JAN'; (kind) o
identificar com facilidade que o ano que teve menor arrecadação nesse
mês, foi 2017 e o maior 2013. Também plotamos o mesmo gráfico, mas em
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 12/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
In [11]: df_etanol.plot(x='ANO',
y='JAN',
Ver anotações
kind='bar',
figsize=(10, 5),
rot=0,
fontsize=12,
legend=False)
df_etanol.plot(x='ANO',
y='JAN',
kind='line',
figsize=(10, 5),
rot=0,
fontsize=12,
legend=False)
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 13/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
rotação da legenda e o tamanho da fonte. Os valores para o eixo y, serão
Ver anotações
usados das colunas. Com essa construção se torna possível avaliar,
visualmente, o desempenho nos meses. Veja que em determinados anos, a
BIBLIOTECA SEABORN
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 14/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
carregadas. Temos 244 linhas e 7 colunas, cujos dados são do tipo ponto flutuante,
categóricos e um inteiro.
0
In [13]: import seaborn as sns
Ver anotações
# Configurando o visual do gráfico. Leia mais em
https://seaborn.pydata.org/generated/seaborn.set.html#seaborn.set
sns.set(style="whitegrid") # opções: darkgrid, whitegrid, dark,
white, ticks
df_tips = sns.load_dataset('tips')
print(df_tips.info())
df_tips.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
total_bill 244 non-null float64
tip 244 non-null float64
sex 244 non-null category
smoker 244 non-null category
day 244 non-null category
time 244 non-null category
size 244 non-null int64
dtypes: category(4), float64(2), int64(1)
memory usage: 7.2 KB
None
O tipo de dados que uma coluna possui é muito importante para a biblioteca
seborn, uma vez que as funções usadas para construir os gráficos são dividas em
grupos: relacional, categóricos, distribuição, regressão, matriz e grids (https://seab
orn.pydata.org/api.html).
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 15/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
FUNÇÃO BARPLOT()
0
biblioteca suporta. Veja o construtor da função barplot: seaborn.barplot(x=None,
Ver anotações
y=None, hue=None, data=None, order=None, hue_order=None, estimator=function
estatísticos, que dão muita flexibilidade e poder aos cientista de dados, vamos falar
sobre o parâmetro "estimator", que por default é a função média. Isso significa que
cada barra do gráfico, exibirá a média dos valores de uma determinada coluna, o
que pode não fazer sentido, uma vez que queremos exibir a quantidade dos
valores (len) ou a soma (sum).
Para entender como esse parâmetro pode "afetar" a construção do gráfico, veja o
código a seguir. Usamos o matplotlib para construir uma figura e um eixo com três
posições. Nosso primeiro gráfico de barras (linha 3), utiliza o estimator padrão, que
sabemos que é a média. O segundo (linha 4), utiliza a função de soma como
estimator e o terceiro (linha 5), a função len, para contar. Veja no resultado como
os gráficos são diferentes. No primeiro, nos conta que a o valor médio da conta
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 16/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
Ver anotações
Construir gráficos não é somente plotar imagens bonitas, existem muitos conceitos
estatísticos envolvidos e a biblioteca seaborn fornece mecanismos para que essas
informações estejam presentes nos resultados visuais.
gráfico está na linha 3, mas configuramos seu tamanho na linha 1, e das linhas 5 a
8, configuramos os rótulos e os tamanhos.
FUNÇÃO COUNTPLOT()
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 17/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
saturation=0.75, dodge=True, ax=None, **kwargs).
Ver anotações
Esse método não aceita que sejam passados valores de x e y ao mesmo tempo,
pois a contagem será feita sobre uma variável categórica, portanto devemos
especificar x ou y, a diferença será na orientação do gráfico. Se informamos x,
teremos uma gráfico na vertical, se y, na horizontal.
quantidade de pessoas por dia, mas discriminado por genêro, quantos homens e
mulheres estiveram presentes em cada dia? Veja no código a seguir, a única
diferença é o parâmetro.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 18/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
Ver anotações
FUNÇÃO SCARTTERPLOT()
Vamos construir um gráfico que permita avaliar se existe uma relação entre o valor
da conta e da gorjeta. Será que quem gastou mais também deu mais gorjeta? Veja
o código a seguir, invocamos a função passando o valor da conta como parâmetro
para x e a gorjeta para y. Agora vamos avaliar o resultado. Cada "bolinha"
representa uma conta paga e uma gorjeta, por exemplo, a bolinha mais a direita,
podemos interpretar que para uma conta de aproximadamente 50 e poucos
doláres foi dada uma gorjeta de 10. Olhando para o gráfico, parece quanto maior o
valor da conta, maior foi o valor da gorjeta. Esse comportamento é chamado de
relação linear, pois conseguimos traçar uma reta entre os pontos, descrevendo seu
comportamento através de uma função linear.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 19/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
Ver anotações
O gráfico scatterplot é muito utilizado por cientistas de dados que estão buscando
por padrões nos dados. O padrão observado no gráfico, que mostra a relação
entre o valor da conta e da gorjeta, pode ser um forte indício que, caso o cientista
precise escolher um algoritmo de aprendizado de máquina para prever a
quantidade de gorjeta que um cliente dará, ele poderá uma regressão linear.
O universo dos dados é cada vez mais requisitado nas empresas, se você gostou
do que aprendemos, não deixe de investir mais tempo em estudo e treinamento,
pois há muito o que se aprender!
2020.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 20/21
11/22/23, 5:05 PM npf_ldkls202_u4s3_lin_pro
0
Ver anotações
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividade… 21/21
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
0
Vanessa Cadan Scheffer
Ver anotações
ANÁLISE E APRESENTAÇÃO DE DADOS
As bibliotecas pandas, matplotlib e seaborn podem ser utilizadas para o carregamento dos
dados e a geração dos gráficos.
Fonte: Shutterstock.
DESAFIO
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 1/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
0
Nessa primeira entrega, você deve apresentar a comparação da quantidade de
satélites que são brasileiros, dos que são estrangeiros. Dentre os satélites
Ver anotações
brasileiros, você deve discriminar a quantidade de cada operadora comercial, bem
Onde esses dados podem ser encontrados? Qual a melhor forma de apresentar os
resultados, basta levar os números? Qual biblioteca pode ser usada para resolver o
desafio?
RESOLUÇÃO
Um dos grandes desafios nessa primeira entrega é encontrar uma fonte confiável
de dados.
Agora que identificamos uma fonte confiável podemos usar as bibliotecas pandas,
matplotlib e seaborn para carregar os dados e gerar gráficos que contemplem as
informações solicitadas.
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 2/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
removidas (linha 2) e para ter os índices variando de 0 até N, vamos resetar (linha
0
3).
Ver anotações
Como resultado temos um DF com 68 linhas e 7 colunas.
print(df_satelites.info())
df_satelites.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 68 entries, 0 to 67
Data columns (total 7 columns):
Satelite operando 68 non-null object
Órbita 68 non-null object
Bandas 68 non-null object
Status do Satélite 68 non-null object
Pos. Orbital 68 non-null object
Direito 68 non-null object
Operadora Comercial 68 non-null object
dtypes: object(7)
memory usage: 3.8+ KB
None
Satélite
EUTELSAT 65 C (AP30B), Ku (AP30B), operação
0 Geoestacionário 65ºO Brasileiro EUTELSAT DO BRASIL LTDA
West A Ka comercial
(GEO)
Satélite
HISPASAT operação
1 Geoestacionário Ku (AP30/30A) 74ºO Brasileiro HISPAMAR SATELITES S.A.
74W-1 comercial
(GEO)
Satélite
operação
2 AL YAH 3 Geoestacionário Ka 20ºO Brasileiro YAH TELECOMUNICAÇÕES LTDA
comercial
(GEO)
Satélite
operação TELECOMUNICACOES
3 SGDC Geoestacionário Ka 75ºO Brasileiro
comercial BRASILEIRAS SA TELEBRAS
(GEO)
Satélite
C (não planejada), Ku operação
4 SES-14 Geoestacionário 47,5ºO Brasileiro SES DTH DO BRASIL LTDA
(não planejada), Ka comercial
(GEO)
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 3/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
Agora vamos criar um gráfico que faz a contagem e visualmente, faz a comparação
entre a quantidade de satélites brasileiros e estrangeiros. Podemos usar o
0
matplotlib para configurar o tamanho da figura e dos textos nos eixos.
Ver anotações
In [21]: # Quantos satélites são brasileiros e quantos são estrangeiro?
plt.figure(figsize=(5,3))
plt.tick_params(labelsize=12)
sns.countplot(data=df_satelites, x='Direito')
df_satelites_brasileiros = df_satelites.loc[df_satelites['Direito']
== 'Brasileiro']
plt.figure(figsize=(15,5))
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
sns.countplot(data=df_satelites_brasileiros, x='Operadora
Comercial')
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 4/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
0
Ver anotações
Para saber quantos satélites brasileiros estão operando em cada banda, vamos
usar o countplot, passando como parâmetro o df_satelites_brasileiros e a coluna
plt.figure(figsize=(15,5))
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
sns.countplot(data=df_satelites_brasileiros, x='Bandas')
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 5/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
0
Ver anotações
Agora vamos repetir os mesmos processos para os satélites estrangeiros,
sobre eles (linha 3). Esse primeiro gráfico mostra quantos satélites cada operadora
estrangeira possui em operação.
df_satelites_estrangeiros = df_satelites.loc[df_satelites['Direito']
== 'Estrangeiro']
plt.figure(figsize=(15,5))
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
sns.countplot(data=df_satelites_estrangeiros, x='Operadora
Comercial')
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 6/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
0
Ver anotações
Agora vamos plotar quantos satélites estrangeiros estão operando em cada banda.
plt.figure(figsize=(15,5))
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
sns.countplot(data=df_satelites_estrangeiros, x='Bandas')
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 7/8
11/22/23, 5:05 PM fmt_ldkls202_u4s3_lin_pro
0
Ver anotações
Com essas informações o cliente começará a ter argumentos para a escolha de
uma operadora e banda que deseja contratar. Que tal personalizar um pouco mais
o tamanho das legendas, criar títulos para os gráficos?
DESAFIO DA INTERNET
https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=brennernunes78%40gmail.com&usuarioNome=BRENNER+NUNES+GRANJEIRO&disciplinaDescricao=&atividadeId=3684107&atividadeDes… 8/8