Como construir um pipeline ETL em Python com pandas
Mover dados de um ficheiro em bruto para uma base de dados pronta a consultar é uma das tarefas mais comuns em qualquer projeto de dados. Um pipeline ETL (Extract, Transform, Load) faz exatamente isso de forma organizada e repetível. Aqui vais construir, do início ao fim, um pipeline ETL simples em Python que lê um CSV de vendas, limpa e enriquece os dados, e carrega o resultado numa base de dados SQLite.
Pré-requisitos
- Python 3.9 ou superior instalado.
- A biblioteca
pandas(instala-se compip install pandas). - Conhecimentos básicos de Python (variáveis e funções).
- Um editor de código ou um terminal. O SQLite já vem incluído no Python, através do módulo
sqlite3.
Passo 1: Preparar o ambiente e os dados
Começa por instalar o pandas e por criar um ficheiro de exemplo. Este pequeno script gera um vendas.csv com algumas linhas, incluindo um valor em falta de propósito, para vermos como o tratar mais à frente.

pip install pandas
import pandas as pd
dados = {
"data": ["2026-06-01", "2026-06-01", "2026-06-02", None],
"produto": ["Teclado", "Rato", "Monitor", "Teclado"],
"quantidade": [3, 5, 2, 1],
"preco_unitario": [25.0, 12.5, 150.0, 25.0],
}
pd.DataFrame(dados).to_csv("vendas.csv", index=False)
Passo 2: Extract — ler os dados de origem
A fase de extração lê os dados da fonte. Com o pandas, ler um CSV é uma única linha. Imprime as primeiras linhas para confirmares que os dados chegaram como esperavas antes de os transformares.
import pandas as pd
df = pd.read_csv("vendas.csv")
print(df.head())
Passo 3: Transform — limpar e enriquecer
A transformação é o coração do pipeline. Aqui removemos linhas inválidas, convertemos as colunas para os tipos de dados corretos e criamos uma coluna nova com o valor total de cada venda. Este é também o sítio onde, num projeto real, aplicarias as tuas regras de negócio.
# Remover linhas sem data
df = df.dropna(subset=["data"])
# Converter para os tipos corretos
df["data"] = pd.to_datetime(df["data"])
df["quantidade"] = df["quantidade"].astype(int)
# Criar uma coluna derivada
df["total"] = df["quantidade"] * df["preco_unitario"]
Passo 4: Load — carregar na base de dados
A fase de carga escreve os dados já tratados no destino. O método to_sql do pandas cria a tabela e insere as linhas numa base de dados SQLite. O parâmetro if_exists="replace" recria a tabela em cada execução, o que é prático enquanto testas.
import sqlite3
conn = sqlite3.connect("vendas.db")
df.to_sql("vendas", conn, if_exists="replace", index=False)
conn.commit()
conn.close()
Passo 5: Juntar tudo num único pipeline
Com as três fases prontas, o passo final é organizá-las numa função reutilizável. Assim consegues correr todo o processo com uma só chamada e reaproveitá-lo para outros ficheiros.
def etl(origem_csv, destino_db):
df = pd.read_csv(origem_csv)
df = df.dropna(subset=["data"])
df["data"] = pd.to_datetime(df["data"])
df["total"] = df["quantidade"] * df["preco_unitario"]
conn = sqlite3.connect(destino_db)
df.to_sql("vendas", conn, if_exists="replace", index=False)
conn.close()
return len(df)
linhas = etl("vendas.csv", "vendas.db")
print(f"Carregadas {linhas} linhas")
Verificar o resultado
Para confirmar que tudo correu bem, volta a ligar-te à base de dados e consulta a tabela. Deves ver três linhas (a linha sem data foi removida) e a nova coluna total preenchida.
import sqlite3
import pandas as pd
conn = sqlite3.connect("vendas.db")
print(pd.read_sql("SELECT * FROM vendas", conn))
conn.close()
Se a consulta devolver as linhas com as colunas data, produto, quantidade, preco_unitario e total, o teu pipeline ETL está a funcionar corretamente.
Conclusão
Construíste um pipeline ETL completo: extraíste dados de um CSV, transformaste-os com pandas e carregaste-os numa base de dados SQLite pronta a consultar. A partir daqui, os próximos passos naturais são agendar o script (com o cron no Linux ou o Task Scheduler no Windows), adicionar cargas incrementais para processar apenas linhas novas e, à medida que o volume cresce, migrar para uma ferramenta de orquestração como o Azure Data Factory. Que fonte de dados vais transformar a seguir no teu primeiro pipeline?