Python ETL
Python ETL
# Introdução
ao pandas
🐼 Manipulando tabelas como no Excel — mas com o
poder do Python.
# Substituição de linhas
🔄 Várias formas de transformar valores de forma
condicional.
# Imputação de
linhas
🩹 Preenchimento de valores ausentes (NaN) para manter
a consistência e a utilidade dos dados.
# Filtragem de
linhas
🎯 Técnicas para selecionar subconjuntos de dados com
base em condições.
# Deduplicação de linhas
🧹 Como identificar e remover registros duplicados em
DataFrames de forma segura e eficiente
# Ordenação de
linhas
📊 Reorganizar as linhas de um DataFrame com base em
uma ou mais colunas.
# O que é?
🧠 ETL é uma sigla para "Extract, Transform, Load", ou Extração,
Transformação e Carga de dados. É um processo fundamental para
quem trabalha com dados.
📥 Extração (Extract):
Coleta de dados de uma ou mais fontes: planilhas, bancos de dados, APIs,
arquivos CSV, web scraping etc. É o momento de buscar o dado bruto, onde quer
que ele esteja.
🧪 Transformação (Transform):
Ajustes necessários para tornar os dados utilizáveis. Aqui está o coração do
processo, onde os dados ganham estrutura e sentido.
# Etapas do ETL Limpeza (tratamento de nulos, erros, duplicações)
Conversão de tipos de dados
Padronização de formatos (datas, números, categorias)
Criação de colunas derivadas (feature engineering)
Junções entre tabelas
📤 Carga (Load):
Envio dos dados tratados para seu destino final:
Usar separador:
df = pd.read_csv("[Link]", sep=";")
# Importar arquivos
CSV
🌐 Usar codificação:
df = pd.read_csv("[Link]", encoding="utf-8")
# Importar arquivos
Excel
📊 Ideal para arquivos do Excel com múltiplas abas.
df = pd.read_excel("[Link]")
# Outros tipos de
🧾
🧩 pd.read_json()
arquivos
🧱 pd.read_html()
pd.read_parquet()
import gspread
from [Link] import auth
from [Link] import default
auth.authenticate_user()
creds, _ = default()
🏢 Banco de dados:
# Tamanho do
dataframe
📏 Retorna o tamanho do DataFrame, com linhas e colunas
[Link]
# Informação geral
das colunas
📋 Retorna estrutura e tipos, com tipos das colunas, nulos e memória
[Link]()
# Nulidades das
colunas
❓ Retorna nulos por coluna, contando número de nulos
[Link]().sum()
# Tipologia das
❓
etc.
Tipo de dados por coluna, verificando cada coluna se é int, float, object, bool
colunas
[Link]
# Estatísticas de Estatísticas para variáveis numéricas (média, desvio padrão, min, max)
colunas numéricas [Link](include=[float, int])
# Acessar nomes de
coluna
💡 Lista os nomes das colunas
[Link]
# Renomear colunas
✏️ Retorna estrutura e tipos, com tipos das colunas, nulos e memória
[Link]()
# Alterar tipos de
colunas
🔄 Converte tipologia da coluna. Use 'str', 'float', etc
df['coluna'] = df['coluna'].astype('int')
📅
# Conversão para Outros parâmetros interessantes:
Data
⚠️
- format=None # Formato esperado da data (ex: "%d/%m/%Y")
- errors='raise' # O que fazer se tiver erro: raise (dá erro), coerce (vira NaT),
🤔
ignore (ignora)
- infer_datetime_format=False # Tenta adivinhar o formato? (pode acelerar)
# Descartando
colunas
🗑️ Remova pelo nome. Ideal para colunas repetidas ou irrelevantes
df = [Link](columns=['coluna'])
desnecessárias
❌ A função dropna() do pandas remove linhas ou colunas com valores nulos
(NaN).
df['sexo'].map(mapa_sexo)
df['sexo'] = df['sexo'].apply(padronizar)
# Preenchimento
📝 Preencher com valor fixo (texto padrão):
Útil para colunas categóricas com valor padrão conhecido.
com valor fixo
df['sexo'] = df['sexo'].fillna("Não informado")
# Preenchimento
📊 Preencher com moda (valor mais frequente):
Evita distorções em colunas com alta frequência de uma categoria.
com moda
df['sexo'] = df['sexo'].fillna(df['sexo'].mode())
# Preenchimento
➗ Preencher com média:
Preferível para variáveis numéricas
com média
df['idade'] = df['idade'].fillna(df['idade'].mean())
# Preenchimento
🧮 Preencher com mediana:
Preferível para variáveis numéricas. Use mediana se houver outliers.
com mediana
df['idade'] = df['idade'].fillna(df['idade'].median())
# Preenchimento
🧠 Preencher com [Link]() (condicional):
Quando quiser um controle condicional simples.
com condicional
import numpy as np
simples
df['sexo'] = [Link](df['sexo'].isna(), "Não informado", df['sexo'])
# Preenchimento
🔙 Preencher com valores da linha anterior:
Muito usado em dados temporais (como séries de tempo ou históricos).
com linha anterior
df['valor'] = df['valor'].fillna(method='bfill')
# Preenchimento
🔜 Preencher com valores da linha posterior:
Muito usado em dados temporais (como séries de tempo ou históricos).
com linha posterior
df['valor'] = df['valor'].fillna(method='ffill')
# Filtragem simples
com condição
🟢 Selecionar linhas que atendem a uma condição:
df[df['idade'] > 60]
# Filtragem com
múltiplas condições
🟢 Selecionar usando & (E) ou | (OU), com parênteses:
df[(df['idade'] > 60) & (df['sexo'] == 'Feminino')]
# Filtragem excluindo
valores com negação
🔴 Selecionar quem NÃO está em uma lista
df[~df['sexo'].isin(['Feminino', 'Masculino'])]
# Filtragem por
texto contido
🟣 Filtrar strings que contêm um padrão.
df[df['nome'].[Link]("Maria", case=False, na=False)]
# Filtragem por
datas
⏰ Filtrar datas anteriores a hoje:
df[df['data'] < [Link]()]
# Verificação de
✅ Conta quantas linhas duplicadas existem:
Compara todas as colunas por padrão.
duplicatas
[Link]().sum()
[Link](subset=['coluna_alvo']).sum()
# Visualizar linhas
duplicadas
🔍 Mostra as linhas duplicadas no DataFrame:
df[[Link]()]
# Manter primeira
🥇 Remove duplicatas mantendo a primeira ocorrência.
df = df.drop_duplicates()
ocorrência
df = df.drop_duplicates(keep='first')
# Manter a última
ocorrência
🥈 Remove duplicatas mantendo a última ocorrência.
df = df.drop_duplicates(keep='last')
# Remover
duplicadas com base
em uma ou mais
🧹 Considera apenas colunas selecionadas na checagem.
df = df.drop_duplicates(subset=['coluna1', 'coluna2'])
coluna
# Manter a ocorrência
por chave primária
🔐 Remove duplicatas mantendo o mais recente por chave.
df = df.drop_duplicates(subset=['id'], keep='last')
Ordenação
Reorganizar as linhas de um DataFrame com base em uma ou
de linhas
mais colunas.
# Ordenação
✅ Organiza da menor para a maior:
Ascending=True é o valor padrão.
crescente df_ordenado = df.sort_values(by='data_lancamento')
df_ordenado = df.sort_values(by='data_lancamento', ascending=True)
# Ordenação
decrescente
🔻 Traz os maiores valores primeiro:
Útil para ranqueamento, top N, alertas etc.
df_ordenado = df.sort_values(by='venda_valor', ascending=False)
# Ordenação por
📊 Primeira prioridade e segunda prioridade:
O que vem primeiro é prioritário
múltiplas colunas
df_ordenado = df.sort_values(by=['data_lancamento', 'venda_valor'])
# Ordenação por
prioridade
🚻 Primeira prioridade e segunda prioridade, com parâmetro de direção:
df = df.sort_values(by=['cliente_sexo', 'venda_valor'], ascending=[True, False])
# Ordenação e reset
🔄 Garante que os índices reflitam a nova ordem:
drop=True evita que o índice antigo vire uma coluna.
do index
df = df.sort_values(by='venda_valor', ascending=False).reset_index(drop=True)
# O que é feature
engineering?
➡️
significativos dos dados.
📊
analítica.
Depois, ao agrupar em faixas etárias (cliente_faixa_etaria), tornou-se ainda mais
interpretável e aplicável.
# Engenharia de Conversão de datas: Transformar datas em atributos úteis para análise. Exemplo:
features baseadas em idade, tempo desde último evento, tempo de uso
conhecimento de
domínio Indicadores binários: Transformar categorias em presença/ausência. Exemplo:
presença de doença, uso de serviço
# Engenharia de
➕ Categoria Sugerida: Combinação e Interação de Variáveis:
Transformações que cruzam ou combinam variáveis para extrair relações mais
features baseadas em complexas.
processamento
técnico Interações e relações cruzadas: Criar novas variáveis a partir da combinação de
outras. Exemplo: colesterol/HDL, n_comorbidades (contagem de comorbidades)
# O que é um
🔗 É a combinação de duas ou mais tabelas com base em uma ou
mais colunas (chaves), para enriquecer os dados. É fundamental para
join (merge)? análises com múltiplas fontes de informação (ex: pacientes + exames, pacientes +
atendimentos).
# Função
[Link](tabela_esquerda, tabela_direita,
[Link] ( )
left_on='coluna_chave_1',
right_on='coluna_chave_2',
how='tipo_join')
🔍 Parâmetro how:
'inner': Mantém apenas registros que existem nas duas tabelas (interseção).
Exemplo: Pacientes que fizeram pelo menos um exame
'outer': Une tudo (união), preenchendo com NaN quando não existir
correspondência. Exemplo: Visão ampla, mesmo para pacientes ou exames sem
correspondência
# Parâmetro
🏷️ Quando há colunas com o mesmo nome nas duas tabelas (ex: data), usar o
parâmetro suffixes evita sobrescrever dados:
suffixes
[Link](df1, df2, on='id', suffixes=('_cadastro', '_exame'))
🧾 Adiciona uma nova coluna chamada '_merge' que informa a origem de cada
linha no resultado da junção. Útil para criar lógica de exclusão, priorização ou
notificação para casos com left_only ou right_only.
both → a linha estava nas duas tabelas (ex: paciente com exame)
left_only → só estava na tabela da esquerda (ex: paciente sem exame)
right_only → só estava na tabela da direita (ex: exame sem paciente conhecido)
# O que é um
🎯 A função groupby() do pandas permite agrupar dados com base
em uma ou mais colunas, para então aplicar agregações (como média, soma,
groupby? contagem etc.) ou funções personalizadas. Isso é essencial para análises
descritivas, resumos estatísticos e segmentações.
# Estrutura
💡 Agrupa os dados por uma dimensão (ex: sexo):
[Link](coluna_agrupadora)["coluna_valor"].função()
básica
Exemplo simples: [Link]("Sexo")["Nota"].mean()
# Agrupamento por
múltiplas colunas
💡 Agrupa os dados por mais de uma dimensão (ex: sexo e turma):
[Link](["Sexo", "Turma"])["Nota"].mean()
# Agrupamento por
✅ Aplicação de múltiplas funções em uma mesma coluna:
def classificar_grupo(grupo):
media = grupo["Nota"].mean()
# Agrupamento com if media > 8:
medida personalizada return "Excelente"
elif media >= 6:
return "Regular"
else:
return "Ruim"
[Link]("Sexo").apply(classificar_grupo)
# Diferenças com
groupby
🔍 Groupby agrupa e agrega dados (como soma, média). Set_index com múltiplas
colunas apenas organiza os dados hierarquicamente, sem agregação.
# Estrutura
básica
🛠️ df_multi_indices = notas_listas.set_index(['semestre', 'aluno'])
# Ações úteis
🔁 Resetar índice: Transforma os índices em colunas novamente
df_multi_indices.reset_index()
Enriquecimento ao
Transformando a forma dos dados: de largo para longo e vice-versa
nível de tabelas com
com apenas um comando
stack, unstack e melt
df_stacked = [Link]()
df_unstacked = [Link]()
df_melted = [Link](df,
id_vars=["ID", "Ano"],
# O que é melt? value_vars=["Jan", "Fev", "Mar"],
var_name="Mês",
value_name="Valor")
# O que é
🟠 A pivot_table() é um método do pandas usado para resumir e reorganizar
dados em uma nova tabela, semelhante às Tabelas Dinâmicas do Excel. Ela
pivot_table? permite especificar índices (linhas), colunas e valores para agregação. Útil para
análises comparativas e visões cruzadas dos dados.
🛠️ Parâmetros básicos:
df.pivot_table(index='coluna_linha',
columns='coluna_coluna',
values='coluna_valores',
# Estrutura aggfunc='função')
básica
Onde:
- index: Atributo que vai para o eixo das linhas (índice da tabela)
- columns: Atributo que será transformada em colunas
- values: Atributos cujos valores serão agregados
- aggfunc: Função de agregação (ex: 'mean', 'sum', 'count', etc.)
# Outros
- fill_value: valor para preencher células ausentes (ex: 0)
parâmetros
- margins=True: adiciona totais por linha e por coluna ("All")
- dropna=False: mantém combinações com colunas nulas
✅ Vantagens da pivot_table:
# Exportação para
df.to_excel("meu_arquivo.xlsx", index=False)
Excel
🩺 Missão:
Desenvolver líderes capazes de reunir expertise clínica, gestão estratégica e domínio
tecnológico, para que, de fato, estejam aptos para abordar os desafios complexos dos
sistemas de saúde modernos, a ponto de conduzi-los com assertividade rumo ao Objetivo
Quíntuplo de aprimorar resultados clínicos e administrativos, sem que comprometer a
equidade e experiência de pacientes e profissionais ao longo da jornada de cuidado.