Boas-vindas a este curso de Seleção e Agrupamento de Dados com a Biblioteca Pandas!
Autodescrição: João Miranda é um homem branco de cabelo médio preso em um coque, com as laterais raspadas. Ele tem a barba rente ao rosto, veste uma camiseta cinza com a logomarca da Alura e está à frente de uma parede com iluminação esverdeada e uma estante de livros com um objeto escrito "Data Science".
Neste curso, criaremos tabelas e gráficos para analisar dados de emissão de gases do efeito estufa no Brasil. Ao concluir este curso, você conseguirá selecionar, filtrar e agrupar dados.
Atenção: este curso não foca na limpeza e tratamento de dados! Por isso, não ensinaremos técnicas de tratamento de dados nulos e outliers.
Para aproveitar bem este conteúdo, recomendamos que você tenha conhecimentos básicos em linguagem de programação Python e da Biblioteca Pandas.
Vamos começar?
Fazemos parte de um órgão de fiscalização ambiental e queremos analisar os dados de emissões de gases do efeito estufa no Brasil. A equipe de supervisão do órgão solicitou algumas informações. Como cientistas de dados, o nosso trabalho será criar tabelas e visualizações para responder às perguntas feitas.
Usaremos o Google Colab para criar e executar os códigos, usando uma base de dados fornecida pelo site do Sistema de Estimativa de Emissões e Remoções de Gases do Efeito Estufa (SEEG).
O primeiro passo será fazer o upload da base de dados que está no nosso computador. Com o Google Colab aberto, clicaremos no ícone de uma pasta na lateral esquerda ("Arquivos").
Poderíamos clicar no ícone de uma folha de papel com uma seta para cima ("Fazer upload para o armazenamento da sessão"). No entanto, como a base de dados com a qual iremos trabalhar é um pouco pesada, cada vez que fecharmos e reabrirmos o Google Colab, teríamos que fazer um novo upload.
Por isso, usaremos a opção "Montar Drive", cujo ícone é uma pasta cinza com o símbolo do Google Drive. Ao utilizá-la, geraremos um link de acesso entre o Google Colab e o Google Drive. Por meio dele, faremos a leitura do código diretamente dos arquivos no Google Drive.
Ao clicarmos em "Montar Drive", surgirá uma aba na tela pedindo a permissão para que este notebook acesse os seus arquivos do Google Drive. Clicaremos no botão "Conectar ao Google Drive".
Uma vez que a minha conta do Gmail já está conectada ao Google Colab, ele automaticamente gera uma pasta chamada "drive" no menu lateral esquerdo com todos os arquivos que estão no meu Google Drive.
Com um clique sobre a pasta, farei o caminho "drive > MyDrive > Alura > dados". Dentro da pasta "dados", encontrarei o arquivo da base com a qual desejamos trabalhar ("1-SEEG10_GERAL-BR_UF_2022.10.27-FINAL-SITE.xlsx").
Este arquivo está disponível no site do SEEG, mas também inseriremos a base diretamente em uma das atividades do curso. Selecionaremos a base de dados com o botão direito e clicaremos em "Copiar caminho".
Agora, podemos fechar a aba de Arquivos na lateral esquerda, pois o caminho do arquivo já foi salvo na área de transferência em formato string
.
Com isso, podemos fazer a leitura da base de dados. Primeiro, importaremos a Biblioteca Pandas por meio do código import pandas as pd
. Esta biblioteca será responsável por fazer a leitura do arquivo e também as análises posteriores do projeto. Pressionaremos "Shift + Enter" para executar a célula.
Importada a biblioteca, faremos a leitura da base de dados. Essa base será armazenada em uma variável chamada emissoes_gases
. Essa variável será igual a pd.read_excel()
. Dentro dos parênteses, colaremos o caminho até o arquivo no Google Drive entre aspas simples usando o atalho "Ctrl + V", pois o caminho já foi copiado para a nossa área de transferência.
Ainda dentro da função, escreveremos o parâmetro sheet_name = GEE Estados
. Essa planilha contém muitas abas com informações. Queremos apenas aquela com as informações divididas por estado do território brasileiro.
emissoes_gases = pd.read_excel('/content/drive/MyDrive/Alura/dados/1-SEEG10_GERAL-BR_UF_2022.10.27-FINAL-SITE.xlsx', sheet_name = 'GEE Estados')
Executaremos a célula pressionando "Shift + Enter". Pode ser que isso demore alguns minutos devido ao tamanho do arquivo. Feita a leitura da base de dados, podemos explorá-la.
Para isso, digitaremos emissoes_gases
em outra célula e a executaremos. Obteremos todas as informações do data frame organizados em uma tabela cujas linhas representam setores da indústria que emitem gases do efeito estufa no Brasil.
As colunas estão divididas por:
Perceberemos que, no meio da tabela, algumas colunas foram omitidas. Para visualizá-las, usaremos a função info()
da Biblioteca Pandas. Em uma nova célula, escreveremos emissoes_gases.info()
e pressionaremos "Shift + Enter" novamente.
Após a execução, visualizaremos que existem 103.312 registros na base de dados, ou seja, linhas no data frame. A tabela também tem 63 colunas. Logo abaixo, obteremos uma nova tabela com o nome de cada coluna, a quantidade de dados não nulos da coluna e o tipo dela.
# | Column | Non-Null Count | Dtype |
---|---|---|---|
0 | Nível 1 - Setor | 103312 non-null | object |
1 | Nível 2 | 103312 non-null | object |
2 | Nível 3 | 103253 non-null | object |
… | … | … | … |
A primeira coluna, por exemplo, é do tipo object, um formato textual (string
). Já as colunas dos anos, que vão de 1970 até 2021, são do tipo "float64", ou seja, informações numéricas.
Até aqui, conseguimos identificar diversas informações sobre a nossa base de dados. No entanto, a equipe de supervisão deseja conhecer os dados das emissões registradas no inventário nacional do Brasil.
Por isso, abordaremos a seguir uma maneira de eliminar informações que não são relevantes para a nossa análise. Até já!
A equipe de supervisão solicitou apenas as informações sobre as emissões cadastradas no inventário nacional. Para entender melhor essa solicitação, podemos acessar o site do SEEG e identificar os tipos de dados presentes na base.
Observaremos que existem quatro categorias de dados, sendo elas:
As Remoções, por exemplo, são dados referentes à retirada dos gases estuda da atmosfera. Assim, a remoção é o oposto da emissão. Já os NCI são dados não contemplados no inventário nacional. Por fim, Bunkers são emissões de transporte marítimo e aéreo internacional. Por isso, não são emissões diretas dos estados.
Com base nisso, já percebemos que os dados de NCI e Bunkers deverão ser removidos da nossa análise. Agora, precisaremos analisar a base para identificar e remover os dados que não usaremos, deixando apenas aqueles solicitados.
Primeiro, selecionaremos a coluna que categoriza os dados entre cada uma das quatro categorias e usaremos a função unique()
, que retorna os dados únicos de uma coluna. Assim, escreveremos emissoes_gases[]
. Ao digitar os colchetes, obteremos uma lista de sugestões de colunas para serem selecionadas. Escolheremos a opção "Emissão / Remoção / Bunker". Ao fim dos colchetes, escreveremos .unique()
e executaremos a célula.
emissoes_gases['Emissão / Remoção / Bunker'].unique()
Recebemos em retorno um array com as seguintes opções:
array(['Emissão', 'Emissão NCI', "Remoção NCI', 'Bunker', 'Remoção'], dtype=object)
Primeiro, identificaremos as informações de Remoção. Para filtrá-las, precisamos selecionar tanto os dados de "Remoção NCI" quanto os categorizados simplesmente como "Remoção".
Podemos fazer isso utilizando uma filtragem booleana utilizando "OU". Com ela, selecionaremos os dados de Remoção NCI ou os dados de Remoção.
Para isso, escreveremos emissoes_gases['Emissão / Remoção / Bunker']
. Em seguida, colocaremos o sinal de comparação (==
), abriremos aspas simples e escreveremos 'Remoção NCI'
.
A mesma comparação também será feita com os dados de Remoção. Por isso, colocaremos tudo o que foi escrito até agora entre parênteses. Copiaremos toda a linha de código e inseriremos uma barra vertical depois dos parânteses (|
). Colaremos o texto copiado anteriormente e editaremos apenas o campo "Remoção NCI
, excluindo a sigla "NCI".
O resultado é o seguinte:
(emissoes_gases['Emissão / Remoção / Bunker'] == 'Remoção NCI') | (emissoes_gases['Emissão / Remoção / Bunker'] == 'Remoção')
Executaremos a célula e obteremos como resultado uma series booleana:
- | - |
---|---|
0 | False |
1 | False |
2 | False |
3 | False |
4 | False |
… | … |
103307 | False |
103308 | False |
103309 | False |
103310 | False |
103311 | False |
Esta série pode ser filtrada na base de dados de modo que sejam retornados no output apenas os valores verdadeiros, excluídos os falsos.
Na próxima célula, faremos essa filtragem com o texto emissoes_gases[]
. Dentro dos colchetes, poderíamos passar toda a filtragem booleana feita agora a pouco copiando e colando a linha anterior.
Mas existe outra forma de fazer isso: como selecionamos duas informações da mesma coluna, podemos usar o método isin()
, que seleciona diversos valores dentro de uma mesma coluna.
Assim, escreveremos dentro dos colchetes emissoes_gases['Emissão / Remoção / Bunker'.]isin([])]
. A lista de valores que inseriremos dentro do isin([])
é: 'Remoção NCI' e 'Remoção'.
O código todo ficou da seguinte forma:
emissoes_gases[emissoes_gases['Emissão / Remoção / Bunker'].isin(['Remoção NCI', 'Remoção'])]
Executaremos a célula e obteremos um data frame com os dados filtrados. Perceberemos que as colunas compostas pelos anos contêm valores negativos de emissão. Isso faz sentido, uma vez que são valores de remoção. Ou seja, os valores negativos representam a eliminação dos gases estufa da atmosfera.
No entanto, será que todos os valores (desde 1970 até 2021) são negativos? Para descobrir, faremos uma seleção. Caso todos os valores sejam negativos, eles correspondem a remoções.
Copiarei a filtragem feita anteriormente e colarei na célula de baixo. Agora, escreverei .loc
após emissoes_gases
. O método loc
nos permite selecionar não só as linhas, mas também as colunas.
Logo após o .loc
, abriremos colchetes ([
) e inseriremos a filtragem booleana. Ao fim da filtragem, inseriremos uma vírgula e o valor 1970:2021
. Com isso, serão selecionados os valores entre estes dois anos.
emissoes_gases.loc[emissoes_gases['Emissão / Remoção / Bunker'].isin(['Remoção NCI', 'Remoção']), 1970:2021]
Executaremos a célula e perceberemos que foi gerada uma tabela em que cada coluna corresponde a um ano e as linhas contêm diferentes valores de remoção. Em alguns casos, o valor da remoção é zero. Em outros, apresenta-se um valor numérico negativo.
# | 1970 | 1971 | 1972 | … | 2012 | 2013 | 2014 | … |
---|---|---|---|---|---|---|---|---|
23520 | 0.0 | 0.0 | 0.0 | … | -1.434540e+07 | -1.499358e+07 | -1.543196e+07 | … |
23521 | 0.0 | 0.0 | 0.0 | … | -5.382949e+06 | -5.524659e+06 | -5.632429e+06 | … |
23522 | 0.0 | 0.0 | 0.0 | … | -3.450455e+06 | -3.540294e+06 | -3.545724e+06 | … |
… | … | … | … | … | … | … | … | … |
Esta seleção serviu apenas para dispor os dados numéricos por ano. Copiarei o código novamente, pois usarei a função max()
em cada coluna. Se extrairmos o máximo de cada coluna, obteremos um valor zero ou negativo.
Se o máximo da coluna for um valor negativo ou zero, isso quer dizer que o maior valor possível daquela coluna é um valor negativo. Assim, confirmaremos que se trata de uma remoção.
Colaremos a linha de código na célula de baixo e, ao fim dela, acrescentaremos .max()
, executando a célula em seguida.
O resultado no output foi uma tabela com duas linhas: a primeira contém os anos em ordem crescente e a segunda uma série de números zero.
Isso indica que o número mais alto de todas as colunas é igual a zero. Portanto, todos os dados selecionados se referem a valores de Remoção ou Remoção NCI.
Agora, identificaremos se os valores de Bunker estão corretos. Estes são dados de viagens marítimas e aéreas internacionais. Assim sendo, elas não correspondem a nenhum estado brasileiro. Para verificar estes dados, confirmaremos se a coluna "Estado" não contém nenhuma informação referente aos estados brasileiros para os dados de Bunker.
Para fazer isso, escreveremos: emissoes_gases.loc[]
. No primeiro valor de loc
, selecionaremos as informações da coluna que sejam iguais à informação Bunker, da seguinte forma: emissoes_gases['Emissão / Remoção / Bunker'] == 'Bunker'
.
Inseriremos uma vírgula após 'Bunker'
e escreveremos 'Estado'
. Com isso, selecionaremos apenas os dados da coluna "Estado". Após o último colchete, escreveremos .unique()
.
O resultado é o seguinte:
emissoes_gases.loc[emissoes_gases['Emissão / Remoção / Bunker'] == 'Bunker', 'Estado'].unique()
Executaremos esta célula e o resultado será um array com a informação nan
. Ou seja, obtivemos uma informação nula.
array([nan], dtype=object)
Assim, para todos os dados em que a coluna de "Emissão / Remoção / Bunker" for igual a "Bunker", a coluna "Estado" está vazia. Dessa forma, todos os dados correspondem a informações do tipo "Bunker".
Agora que já confirmamos que as informações de remoção e bunker estão categorizadas corretamente, podemos excluí-las das base de dados sem nenhum problema.
Na próxima célula, escreveremos: emissoes_gases = emissoes_gases[]
. Dentro dos colchetes, faremos uma filtragem para que a coluna "Emissão / Remoção / Bunker" apresente apenas dados de emissão. Faremos isso escrevendo emissoes_gases['Emissão / Remoção / Bunker'] == 'Emissão'
.
Todos os outros dados serão removidos, uma vez que a equipe de supervisão não deseja obter as informações não cadastradas no inventário nacional, tampouco as de remoção.
Na mesma célula, escreveremos emissoes_gases
para visualizar o resultado.
emissoes_gases = emissoes_gases[emissoes_gases['Emissão / Remoção / Bunker'] == 'Emissão']
emissoes_gases
Executaremos a célula e observaremos que restaram apenas 94.748 linhas dos 103 mil dados verificados anteriormente com o uso da função info()
.
Não restou nenhum valor útil para análise na coluna "Emissão / Remoção / Bunker", pois todos os seus valores agora são de emissões. Por isso, removeremos esta coluna da base de dados usando a função drop()
.
Escreveremos:
emissoes_gases = emissoes_gases.drop(columns = 'Emissão / Remoção / Bunker')
emissoes_gases
Executaremos a célula pressionando "Shift + Enter". Perceberemos que a coluna "Emissão / Remoção / Bunker" foi removida da base de dados.
Agora que já selecionamos apenas os dados de emissão, podemos continuar a nossa análise, avaliando os tipos de gases que estão na base de dados.
O curso Pandas: selecionando e agrupando dados possui 113 minutos de vídeos, em um total de 43 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:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Acesso completo
durante 1 ano
Estude 24h/dia
onde e quando quiser
Novos cursos
todas as semanas