{"id":22873666,"url":"https://github.com/gabrieladados/novadrive-data-pipeline","last_synced_at":"2025-03-31T12:27:05.312Z","repository":{"id":264936147,"uuid":"894708698","full_name":"gabrieladados/novadrive-data-pipeline","owner":"gabrieladados","description":"Do Data Warehouse ao Looker Studio: Projeto End-to-End de Análise para a concessionária Nova Drive","archived":false,"fork":false,"pushed_at":"2024-12-28T20:33:02.000Z","size":50,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-06T18:45:30.537Z","etag":null,"topics":["airflow","dbt","docker","looker-studio","snowflake","sql"],"latest_commit_sha":null,"homepage":"https://lookerstudio.google.com/reporting/084f3415-ca37-4d1c-ba6f-adfe0df6becd","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabrieladados.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-26T21:00:30.000Z","updated_at":"2024-12-28T20:33:06.000Z","dependencies_parsed_at":"2024-12-28T21:31:56.449Z","dependency_job_id":null,"html_url":"https://github.com/gabrieladados/novadrive-data-pipeline","commit_stats":null,"previous_names":["gabrieladados/novadrive-data-pipeline"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieladados%2Fnovadrive-data-pipeline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieladados%2Fnovadrive-data-pipeline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieladados%2Fnovadrive-data-pipeline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrieladados%2Fnovadrive-data-pipeline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabrieladados","download_url":"https://codeload.github.com/gabrieladados/novadrive-data-pipeline/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246467585,"owners_count":20782339,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airflow","dbt","docker","looker-studio","snowflake","sql"],"created_at":"2024-12-13T14:29:49.348Z","updated_at":"2025-03-31T12:27:05.286Z","avatar_url":"https://github.com/gabrieladados.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Do Data Warehouse ao Looker Studio: Projeto End-to-End de Análise para a concessionária Nova Drive\n\n\u003e Este projeto foi desenvolvido como parte do Bootcamp de Engenharia de Dados ministrado pelo professor Fernando Amaral. Ele consiste na construção de um Data Warehouse para uma concessionária fictícia, com foco na criação de pipelines de dados eficientes e visuais impactantes.\n\u003e\n\n\n## 📝 Contexto\n\nA **Nova Drive** é uma concessionária que enfrenta dificuldades na área de vendas para acessar e consumir dados de forma eficiente. Atualmente, a equipe precisa solicitar ao setor de TI a geração de relatórios do CRM, que são posteriormente exportados para o Excel e tratados manualmente. Esse processo é demorado, propenso a erros e deixa os dados frequentemente desatualizados. Além disso, há questões de segurança, já que o uso de planilhas manipuláveis pode comprometer a integridade das informações.\n\n## 🎯 Objetivo do Projeto\n\nO objetivo deste projeto é automatizar a **extração, carregamento e transformação (ELT)** dos dados, criando um pipeline que entregue um **dashboard** dinâmico e atualizado em tempo real. Com isso, a equipe de vendas poderá acessar informações seguras e precisas sobre os principais indicadores (KPIs) de forma ágil, sem depender de processos manuais, garantindo maior eficiência e confiança na tomada de decisões.\n\n## 🛠️ Arquitetura do Projeto\n\nA arquitetura do projeto foi organizada em camadas, seguindo boas práticas de engenharia de dados.\n\n1. **Camada de Ingestão**: Extração dos dados do PostgreSQL.\n2. **Camada de Orquestração**: Automação dos processos de extração, transformação e carregamento usando Airflow.\n3. **Camada de Armazenamento**: Armazenamento dos dados transformados no Snowflake.\n4. **Camada Analítica**: Modelagem dos dados no dbt para geração de tabelas analíticas.\n5. **Visualização de Dados**: Dashboards criados no Looker Studio.\n\n## 🛠️ Ferramentas Utilizadas\n\n- **PostgreSQL**: Banco de dados de origem.\n- **Airflow**: Orquestração e automação de pipelines.\n- **Snowflake**: Data Warehouse na nuvem.\n- **dbt**: Modelagem, testes e documentação de dados.\n- **Looker Studio**: Visualização de dados e construção de dashboards.\n- **AWS EC2**: Hospedagem da máquina virtual.\n   \n\n## 🚀 Etapas do Projeto\n\n### **Etapa 1: Conexão com o banco de dados e exploração dos dados**\n\n- Conexão com o banco de dados PostgreSQL usando o PgAdmin.\n- Exploração inicial das tabelas e suas relações.\n\n### **Etapa 2: Configuração da máquina virtual e do Airflow**\n\n- Configuração de uma instância EC2 no AWS com Ubuntu.\n- Instalação e configuração do Docker e Airflow.\n\n### **Etapa 3: Configuração do Snowflake**\n\n- Criação de uma conta no Snowflake.\n- Configuração de objetos no Snowflake (banco de dados, schemas, tabelas e warehouses).\n\n### **Etapa 4: Construção do pipeline com Airflow**\n\n- Desenvolvimento de DAGs para extração, transformação e carregamento (ETL) dos dados.\n- Testes de carregamento de dados no Snowflake.\n\n### **Etapa 5: Modelagem analítica com dbt**\n\n- Criação de modelos analíticos no dbt.\n- Validação e teste de integridade dos dados.\n- Execução de jobs para geração de tabelas analíticas.\n\n### **Etapa 6: Construção do Dashboard no Looker Studio**\n\n- Integração do Snowflake com o Looker Studio.\n- Criação de dashboards com os principais KPIs da empresa.\n\n\n## Exploração Incial dos Dados \u0026 Respondendo Questões\n1. Liste todos os veículos com tipo 'SUV Compacta' e valor inferior a 30.000,00.\n    ```sql\n    SELECT *\n    FROM veiculos\n    WHERE tipo = 'SUV Compacta' AND valor \u003c30000.00\n    ```\n2. Exiba o nome dos clientes e o nome das concessionárias onde realizaram suas compras.\n       \n   ```sql\n   SELECT \n       cli.cliente,\n       con.concessionaria\n   FROM clientes AS cli\n   JOIN concessionarias AS con\n        ON cli.id_concessionarias = con.id_concessionarias\n   ```\n\n3. Conte quantos vendedores existem em cada concessionária.\n       \n   ```sql\n    SELECT \n    \tcon.concessionaria AS nome_concessionaria,\n    \tCOUNT(DISTINCT(ven.id_vendedores)) AS num_vendedores\n    FROM concessionarias AS con\n    JOIN vendedores AS ven\n    ON con.id_concessionarias = ven.id_concessionarias\n    GROUP BY nome_concessionaria\n    ORDER BY num_vendedores DESC\n   ```\n\n4. Encontre os veículos mais caros vendidos em cada tipo de veículo.\n   ```sql\n    WITH base AS (\n    \n    SELECT *\n    FROM vendas AS ven\n    JOIN veiculos AS vei\n    ON ven.id_veiculos = vei.id_veiculos\n    ),\n    \n    mais_caros AS (\n    SELECT \n    \ttipo,\n    \tMAX(valor_pago) AS maior_valor\n    FROM base\n    GROUP BY tipo\n    ORDER BY maior_valor DESC\n    )\n    \n    SELECT *\n    FROM mais_caros\n        ORDER BY num_vendedores DESC\n   ```\n5. Liste o nome do cliente, o veículo comprado e o valor pago, para todas as vendas.\n   ```sql\n    SELECT \n    \tcli.cliente,\n    \tvei.nome,\n    \tven.valor_pago\n    FROM vendas AS ven\n    LEFT JOIN clientes AS cli\n      ON ven.id_clientes = cli.id_clientes\n    JOIN veiculos AS vei\n      ON ven.id_veiculos = vei.id_veiculos\n    ```\n6. Identifique as concessionárias que venderam mais de 5 veículos.\n   ```sql\n   SELECT \n    \tcon.concessionaria,\n    \tCOUNT(ven.id_veiculos) AS num_veiculos\n    FROM vendas AS ven\n    JOIN concessionarias AS con\n    ON ven.id_concessionarias = con.id_concessionarias\n    GROUP BY con.concessionaria\n    HAVING COUNT(ven.id_veiculos) \u003e 5\n   ```\n    \n7. Liste os três veículos mais caros disponíveis.\n   ```sql\n    SELECT *\n    FROM veiculos\n    ORDER BY valor DESC\n    LIMIT 3\n   ```\n       \n8. Selecione todos os veículos adicionados no último mês.\n   ```sql\n    SELECT *\n    FROM veiculos\n    WHERE data_inclusao \u003e CURRENT_TIMESTAMP - INTERVAL '1 month'\n   ```\n  \n9. Liste todas as cidades e qualquer concessionária nelas, se houver.\n   ```sql\n    SELECT \n    \tciade,\n    \tconcessionaria\n    FROM cidades AS cid\n    LEFT JOIN concessionarias AS con\n      ON cid.id_cidades = con.id_cidadesd\n    ```\n\n10. Encontre clientes que compraram veículos 'SUV Premium Híbrida' ou veículos com valor acima de 60.000,00.\n ```sql\n    SELECT \n      \tcli.cliente,\n      \tCASE \n          WHEN vei.tipo = 'SUV Premium Híbrida' and ven.valor_pago \u003e 60000 THEN 'SUV PH e \u003e60k'\n      \t\tWHEN vei.tipo = 'SUV Premium Híbrida' THEN 'SUV PH'\n      \t\tWHEN ven.valor_pago \u003e 60000 THEN '\u003e60K'\n      \tEND as tipo_cliente\n    FROM vendas AS ven\n    JOIN clientes AS cli\n       ON ven.id_clientes = cli.id_clientes\n    JOIN veiculos AS vei\n      ON ven.id_veiculos = vei.id_veiculos\n    WHERE vei.tipo = 'SUV Premium Híbrida' OR ven.valor_pago \u003e 60000\n   ```\n\n\n## 🚀 Instalação e Configuração do Airflow com Docker\n\nPara instalar e configurar o **Apache Airflow** utilizando o **Docker** no Ubuntu, siga os passos abaixo. Esses comandos serão usados para configurar o Airflow em um ambiente desacoplado e garantir que ele esteja rodando corretamente.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\n Passo a passo da Instalação\n\u003c/summary\u003e\n  \n  1. **Atualize a lista de pacotes do APT:**\n     ```bash\n      sudo apt-get update\n      ```\n  2. **Instale pacotes necessários para adicionar um novo repositório via HTTPS:**\n      ```bash\n      sudo apt-get install ca-certificates curl gnupg lsb-release\n      ```\n  \n  3. **Crie o diretório para armazenar as chaves de repositórios:**\n      ```bash\n      sudo mkdir -m 0755 -p /etc/apt/keyrings\n      ```\n  \n  4. **Adicione a chave GPG do repositório do Docker:**\n      ```bash\n      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg\n      ```\n  \n  5. **Adicione o repositório do Docker às fontes do APT:**\n      ```bash\n      echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null\n      ```\n  \n  6. **Atualize a lista de pacotes após adicionar o novo repositório do Docker:**\n      ```bash\n      sudo apt-get update\n      ```\n  \n  7. **Instale o Docker e seus componentes:**\n      ```bash\n      sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n      ```\n  \n  8. **Baixe o arquivo `docker-compose.yaml` do Airflow:**\n      ```bash\n      curl -LfO 'https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml'\n      ```\n  \n  9. **Crie os diretórios necessários para DAGs, logs e plugins:**\n      ```bash\n      mkdir -p ./dags ./logs ./plugins\n      ```\n  \n  10. **Crie o arquivo `.env` com o UID do usuário para configurações de permissões do Docker:**\n      ```bash\n      echo -e \"AIRFLOW_UID=$(id -u)\" \u003e .env\n      ```\n  \n  11. **Inicie o Airflow com o comando:**\n      ```bash\n      sudo docker compose up airflow-init\n      ```\n  \n  12. **Suba o Airflow em modo desacoplado:**\n      ```bash\n      sudo docker compose up -d\n      ```\n  \n  13. **Aguarde até que o Airflow esteja pronto e saudável.**\n  \n  14. **Acesse o Airflow através do navegador utilizando o endereço (substitua a URL abaixo pelo IP público do seu servidor):**\n      ```bash\n      http://coloque_a_url_aqui:8080/\n      ```\n  \n  15. **Edite o arquivo `docker-compose.yaml` e altere a configuração `AIRFLOW__CORE__LOAD_EXAMPLES` para `false`:**\n      ```bash\n      nano /home/ubuntu/docker-compose.yaml\n      # Mude para falso\n      AIRFLOW__CORE__LOAD_EXAMPLES: 'false'\n      ```\n  \n  16. **Reinicie o Airflow após as alterações:**\n      ```bash\n      sudo docker compose stop\n      sudo docker compose up -d\n      sudo docker ps\n      ```\n\u003c/details\u003e\n\n\n\n## 🧑‍💻 Modelagem dos Dados no dbt e Testes\n\nA modelagem dos dados no dbt foi dividida em três etapas principais: **staging**, **intermediate** e **marts**.\n\n1. **Staging:** Carrega os dados brutos para a área de staging e renomeando campos necessários sem modificar substancialmente os dados.\n\n2. **Intermediate:** Realiza transformações iniciais, como limpeza de dados e criação de joins, criando as tabelas dimensionais e a fato. \n\n3. **Marts:** A camada Marts é a etapa final da modelagem dimensional, onde os dados são organizados para análise de negócios, como vendas por período, concessionária, veículo e vendedor. É a camada consumida pelos usuários finais, seja por consultas diretas no Snowflake ou por meio de ferramentas de BI, facilitando a extração de insights de forma rápida e eficiente.\n\n\n### Testes no dbt\n\nDurante a modelagem, foram aplicados testes para garantir a qualidade e a consistência dos dados, como a verificação de dados nulos e a unicidade das chaves primárias. Além de um teste em específico para validar se os dados de acordo com as regras de negócio, são elas:\n\n1. O preço de venda do veículo deve ser igual ou inferior ao valor sugerido.\n2. O desconto aplicado não pode exceder 5% do valor do veículo.\n\n#### Exemplos de comnados executados no dbt:\n- **dbt run:** Executa os modelos e materializa-os no data warehouse.\n- **dbt test –select source:*:** Realiza testes de qualidade nos dados de origem.\n- **dbt test:** Valida os dados com base nas regras de negócio e condições do projeto.\n\n\n\n\n## 📊 Dashboard no Looker Studio\n\n- **KPIs monitorados e Análises Realizadas**:\n    - Quantidade de vendas.\n    - Total de vendas.\n    - Valor médio de vendas\n    - Análise temporal do total de vendas\n    - Mapa da quantidade de vendas por estado.\n    - Top 5 concessionárias em total de vendas.\n    - Top 5 veículos em total de vendas.\n    - Top 5 vendedores em total de vendas.\n    \u003cbr\u003e  \n      \n  \u003e 👉 **Acesse o dashboard no Looker aqui:** https://lookerstudio.google.com/reporting/084f3415-ca37-4d1c-ba6f-adfe0df6becd\n![analise_vendas](https://github.com/user-attachments/assets/af7e1b92-4fb6-4842-9ecd-b755895f0ae3)\n\n\n\n## 🚀 Conclusão\nAo final deste projeto, conseguimos construir uma solução de engenharia de dados robusta e eficiente para a Nova Drive. O pipeline desenvolvido, com o uso de ferramentas modernas como Airflow, Snowflake, dbt e Looker Studio, garante que a área de vendas agora tenha acesso a dados atualizados em tempo real, sem depender de processos manuais demorados ou suscetíveis a erros.\n\nO dashboard criado oferece uma visualização clara e interativa dos principais KPIs, permitindo que os gestores da Nova Drive acompanhem o desempenho das vendas, identifiquem tendências e tomem decisões informadas de maneira ágil e segura. Além disso, a automação do processo elimina a necessidade de intervenção manual constante e garante a integridade e segurança dos dados, resolvendo os principais desafios que a equipe enfrentava.\n\nEssa solução não apenas otimiza o fluxo de trabalho, mas também proporciona mais confiança e agilidade na análise de dados, dando à Nova Drive uma vantagem estratégica no mercado competitivo de vendas de veículos.\n\n\n---\n\n\n## Contribuições\n\nMuito obrigada por acompanhar meu projeto até aqui! 🎉\n\nContribuições são **muito bem-vindas**. Se você tem sugestões ou melhorias, fique à vontade para abrir uma **issue** ou enviar um **pull request**.\n\nGostou do projeto? Não esqueça de dar uma ⭐️! \n\n\n**Meus Contatos:**\n\n💻 [LinkedIn](https://www.linkedin.com/in/gabrielasantanamorais/)  \n📩 [E-mail](mailto:gabrielasmorais01@gmail.com)\n\n**Até a próxima!** 🚀\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrieladados%2Fnovadrive-data-pipeline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabrieladados%2Fnovadrive-data-pipeline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrieladados%2Fnovadrive-data-pipeline/lists"}