(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
ETL

Como construir um pipeline ETL em Python com pandas

João Barros 04 de July de 2026 4 min de leitura

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 com pip 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.

Como construir um pipeline ETL em Python com pandas
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?

Partilhar: