Manipulação de Dados com Pandas

Manipulação de Dados com Pandas

É uma biblioteca para manipulação e análise de dados, criada para uso na linguagem Python — é uma linguagem de programação de alto nível, interpretada, de script, imperativa, orientada a objetos, funcional, de tipagem dinâmica e forte. O nome Pandas é derivado de panel data (dados em painel).

Uma biblioteca muito popular, em grande maioria dos casos uma porta de entrada para o mundo de ciência de dados. Alguns detalhes chamam atenção para sua popularidade:

  • Facilidade de uso e curva de aprendizado mais acelerada comparada com outras bibliotecas
  • Performance com estruturas de dados de alto nível e funções projetadas para fazer com que trabalhar com dados estruturados ou tabulares seja rápido, fácil e expressivo.
  • Métodos com diferentes aplicações sobre os dados: combinar, filtrar, agrupar, etc.
  • Construção com base em NumPy— processamento de alto desempenho de arrays e Matplotlib — popular para fazer plotagens e gerar outras visualizações de dados bidimensionais
  • Uma biblioteca de software livre que é fornecida sob a licença BSD — os termos da licença é considerado como de domínio público e pode ser modificado sem nenhuma restrição

O desenvolvimento do pandas começou na AQR Capital Management em abril de 2008. O código-fonte foi aberto no final de 2009. A AQR continuou a fornecer recursos para o desenvolvimento até o final de 2011 e continua a contribuir com relatórios de bug hoje.

Desde janeiro de 2012, a Lambda Foundry fornece recursos de desenvolvimento, bem como suporte comercial, treinamento e consultoria para Pandas.

Estruturas de dados do pandas

Existe 2 tipos de estruturas de dados, a pseires — é unidimensional, muito similar com uma lista em Python, representa cada coluna de um DataFrame.

# Importando a biblioteca
import pandas as pd
# Criando um pseries
pseries = pd.Series([7,13, np.nan,21,33])
print(pseries)

E o segundo tipo são os Dataframes — uma abstração de uma estrutura tabular para armazenar dados, comparados a um dicionário em Python onde a chave é o nome da coluna e o valor é um objeto pseries. Representação de dados regulares e tabular, com matrizes rotuladas, tendo objetos de índice que permite indexação de diferentes níveis.

# Criando um Dataframe
dt = [1, 2, 3, 7] # Lista de dados
df1 = pd.Dataframe(dt)
df1

Os dataframes e pseries são as principais estruturas de dados utilizadas em Pandas, além das abstrações utilizadas no processamento de dados o pandas também possui uma série de funções para operações e transformações nos conjuntos de dados. Em muitos pipelines de processamento de dados (etapas de processamento de dados) o Pandas é usado em conjunto com outras bibliotecas na exploração dos dados, por conta disso uma das principais vantagens do Pandas é essa excelente integração com diversas outras bibliotecas de Python para Machine Learning e para geração de visualizações como por exemplo: scikitlearn e matplotlib.

Manipulação de Dados

Será abordado aqui prática com exemplos de código em 3 tópicos, sendo: transformação, agregação, fatiamento, indexação e valores ausentes.

Os dados utilizados foram extraídos de um dataset do Kaggle: históricos de vendas de um supermercado que registrou em 3 filiais diferentes, por um período registrado de 3 meses.


01 — Transformação dos dados

Quanto ao carregamento de dados temos algumas possibilidades:

# Carregando arquivo CSV
dados.pd.read_csv('arquivo.csv')
# Gravando em um arquivo CSV
dados.pd.read_csv('arquivo.csv')
# Gravando em um arquivo Excel
dados.to_excel('novosdados.xlsx', sheet_name = 'Sheet1')
# Crianco arquivo CSV a partir de dataframe
dados.to_csv("dados.csv")

Exemplos de criação de objetos — pseries e dataframa.

Dataframes

DataFrames são compostos de três partes: um array NumPy para os dados e dois índices para armazenar os detalhes de linha e coluna. Nosso dataset foi importado para um DataFrame chamado df_market. Vamos explorar alguns métodos.

# O .head() demonstra as 5 primeiras linhas do DataFrame
df_market.head()
# é usado para visualizar alguns resultados estatísticos como percentil, média, padrão, etc.
df_market.describe()
# Aplicando describe() por coluna
df_market["Rating"].describe()
# .info() função Pandas é usada para obter um resumo conciso do dataframe.df_market.info()
df_market.info()
# retornar o formato do dataframe, primeiro termo quantidade de linhas e segundo total de colunas.
 df_market.shape
 # (1000, 17)
 
# Ordenação baseando-se em coluna - ordem crescente na coluna Total
 df_market.sort_values("Total") 
# Visualização por colunas selecionadas
df_market['City'].sort_values(ascending=False)
Ordenação alfabética decrescente pela coluna “City”.

Criação de subsets do DataFrame

Seleção de colunas específicas ou criação de novos DataFrames.

cols_dados = ["City", "Quantity", "Unit price", "Date"]
df_market[cols_dados]
Seleção de 3 colunas.
# Em "Product line" filtrar por "Electronic accessories"
df_market[df_market["Product line"] == "Electronic accessories"]
# Aplicando mais de uma condição
 df_market_yangon_eletacc = df_market[(df_market["City"] == "Yangon") & (df_market["Product line"] == "Electronic accessories")]
 df_market_yangon_eletacc.head() 
# Criando uma nova coluna e aplicando uma operação matemática entre as variáveis
 df_market["Ticket"] = df_market["Total"] / df_market["Quantity"]
 df_market 


02 — Agregando os dados

Estatísticas de resumo: 

Podemos através de métodos diversos, aplicados a objetos no Pandas, usar de reduções ou de estatísticas de resumo: extraem um único valor (soma e média, por exemplo) de uma Serie ou DataFrame, tais como:

# Média dos valores
df_market["Total"].mean()

# Valor mínimo
df_market["Total"].min()

# Valor máximo
df_market["Total"].max()

# Retorna valores no quantil* fornecido sobre o eixo solicitado
df_market.quantile(0.25)


# Valor moda - representa o valor mais frequente de um conjunto de dados
df_market["Quantity"].mode()

Outros métodos não geram redução ou acúmulo, mas geram dados estatísticos importantes para análise:

# Usada para obter um resumo conciso do dataframe - suas variáveis e tipos dos dados
df_market.info()
# Criando acúmulo .describe é um exemplo desse tipo, e gera vários dados estatísticos:
df_market.describe()

Método .agg — Agregue usando uma ou mais operações

Para uma função ou lista de funções a serem aplicadas em uma série ou mesmo em cada elemento da série separadamente.

df_market["Rating"].agg([np.mean, max, min])

Dropping duplicate — descartando dados duplicados

Útil para tratativas de dados duplicados, com ele podemos gerar um objeto com os valores duplicados removidos.

# Excluindo duplicidade  categoricos Payment Número de identificação da fatura do recibo de venda gerado por computador
df_market_id = df_market.drop_duplicates(subset="Payment")
df_market_id #não observado valores duplicados

Contagem de valores

Podemos determinar uma coluna do dataset e realizar a contagem de acordo com as categorias da mesma, no caso abaixo a quantidade de registros por cada categoria de produto:

df_market["Product line"].value_counts()

Aplicando nomalize=True o retorno do objeto terá as frquências relativas dos valores únicos.

# A porcentagem dos dados por gênero
df_market[[ "Gender"]].value_counts(normalize=True)

Agrupamento — Groupby

Utilizado para divisão dos dados em grupos com critérios definidos, sendo a divisão em qualquer eixo do DataFrame, fornecendo assim uma possibilidade de mapeamento dos rótulos.

# Agrupamento por "City" com a média de "Unit price"
df_market.groupby("Product line")["Unit price"].mean().sort_values(ascending = False)
# Agrupamento com mais de uma variável
df_market.groupby("Product line")[["Unit price", "Total"]].mean().sort_values("Total", ascending = False)
# Agrupamento com multiplas estatísticas
df_market.groupby("Product line")[["Quantity", "Total"]].agg([min, max,sum])

 

Tabelas Dinâmicas

O objeto gerado é um frame — estrutura de dados tabular bidimensional, mutável em tamanho e potencialmente heterogênea, com eixos rotulados (linhas e colunas).

# Utilizando pivot_table
t2 = df_market.pivot_table(values="Quantity", index="Product line")
t2


03 — Fatiar e indexar

São diversas as possibilidades de selecionar um subconjunto de dados ou elementos individuais, sendo o índice uma escolha.

# As colunas do dataset
df_market.columns
df_market.index
# Configurar uma coluna como índice
df_market_ind = df_market.set_index("Invoice ID")
df_market_ind.head(3)
# Removendo índice
df_market_id.reset_index()
# Multinível para índice
df_market_id3 = df_market.set_index(["Branch", "City"])
df_market_id3.loc[["C", "B"]]

Slicing e subdividir com .loc e .iloc

Fatiar é uma técnica para selecionar elementos consecutivos de objetos.

Eles permitem selecionar um subconjunto de linhas e colunas de um DataFrame com uma notação semelhante a do NumPy, usando rótulos de eixo (loc) ou inteiros(iloc): dataframe = [linhas, colunas]

# Slicing com colunas
df_market.loc[:, "City":"Product line"]
# Slicing por posição
df_market2.iloc[2:10, 1:5]


Valores ausentes — (missing)

Os dados ausentes são comuns em conjuntos e análises de dados, eles são excluídos nos métodos e objetos de estatística descritiva — devido a ausência de dados. No Pandas é utilizado o valor de ponto flutuante NaN (Not a Number) para representá-los. Há disponível diversos métodos, aqui vamos utilizar alguns deles.

# Criando uma lista por coluna
lista = {
"nome": ["João", "Maria", "Caio", "Gabriela"],
"sexo": ["H", "F", "M", "F"],
"produto": ["abacate", "mamão", "laranja", "laranja"],
"peso_kg": ["1.2", "2,5", "3.5", np.nan],
"valor_total": [10.48, 22.5, 14.4, np.nan]
}

# Criando um novo dataframe
df2 = pd.DataFrame(lista)
df2
# Total de valores ausentes por coluna
df2.isna().sum()
# Plotando valores ausentes
df2.isna().sum().plot(kind="bar")
plt.show()
# Removendo valores missing
df2.dropna()
# Preenchendo valores ausentes, no caso abaixo com 0:
df2.fillna(0)

Os comandos aqui demonstrados já possibilitam diversidade de resultados, respondendo já algumas questões de negócio ou preparando o conjunto para aplicação de Machine Learning. Outras opções com a biblioteca Pandas: junção de dados diversos, mesclar, remodelar, eficiência do código com Pandas, e outras funções e métodos avançados.

Relembrando que Pandas é uma das principais bibliotecas para ciência de dados em Python, e atua com sinergia com outras, como: NumPy (funções matemáticas), Matplotlib (visualização de dados), Seaborn (estatística e visualização), Scikit-Learn (machine learning), entre outras.

Como dica final: procure uma base de dados que ache interessante, aplique os conhecimentos do Pandas sobre ela, já será possível extrair insights importantes com os conhecimentos aqui expostos.

Os códigos completos com estes e outros exemplos você encontra em: https://github.com/vitordiego/analisededados/blob/main/01_Dicas_de_Manipulacao_de_Dados_com_Pandas_Vitor_Diego_Ramos.ipynb


Referências:

Sobre o Autor

Vitor Diego Ramos
Vitor Diego Ramos

Sólida experiência em liderança de equipes, desenvolvimento de negócios e apaixonado por tecnologia - data science e desenvolvimento front-end. Atuo ativamente em causas de voluntariado, projetos de tecnlogia, mentoria de aprendizado e produtividade e organização.

0 Comentários

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *