Engenharia de Dados  ·  Case Study

Como Construí o Portugal
Data Intelligence

Não é mais um dashboard. A história de construir uma plataforma macroeconómica de 12 pilares: o pipeline de ingestão e qualidade de dados, a camada de previsão e o salto dos gráficos para um briefing de nível consultivo.

Engenharia de Dados Python · SQL Forecasting Power BI
9 min de leitura

Durante alguns anos trabalhei como Analista Financeiro, a pessoa que construía os dashboards que os executivos usavam para decidir. Era bom a transformar um emaranhado de números num único gráfico que respondia a uma pergunta. Mas batia constantemente nos limites do que uma ferramenta de BI consegue fazer, e queria saber o que estava do outro lado: a ingestão, a modelação, a previsão, a disciplina de engenharia que está por baixo de um dashboard antes de alguém ver um gráfico.

O Portugal Data Intelligence é onde fui descobrir. É uma plataforma macroeconómica de ponta a ponta que acompanha a economia portuguesa em doze pilares, de 2010 a 2025, e deliberadamente não fica por "aqui está um gráfico bonito". Este é o relato honesto de como o construí, do que escolhi fazer como deve ser, e onde tracei as linhas.

O Problema

Os dados económicos de Portugal estão em todo o lado e em lado nenhum

Se quiseres perceber como a economia portuguesa se moveu pela crise da dívida soberana, pela COVID e pela recuperação, os dados existem, mas estão dispersos por várias autoridades estatísticas nacionais e europeias, cada uma com o seu portal, formato, cadência e manias. O INE publica uma coisa, o Banco de Portugal outra, o Eurostat e o BCE mais duas. Não há um único sítio que os consolide, os alinhe numa linha temporal comum e te deixe fazer perguntas transversais como "como é que o desemprego e as yields da dívida soberana se moveram juntos?"

Esse era o problema à superfície. A verdadeira razão por que o construí foi empurrar a minha própria profundidade, levar um projeto de respostas brutas de API até um briefing pronto para administração, sendo dono de cada camada pelo meio, em vez de herdar um dataset limpo e fazer só a última milha.

Um dashboard responde a perguntas que já sabes fazer. Eu queria construir a camada por baixo dele, a parte que decide se os números do dashboard são sequer de confiança.
Âmbito

A primeira decisão: o que é real e o que é modelado

Doze pilares ao longo de quinze anos são muita superfície, e nem tudo está disponível através de uma API aberta e limpa. A decisão inicial mais importante não foi técnica. Foi sobre honestidade. Dividi os dados em dois níveis e tornei a divisão explícita em todo o lado onde importa.

Séries oficiais
Os seis pilares macrofinanceiros centrais (PIB, desemprego, inflação, taxas de juro, crédito, dívida pública) mais desigualdade e regional NUTS2.

Obtidos das APIs abertas oficiais do Eurostat, do BCE e do Banco de Portugal. Estes carregam os valores publicados.
Estimativas modeladas
Os pilares estendidos (habitação, detalhe do mercado de trabalho, contas externas, estrutura orçamental) e o benchmark da UE.

Calibrados face a tendências publicadas onde não há dados granulares via API aberta. Acompanham as dinâmicas reais, mas não são os registos oficiais brutos, e o projeto di-lo.

Teria sido fácil apresentar os doze pilares como se tivessem todos a mesma autoridade. Não o fiz, porque no momento em que alguém descobre um número modelado apresentado como evangelho, deixa de confiar em todos. O dataset commitado é determinístico e reproduzível a partir de um snapshot, por isso qualquer um o pode reconstruir e obter o mesmo resultado, e a documentação de proveniência dos dados explica exatamente que pilares são quais.

Em analytics, a forma mais rápida de destruir a própria credibilidade é exagerar a proveniência dos dados. Rotular as séries modeladas com honestidade não me custou nada e comprou à plataforma toda a sua confiança.
Arquitetura

Um pipeline em três fases, cada camada minha

O sistema é um único comando (python main.py) que corre três fases de ponta a ponta. Mantê-las bem separadas (extrair, analisar, entregar) significou que podia reconstruir qualquer camada sem tocar nas outras, e testar cada uma isoladamente.

01
ETL & ingestão
Extrai de cinco fontes (INE, Banco de Portugal, PORDATA, Eurostat, BCE) via CSV/API com cache em disco, transforma com SQL e carrega em SQLite, com linhagem de execução por UUID e checksums SHA-256, para que cada número seja rastreável a um lote.
02
Camada de analytics
Decomposição, previsão, causalidade, nowcasting, deteção de anomalias e correlação entre pilares, o motor estatístico que transforma séries limpas em estrutura e sinal.
03
Camada de saída
Power BI (39 medidas DAX), uma app Streamlit de quatro páginas, uma API REST em FastAPI, exportações Excel multi-folha e um briefing HTML autocontido, a mesma análise entregue para cinco audiências diferentes.

A verdade pouco glamorosa do trabalho com dados é que a camada do meio é a parte fácil de exibir e a parte difícil de garantir confiança. Por isso gastei a maior parte do esforço nos dois extremos que ninguém fotografa: o portão de qualidade à entrada, e o "então e depois?" à saída.

Qualidade de Dados

A camada aborrecida que decide tudo

Um único número errado num dashboard macro não é um bug cosmético. É o tipo de coisa que leva um leitor a descartar em silêncio o relatório inteiro. Por isso, antes de qualquer série chegar à camada de analytics, passa por um framework de validação com oito verificações. Cada pilar, cada carga, todas as vezes.

Esquema
Colunas, tipos e chaves são exatamente o que o código a jusante espera.
Nulos
Valores em falta são apanhados e contabilizados, nunca silenciosamente diluídos numa média.
Intervalos
Uma taxa de desemprego de 180% é um bug de parsing, não uma recessão.
Outliers
Saltos estatisticamente improváveis são sinalizados para inspeção, não tomados como bons.
Drift
Uma série cuja distribuição muda entre cargas sinaliza uma alteração a montante.
Completude
Sem lacunas silenciosas na linha temporal que distorçam uma tendência ou uma previsão.
Consistência
Os totais derivados reconciliam com os seus componentes entre tabelas.
Atualidade
Os dados são tão recentes quanto a fonte afirma serem.

Cada execução escreve um relatório de qualidade em JSON e um registo de linhagem (um run_id UUID, checksums de ficheiros, metadados de proveniência) para que, se um número parecer errado, o consiga rastrear de trás para a frente pelas camadas até ao lote e à fonte exatos que o produziram. Essa rastreabilidade é a diferença entre "acho que os dados estão bem" e "consigo provar de onde isto veio".

Analytics

Para além dos gráficos: o que a camada de analytics faz mesmo

É aqui que o instinto de um analista financeiro encontrou um toolkit estatístico mais profundo. O objetivo nunca foi prever o PIB português melhor do que o banco central. Foi demonstrar os métodos como deve ser, com validação honesta em vez de uma linha confiante traçada para o futuro.

Decomposição
O STL separa o desemprego, a inflação e o PIB em componentes de tendência, sazonal e residual, para que uma oscilação sazonal nunca seja confundida com uma mudança estrutural.
Previsão
SARIMAX com seleção automática de ordem por AIC, mais um ensemble multi-modelo e, crucialmente, backtesting de janela expansível que reporta MAE, RMSE, MAPE e precisão direcional. Uma previsão que não fizeste backtest é só um palpite confiante.
Causalidade
Um modelo VAR com funções de impulso-resposta, decomposição de variância e testes de causalidade de Granger entre PIB, desemprego, inflação e dívida, para perguntar que séries movem de facto quais.
Nowcasting
Uma bridge equation que usa dados mensais de produção industrial e de crédito para estimar o PIB do trimestre atual antes de sair a publicação oficial.
Deteção de anomalias
Um z-score móvel de 24 meses e um Isolation Forest apanham movimentos invulgares entre pilares, alimentando um motor de alertas por limiares em onze indicadores.
Correlação entre pilares
Uma matriz de Pearson completa que faz emergir as relações que vale a pena reportar (a ligação desemprego–yield da dívida, r = 0,71; o inverso inflação–NPL, r = −0,48), com benchmarking da UE-27 para contexto.

O enquadramento honesto em todo o lado: onde um método é genuinamente robusto nestes dados, apoio-me nele; onde os pilares modelados o tornam ilustrativo, digo-o. Um gráfico de previsão que esconde as suas próprias métricas de erro é marketing, não análise.

O Salto

De "aqui estão os dados" para "aqui está o que significam"

A maior coisa que separa este projeto de um conjunto arrumado de gráficos é a camada final. Um dashboard obriga o leitor a fazer a interpretação. Um entregável consultivo faz a interpretação por ele, e assume uma posição. A plataforma gera um briefing HTML autocontido que termina não com um gráfico, mas com uma matriz de risco e recomendações estratégicas.

Insights narrativos
Um motor baseado em regras escreve o comentário por pilar e entre pilares. Um modelo OpenAI é um aprimoramento opcional. O relatório é totalmente gerado sem ele, e os números que descreve são sempre os determinísticos.
Matriz de risco
Indicadores pontuados por probabilidade e impacto, para que o briefing nomeie onde a economia está exposta, não só onde já esteve.
Recomendações estratégicas
O "então e depois?": leituras concretas ancoradas na análise, mais cenários base / otimista / pessimista calibrados com elasticidades da lei de Okun e da taxa de crédito.

Manter o relatório determinístico foi uma decisão de produto deliberada, não uma limitação. Para algo apresentado como análise económica, um número que muda de cada vez que regeneras a página é pior do que inútil. É um buraco de confiança. O LLM acelera a prosa; nunca decide os valores.

Engenharia

Porque é que um projeto de portfólio tem 489 testes

Seria razoável perguntar porque é que um projeto de analytics a solo precisa de uma suite de testes real, de containers e de CI. A resposta é que a disciplina de engenharia é parte do que o projeto pretende demonstrar, que consigo construir trabalho de dados da forma como uma equipa teria mesmo de o manter.

Uma suite de testes real
489 testes em 38 ficheiros cobrem as transformações de ETL, as verificações de validação e as funções analíticas. Quando mudo uma regra de scoring ou uma transformação, a suite diz-me imediatamente o que parti, a mesma rede de segurança que deixa uma equipa avançar depressa sem partir os números.
Reproduzível por construção
Execução em Docker, um snapshot de dados brutos commitado e um único ponto de entrada significam que qualquer um pode clonar o repo e reconstruir exatamente a mesma base de dados, gráficos e relatório, offline e de forma determinística. O CI corre-o a cada push; o MkDocs documenta-o.
Retrospetiva

O que resultou, e o que eu mudaria

O projeto fez aquilo para que o construí: levou-me por todas as camadas de uma plataforma de dados, de uma resposta bruta de API a uma recomendação sobre a qual um leitor pudesse agir. Algumas reflexões honestas:

O que resultou: qualidade antes de esperteza
Gastar o esforço inicial no framework de oito verificações e na linhagem (antes de qualquer modelação) significou que nunca tive de debugar uma previsão que era, na verdade, uma linha de dados má. Cada hora em qualidade de dados poupou várias a jusante.
O que resultou: a camada consultiva
A matriz de risco e as recomendações são o que faz as pessoas dizerem "isto é um briefing", não "isto é um dashboard". É a diferença entre apresentar dados e ter um ponto de vista sobre eles.
O que eu mudaria: mais cobertura por API ao vivo
Os pilares estendidos modelados são honestos, mas a próxima versão devia puxar mais deles de fontes ao vivo e encolher o conjunto calibrado. A plataforma foi construída para fazer essa troca de forma limpa, via a flag is_provisional e o modo de refresh.
O que eu mudaria: intervalos de confiança em todo o lado
As previsões reportam métricas de erro, mas os gráficos públicos podiam mostrar os intervalos de previsão de forma mais proeminente. Uma única linha para o futuro parece sempre mais certa do que é, e o honesto é mostrar o cone.
A lição que transitou diretamente de volta para o trabalho de produto: o valor da análise não é o gráfico, é a decisão que muda. Constrói tudo (o portão de qualidade, a previsão, o briefing) de trás para a frente, a partir da decisão que alguém precisa de tomar.

Vê a plataforma

Explora o briefing interativo, ou mergulha no código: o pipeline de ETL, o motor de analytics e a documentação completa estão no GitHub.