LDDFRT 6yrhdy
LDDFRT 6yrhdy
LDDFRT 6yrhdy
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