Primeiras aulas do curso Pandas: Formatos diferentes de entrada e saída (IO)

Pandas: Formatos diferentes de entrada e saída (IO)

Alunas e alunos com Json - Introdução

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!

Alunas e alunos com Json - Lendo nomes com Json

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.

nomeregiaofreqranksexo
0MARIA0116947381F
1ANA030797292F
2FRANCISCA07216373F
3ANTONIA05887834F
4ADRIANA05656215F
5JULIANA05625896F
6MARCIA05518557F
7FERNANDA05316078F
8PATRICIA05294469F
9ALINE050986910F
10SANDRA047923011F
11CAMILA046985112F
12AMANDA046462413F
13BRUNA046077014F
14JESSICA045647215F
15LETICIA043405616F
16JULIA043006717F
17LUCIANA042976918F
18VANESSA041751219F
19MARIANA038177820F

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")
nomeregiaofreqranksexo
0JOSE057325081M
1JOAO029719352M
2ANTONIO025674943M
3FRANCISCO017651974M
4CARLOS014831215M
5PAULO014179076M
6PEDRO012135577M
7LUCAS011168188M
8LUIZ011029279M
9MARCOS0110112610M
10LUIS093153011M
11GABRIEL092274412M
12RAFAEL081470913M
13DANIEL070652714M
14MARCELO069009815M
15BRUNO066327116M
16EDUARDO062853917M
17FELIPE061592418M
18RAIMUNDO061117419M
19RODRIGO059882520M

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
nomeregiaofreqranksexo
0MARIA0116947381F
1ANA030797292F
2FRANCISCA07216373F
3ANTONIA05887834F
4ADRIANA05656215F
5JULIANA05625896F
6MARCIA05518557F
7FERNANDA05316078F
8PATRICIA05294469F
9ALINE050986910F
10SANDRA047923011F
11CAMILA046985112F
12AMANDA046462413F
13BRUNA046077014F
14JESSICA045647215F
15LETICIA043405616F
16JULIA043006717F
17LUCIANA042976918F
18VANESSA041751219F
19MARIANA038177820F

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.

nomeregiaofreqranksexo
0JOSE057325081M
1JOAO029719352M
2ANTONIO025674943M
3FRANCISCO017651974M
4CARLOS014831215M
..................
195WALTER067207196M
196ARLINDO066669197M
197MICHAEL065736198M
198ALVARO065444199M
199GEOVANE065435200M

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
0MARIA
1ANA
2FRANCISCA
3ANTONIA
4ADRIANA
......
195WALTER
196ARLINDO
197MICHAEL
198ALVARO
199GEOVANE

Armazenaremos esse retorno em uma variável nomes. 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
30ANDERSON
5PAULO
31RICARDO
85FABRICIO
17FELIPE

Executando novamente, teremos outro resultado.

nome
156VALDEMAR
178DENILSON
13BRUNA
187NAIARA
82SOLANGE

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().

Alunas e alunos com Json - Incluindo ID dos alunos

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
34SEBASTIAO
42MARLENE
103MAICON

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

nomeid_aluno
46FABIANA373
159SELMA29
3ANTONIA383

Com nomes.sample(5), conseguiremos novas amostras:

nomeid_aluno
113VICENTE27
160MOACIR25
146WILIAM226
34SEBASTIAO270
61CICERO335
nomeid_aluno
92DIOGO345
166KELLY45
98THAIS12
142HUGO19
184MARILIA252

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.

nomeid_alunodominio
63FABIANA81@dominiodoemmail.com.br
185DIEGO38@dominiodoemmail.com.br
144NILTON311@servicodoemail.com
120MOISES398@servicodoemail.com
101GISELE282@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:

nomeid_alunodominioemail
75NELSON48@dominiodoemmail.com.brnelson@dominiodoemmail.com.br
18RAIMUNDO267@servicodoemail.comraimundo@servicodoemail.com
120JOSIANE179@servicodoemail.comjosiane@servicodoemail.com
74ALAN123@dominiodoemmail.com.bralan@dominiodoemmail.com.br
71MARTA326@dominiodoemmail.com.brmarta@dominiodoemmail.com.br

Nosso dataframe agora já tem características mais interessantes para o registro de alunos em uma escola, não acha?

Sobre o curso Pandas: Formatos diferentes de entrada e saída (IO)

O curso Pandas: Formatos diferentes de entrada e saída (IO) possui 93 minutos de vídeos, em um total de 29 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:

Aprenda Data Science acessando integralmente esse e outros cursos, comece hoje!

  • 1222 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1222 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1222 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1222 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?

Acesso completo por 1 ano

Estude 24h/dia onde e quando quiser

Novos cursos todas as semanas