📊 BI Data Generator
Gerador de dados fictícios em modelo estrela (fato + dimensões + calendário) para quem quer praticar Power BI, DAX, SQL e modelagem dimensional sem depender de bases reais, sensíveis ou difíceis de conseguir.
Em poucos segundos você escolhe um setor de negócio, define um período e um volume de linhas, e recebe um pacote completo com tabela fato, dimensões, tabela calendário (com semana ISO 8601 e ano fiscal configurável), medidas DAX sugeridas, modelo TMDL pronto para o Power BI (ou um template de projeto .pbip completo, pronto pra abrir direto no Power BI Desktop), dicionário de dados e, se quiser, os scripts SQL para recriar tudo em um banco relacional.
O app principal tem 11 abas: o Gerador de Setores (200 bases prontas), o Automatizar BI (envie sua própria planilha e gere medidas/modelo automaticamente), o Simulador de Certificação PL-300 (quiz de prática para a certificação oficial da Microsoft), o Dados Causais (gera uma relação causa-efeito conhecida de propósito, em cima do setor que você já gerou), o Formatar DAX (cola uma expressão bagunçada e recebe ela formatada), o Formatar M (o mesmo princípio, mas para código Power Query), o Auditor de Modelo (cole o TMDL de um modelo seu e receba uma nota de qualidade), o DAX Sandbox (escreva uma medida DAX e veja o resultado calculado de verdade contra os dados), o Pergunte aos Dados (escreva uma pergunta de negócio em português e veja a medida DAX equivalente e a resposta calculada de verdade) e o Carrossel Power BI (envie o .pbix do seu relatório, marque as páginas e baixe um HTML com barra de progresso que alterna sozinho entre elas).
Aplicação construída em Streamlit e distribuída publicamente em:
🔗 https://rodrigoaiosa.streamlit.app
📚 Sumário
🧭 Visão geral
Este repositório gera dados sintéticos de BI em modelo estrela, com relacionamentos íntegros, prontos para importar em ferramentas de análise (Power BI, Tableau, Excel, Python, SQL).
O objetivo é resolver um problema comum de quem estuda ou ensina Business Intelligence: falta de dados bons para praticar. Criar tabelas manualmente é lento, não tem sazonalidade real, e raramente reflete um modelo dimensional coerente. O BI Data Generator resolve isso gerando, em segundos:
- Tabela Fato com chaves estrangeiras e métricas numéricas;
- Tabelas Dimensão com atributos descritivos e chave primária;
- Tabela dCalendario (compatível com Power Query) para análises de série temporal, com granularidade de semana ISO 8601 e ano fiscal (mês de início configurável);
- Medidas DAX sugeridas automaticamente com base nas colunas geradas;
- Modelo TMDL com tabelas, relacionamentos e medidas prontos para importar no Power BI;
- Template de projeto Power BI (.pbip), com o mesmo modelo já montado, pronto para abrir direto no Power BI Desktop;
- Dicionário de dados explicando cada tabela e coluna;
- Scripts SQL (DDL/INSERT) para recriar a base em SQL Server, PostgreSQL ou MySQL;
- Um case de negócio fictício, gerado automaticamente, transformando a base num exercício com objetivo real a resolver;
- Um modo Automatizar BI, que aplica esse mesmo motor de medidas/modelo em planilhas que você mesmo envia (.csv/.xlsx);
- Um Simulador de Certificação PL-300, com perguntas originais organizadas nos 4 domínios oficiais do exame.
🗂 Estrutura do repositório
Repositório de um único app (BI Data Generator PRO), tudo na raiz.
bi_data_generator/
├── app.py # ⭐ App principal (BI Data Generator PRO), versão mais completa
├── config.py # Configuração da página, slider de volume, dicionário de 200 setores e obter_gerador() (import sob demanda do setor escolhido)
├── i18n.py # Sistema de internacionalização (PT-BR / EN)
├── helpers.py # Funções utilitárias no nível raiz
├── log_acesso.py # Log de acesso e uso (sessão, eventos) enviado para uma planilha Google Sheets
├── requirements.txt # Dependências do app principal
├── LICENSE
│
├── generators/ # 🏭 Um módulo por setor de negócio (200 setores + 15 motores/utilitários)
│ ├── __init__.py # Vazio de propósito: cada gerador é importado sob demanda (ver config.obter_gerador), não todos de uma vez
│ ├── helpers.py # dcalendario(), new_ids(), get_faker(), fake_pool(), rand_dates(), to_zip()...
│ ├── dicionario.py # Gera o dicionário de dados (CSV zipado) com descrições PT/EN
│ ├── medidas.py # Gera a bateria de medidas DAX sugeridas por tabela fato
│ ├── sql_generator.py # Gera DDL / INSERT / script completo (SQL Server, PostgreSQL, MySQL)
│ ├── relatorios_gerenciais.py # Gera as views SQL de Relatórios Gerenciais para qualquer setor
│ ├── tmdl_generator.py # Gera o modelo TMDL "createOrReplace" (tabelas, relacionamentos e medidas) para colar no Tabular Editor
│ ├── pbip_generator.py # Gera um projeto .pbip completo (Report + SemanticModel em TMDL nativo) pronto pra abrir direto no Power BI Desktop
│ ├── case_negocio.py # Gera o case de negócio fictício que acompanha cada base
│ ├── concept_drift.py # Injeta deriva temporal (concept drift) genérica na tabela fato
│ ├── dax_formatter.py # Motor de formatação de expressões DAX (tokenizador + quebra de linha)
│ ├── m_formatter.py # Motor de formatação de código M / Power Query (mesmo princípio, adaptado)
│ ├── auditor_modelo.py # Motor de análise/nota de qualidade de um TMDL colado pelo usuário
│ ├── dax_engine.py # Motor de avaliação real de medidas DAX (subconjunto pedagógico) contra os dados
│ ├── varejo.py, financeiro.py, saude.py, ecommerce.py, ... (um arquivo por setor)
│ └── ...
│
├── ui/ # 🎨 Componentes de interface do app principal
│ ├── hero.py # Seção de topo (hero) da landing
│ ├── sidebar.py # Sidebar: busca de setor, período, volume, botão gerar, export SQL
│ ├── estado_inicial.py # Tela inicial / onboarding ("Como usar")
│ ├── resultado.py # Métricas, preview de tabelas, medidas DAX, gabarito e download do ZIP
│ ├── cache_utils.py # Cache da geração bruta (compartilhado entre abas/botão de SQL) e cache genérico de medidas DAX/TMDL/ZIP do resultado
│ ├── automatizar_bi.py # Aba "Automatizar BI": upload de planilha, tipos, medidas e TMDL
│ └── simulador_pl300.py # Aba "Simulador PL-300": quiz de prática para a certificação
│ └── dados_causais.py # Aba "Dados Causais": relação causa-efeito conhecida, em cima do setor gerado
│ └── formatar_dax.py # Aba "Formatar DAX": cola uma expressão bagunçada e recebe ela formatada
│ └── formatar_m.py # Aba "Formatar M": mesmo princípio, pra código Power Query
│ └── auditor_modelo.py # Aba "Auditor de Modelo": cola o TMDL e recebe uma nota de qualidade
│ └── dax_sandbox.py # Aba "DAX Sandbox": escreve uma medida DAX e vê o resultado calculado de verdade
│ └── sugestao_proximo_passo.py # Sugestão discreta de próxima ferramenta a usar, entre as abas
│
└── styles/
├── css.py # CSS customizado injetado no Streamlit (tema Power BI: amarelo/preto)
└── seo.py # (opcional) meta tags de SEO
🚀 Instalação e execução local
Pré-requisitos
- Python 3.10+ (recomendado 3.11)
- pip
git clone https://github.com/RodrigoAiosa/bi_data_generator.git
cd bi_data_generator
pip install -r requirements.txt
streamlit run app.py
O Streamlit vai abrir automaticamente em http://localhost:8501.
🖱 Como usar o app
O app abre com 11 abas: "🏭 Gerador de Setores", "🤖 Automatizar BI", "🎓 Simulador PL-300", "🧬 Dados Causais", "📐 Formatar DAX", "🔧 Formatar M", "🩺 Auditor de Modelo", "🧮 DAX Sandbox", "💬 Pergunte aos Dados" e "🖥️ Carrossel Power BI".
Aba 🏭 Gerador de Setores
- Escolha o setor: use a caixa de busca na barra lateral para filtrar entre os 200 setores disponíveis (ex.: digitar "saúde", "log", "marketing").
- Defina o período: datas de início e fim; a tabela
dCalendario é gerada automaticamente cobrindo esse intervalo, já com granularidade de semana ISO 8601 e ano fiscal.
- (Opcional) Defina o início do ano fiscal: mês em que o exercício fiscal começa (default Janeiro = ano fiscal igual ao civil); afeta as colunas
AnoFiscal/MesFiscal/TrimestreFiscal da dCalendario.
- Defina o volume de dados: slider de 100 a 100.000 linhas na tabela fato (o volume das dimensões é ajustado proporcionalmente).
- (Opcional) Ative "Injetar anomalias nos dados" para adicionar problemas propositais (veja Modo anomalias, deriva temporal e case de negócio).
- (Opcional) Ative "Simular deriva temporal (concept drift)" para fazer uma categoria ganhar participação gradualmente ao longo do período, sem evento único que explique.
- Clique em "Gerar base agora". Uma barra de progresso mostra as etapas reais: criação de dimensões, geração da fato, cálculo de métricas, compactação do ZIP.
- A tela de resultado mostra, nessa ordem:
- Um case de negócio fictício, gerado automaticamente para o setor escolhido;
- O resumo das tabelas geradas e o preview de cada uma;
- As medidas DAX sugeridas, organizadas por categoria;
- O gabarito (se anomalia ou deriva temporal estiverem ativas), num expansor colapsado tipo spoiler;
- O botão de download do
.zip completo (CSVs + model.tmdl);
- O botão de download do template Power BI (.pbip), pronto para abrir direto no Power BI Desktop.
- Baixe o dicionário de dados (Excel/CSV zipado) com a descrição de cada tabela e coluna.
- (Opcional) Na barra lateral, gere o script SQL (DDL, INSERT ou completo) no dialeto desejado.
- (Opcional) Se você já gerou um cenário na aba "🧬 Dados Causais" antes de clicar em "Baixar Base", o também inclui o CSV causal e o gabarito (veja a seção dedicada).
Aba 🤖 Automatizar BI
Veja a seção Automatizar BI (suas próprias planilhas) para o passo a passo completo.
Aba 🎓 Simulador PL-300
Veja a seção Simulador de Certificação PL-300 para o passo a passo completo.
Aba 🧬 Dados Causais
Veja a seção Dados Causais (relação causa-efeito conhecida) para o passo a passo completo.
Aba 📐 Formatar DAX
Veja a seção Formatar DAX para o passo a passo completo.
Aba 🔧 Formatar M
Veja a seção Formatar M para o passo a passo completo.
Aba 🩺 Auditor de Modelo
Cole o TMDL de um modelo Power BI seu (arquivo .tmdl exportado do Tabular Editor, ou o conteúdo copiado da pasta definition/ de um projeto PBIP) e receba uma nota de qualidade com achados acionáveis: medidas duplicadas, divisão sem DIVIDE(), colunas calculadas que poderiam ser medidas, relacionamentos inativos não utilizados, entre outras checagens comuns de boas práticas de modelagem.
Aba 🧮 DAX Sandbox
Veja a seção DAX Sandbox para o passo a passo completo.
Aba 💬 Pergunte aos Dados
Veja a seção Pergunte aos Dados para o passo a passo completo.
Aba 🖥️ Carrossel Power BI
Veja a seção Carrossel Power BI para o passo a passo completo.
🏭 Setores de negócio disponíveis (200)
| Setor | Conteúdo típico |
|---|
| 🏋️ Academia & Fitness | Check-ins, alunos, instrutores, pagamentos e avaliações físicas |
| 🛫 Aeroporto & Operações Aeroportuárias | Aeroportos, terminais, pousos e decolagens, companhias aéreas |
| 💱 Agência de Câmbio | Operações de câmbio, moedas, cotações e taxas de serviço |
| 📰 Agência de Notícias | Jornalistas, matérias, veículos assinantes e distribuição |
| 📢 Agência de Publicidade | Projetos, campanhas de mídia, equipe e clientes |
| 🌾 Agronegócio | Safras, culturas, propriedades e insumos |
| 🌱 AgTech | Sensores IoT, drones, monitoramento e agricultura de precisão |
| 🚰 Água Mineral & Envasamento | Fontes, linhas envasadas, produção e distribuição |
| 🍔 Alimentos & Bebidas | Produção, plantas, produtos e fornecedores |
| 🚲 Aluguel de Bicicletas & Bike Sharing | Estações, bicicletas, corridas e planos |
| 🚑 Ambulância & Remoção | Chamados de emergência, ambulâncias, equipes e tempo de resposta |
| 🐝 Apicultura | Apiários, colmeias, colheita de mel e sanidade |
| 🎰 Apostas Esportivas & iGaming | Apostas, jogadores, eventos esportivos e transações |
| 🏬 Armazenagem & Self Storage | Unidades, boxes, contratos e ocorrências de armazenagem |
| 🏛️ Arquitetura & Design | Projetos, serviços, honorários e gestão de obras |
| 🧶 Artesanato | Artesãos, produtos, vendas por canal e produção |
| 👵 Asilo & Casa de Repouso | Instituições, residentes, cuidadores e ocorrências de saúde |
| 🔩 Assistência Técnica de Eletrônicos | Ordens de serviço, técnicos, peças e reparos |
| 🛍️ Atacado & Atacarejo | Lojas, produtos a granel, vendas B2B e clientes |
| 🎬 Audiovisual & Produtora | Produções, orçamentos, recursos e bilheteria |
| 🕵️ Auditoria & Compliance | Auditores, clientes, achados e não conformidades |
| 🚦 Autoescola | Unidades, instrutores, aulas e exames de habilitação |
| 🔧 Autopeças & Oficina Mecânica | Peças, serviços, clientes e canais de venda |
🧮 Quantidade de medidas DAX geradas por setor
Cada setor gera uma quantidade diferente de medidas DAX automaticamente, dependendo de quantas tabelas fato, colunas numéricas e chaves estrangeiras ele tem (setores multi-fato e com mais colunas de valor multiplicam a base de medidas). Somando os 200 setores, o motor já sabe escrever 10.690 medidas DAX diferentes, sem depender de nenhuma IA.
| Setor | Medidas DAX |
|---|
| 🚛 Transporte | 303 |
| 📣 Marketing Digital | 215 |
| 🏛️ Governo & Setor Público | 185 |
| 🚗 Mobilidade | 160 |
| ☁️ SaaS B2B | 146 |
| 🛢️ Petróleo & Gás | 140 |
| 🦄 Startups & Venture Capital | 137 |
| 💊 Farmacêutico | 118 |
| 🏪 E-commerce | 116 |
| 🏦 Fintech | 116 |
| 🏟️ Esportes | 103 |
| ⛏️ Mineração | 103 |
| 🤝 CRM | 98 |
| 🌾 Agronegócio | 92 |
| 🍔 Alimentos & Bebidas | 92 |
| 🧵 Têxtil & Confecção | 92 |
| 🚀 Espacial & Aeroespacial | 91 |
| 🐟 Pesca & Aquicultura | 91 |
| ✈️ Viagens Corporativas | 91 |
| 🏋️ Academia & Fitness | 84 |
| 👗 Moda & Vestuário | 83 |
| 🏢 Recursos Humanos | 83 |
| 💱 Agência de Câmbio | 82 |
| 📢 Agência de Publicidade | 82 |
| 💄 Beleza & Estética | 82 |
| ♻️ Economia Circular | 82 |
| 🎉 Eventos & Entretenimento | 82 |
| 🏷️ Franquias | 82 |
| 🍽️ Restaurantes & Food Service | 82 |
| ⚖️ Jurídico | 81 |
| 🎬 Audiovisual & Produtora | 80 |
| 🌲 Florestal & Papel | 80 |
| 🎮 Games & eSports | 80 |
| 🐄 Pecuária | 72 |
| ✈️ Aviação Civil | 71 |
| 📖 Editora & Publicação | 71 |
| 📦 Fábrica de Embalagens | 71 |
| 🥩 Frigorífico & Processamento de Carnes | 71 |
|
🗃 Modelo de dados gerado (Star Schema)
Cada base gerada segue o padrão de modelagem dimensional (esquema estrela):
- Tabela Fato (
Fato*): uma linha por evento/transação, com chaves estrangeiras (sk_* / id_*) para as dimensões e colunas numéricas (valores, quantidades, métricas).
- Tabelas Dimensão (
Dim* ou nome do setor): chave primária e atributos descritivos (nomes, categorias, localizações etc.).
- Tabela
dCalendario: gerada automaticamente para o período escolhido, com colunas Data, Ano, Mes, MesAno, IdMesAno, granularidade de semana ISO 8601 (SemanaISO, AnoSemanaISO, IdSemanaISO) e ano fiscal (AnoFiscal, MesFiscal, TrimestreFiscal — mês de início configurável na sidebar, default Janeiro = ano fiscal igual ao civil), pronta para relacionar com Power Query/Power BI.
- Tabelas Bridge (
Bridge*): quando o setor exige, tabelas de associação para relacionamentos N:N.
Dica de modelagem sugerida pelo próprio app: importe os CSVs no Power BI e crie relacionamentos usando as colunas sk_* (chave estrangeira) da tabela Fato até a chave primária correspondente em cada dimensão, e conecte dCalendario[Data] ao campo de data da tabela Fato.
Em setores onde uma fato referencia outra fato (ex.: despesas ou abastecimentos vinculados a uma viagem específica), o modelo TMDL gerado já resolve automaticamente qualquer ambiguidade de relacionamento: a fato-filha mantém o vínculo ativo com a fato-pai, e tem o link direto com o calendário desativado quando necessário, evitando o erro "caminhos ambíguos" ao aplicar o modelo no Power BI.
🔗 Sugestão de próximo passo entre abas
Depois de concluir uma ação relevante em qualquer uma das abas (gerar uma base, gerar medidas no Automatizar BI, corrigir um simulado, gerar um cenário causal, formatar um DAX ou um M, auditar um modelo, testar uma medida no DAX Sandbox), aparece uma sugestão discreta apontando para a próxima aba que provavelmente faz sentido usar em seguida, conectando as ferramentas em vez de tratá-las como produtos isolados. Nunca interrompe o fluxo principal, sempre some quando não se aplica mais (ex.: a sugestão de gerar uma base primeiro só aparece no Simulador PL-300 se você ainda não tiver gerado nenhuma).
✨ Recursos principais
- 200 setores de negócio com dados contextualmente coerentes (nomes, categorias, faixas de valores e distribuições plausíveis para cada indústria).
- Volume configurável: de 100 a 100.000 linhas na tabela fato via slider.
- Período configurável: qualquer intervalo de datas, com geração automática da
dCalendario.
- Busca de setor na barra lateral, com índice construído a partir do nome e da descrição de cada setor.
- Barra de progresso real, com etapas (dimensões, fato, métricas, compactação).
- Medidas DAX sugeridas automaticamente (
generators/medidas.py), organizadas por categoria e prontas para colar no Power BI. Somando os 200 setores, já são 10.690 medidas diferentes que o motor sabe escrever sozinho, sem depender de nenhuma IA.
- Modelo TMDL (
generators/tmdl_generator.py): tabelas, relacionamentos e medidas prontos para importar no Power BI (Tabular Editor), com resolução automática de ambiguidade de relacionamento, inclusive em cadeias fato-para-fato.
- Template de projeto Power BI (
generators/pbip_generator.py): reaproveita o mesmo modelo (tabelas, relacionamentos e medidas) já em formato de projeto .pbip (Report + SemanticModel em TMDL nativo), pronto para abrir direto no Power BI Desktop (Arquivo → Abrir → Procurar) sem precisar colar nada no Tabular Editor. Basta apontar o parâmetro CaminhoPasta para onde os CSVs foram extraídos e atualizar.
- Dicionário de dados (
generators/dicionario.py): explica o significado de cada tabela e coluna com base em padrões de nome (id_, valor_, qtd_, status, data_, etc.), disponível em PT/EN e exportado como ZIP.
- Case de negócio automático (
generators/case_negocio.py): cada base vem com um parágrafo de contexto fictício, adaptado ao setor e ao modo ativo (anomalia, deriva temporal ou nenhum dos dois), transformando a geração num exercício com objetivo real.
- Gabarito de anomalias e deriva temporal: quando algum desses modos está ativo, um expansor colapsado (tipo spoiler) revela exatamente o que foi alterado e onde, útil para quem ensina conferir se a análise encontrou o problema certo.
- Exportação em ZIP: todas as tabelas em CSV, mais
model.tmdl, case_negocio.txt e (quando aplicável) gabarito.txt, compactados em um único arquivo pronto para importar no Power BI, Tableau, Excel ou Python.
🗄 Exportação SQL (DDL / INSERT / Relatórios Gerenciais)
Além do ZIP de CSVs, a barra lateral do app principal permite gerar diretamente um script SQL para o setor selecionado (generators/sql_generator.py), com suporte a:
- Dialetos: SQL Server, PostgreSQL e MySQL, com mapeamento automático de tipos (
INT/BIGINT, DECIMAL/NUMERIC, BIT/BOOLEAN/TINYINT(1), NVARCHAR/VARCHAR, DATETIME2/TIMESTAMP/DATETIME, entre outros).
- Tipos de script:
- 📋 CREATE TABLE (DDL): apenas a estrutura das tabelas, com tipos inferidos, chaves primárias (
id_/sk_) e índices sugeridos. Ideal para criar o banco do zero.
- 💾 INSERT INTO (dados): popula as tabelas com os dados gerados, no volume definido no slider, em blocos de 500 linhas por
INSERT.
- 📦 Completo (DDL + INSERT + Relatórios): os três combinados em um único arquivo — estrutura, dados e views de relatórios gerenciais — pronto para colar no SSMS, DBeaver ou
psql e recriar o banco inteiro já pronto para consulta gerencial.
- 📊 Somente Relatórios Gerenciais (Views): gera apenas as views, para quem já tem as tabelas e os dados criados no banco e só quer adicionar a camada de análise gerencial.
- Overrides de tamanho de coluna para campos conhecidos (CPF, CNPJ, CNH, placa, UF, e-mail, telefone, CEP, URL, descrição, observação, endereço etc.), evitando
VARCHAR genérico demais.
- Preview do script direto na interface antes do download (com truncamento visual para scripts muito longos).
📊 Relatórios Gerenciais (Views)
Ao gerar o script Completo ou a opção Somente Relatórios Gerenciais, o app cria automaticamente (generators/relatorios_gerenciais.py) um conjunto de views SQL de análise gerencial para qualquer um dos 200 setores — sem depender de conhecimento manual do schema de cada um. A lógica introspecciona as tabelas Fato*/Dim*/dCalendario e as colunas reais geradas (nome, tipo e cardinalidade) para deduzir:
| View | O que mostra |
|---|
vw_KPIsGerenciais_<Setor> | Painel executivo — contagens das dimensões + soma/média das principais medidas numéricas |
vw_EvolucaoMensal_<Setor> | Série mensal de volume e medidas (quando há coluna de data ligada ao dCalendario) |
vw_EvolucaoAnual_<Setor> | Mesma evolução, agregada por ano |
vw_IndicadoresMoMYoY_<Setor> | Variação percentual mês a mês (MoM) e ano a ano (YoY), via LAG(1)/LAG(12) |
vw_<Setor>Por_<categoria> | Distribuição por até 2 colunas categóricas detectadas (canal, tipo, status etc.) |
vw_RankingTop20_<Dimensão> | Ranking das 20 principais entidades relacionadas por FK (vendedor, profissional, cliente etc.), priorizando dimensões do tipo "prestador/performer" quando existirem |
Funciona nos 3 dialetos (SQL Server, PostgreSQL, MySQL). Como as views são deduzidas automaticamente a partir de heurísticas de nome/tipo de coluna, vale sempre revisar antes de usar em produção — especialmente a coluna escolhida como medida principal e a coluna de data usada para as séries temporais.
🧪 Modo anomalias, deriva temporal e case de negócio
Case de negócio automático
Toda base gerada vem acompanhada de um parágrafo de contexto fictício (generators/case_negocio.py): você é contratado(a) como Analista de BI numa empresa fictícia do setor escolhido, e recebe um problema de negócio pra resolver com os dados. O texto se adapta automaticamente conforme o cenário:
- Sem anomalia nem deriva ativas: uma pergunta de negócio genérica (ex.: entender o desempenho do KPI principal).
- Com anomalia ativa: o gatilho aponta pro tipo de sintoma (sem entregar a resposta exata, essa fica só no gabarito).
- Com deriva temporal ativa: o gatilho menciona uma mudança de comportamento gradual e não percebida.
O texto vai também no ZIP de download, como case_negocio.txt.
Modo anomalias
Ao ativar o toggle "Injetar anomalias nos dados", o app aplica quatro tipos de problemas propositais na tabela fato, pensados para prática de análise de causa raiz:
- Spike de churn/cancelamento: força um mês aleatório a concentrar cancelamentos (quando há coluna booleana + coluna de data).
- Margem negativa: cerca de 4% dos registros recebem margem/lucro/desconto negativo e exagerado.
- Sazonalidade extrema: um trimestre aleatório sofre queda artificial de 70% no valor principal.
- Outliers de valor: cerca de 1% dos registros recebem valores 10 a 30 vezes acima da média.
Deriva temporal (concept drift)
Ao ativar o toggle "Simular deriva temporal (concept drift)" (generators/concept_drift.py), uma categoria de uma coluna categórica da tabela fato (canal, segmento, status etc.) ganha participação gradualmente ao longo do período gerado, sem nenhum evento único que explique a mudança. Diferente do modo anomalias (mudanças abruptas e pontuais), esse modo é pensado para praticar detecção de tendência e mudança de comportamento ao longo do tempo.
Gabarito
Quando qualquer um dos dois modos acima está ativo, um aviso é exibido na interface (⚠️ Modo anomalia ativo / 🧬 Deriva temporal ativa) para deixar claro que os dados contêm alterações intencionais. Um expansor colapsado, tipo spoiler ("🔍 Ver gabarito"), revela exatamente o que foi alterado, onde e quantas linhas foram afetadas, útil para quem ensina conferir se a análise encontrou o problema certo. O gabarito também vai no ZIP de download, como gabarito.txt.
🤖 Automatizar BI (suas próprias planilhas)
A segunda aba do app aplica o mesmo motor de medidas DAX e modelo TMDL usado nos 200 setores prontos, só que em planilhas que você mesmo envia, sem depender do padrão Fato/Dimensão dos setores prontos.
Passo a passo
- Envie um ou mais arquivos .csv ou .xlsx (um Excel com várias abas vira várias tabelas separadas automaticamente; planilhas com exatamente as mesmas colunas são consolidadas automaticamente numa só, veja Consolidação automática de planilhas idênticas).
- Cada tabela aparece num expansor com preview das 10 primeiras linhas e um combobox por coluna, já com um tipo sugerido automaticamente (Texto, Número inteiro/decimal, Data, Data e hora, Verdadeiro/Falso, Chave/ID), que você pode ajustar.
- Clique em "🧮 Gerar medidas DAX". O motor gera:
- Perguntas de negócio montadas a partir das colunas reais que você enviou (não são um exemplo fictício);
- Medidas DAX completas: agregações básicas, contagens, percentual de participação e, quando existir coluna de data, Time Intelligence completo (Mês Anterior, %MoM, Ano Anterior, %YoY, YTD, MTD);
- Uma tabela Calendario gerada automaticamente, cobrindo do menor ao maior valor de data encontrado nas tabelas enviadas;
- Um model.tmdl completo, com os relacionamentos detectados automaticamente entre as tabelas (mesma lógica de resolução de ambiguidade usada no Gerador de Setores).
- Baixe o que precisar: só as medidas (
.txt), só o Calendario.csv, ou o modelo completo (.zip com os CSVs de cada tabela + model.tmdl, pronto para importar no Power BI ou no Tabular Editor).
Reparos automáticos
Alguns arquivos exportados de forma errada chegam com todas as colunas despejadas como texto corrido numa única coluna (o cabeçalho vira o nome de uma única coluna cheia de vírgulas). O Automatizar BI detecta esse padrão e desmembra automaticamente de volta em colunas de verdade, avisando na tela quando isso acontece. Também corrige automaticamente acentuação quebrada (texto UTF-8 lido como Latin-1, tipo "Cobrança" em vez de "Cobrança").
Consolidação automática de planilhas idênticas
Se você envia várias planilhas com exatamente o mesmo conjunto de colunas (independente da ordem), como um Excel com uma aba por mês (Jan, Fev, Mar...) ou vários CSVs regionais com a mesma estrutura, o Automatizar BI detecta isso e consolida tudo numa única tabela, empilhando as linhas.
- O nome da tabela consolidada usa o prefixo comum entre os nomes originais (ex.:
Vendas_Jan + Vendas_Fev + Vendas_Mar → Vendas_Consolidado), ou um nome genérico se não achar um prefixo útil.
- Uma coluna extra
_planilha_origem é adicionada, guardando de qual planilha original cada linha veio, mantendo rastreabilidade.
- Planilhas sem nenhuma outra com o mesmo conjunto de colunas ficam exatamente como estavam, sem nenhuma mudança.
- Um aviso aparece na tela informando o que foi consolidado e quantas linhas a tabela final tem.
🎓 Simulador de Certificação PL-300
A terceira aba é um quiz de prática para a certificação PL-300 (Microsoft Certified: Power BI Data Analyst Associate), com perguntas 100% originais (escritas para este projeto, nunca reproduzidas de prova real ou de sites de "exam dump"), organizadas nos 4 domínios oficiais do exame:
- Preparar os dados
- Modelar os dados
- Visualizar e analisar os dados
- Gerenciar e proteger o Power BI
Algumas perguntas usam a base que você acabou de gerar na aba do Gerador de Setores como contexto (nome do setor, tabela fato, coluna real).
Como usar
- Escolha quantas perguntas quer no simulado (5/10/15/20) e clique em "🎲 Sortear novo simulado".
- Responda todas as perguntas no formulário.
- Clique em "✅ Corrigir simulado" para ver a nota geral, o desempenho por domínio, a revisão pergunta a pergunta com explicação, e o painel "🏆 Seu progresso".
- Baixe o "📥 Baixar resultado desta prova (.csv)".
🏆 Seu progresso (sem ranking, sem comparação com ninguém)
Depois de corrigir qualquer simulado, aparece um painel de progresso pessoal: quantos simulados você já fez, sua melhor nota, sua média geral, e um gráfico da evolução ao longo do tempo. É só sobre o seu próprio progresso, sem posição em fila nem comparação com outras pessoas.
Cada simulado corrigido na sessão atual entra automaticamente nesse histórico. Como o app não tem login, o jeito de juntar o progresso de visitas diferentes é reenviando os arquivos de resultado que você já baixou antes: dentro do próprio painel de progresso tem um expansor "📤 Importar histórico de sessões anteriores", onde você sobe um ou mais .csv de tentativas passadas e o app junta tudo numa visão só. O controle do histórico fica com você, no seu computador, não em nenhum banco de dados.
Cada prova corrigida também continua gerando o CSV individual, no formato:
data_hora;pergunta;resposta_aluno;resposta_correta;total_acertos;total_erros;%total_acerto
O data_hora (fuso de Brasília) marca o momento exato daquela tentativa, e os campos total_acertos/total_erros/%total_acerto se repetem em toda linha do arquivo, representando o resultado geral daquela prova.
Fontes oficiais (recomendado usar junto)
Este simulador não substitui o exame real nem o material oficial. Um expansor na própria tela linka direto para:
🧬 Dados Causais (relação causa-efeito conhecida)
Diferente do resto do gerador, onde os dados são só estatisticamente plausíveis, essa aba constrói uma relação de causa e efeito conhecida de propósito, em cima do setor que você já gerou. Serve para praticar inferência causal, teste A/B e marketing mix modeling com a resposta certa documentada, algo que datasets sintéticos comuns não oferecem.
Como funciona
- Gere uma base normalmente na aba "🏭 Gerador de Setores" primeiro (a aba "Dados Causais" avisa e pede isso, caso ainda não tenha sido feito).
- Escolha, entre as colunas numéricas reais da tabela fato daquele setor, qual coluna é a CAUSA e qual coluna representa o EFEITO.
- Defina se a causa aumenta ou reduz o efeito, se quer incluir um confundidor (uma sazonalidade cíclica que afeta o efeito por fora da causa escolhida), a força do efeito causal (%), a defasagem (quantas semanas depois a causa realmente aparece no efeito) e a intensidade do ruído estatístico.
- Clique em "🧬 Gerar cenário causal".
O que é real e o que é simulado
- A coluna de causa usa os valores reais da sua base, agregados por semana.
- A coluna de efeito é 100% simulada pela fórmula causal (defasagem + confundidor + ruído). Ela não usa os valores reais da coluna escolhida na base original, isso é necessário para garantir que o gabarito seja confiável.
- Um expansor colapsado ("🔍 Ver gabarito causal") documenta a força do efeito, a defasagem exata, se há confundidor e a intensidade do ruído usados.
Validação
Em testes com vários setores diferentes, a correlação medida com a defasagem correta é sempre mais forte do que sem considerar a defasagem (ex.: de 0,21 para 0,93 num teste real), confirmando que o mecanismo causal realmente se manifesta nos dados gerados, não é só uma promessa.
Downloads
- Dentro da própria aba: "📥 Baixar dados (.csv)" e "📥 Baixar gabarito causal (.txt)".
- Se você já tiver gerado um cenário causal antes de clicar em "Baixar Base" na aba "Gerador de Setores", o
.zip principal daquele setor também inclui automaticamente o CSV causal (nomeado fato_<setor>_causais.csv) e o gabarito_causal.txt.
📐 Formatar DAX
Cola uma expressão ou medida DAX bagunçada (sem espaço, tudo numa linha só) e recebe ela formatada, cada argumento de função numa linha própria quando a expressão é longa ou tem múltiplos argumentos, VAR/RETURN cada um na sua linha, espaçamento consistente ao redor de operadores.
É uma implementação própria (generators/dax_formatter.py), não chama nem depende do daxformatter.com: um tokenizador reconhece funções, colunas/medidas (Tabela[Coluna], [Medida]), operadores, VAR/RETURN e strings, e um motor de renderização decide, pela profundidade de parênteses, quando quebrar cada argumento numa linha própria.
Como usar
- Cole a expressão DAX no campo de texto (ou clique em "💡 Usar exemplo" para testar sem ter uma medida em mãos, um exemplo diferente é sorteado a cada clique, entre 7 opções, sem repetir o do clique anterior).
- Clique em "📐 Formatar".
- O resultado aparece formatado, com indentação e quebra de linha, pronto para copiar direto do bloco de código.
- Baixe o resultado em
.dax se quiser guardar.
O que o formatador aceita
- Uma expressão solta (ex.:
SUM(FatoVendas[valor_total]));
- Uma medida completa no formato
Nome da Medida = expressão;
- Expressões com
VAR/RETURN;
- Nomes de medida, coluna e tabela com acentuação (ex.: "Preço Médio", "Mês Anterior").
🔧 Formatar M
Cola um código M (Power Query) bagunçado, tudo numa linha só, e recebe ele formatado: bloco let ... in ... com cada passo em sua própria linha, expressões longas quebradas por profundidade de parênteses/colchetes/chaves, identificadores entre aspas (#"Nome do Passo") preservados.
É uma implementação própria (generators/m_formatter.py + ui/formatar_m.py), reaproveitando o mesmo princípio do formatador de DAX (tokenizar e quebrar por profundidade), adaptado pra sintaxe própria do M: suporta os 3 tipos de agrupamento (() chamada de função, {} lista, [] record).
Como usar
- Cole o código M no campo de texto (ou clique em "💡 Usar exemplo", um exemplo diferente é sorteado a cada clique, entre 5 opções, sem repetir o do clique anterior).
- Clique em "🔧 Formatar".
- O resultado aparece formatado, pronto para copiar direto do bloco de código.
- Baixe o resultado em
.m se quiser guardar.
O que o formatador aceita
- Um bloco completo
let ... in ..., com qualquer número de passos;
- Uma expressão solta, sem
let/in (ex.: Table.SelectRows(Source, each [Coluna] > 100));
- Identificadores entre aspas com espaço no nome (ex.:
#"Changed Type", #"Expanded Clientes");
- Nomes de coluna e passo com acentuação (ex.:
[Preço], "Preço Médio").
🩺 Auditor de Modelo
Cole o TMDL de um modelo Power BI seu, de verdade (não precisa ter sido gerado por este projeto) e receba uma nota de qualidade de 0 a 100, mais uma lista de achados acionáveis, cada um com localização e sugestão de correção.
É uma implementação própria (generators/auditor_modelo.py + ui/auditor_modelo.py), baseada em análise de texto/regex — não usa nenhum serviço externo nem envia o modelo para fora da sessão.
Como usar
- Cole o TMDL do seu modelo no campo de texto, ou envie um arquivo
.tmdl/.txt.
- Clique em "🩺 Auditar modelo".
- Veja a nota geral e as métricas (medidas, colunas e relacionamentos analisados).
- Abra cada achado num expansor para ver onde está o problema, o que é e a sugestão de correção.
- Baixe o relatório completo em
.txt se quiser guardar ou compartilhar.
O que ele analisa
- Divisão sem
DIVIDE() (risco de erro por divisão por zero);
- Medidas duplicadas (mesma lógica, nomes diferentes);
- Colunas calculadas que poderiam ser medidas;
- Colunas técnicas expostas (ex.: chaves/IDs sem
isHidden);
- Nomenclatura inconsistente entre medidas;
- Organização de pastas (
displayFolder) ausente ou incompleta.
💡 No Tabular Editor (2 ou 3), clique com o botão direito no modelo → "Advanced Scripting" ou use "Copy as TMDL"/"Script" para pegar o texto completo do seu modelo real.
🧮 DAX Sandbox
Diferente do "Formatar DAX" (que só reformata texto), o DAX Sandbox calcula de verdade: você escreve uma medida DAX e vê o resultado real, computado em cima dos dados gerados para o setor escolhido — sem precisar abrir o Power BI Desktop para testar.
Implementação própria (generators/dax_engine.py + ui/dax_sandbox.py), em Python puro + pandas, sem nenhuma dependência nova. Não é um motor de DAX completo (isso é o motor do próprio Power BI/Analysis Services), mas sim um subconjunto pedagógico com as funções e padrões mais comuns usados em sala de aula e no PL-300.
Como usar
- Escolha o setor na barra lateral (o mesmo seletor usado no Gerador de Setores — não há um seletor próprio nesta aba).
- Clique em "🔄 Recarregar dados" (reaproveita o cache da última geração, se o setor bater; recarrega sozinho sempre que você troca de setor na barra lateral).
- Abra o expansor "📊 Modelo do setor" para ver o diagrama do modelo estrela (Fato em amarelo, Dimensões em verde, Calendário em azul, com a coluna de relacionamento em cada seta).
- Escolha um dos exemplos prontos (deduzidos automaticamente para o setor:
SUM, AVERAGE, COUNTROWS, DIVIDE e um CALCULATE com filtro cruzado, quando há uma dimensão com coluna categórica detectável) ou escreva sua própria medida no formato NomeMedida = expressão (o nome da medida é opcional).
- Clique em "▶️ Executar" e veja o valor calculado, com um passo a passo explicando exatamente o que foi computado.
Funções suportadas
| Função | Exemplo |
|---|
SUM / AVERAGE / MIN / MAX | SUM(FatoVendas[valor_total]) |
COUNTROWS | COUNTROWS(FatoVendas) |
DISTINCTCOUNT | DISTINCTCOUNT(FatoVendas[id_cliente]) |
DIVIDE (com valor alternativo opcional para divisão por zero) | DIVIDE(SUM(FatoVendas[valor_total]), COUNTROWS(FatoVendas), 0) |
CALCULATE com filtro na própria tabela | CALCULATE(SUM(FatoVendas[valor_total]), FatoVendas[canal]="Online") |
CALCULATE com filtro cruzado numa dimensão relacionada (detecta a FK automaticamente) | CALCULATE(SUM(FatoVendas[valor_total]), DimProduto[categoria]="Eletrônicos") |
| Operadores aritméticos, com precedência e parênteses | DIVIDE(SUM(FatoVendas[valor_total]), COUNTROWS(FatoVendas)) * 100 |
Operadores de filtro aceitos dentro do CALCULATE: =, <>, >, <, >=, <=.
Erros de sintaxe ou de dado (função não suportada, coluna/tabela inexistente, coluna não numérica, filtro sem relacionamento detectável) mostram uma mensagem clara explicando o problema, nunca um traceback técnico.
💬 Pergunte aos Dados
Complementa o DAX Sandbox no sentido inverso: em vez de você escrever a medida DAX, você escreve a pergunta de negócio em português (ex.: "Qual foi o total de vendas?", "Qual vendedor teve o maior faturamento?") e a ferramenta mostra a medida DAX equivalente junto com a resposta calculada de verdade — pra ensinar como traduzir uma pergunta em código, não só entregar o número pronto.
Importante: isto não é um assistente de IA de linguagem natural (o projeto não tem nenhuma integração paga com LLM). É um motor de reconhecimento de padrões (generators/qa_engine.py), deliberadamente limitado a um conjunto pequeno e bem testado de perguntas. Quando a pergunta foge desse conjunto — ou pede algo que a ferramenta genuinamente não sabe fazer, como previsão do futuro ou explicação de causa — ela diz claramente que não entendeu, em vez de arriscar uma resposta errada.
Como usar
- Escolha o setor na barra lateral (mesmo seletor do Gerador de Setores e do DAX Sandbox).
- Escreva sua pergunta no campo de texto (veja os exemplos sugeridos, deduzidos automaticamente para o setor).
- Clique em "🔎 Perguntar" e veja a resposta, a medida DAX equivalente e o passo a passo do cálculo.
Perguntas suportadas
| Tipo de pergunta | Exemplo |
|---|
| Agregação simples (total, soma, média, maior, menor) | "Qual foi o total de vendas?", "Qual foi a média de valor total?" |
| Contagem de registros | "Quantos registros existem?" |
| Filtro por valor categórico | "Qual foi o total de vendas no canal Online?" |
| Ranking por dimensão de negócio | "Qual vendedor teve o maior faturamento?" |
| Ranking por período de tempo (mês, ano, trimestre, semestre) | "Qual foi o mês com a maior média de valor parcela?" |
| Ticket médio | "Qual é o ticket médio?" |
Perguntas fora desse escopo (previsão, explicação de causa, ou que mencionem uma medida que não existe no setor escolhido) são recusadas com uma mensagem clara, nunca respondidas por adivinhação.
🖥️ Carrossel Power BI
Ferramenta autônoma (não depende de nenhum setor gerado): envie o arquivo .pbix do seu relatório publicado, marque quais páginas quer incluir, cole o link do relatório e baixe um arquivo HTML pronto que alterna sozinho entre as páginas selecionadas — com uma barra de progresso na parte inferior mostrando o tempo restante até a próxima troca. Ideal para deixar rodando num monitor ou TV de sala em modo apresentação.
Como usar
- Exporte (ou já tenha) o .pbix do relatório que você quer exibir — o mesmo arquivo que você abre no Power BI Desktop. Também aceita o
.zip de um projeto .pbip (formato PBIR), se você usar esse formato mais novo.
- Publique o relatório no Power BI Service (se ainda não publicou) e vá em Arquivo → Inserir relatório → Site ou portal.
- Envie o .pbix na aba, marque as páginas que quer incluir no carrossel (todas vêm marcadas por padrão; dá para desmarcar as que não quer, ou usar os botões "Marcar todas"/"Desmarcar todas").
- Cole o link (ou o código
<iframe> inteiro) obtido no passo 2 — a ferramenta identifica sozinha o reportId e o ctid de dentro dele, não precisa recortar nada.
- Ajuste o intervalo de troca (em segundos) e clique em "📥 Baixar carrossel.html".
- Abra o arquivo baixado em qualquer navegador (de preferência já autenticado no Power BI, já que os relatórios usam
autoAuth) e deixe em tela cheia.
Formatos de arquivo aceitos
A extração de páginas reconhece automaticamente dois formatos, sem precisar informar qual é:
.pbix padrão (o formato binário comum do Power BI Desktop) — lê o arquivo interno Report/Layout (JSON em UTF-16LE com a lista de páginas).
.pbip/PBIR (o formato de projeto mais novo, em pastas) — lê Report/definition/pages/pages.json e os page.json de cada página.
Se o arquivo enviado não tiver nenhum dos dois, ou se o link colado não contiver um reportId/ctid reconhecível, a ferramenta explica exatamente o que faltou, em vez de gerar um HTML quebrado.
📊 Log de acesso e painel de uso
O app registra automaticamente eventos de uso (início de sessão, geração de base, download de ZIP/dicionário/SQL) numa planilha do Google Sheets, via log_acesso.py e um Web App do Google Apps Script.
- O log é best-effort: se o webhook não estiver configurado ou a chamada falhar, o app continua funcionando normalmente, só sem gravar aquele evento.
- Os horários gravados usam sempre o fuso de Brasília (
America/Sao_Paulo), independente de onde o servidor do Streamlit estiver rodando.
- Para configurar, defina
log_webhook_url em st.secrets com a URL do seu Web App do Apps Script (veja o cabeçalho de log_acesso.py para o passo a passo completo de publicação).
- Existe um painel de acesso separado (outro projeto Streamlit,
dash_bi_data_generator) que lê essa mesma planilha e mostra KPIs, gráficos e filtros (Ano, Mês, Dia, Setor, Ação, Status, Dispositivo) sobre o uso real do app.
🌐 Internacionalização (PT/EN)
Todo o texto da interface (sidebar, hero, resultado, case de negócio, mensagens de erro, dicionário de dados, script SQL) é controlado pelo módulo i18n.py, com mais de 800 linhas de strings mapeadas para Português (pt) e Inglês (en). O toggle de idioma fica na barra lateral e afeta:
- Textos da interface e mensagens;
- Nomes de meses na
dCalendario;
- Locale do
Faker usado para gerar nomes, endereços e demais dados fictícios (pt_BR ou equivalente em inglês).
☁️ Deploy no Streamlit Cloud
Ao criar o app no Streamlit Cloud, aponte o "Main file path" para app.py (raiz do repositório), usando o requirements.txt também da raiz.
📦 Requisitos e dependências
Dependências principais (arquivo requirements.txt da raiz):
streamlit
pandas
numpy
faker
plotly
requests
tzdata
openpyxl
Python 3.10+ é recomendado devido ao uso de type hints modernos (dict[str, pd.DataFrame]) presentes no código.
🗺 Roadmap / ideias futuras
Ideias que fazem sentido para evolução do projeto (não implementadas ainda):
- Exportação direta em formato Parquet/Delta Table;
- Testes automatizados por gerador de setor;
- Documentação por gerador (schema de colunas de cada setor).
Contribuições e sugestões são bem-vindas via issues e pull requests.
⚖️ Aviso legal
Todos os dados gerados são 100% fictícios e sintéticos, criados com o pacote Faker e regras de negócio simuladas. Nenhuma informação real de pessoas, empresas ou entidades é utilizada. O projeto é destinado a fins educacionais e de portfólio, para estudo de Power BI, DAX, modelagem dimensional e SQL.
Versão nativa (Vercel + Supabase) — em migração
public/ — site estático (login/cadastro no Supabase, escolha de setor, geração e download).
api/gerar.py, api/setores.py — funções Python da Vercel que reutilizam generators/ via servico/pacote.py (sem Streamlit).
- Variáveis de ambiente na Vercel (apenas para pacotes > 3 MB, que vão ao bucket privado
pacotes do Supabase Storage):
SUPABASE_URL e SUPABASE_SERVICE_KEY (nunca expor no front-end).
- Teste local:
python scripts/dev_local.py 8765.
- Streamlit (
app.py, ui/, styles/) permanece até as demais abas serem migradas; dependências em requirements-streamlit.txt.