Olá! Meu nome é Guilherme Lima e venho lhe dar as boas vindas ao curso Pandas: Formatos diferentes de entrada e saída (IO), no qual trabalharemos com JSON, HTML, arquivos CSV, arquivos Excel e banco SQL tanto na entrada quanto na saída.
Na parte prática, analisaremos uma escola de programação com diferentes cursos e diversos alunos e alunas. Nosso objetivo será realizar análises descritivas dessa escola, que será criada a partir das nossas entradas de dados.
Começaremos criando o nome dos alunos e alunas a partir de um arquivo JSON. Para buscarmos os nomes dos cursos, realizaremos a leitura de uma página HTML - ou seja, um site contendo uma tabela que será trazida para nosso dataframe. Aprenderemos então a manipular essa tabela de modo a utilizá-la em nossas análises.
Além disso, exportaremos as informações para diferentes tipos de arquivos, alguns dos quais já trabalhamos nos cursos anteriores. Trabalharemos também com um banco SQL, aprendendo a conectar o Pandas com esse tipo de banco e realizando queries que nos permitirão exportar informações em diferentes formatos de arquivo. Por fim, leremos alguns outros tipos de arquivos, como tabelas do Excel.
Se você deseja aprofundar ainda mais os seus conhecimentos com o Pandas, eu te convido a participar desse curso!
Bons estudos!
Nos treinamentos anteriores, geralmente disponibilizávamos um arquivo .csv
para realizarmos nossas análises. Porém, a biblioteca Pandas também nos permite importar e exportar diferentes tipos de arquivos, que é o que faremos nesse treinamento.
Começaremos analisando as informações de uma escola de programação que possui muitos alunos e alunas em diferentes cursos. Abriremos o Google Colaboratory e criaremos um novo notebook Python 3, que renomearemos para Pandas IO.ipynb
.
Na atividade anterior, "Preparando o ambiente", temos um passo a passo do que é necessário para utilizar o Colaboratory, uma ferramenta disponibilidade pelo Google para programação em Python.
Repare que até o momento não temos nenhum arquivo para trabalhar, afinal não fizemos nenhum upload. De que outra forma podemos trazer as informações de nomes dos nossos alunos e alunas? Uma alternativa para criação desses nomes é procurarmos no Google uma API do IBGE contendo tais dados.
Nosso primeiro resultado será "IBGE - API de serviço de dados", que nos levará direto a uma API com informações coletadas no censo de 2010, divididas em "Frequência por nome" e "Ranking por frequência". Acessaremos esse segundo conjunto clicando no link:
https://servicodados.ibge.gov.br/api/v2/censos/nomes/ranking
Receberemos no navegador uma lista de nomes (como "JOSE" e "MARIA") no formato JSON. Se aleterarmos o link para a versão 1 do conjunto (v1
), teremos uma visualização mais facilitada.
https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking
Aqui identificaremos nomes como "ANA", "ANTONIO" e assim por diante. Também podemos filtrar mais as nossas informações. Após "ranking", adicionaremos uma interrogação (?
) e o parâmetro qtd=20
. Além disso, usaremos o caractere &
(conhecido como "e comercial") para passarmos mais um parâmetro, sexo=f
.
https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=20&sexo=f
Nosso resultado será uma lista contendo 20 nomes, todos eles do sexo feminino. Se alterarmos o último parâmetro para sexo=m
, conseguiremos os nomes de sexo masculino.
Voltando ao Colaboratory, importaremos o Pandas em nosso projeto com o conhecido comando import pandas as pd
(utilizando o apelido convencional pd
).
import pandas as pd
Agora gostaríamos de ler a API contendo os nomes masculinos e femininos. Para isso, chamaremos a função pd.read_json()
- ou seja, uma função que lê arquivos JSON. Como parâmetro, entre aspas duplas, passaremos a URL dos nomes de sexo feminino.
pd.read_json("https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=20&sexo=f")
Ao executarmos, receberemos uma tabela contendo os 20 nomes da nossa consulta - ou seja, do índice 0
ao 19
.
nome | regiao | freq | rank | sexo | |
---|---|---|---|---|---|
0 | MARIA | 0 | 11694738 | 1 | F |
1 | ANA | 0 | 3079729 | 2 | F |
2 | FRANCISCA | 0 | 721637 | 3 | F |
3 | ANTONIA | 0 | 588783 | 4 | F |
4 | ADRIANA | 0 | 565621 | 5 | F |
5 | JULIANA | 0 | 562589 | 6 | F |
6 | MARCIA | 0 | 551855 | 7 | F |
7 | FERNANDA | 0 | 531607 | 8 | F |
8 | PATRICIA | 0 | 529446 | 9 | F |
9 | ALINE | 0 | 509869 | 10 | F |
10 | SANDRA | 0 | 479230 | 11 | F |
11 | CAMILA | 0 | 469851 | 12 | F |
12 | AMANDA | 0 | 464624 | 13 | F |
13 | BRUNA | 0 | 460770 | 14 | F |
14 | JESSICA | 0 | 456472 | 15 | F |
15 | LETICIA | 0 | 434056 | 16 | F |
16 | JULIA | 0 | 430067 | 17 | F |
17 | LUCIANA | 0 | 429769 | 18 | F |
18 | VANESSA | 0 | 417512 | 19 | F |
19 | MARIANA | 0 | 381778 | 20 | F |
Se alterarmos o último parâmetro para sexo=m
, teremos os 20 nomes masculinos.
pd.read_json("https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=20&sexo=m")
nome | regiao | freq | rank | sexo | |
---|---|---|---|---|---|
0 | JOSE | 0 | 5732508 | 1 | M |
1 | JOAO | 0 | 2971935 | 2 | M |
2 | ANTONIO | 0 | 2567494 | 3 | M |
3 | FRANCISCO | 0 | 1765197 | 4 | M |
4 | CARLOS | 0 | 1483121 | 5 | M |
5 | PAULO | 0 | 1417907 | 6 | M |
6 | PEDRO | 0 | 1213557 | 7 | M |
7 | LUCAS | 0 | 1116818 | 8 | M |
8 | LUIZ | 0 | 1102927 | 9 | M |
9 | MARCOS | 0 | 1101126 | 10 | M |
10 | LUIS | 0 | 931530 | 11 | M |
11 | GABRIEL | 0 | 922744 | 12 | M |
12 | RAFAEL | 0 | 814709 | 13 | M |
13 | DANIEL | 0 | 706527 | 14 | M |
14 | MARCELO | 0 | 690098 | 15 | M |
15 | BRUNO | 0 | 663271 | 16 | M |
16 | EDUARDO | 0 | 628539 | 17 | M |
17 | FELIPE | 0 | 615924 | 18 | M |
18 | RAIMUNDO | 0 | 611174 | 19 | M |
19 | RODRIGO | 0 | 598825 | 20 | M |
Claro, não queremos ter que rodar essas linhas de código toda vez que precisarmos visualizar nossos alunos e alunas. Sendo assim, criaremos as variáveis nomes_m
e nomes_f
armazenando os nomes masculinos e femininos, respectivamente.
nomes_f = pd.read_json("https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=20&sexo=f")
nomes_m = pd.read_json("https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=20&sexo=m")
Se quisermos, podemos visualizar nossos nomes a partir de cada variável.
nomes_f
nome | regiao | freq | rank | sexo | |
---|---|---|---|---|---|
0 | MARIA | 0 | 11694738 | 1 | F |
1 | ANA | 0 | 3079729 | 2 | F |
2 | FRANCISCA | 0 | 721637 | 3 | F |
3 | ANTONIA | 0 | 588783 | 4 | F |
4 | ADRIANA | 0 | 565621 | 5 | F |
5 | JULIANA | 0 | 562589 | 6 | F |
6 | MARCIA | 0 | 551855 | 7 | F |
7 | FERNANDA | 0 | 531607 | 8 | F |
8 | PATRICIA | 0 | 529446 | 9 | F |
9 | ALINE | 0 | 509869 | 10 | F |
10 | SANDRA | 0 | 479230 | 11 | F |
11 | CAMILA | 0 | 469851 | 12 | F |
12 | AMANDA | 0 | 464624 | 13 | F |
13 | BRUNA | 0 | 460770 | 14 | F |
14 | JESSICA | 0 | 456472 | 15 | F |
15 | LETICIA | 0 | 434056 | 16 | F |
16 | JULIA | 0 | 430067 | 17 | F |
17 | LUCIANA | 0 | 429769 | 18 | F |
18 | VANESSA | 0 | 417512 | 19 | F |
19 | MARIANA | 0 | 381778 | 20 | F |
Considerando ambos os conjuntos, temos 40
nomes, o que é pouco pensando no escopo de uma grande escola de programação. Portanto, ao invés de apenas 20
nomes de cada sexo, passaremos a utilizar 200
.
nomes_f = pd.read_json("https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=200&sexo=f")
nomes_m = pd.read_json("https://servicodados.ibge.gov.br/api/v1/censos/nomes/ranking?qtd=200&sexo=m")
nomes_m
Com isso, o índice das nossas tabelas passará a registrar de 0
a 199
, totalizando 200 nomes masculinos e 200 femininos.
nome | regiao | freq | rank | sexo | |
---|---|---|---|---|---|
0 | JOSE | 0 | 5732508 | 1 | M |
1 | JOAO | 0 | 2971935 | 2 | M |
2 | ANTONIO | 0 | 2567494 | 3 | M |
3 | FRANCISCO | 0 | 1765197 | 4 | M |
4 | CARLOS | 0 | 1483121 | 5 | M |
... | ... | ... | ... | ... | ... |
195 | WALTER | 0 | 67207 | 196 | M |
196 | ARLINDO | 0 | 66669 | 197 | M |
197 | MICHAEL | 0 | 65736 | 198 | M |
198 | ALVARO | 0 | 65444 | 199 | M |
199 | GEOVANE | 0 | 65435 | 200 | M |
Podemos identificar a quantidade de nomes em nossos conjuntos imprimindo (print()
) o tamanho de cada um deles. Para isso, concatenaremos a string "Quantidade de nomes: " com a soma len(nomes_f) + len(nomes_m))
.
print("Quantidade de nomes: " + len(nomes_f) + len(nomes_m))
A execução dessa instrução resultará em um erro, afinal o retorno da soma é um número inteiro, e não uma string que possa ser concatenada com nosso texto. Corrigiremos isso utilizando a função conversora str()
.
print("Quantidade de nomes: " + str(len(nomes_f) + len(nomes_m)))
Quantidade de nomes: 400
Agora queremos juntar esses dois conjuntos em um único dataframe contendo os nomes de todos os alunos e alunas da escola. Para isso, criaremos uma variável frames
que receberá uma lista contendo nossas informações.
frames = [nomes_f, nomes_m]
Em seguida, poderíamos usar a função pd.concat()
do Pandas para concatenarmos os dados em um único dataframe. Entretanto, se observamos nossa lista frames
, veremos que existem diversas colunas desnecessárias para o projeto, como freq
(a frequência do nome no país), nem o rank
(de ranking), a região ou o sexo.
Na função pd.concat()
, é possível especificar quais colunas queremos concatenar, nesse caso apenas a nome
. Ao final, usaremos a função to_frame()
para transformarmos o conjunto resultante em um dataframe.
pd.concat(frames)['nome'].to_frame()
Como resultado, teremos:
nome | |
---|---|
0 | MARIA |
1 | ANA |
2 | FRANCISCA |
3 | ANTONIA |
4 | ADRIANA |
... | ... |
195 | WALTER |
196 | ARLINDO |
197 | MICHAEL |
198 | ALVARO |
199 | GEOVANE |
Armazenaremos esse retorno em uma variável nomes
:
nomes = pd.concat(frames)['nome'].to_frame()
Com a função sample()
, podemos conseguir um determinado número de amostras aleatórias dentro deste dataframe. Nesse caso, pediremos cinco:
nomes.sample(5)
nome | |
---|---|
30 | ANDERSON |
5 | PAULO |
31 | RICARDO |
85 | FABRICIO |
17 | FELIPE |
Executando novamente, teremos outro resultado.
nome | |
---|---|
156 | VALDEMAR |
178 | DENILSON |
13 | BRUNA |
187 | NAIARA |
82 | SOLANGE |
Com o comando pd.read_json()
, criamos um dataframe com 400 nomes, entre eles 200 femininos e 200 masculinos, que foram reunidos utilizando a função concat()
.
No mundo real, as escolas geralmente guardam, além dos nomes, mais informações dos alunos e alunas que lá estudam. Seria interessante incluirmos na nossa tabela alguns desses dados, como um e-mail de cadastro e um código de identificação. Antes de prosseguirmos, vamos organizar melhor nosso projeto adicionando uma caixa de texto com o título "Criando os nomes" (precedido por uma cerquilha #
) antes da importação do Pandas, criando uma seção.
#Criando os nomes
Toda criação de seções seguirá o mesmo procedimento!
Após todos os códigos que escrevemos até agora, adicionaremos um novo texto, agora com o título "Incluindo ID dos alunos". Dessa forma, poderemos utilizar as setas no canto inferior esquerdo para minimizarmos determinadas seções.
A ideia agora é gerarmos um ID para nossos alunos e alunas, algo que podemos fazer de forma aleatória utilizando a biblioteca Numpy do Python, que por convenção recebe o apelido np
.
import numpy as np
Utilizaremos a função random.seed()
com o parâmetro 123
pára gerarmos sempre a mesma sequência de números aleatórios.
import numpy as np
np.random.seed(123)
Criaremos uma variável total_alunos
que receberá a chamada de len(nomes)
, de modo a termos um registro de quantos alunos temos na escola.
total_alunos = len(nomes)
total_alunos
400
Atualmente, nossos alunos possuem uma identificação de acordo com a sua posição no conjunto. Por exemplo, se pegarmos uma amostra de 3 nomes, teremos:
nomes.sample(3)
nome | |
---|---|
34 | SEBASTIAO |
42 | MARLENE |
103 | MAICON |
O "34" é a posição do nome "Sebastião", mas queremos que os IDs sejam aleatórios, compreendendo entre 1 a 400. Como aprendemos em cursos anteriores, é possível criar novas colunas em um dataframe passando um novo nome entre colchetes. Nesse caso, criaremos a coluna "id_aluno".
A nova coluna receberá a chamada de np.random.permutation()
, uma função do Pandas que distribui números de forma aleatória. Para ela, passaremos como parâmetro o total_alunos
e somaremos 1
.
nomes["id_aluno"] = np.random.permutation(total_alunos) + 1
Isso nos trará a nova coluna, id_aluno
, que compreende números de 1
a 400
distribuídos aleatoriamente
nome | id_aluno | |
---|---|---|
46 | FABIANA | 373 |
159 | SELMA | 29 |
3 | ANTONIA | 383 |
Com nomes.sample(5)
, conseguiremos novas amostras:
nome | id_aluno | |
---|---|---|
113 | VICENTE | 27 |
160 | MOACIR | 25 |
146 | WILIAM | 226 |
34 | SEBASTIAO | 270 |
61 | CICERO | 335 |
nome | id_aluno | |
---|---|---|
92 | DIOGO | 345 |
166 | KELLY | 45 |
98 | THAIS | 12 |
142 | HUGO | 19 |
184 | MARILIA | 252 |
Repare que os IDs são diferentes da posição de cada nome no dataframe, como no exemplo da "Kelly", que figura na posição 166
, mas cujo ID é 45
.
Quando um aluno se matricula em um curso, além de um ID, as escolas costumam pedir também um e-mail para envio de informações, mensalidades, certificados e assim por diante. Para implementarmos isso em nosso projeto, criaremos a lista dominios
que receberá dois valores: `@dominiodoemmail.com.bre
@servicodoemail.com`.
dominios = ['@dominiodoemmail.com.br', '@servicodoemail.com']
A ideia é juntarmos os nomes dos nossos alunos a um desses domínios. Criaremos então, em nosso dataframe, as novas colunas "dominio" e "email".
A coluna nomes['dominio']
irá receber, randomicamente, algum dos domínios da nossa lista, algo que faremos com a função np.random.choice()
para qual passaremos, como parâmetros, os dominios
e o total_alunos
.
dominios = ['@dominiodoemmail.com.br', '@servicodoemail.com']
nomes['dominio'] = np.random.choice(dominios, total_alunos)
Ao executarmos um nomes.sample(5)
, veremos que a nova coluna foi adicionada.
nome | id_aluno | dominio | |
---|---|---|---|
63 | FABIANA | 81 | @dominiodoemmail.com.br |
185 | DIEGO | 38 | @dominiodoemmail.com.br |
144 | NILTON | 311 | @servicodoemail.com |
120 | MOISES | 398 | @servicodoemail.com |
101 | GISELE | 282 | @servicodoemail.com |
Agora queremos juntar os nomes aos seus respectivos domínios, formando os endereços de e-mail. Para isso, criaremos a coluna nomes['email']
que receberá a concatenação de nomes.nome
com nomes.dominio
. Como queremos concatenar strings, usaremos a função str.cat()
. Além disso, desejamos que os nomes estejam em caixa baixa (letras minúsculas), o que conseguiremos com str.lower()
.
nomes['email'] = nomes.nome.str.cat(nomes.dominio).str.lower()
Trazendo uma amostra de 5
nomes, teremos:
nome | id_aluno | dominio | ||
---|---|---|---|---|
75 | NELSON | 48 | @dominiodoemmail.com.br | nelson@dominiodoemmail.com.br |
18 | RAIMUNDO | 267 | @servicodoemail.com | raimundo@servicodoemail.com |
120 | JOSIANE | 179 | @servicodoemail.com | josiane@servicodoemail.com |
74 | ALAN | 123 | @dominiodoemmail.com.br | alan@dominiodoemmail.com.br |
71 | MARTA | 326 | @dominiodoemmail.com.br | marta@dominiodoemmail.com.br |
Nosso dataframe agora já tem características mais interessantes para o registro de alunos em uma escola, não acha?
O curso Pandas: formatos diferentes de entrada e saída (IO) possui 91 minutos de vídeos, em um total de 30 atividades. Gostou? Conheça nossos outros cursos de Data Science em Data Science, ou leia nossos artigos de Data Science.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.
Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.
Emitimos certificados para atestar que você finalizou nossos cursos e formações.
Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.
Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.
Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.
Emitimos certificados para atestar que você finalizou nossos cursos e formações.
Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.
Acesso completo
durante 1 ano
Estude 24h/dia
onde e quando quiser
Novos cursos
todas as semanas