Transformando dados com Python e Pandas (Parte 1)
Python é uma linguagem de programação popular nos dias de hoje. Pandas, uma biblioteca escrita na linguagem Python, é uma das ferramentas mais utilizadas em análise de dados. Com Pandas podemos ler e transformar dados de arquivos deixando-os prontos para análises posteriores.
Nesse tutorial, aprenderemos vários tipos de transformações utilizando a biblioteca Pandas.
Sumário
- Começando com o Google Colab
- Bibliotecas que utilizaremos
- Criando uma tabela do zero
- Tratamento de dados incompletos
- Discretização de valores booleanos
- Discretização de valores categóricos
- Inserção de uma única linha
- Inserção de várias linhas
- Remoção de linhas
- Reset de índices
- Reordenando colunas
- Transformação de uma coluna utilizando funções
- Transformação de mais de uma coluna utilizando funções
Este post é melhor visualizado em um computador de mesa. As imagens não ficam legais em smartphones. No entanto, todos os códigos aqui usados podem ser encontrados aqui.
Começando com o Google Colab
Este trabalho é feito em linguagem de programação Python e compilado com a ajuda do Google Colab. O leitor pode criar um notebook gratuitamente através do link: https://colab.research.google.com/
Depois, basta dar um nome para seu arquivo onde está a seta vermelha. Digitar seu código onde se encontra a seta verde e executar o código apertando o botão indicado pela seta azul. No exemplo da figura abaixo fizemos um código que imprime a mensagem Hello, world!
Bibliotecas que utilizaremos
Uma vez aberto nosso ambiente Python, importaremos algumas bibliotecas essenciais.
Pandas é uma biblioteca para trabalhar com tabelas e sequências ou séries numéricas. Numpy é muito útil para manipulação de matrizes e vetores. Por fim, a biblioteca Matplotlib é utilizada na produção de gráficos.
Criando uma tabela do zero
Para este trabalho utilizaremos uma adaptação do conjunto de dados Golf (Quinlan, 1986). Basicamente, o conjunto de dados possui informações de como está o céu, a temperatura, a humidade, o vento e, nessas condições, se algum atleta jogaria ou não golfe.
Aqui é importante escolher dados que ajudem a resolver determinado problema. Neste caso, é só um exemplo para praticarmos transformações com Python e Pandas. Podemos pensar que dados semelhantes, numa aplicação real, poderiam ser utilizados para planejamento da escala de funcionários de um clube de golfe. Em dias que, provavelmente, não há muita movimentação de atletas no clube, poderiam ser escalados menos funcionários.
Vendo a aplicabilidade em um contexto mais amplo, poderiam ser escalados seguranças para clube de festas, enfermeiros e médicos para plantões, garçons para um restaurante, etc.
Criaremos então nossa tabela utilizando Python e Pandas no Colab:
Tratando dados incompletos
Na prática, podem haver tabelas com dados incompletos. Podemos simplesmente remover a linha com esse dado faltante, porém podemos perder outras informações preciosas.
A escolha do tratamento para esse tipo de dado varia com seu objetivo. No nosso caso, queremos criar um algoritmo que, dados como está o céu, a temperatura, a umidade e o vento, no diz se um atleta viria ou não ao clube jogar golfe. Nesse caso, um possível tratamento é preencher os dados faltantes com a média (ser for numérico, também usa-se mediana) ou a moda (se for categórico).
Vejamos quais colunas possuem dados faltantes:
Observamos que temos 6 entradas. No entanto, umidade tem apenas 5 entradas não nulas e vento, também, apenas 5.
Preencheremos os faltantes da coluna umidade com a média:
Preencheremos os faltantes da coluna vento com a moda:
Vejamos como ficou o conjunto com as mudanças:
Discretização de booleanos
Lembrando que, aqui, nosso objetivo é criar um algoritmo de tomada de decisão. Existem várias técnicas para isso. A maioria exige que os dados sejam numéricos.
A coluna vento apresenta hora True, hora False. Quando uma coluna possui apenas duas classes distintas, como esse caso, utilizamos 1’s e 0’s para representá-las. Mais ainda, quando as classes são True e False, utilizamos respectivamente 1 e 0.
Vejamos o código para tal tratamento:
A coluna joga apresenta dois valores, a saber, sim ou nao. Observe que, de uma forma mais padronizada, a tabela poderia estar com True no lugar do sim e False no lugar do nao.
Paciência… nem tudo é perfeito no mundo real.
Podemos transformar as entradas da coluna vento de maneira análoga:
Discretização de categorias
Outra coluna não numérica é a coluna ceu. Neste caso, como temos três possibilidades (nuvem, sol e chuva) não poderemos utilizar os métodos anteriores.
Faremos uma coluna chamada chuva e suas entradas seguirão a seguinte regra: Se o céu está de chuva, 1; senão, 0.
Criaremos a coluna sol:
E a coluna nuvem? Esta não é necessária, pois sempre que sol e chuva assumirem o valor 0 simultaneamente, a coluna nuvem assumiria o valor 1. Caso contrário, a coluna nuvem assumiria o valor 0. Como estamos preocupados em criar algoritmos de tomada de decisão utilizando aprendizado de máquina, essas redundâncias podem diminuir a precisão dos resultados obtidos.
Vejamos como ficou o conjunto de dados:
Remoção colunas
A coluna ceu não é mais necessária. Portanto, esta será removida:
Inserção de nova linha
Para inserir uma linha com os valores 72, 89, 1, 0, 1, 0 para temperatura, umidade, vento, joga, chuva e sol respectivamente:
Inserção de mais de uma linha
As vezes é necessário inserir mais de uma linha. O ideal então é criar uma nova tabela e complementar a anterior:
Remoção de linhas
Vejamos como está nosso conjunto de dados:
Removeremos as linhas 2, 5, 7 e 8:
Vejamos como ficou após remoção das linhas:
Reset de índices
Observe que os índices são mantidos. Se os índices não são importantes para o projeto, podemos resetá-los:
Reordenação de colunas
Colocaremos a coluna joga por último e traremos chuva e sol para as primeiras posições. Tudo isso para ficar mais perto do que tínhamos no começo. Vejamos:
Transformação de uma coluna via função
Alguns algoritmos de aprendizado de máquina possuem a necessidade de mudança de escala numérica.
Uma forma de normalizar uma coluna é subtrair suas entradas pelo mínimo daquela coluna e depois dividir essa entrada pela diferença entre o máximo pelo mínimo da coluna. Complicado? Vejamos uma função para fazer isso em Python:
Agora para normalizar a coluna temperatura, aplicaremos a função normalize_temperatura na coluna temperatura:
Temos agora os valores da coluna temperatura variando entre 0 e 1. Faremos o mesmo para a coluna umidade:
Pausa para um gráfico
Faremos um gráfico para visualizar quando um atleta jogaria golfe dados os valores normalizados de temperatura e umidade:
O gráfico fica assim:
Transformando duas ou mais colunas via função
Podemos tirar algumas conclusões do gráfico anterior. Se a umidade normalizada estiver abaixo de 0.6, 100% das vezes o atleta joga golfe. Se a umidade normalizada estiver acima de 0.6, apenas 33% das vezes o atleta joga golfe.
Esta conclusão é simples, pois estamos trabalhando com poucos dados, uma vez que estamos aprendendo novos conceitos nesse momento, mas na prática podemos ter que girar esses dados para ter insights como esses.
Girar é um tipo de transformação, mais ainda, é um tipo de transformação linear. Para exemplificar, vamos girar temperatura e umidade normalizados num ângulo de 45º no sentido anti-horário. A função para realizar tal façanha é:
Observe que dependemos de duas variáveis x e y. Para o nosso exemplo x e y são respectivamente temperatura e umidade. Aplicaremos agora a função nessas variáveis criando novas colunas:
Pausa para um último gráfico
Vejamos como fica o gráfico agora com as temperaturas e umidades rotacionadas 45º no sentido anti-horário:
Pode parecer que não funcionou, ou um pouco confuso. Tentaremos verificar de uma forma mais clara. Vejamos o ponto (1,0) de antes. Ele foi para (0.7071,0.7071). Com umas continhas simples você mesmo pode verificar que está correto!
Conclusão
Neste tutorial vimos:
- Criação de tabelas (DataFrames) do zero com pandas
- Tratamento de dados incompletos
- Discretização de valores boleanos
- Discretização de valores categóricos
- Inserção de uma única linha no DataFrame
- Inserção de várias linhas no DataFrame
- Remoção de linhas do DataFrame
- Reset de índices
- Reordenando colunas
- Transformação de uma coluna utilizando funções
- Transformação de mais de uma coluna utilizando funções
Espero que tenham gostado! Até a próxima.
Desafios
A melhor forma de aprender é colocar o conhecimento em prática. Tente aplicar os conceitos aqui apresentados no conjunto de dados Titanic.
Quais regras você descobriu para identificar quais os tripulantes morreram e quais não morreram no Titanic? Precisou transformar os dados?