Básico de Análise de Dados com Python & Pandas

Lab de Programação / Ciência da Computação

Conceitos essenciais, fluxo de trabalho, e operações fundamentais em Pandas — com syntax highlighting

Objetivos da Aula

  • Entender o que é análise de dados e o fluxo de trabalho básico.
  • Conhecer as estruturas centrais do Pandas: Series e DataFrame.
  • Aprender a carregar, inspecionar, limpar, transformar e agregar dados.
  • Realizar junções, pivôs e visualizar resultados rapidamente.

Instalação

# ambiente recomendado
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install pandas matplotlib pyarrow # (opcional: jupyter)

Importação

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

pd.__version__

O que é Análise de Dados?

  • Processo de obter insights a partir de dados (tabelas, logs, planilhas...).
  • Etapas: Coleta → Limpeza → Exploração → Modelagem → Comunicação.
  • Nesta aula focaremos em limpeza, exploração e comunicação com Pandas.

Dados Tabulares (Tidy)

  • Cada linha = uma observação.
  • Cada coluna = uma variável.
  • Cada célula = um valor.

Tipos Comuns

  • Numéricos: int, float
  • Categóricos / Strings
  • Datas & tempos (datetime)
  • Booleanos

Estruturas do Pandas

  • Series: vetor 1D com rótulos (índice).
  • DataFrame: tabela 2D (linhas × colunas).
  • Índice facilita alinhamento, seleção e operações.

Criação Rápida

s = pd.Series([10, 20, 30], index=["a","b","c"])
df = pd.DataFrame({
    "aluno": ["Ana","João","Bia"],
    "nota": [9.1, 7.5, 8.3],
    "aprovado": [True, False, True]
})
s, df.head()

Carregar Arquivos

df = pd.read_csv("dados.csv")          # CSV
df = pd.read_excel("planilha.xlsx")    # Excel
df = pd.read_json("dados.json")        # JSON
df = pd.read_parquet("tabela.parquet") # Parquet (rápido)

Salvar Arquivos

df.to_csv("saida.csv", index=False)
df.to_excel("saida.xlsx", index=False)
df.to_parquet("saida.parquet")

Inspeção Inicial

df.head()      # primeiras linhas
df.tail()      # últimas linhas
df.shape       # (linhas, colunas)
df.columns     # nomes das colunas
df.info()      # tipos e nulos
df.describe(numeric_only=True)

Tipos & Conversões

df.dtypes
df["data"] = pd.to_datetime(df["data"], dayfirst=True, errors="coerce")
df["categoria"] = df["categoria"].astype("category")
df["preco"] = pd.to_numeric(df["preco"], errors="coerce")

Seleção por Rótulo/Posição

# colunas
df["nota"]                      # Series
df[["aluno","nota"]].head(3)    # DataFrame

# linhas por rótulo/posição
df.loc[0:3, ["aluno","nota"]]   # rótulos
df.iloc[0:3, 0:2]               # posições

Filtragem Booleana

aprovados = df[df["nota"] >= 7.0]
filtro = (df["nota"] >= 7) & (df["categoria"] == "A")
resultado = df.loc[filtro, ["aluno","nota","categoria"]]

Valores Ausentes

df.isna().sum()
df2 = df.fillna({"nota": df["nota"].mean()})
df3 = df.dropna(subset=["nota","aluno"])

Colunas Derivadas

df["nota_pad"] = (df["nota"] - df["nota"].mean()) / df["nota"].std()
df["status"] = np.where(df["nota"] >= 7, "Aprovado", "Reprovado")

GroupBy & Agregações

# estatísticas por categoria
grp = df.groupby("categoria")["nota"]
resumo = grp.agg(["count","mean","std","min","max"]).reset_index()
resumo.sort_values("mean", ascending=False)

Use .agg() para múltiplas métricas; .transform() para adicionar resultados por linha.

Pivot / Crosstab

# tabela dinâmica
pv = pd.pivot_table(
    df, values="nota", index="categoria", columns="turma",
    aggfunc="mean", fill_value=0
)

# frequência cruzada
xt = pd.crosstab(df["turma"], df["status"], normalize="index")

Ordenação & Top-N

top = df.sort_values(["nota","aluno"], ascending=[False, True]).head(10)

Junções (Merge)

alunos = pd.DataFrame({"id":[1,2], "aluno":["Ana","João"]})
notas  = pd.DataFrame({"id":[1,1,2], "disc":["Mat","Fis","Mat"], "nota":[9,8,7]})

dfm = pd.merge(alunos, notas, on="id", how="left")  # inner/left/right/outer

Concatenação (Concat)

part1 = df.iloc[:100]
part2 = df.iloc[100:]
df_full = pd.concat([part1, part2], axis=0, ignore_index=True)

Datas & Séries Temporais

df["data"] = pd.to_datetime(df["data"])
df = df.set_index("data").sort_index()

mensal = df["nota"].resample("M").mean()   # A, Q, M, W, D...
rolling = df["nota"].rolling(7).mean()     # média móvel 7 períodos

Plot Rápido (Pandas+Matplotlib)

ax = mensal.plot(kind="line", marker="o", figsize=(7,3), grid=True)
ax.set_title("Média Mensal da Nota")
plt.tight_layout(); plt.show()

Dicas de Performance

  • Prefira operações vetorizadas (evite loops Python).
  • Use categorical para colunas com poucos valores distintos.
  • Para dados grandes: formatos binários (parquet) e chunks na leitura.
  • df.memory_usage(deep=True) para medir memória.

Boas Práticas

  • Documente suposições e decisões de limpeza.
  • Crie funções reutilizáveis para etapas repetitivas.
  • Salve resultados intermediários (CSV/Parquet) com versões.
  • Valide tipos e nulos após importação.

Checklist do Fluxo (EDA)

  • Importar dados e verificar shape/colunas.
  • Tipos corretos (numérico, categoria, data).
  • Nulos: tratar fillna/dropna.
  • Outliers e estatísticas (describe).
  • Agregações, pivôs e joins necessários.
  • Gráficos para comunicar achados.

Exercícios (Lab)

  1. Carregue um CSV de vendas e reporte: linhas, colunas, info(), describe().
  2. Converta colunas de data e preço para tipos adequados; trate nulos.
  3. Crie colunas derivadas (ex.: receita = qtd * preco).
  4. Faça groupby por categoria e por mês; gere um pivô (categoria × mês) com soma de receita.
  5. Plote a série mensal total (linha) e o top-5 de categorias (barras horizontais).

Conclusões

  • Pandas facilita ingestão, limpeza, transformação e exploração tabular.
  • Domine seleção/filtragem, agregações, pivôs e junções para produtividade.
  • Integre com Matplotlib para visualizações rápidas e comunicativas.