• Roger Sampaio

Pandas: aqui não é um urso, mas é tão poderoso quanto


Fala meus guerreiros. O urso Panda no reino animal embora tenha um aspecto fofo, é conhecido pela sua força e ferocidade. Há quem diga que é quase impossível escapar de um ataque dele com as garras longas e cortantes. Você certamente meu guerreiro não iria querer ver um perto? Eu pelo menos não (kkkkk). Os milhares de desenvolvedores da linguagem Python espalhados pelo globo, decidiram lançar um pacote para análise de dados chamado Pandas. Assim como no reino animal, Pandas é mui poderoso, contendo uma série de funções que incluem obtenção de dados de diversas fontes, o respectivo tratamento, transformação e a limpeza, sendo aquelas simples de escrever e com boa performance. A partir dos próximos instantes, segure na minha mão, que vou guiá-lo a conhecer algumas funções bastantes úteis do Pandas, e você ficará de queixo caído. Vamos nessa?


  1. Como Obter os Dados?

Os dados podem vir das mais variadas fontes como, por exemplo, banco de dados relacionais, páginas da web, arquivos textos, planilhas entre outros. Um formato bastante utilizado é o formato csv, que nada mais é do que um arquivo textual, no qual cada dado vem separado por um delimitador específico (exemplo: vírgula). Melhor do que ficar blábláblá, veja um exemplo, meu guerreiro.

Vou utilizar como referência uma base de dados pública do Kaggle, que contém informações sobre pacientes que sofreram ou não um AVC (Acidente Vascular Cerebral). Ao passar uma lupa sobre as primeiras linhas do arquivo veremos:

id,gender,age,hypertension,heart_disease,ever_married,work_type,Residence_type,avg_glucose_level,bmi,smoking_status,stroke
9046,Male,67,0,1,Yes,Private,Urban,228.69,36.6,formerly smoked,1
51676,Female,61,0,0,Yes,Self-employed,Rural,202.21,N/A,never smoked,1
31112,Male,80,0,1,Yes,Private,Rural,105.92,32.5,never smoked,1
60182,Female,49,0,0,Yes,Private,Urban,171.23,34.4,smokes,1

A primeira linha representa o cabeçalho, ou seja, o nome de cada coluna.

Note que temos 'gender' representando o sexo do paciente (Male = Masculino, Female = Feminino), 'hypertension' indicando se possui hipertensão (valor 1) ou não (valor 0), 'ever_married' dizendo se é casado ou não entre outras informações. Note que cada dado é separado por um delimitador, no caso, a vírgula. O significado de cada coluna pode ser encontrado aqui nesse link.

Antes de utilizar qualquer função do pandas, devemos importá-lo. Para ler um arquivo no formato .csv é bem simples, basta utilizar a função 'read_csv' especificando o caminho do arquivo, veja:

# Importação das bibliotecas e pacotes
import pandas as pd
# Carregando o arquivo .csv
registros = pd.read_csv("datasets/healthcare-dataset-stroke-data.csv");
# Verificando o tipo de objeto
type(registros)

O resultado é:

pandas.core.frame.DataFrame

2. Como Visualizar os Dados?

A função read_csv ao ler o arquivo, retorna em um objeto do tipo DataFrame, que é uma estrutura semelhante a uma planilha, no qual qualquer elemento pode ser acessado por meio da linha e coluna. Podemos visualizar alguns registros utilizando a função 'head' ou 'tail'. A diferença entre elas é que 'head' (significa cabeça) visualiza as primeiras linhas, enquanto 'tail' (significa calda) retornará as últimas. Veja:

# Visualizando alguns registros iniciais, o número dentro do parênteses 
# indica a quantidade de registros que queremos
registros.head(5)

O resultado será visualmente organizado, bonito e de simples compreensão:

# Visualizando alguns registros finais
registros.tail(5)

Ao executar o comando acima, teremos a saída:

E caso queiramos visualizar as dimensões da planilha. Podemos utilizar o atributo 'shape'.

# Visualizando as dimensões: linhas x colunas
registros.shape

O resultado final está abaixo. O primeiro representa a quantidade de linhas, enquanto o segundo a quantidade de colunas.

(5110, 12)

E agora queremos descobrir o nome de cada coluna. Isso é mais fácil do que você pensa, meu guerreiro. Basta utilizar, advinhaaaaa, o atributo 'colums'.

# Visualizando as colunas, nome de cada uma
registros.columns

A saída é:

Uma atividade comum é compreender qual o tipo de cada dado no dataframe. No momento que efetuamos a carga do arquivo csv, o Python identifica automaticamente o tipo de cada um, porém esse comportamento padrão pode ser alterado caso queira. Para compreender o tipo de cada dado, podemos utilizar o atributo 'dtypes'.

# Visualizando o tipo de cada coluna, atribuído no momento da carga
registros.dtypes

O resultado é:

Podemos acessar uma coluna específica, basta utilizar o nome dela. Abaixo acessaremos o 'ID' dos cinco primeiros registros.

# Acessando uma coluna específica utilizando ['nomeColuna']
registros['id'].head(5)

O código abaixo é uma forma de uso, fazendo exatamente a mesma coisa. Fica ao seu critério utilizar o que melhor achar, meu guerreiro.

# Acessando uma coluna específica utilizando .nomeColuna.
registros.id.head(5)

O resultado é:

Caso queiramos acessar mais de uma coluna, basta especificar o nome de cada uma. Veja:

# Acessando registros pelo nome das colunas
registros[['id','gender']].head(5)

Resultado:

Guerreiro, uma alerta de aprendizado. Até agora nós vimos de série de códigos, nome de funções e desde já recomendo a NÃO DECORÁ-LO. Como assim? É exatamente isso que você acabou de ler. Há muitas funções e decorá-las não é produtivo, porque você conta com a documentação oficial. Nela você pode consultar cada função e entender o proposito, parâmetros além de exemplos. Eu mesmo, não sei o nome de todas as funções e não desejo saber, ao invés disso, eu sempre pesquiso. Claro que à medida que você vá utilizando as funções, naturalmente tende a decorá-las.

Qualquer elemento do dataframe, pode ser acessado por meio de índices, que sempre começam em 0. Para isso podemos contar com a função iloc, que funciona da seguinte maneira:

nomeDatame.iloc[<linhas>,<colunas>]

O parâmetro <linhas> corresponde exatamente as linhas que queremos selecionar, enquanto o segundo se refere as colunas. Podemos, por exemplo, acessar apenas uma única linha, intervalo de linhas ou determinar exatamente as colunas que queremos. Um exemplo: acessar a primeira linha, que obrigatoriamente começa com índice 0.

# Acesso registros por meio dos índices. Função iloc. Linha x Coluna. 
# Acessando a primeira linha. Como não especificamos as colunas, todas
# serão tragas na consulta.
registros.iloc[0]

O resultado é:


E caso queiramos acessar o intervalo de linhas de zero até quatro. Veja como é simples o comando:

# Acessando um intervalo de linhas. Linha 0 até 4.
registros.iloc[0:4]

Resultado abaixo:

Se por acaso desejarmos selecionar apenas as linhas 1,5 e 10, ou seja determinando exatamente qual. Veja a construção do comando:

# Acessando algumas linhas de registros.
registros.iloc[[1,5,10]]

Resultado:

E podemos brincar com mais uma possibilidade: acessar a partir do terceiro elemento em diante. Veja:

# Acessando a partir de determinado elemento: da linha 3 em diante
registros.iloc[3:]

O resultado é:


Agora combinando os índices: acessando as duas primeiras linhas e quatro primeiras colunas. Veja:

# Acessando as duas primeiras linhas e colunas de 0 até 4.
registros.iloc[0:2,0:4]

O resultado será:

Podemos filtrar nossa consulta especificando critérios. O exemplo abaixo retorna todos os registros cuja idade esteja entre 60 e 69.

# Aplicando filtros
registros.loc[(registros.age >= 60) & (registros.age <= 69)]

Gostando ou não a Estatística é uma disciplina que auxiliar compreender os dados por meio de técnicas, procedimentos, métodos. Uma atividade bastante comum é encontrar diversas medidas bastantes úteis como, por exemplo, média aritmética, contagem de valores, desvio padrão, quartis, valor mínimo e máximo. E você não irá acreditar, meu guerreiro. Tudo isso pode ser com uma única linha de comando no Pandas. Mais fácil do que tirar doce de guri.

Veja:

# Obtendo informações estatísticas rápidas
registros.describe()

O resultado é:

Para o nosso dataframe, podemos criar, excluir ou alterar o valor de qualquer coluna. Suponha que, por exemplo, queiramos alterar o conteúdo da coluna 'ever_married'. Substituiremos o 'yes' pelo 'Já casado', enquanto o 'no' por 'Não casado'. Uma maneira de fazer isso é utilizando a função apply. A função apply chama e aplica um método definido por você para cada elemento. Vamos definir o nosso método da seguinte maneira:

def alterarLabelEstadoCivil(label):
    if label == 'Yes':
        return 'Já casado'
    elif label == 'No':
        return 'Não casado'
    else:
        return 'Desconhecido'

E agora basta chamá-lo como parâmetro da função apply.

# Sintaxe da função apply: dataframe.coluna.apply(nomeDaFuncao)
registros2.ever_married = registros2.ever_married.apply(alterarLabelEstadoCivil)

E visualizando os resultados teremos:

registros2.head(5)

Se quisermos excluir uma coluna, podemos utilizar o comando del seguido do nome da coluna. Se a coluna não existir, uma exceção do tipo 'KeyError' será lançada. Vamos excluir a coluna 'Residence_type'. Veja:

# Excluindo uma coluna
#del nomeDataFrame['nomeColuna']
del registros2['Residence_type']

O resultado é:

registros2.head(5)

Agora iremos criar uma coluna nova e chamaremos de 'sexoPT', que consistirá do label 'sexo' traduzido para o Português. Iremos nos basear na coluna 'gender' aplicando o seguinte mapeamento: 'Female' = 'Feminino', 'Male' = 'Masculino'. Veja a definição da método:

def alterarLabelSexo(label):
    if(label == 'Female'):
        return 'Feminino'
    elif (label == 'Male'):
        return 'Masculino'
    else:
        return '-'

Vamos aplicar agora a função apply chamando o método 'alterarLabelSexo'. Note que a coluna registros2.sexoPT não existe, logo será criada no dataframe.

# Criando nova coluna condicional
registros2['sexoPT'] = registros2['gender'].apply(alterarLabelSexo)

E o resultado é:

registros2.head(5)

Podemos renomear o nome das colunas, seja durante o momento de carga dos dados ou na manipulação. Para renomear podemos utilizar a função rename. Acionamos ela através do nome do dataframe e definimos para o parâmetro columns as colunas que iremos usar, definindo primeiramente o nome original e depois o novo nome. Veja a alteração da coluna 'age' para o nome 'idade'.

# Renomeando coluna
registros2.rename(columns={'age':'idade'},inplace = True)

Visualizando o resultado:

registros2.head(5)

Podemos alterar o tipo de cada coluna. Vamos olhar atentamente a coluna 'idade' e verificar o tipo através do atributo dtypes.

registros2.dtypes

O resultado é:

Na nossa análise não faz sentido idade ser um valor float, ou seja, real. Vamos convertê-lo para inteiro utilizando a função astype. Se quisermos alterar para uma string, por exemplo, bastaríamos substituir o 'int' por 'str'. Veja como é simples:

# Alterando o tipo de dado
registros2.idade = registros2.idade.astype(int)

Vendo o resultado final da transformação:

registros2.idade.dtypes
dtype('int64')

3. E no Final das Contas


Ufaaaaa, concordo com você que é bastante conteúdo. Isso porque não exploramos nem 1% do poder do pandas para análise de dados. O post explorou comandos bastantes úteis no dia-a-dia como, por exemplo: criação de nova colunas, carga de dados, alterar o tipo da variável, obter uma estatística descritiva rápida, criação de colunas condicionais, visualização das primeiras ou últimas linhas, aplicação de filtros entre outros. E repito mais uma vez: procure não decorá-los e sim usar a documentação todas as vezes que precisar usar o comando. A documentação é sua amiga e sempre estará disponível. E outro detalhe: programação é muita prática, não espere ficar fera do dia para noite, meu guerreiro. Agora você pode considerar o Pandas como uma poderosa ferramenta para suas análises de dados. Quer aprender mais sobre o Python, veja nosso curso:

Baixe o código-fonte aqui.

Abraços e até a próxima.

190 visualizações0 comentário

Posts recentes

Ver tudo

Adoraria ouvir de você

  • YouTube
  • Ícone do Instagram Preto

© 2023 por Laura Castro. Orgulhosamente criado com Wix.com