{"id":19590175,"url":"https://github.com/imbrunoagc/data-resident-evil","last_synced_at":"2026-04-13T04:09:18.740Z","repository":{"id":262175041,"uuid":"868151620","full_name":"imbrunoagc/data-resident-evil","owner":"imbrunoagc","description":"Arquitetura Open Source de Baixo Custo para Raspagem de Dados e Disponibilização em Streamlit com Docker e MinIO","archived":false,"fork":false,"pushed_at":"2024-12-17T11:31:27.000Z","size":1222,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T13:46:30.349Z","etag":null,"topics":["docker","etl","minio","python","ruff","streamlit"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/bruno-agc/","language":"Jupyter Notebook","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/imbrunoagc.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-10-05T15:56:57.000Z","updated_at":"2024-12-17T11:31:35.000Z","dependencies_parsed_at":"2024-11-11T02:20:00.286Z","dependency_job_id":"8e72fea9-b5b2-4e68-84e5-edeb5b567113","html_url":"https://github.com/imbrunoagc/data-resident-evil","commit_stats":null,"previous_names":["imbrunoagc/data-resident-evil"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/imbrunoagc/data-resident-evil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imbrunoagc%2Fdata-resident-evil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imbrunoagc%2Fdata-resident-evil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imbrunoagc%2Fdata-resident-evil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imbrunoagc%2Fdata-resident-evil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imbrunoagc","download_url":"https://codeload.github.com/imbrunoagc/data-resident-evil/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imbrunoagc%2Fdata-resident-evil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31739129,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T03:27:07.512Z","status":"ssl_error","status_checked_at":"2026-04-13T03:26:53.610Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["docker","etl","minio","python","ruff","streamlit"],"created_at":"2024-11-11T08:23:39.564Z","updated_at":"2026-04-13T04:09:18.719Z","avatar_url":"https://github.com/imbrunoagc.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎯 Projeto: Data Resident Evil\n\n## Coleta de Dados e Data Lake com MinIO\nEste projeto de arquitetura open source tem como foco a raspagem de dados de personagens do universo ``Resident Evil``, com armazenamento em um ``data lake`` e exibição em um dashboard interativo. A construção visa boas práticas e clareza em todos os aspectos, da arquitetura à escrita do código.\n\n### Objetivos:\n* Implementar um data lake seguindo a arquitetura ``medallion``.\n* Utilizar ``BeautifulSoup`` para a raspagem dos dados.\n* Armazenar os dados na camada Bronze em formato JSON com Python.\n* Realizar transformações nas camadas Silver e Gold com ``pandas``.\n* Utilizar o airflow para orquestrar as ``camadas``.\n* Escrever *testes unitários* utilizando ``pytest`` - Local.\n* Aplicar o ``ruff`` para garantir a *formatação* do código Python - Local.\n* Criar um dashboard com ``Streamlit`` para visualização gráfica dos dados da camada Gold.\n* Subir todos os serviços via ``Docker``.\n\nA arquitetura proposta é a seguinte:\n\u003ctable\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"assets/architecture-version_2.0.png\"\n\u003e\u003c/img\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n**Principais ferramentas utilizadas no projeto:**  \n- **Apache Airflow**: Responsável por orquestrar pipelines de dados, automatizando tarefas e seus agendamentos;  \n- **MinIO**: Armazenamento de objetos gratuito usado para guardar e organizar os dados;  \n- **Pandas**: Biblioteca Python usada para processar, transformar e analisar os dados;  \n- **Docker**: Plataforma para criar e gerenciar containers, garantindo que os serviços rodem de forma consistente;  \n- **Streamlit**: Utilizado para criar interfaces simples e rápidas para visualização de dados.  \n\n## Estrutura do Projeto\n* `.git` - Controle de versão.\n* `.pytest` - Configurações para testes unitários.\n* `.ruff_cache` - Cache do Ruff para linting.\n* `.venv` - Ambiente virtual com dependências do projeto.\n* `.gitignore` - Arquivo de exclusões do Git.\n* `.python-version` - Versão do python utilizada no projeto.\n* `requirements.txt` - Dependências do projeto.\n* `pyproject.toml` - Configurações e dependências do projeto com Poetry. \n* `README.md` - Documentação principal do projeto.\n* `assets/` - Imagens e arquivos de mídia utilizados na documentação.\n* `docs/` - Documentação suplementar.\n* `notebook` - Analises pontuais em notebook\n* `src/airflow/dags/resources/` - Arquivo de conexão com o MinIO e demais funcionalidades de coleta e inserção.\n* `src/airflow/dags/scrapy/` - Arquivo principal com a respagem de dados do projeto.\n* `src/airflow/dags/` - Arquivo endereçados como Bronze, Silver e Gold, que é o core do projeto com a DAG para orquestração do processo.\n* `tests/` - Arquivo que propõe teste unitários em classes e métodos.\n\n\n## Estrutura de Pastas\n\n```bash\n|\n|── .devcontainer/\n|── .dockerignore\n|── .docker-compose.yml\n|── .gitignore\n|── .python-version\n|── requirements.txt\n|── poetry.lock\n|── pyproject.toml\n|── README.md\n|── assets/\n|── config_airflow/\n|   └── airflow.Dockerfile\n|── data/\n|── docs/\n|── frontend/\n|   |── components/\n|   |       |── footer.py\n|   |       └── inputs_css.py\n|   |── configs/\n|   |       └── settings_page.py\n|   |── app.py\n|   |── Dockerfile.py\n|   └── requirements.txt\n|── notebook/\n|── src/\n|   └── airflow/\n|          └── dags/\n|                |── resources/\n|                |   |── __init__.py\n|                |   └── minio_manager.py\n|                |── scrapy/\n|                |   |── __init__.py\n|                |   |── collect.py\n|                |   └── paramns.py\n|                |── tools/\n|                |   |── transform.py\n|                |   └── rules_gold.py\n|                |── __init__.py\n|                |── bronze.py\n|                |── silver.py\n|                |── gold.py\n|                └── TaskGroup.py\n|\n└── tests/\n        |── test_1.py\n        └── test_2.py\n```\n\n## Setup do Projeto\n\n#### **1. Clone o repositório**\n```bash\n\u003e git clone https://github.com/imbrunoagc/data-resident-evil.git\n\u003e cd data-resident-evil\n```\n\n#### **2. Execute o projeto**\n```bash\n\u003e docker-compose up --build\n``` \n\n## Setup de execução do projeto em Docker\nComo o projeto está construido em serviços docker, o que é preciso para levantar os serviços é `docker-compose up`, agora quando subir e você acessar o caminho http://127.0.0.1:9001/ em seu navegador. verá que vai existir 1 bucket com as seguintes camadas `bronze, silver e gold`.\n\nAgora, faça um ``docker-compose down -v``, para derrubar os serviços e deletar os volumes.\n\nApós derrubar os volumes, caso deseje realizar a delete das imagens só realizar os seguintes comandos:\n1. Visualizar as imagens\n```bash\ndocker images\n```\n![alt text](assets/docker-images.png)\n\n2. Comando para deletar a imagem por **IMAGE ID**\n```bash\ndocker rmi IMAGE ID\n```\n![alt text](assets/docker-rmi-images.png)\n\n3. Acessar o ambiente do airflow para executar a ``DAG``.\n\n* Através do ambiente do docker-desktop acesse o ``airflow`` -\u003e ``files/``.\n* Abra o arquivo ``standalone_admin_password.txt`` no diretório ``opt/airflow`` e guarde a chave em um local seguro.\n* Acesse a porta do airflow atraves do navegador desejado.\n* user: admin\n* password: conteudo armazenado no arquio ``standalone_admin_password.txt``\n\n## Métricas e Regras | Gold\n\n| **Métrica**                     | **Cálculo/Regra**                                                                 | **Gold? (Sim/Não)**                                                                                                        |\n|----------------------------------|-----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|\n| **Top Personagens Populares**   | Ordenar por `aparicoes` e selecionar os top N (ex: top 10).                       | **Sim** - Uma visão consolidada e resumida que agrega dados de outras camadas.                                            |\n| **Distribuição por Tipo Sanguíneo** | Contar o número de personagens por `tipo_sanguineo`.                                | **Sim** - Agrega dados categóricos que podem ser usados em análises e dashboards.                                         |\n| **Média de Altura por Tipo Sanguíneo** | Calcular `mean(altura)` agrupando por `tipo_sanguineo`.                              | **Sim** - Transformação de dados brutos para uma métrica consolidada.                                                    |\n| **Média de Peso por Tipo Sanguíneo** | Calcular `mean(peso)` agrupando por `tipo_sanguineo`.                                | **Sim** - Métrica consolidada para análises específicas.                                                                 |\n| **Altura x Peso (Scatter)**     | Não há agregação; apenas exibição individual dos dados (gráfico de dispersão).     | **Não** - Dados brutos, melhor na camada **Silver** para análise exploratória.\n\n## Como executar o ruff?\n\n```bash\n# Execução para verificar o código\n\u003e ruff check .\n\n# Execução para verificar o código e corrigir\n\u003e ruff check . --fix\n```\n\n## Como executar o pytest?\n\n\n## Como executar o Streamlit?\n```bash\n# Para execução local, basta seguir com a instalação do pacote stramlit\n\u003e pip install streamlit | poetry add streamlit\n\n# Execução local\n\u003e streamlit run app.py\n```\n\n# Screenshot\n\n## MiniIO\n\n- 1. Bucket Criado.\n\u003ctable\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"assets/minIO-buckets.png\"\n\u003e\u003c/img\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n- 2. Camadas do medallion.\n\u003ctable\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"assets/minIO-layers.png\"\n\u003e\u003c/img\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n- 3. Registros na camada Bronze no formato **JSON**.\n\u003ctable\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"assets/minIO-records-bronze.png\"\n\u003e\u003c/img\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n- 4. Registros na camada Silver no formato **PARQUET**.\n\u003ctable\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"assets/minIO-records-silver.png\"\n\u003e\u003c/img\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n- 5. Registros na camada Gold agregados/sumarizados no formato **PARQUET**.\n\u003ctable\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"assets/minIO-records-gold.png\"\n\u003e\u003c/img\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## Demo App\n[![Streamlit App](https://static.streamlit.io/badges/streamlit_badge_black_white.svg)](https://data-resident-evil-wkwerqngfdjhsbsgrfyvzn.streamlit.app/)\n\n## Colab notebook graphics\n[![Colab Notebook](https://colab.research.google.com/assets/colab-badge.svg)](https://github.com/imbrunoagc/data-resident-evil/blob/main_medellion/notebook/visualize_data_gold.ipynb)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimbrunoagc%2Fdata-resident-evil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimbrunoagc%2Fdata-resident-evil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimbrunoagc%2Fdata-resident-evil/lists"}