├── datawarehouse ├── seeds │ ├── .gitkeep │ └── movimentacao_commodities.csv ├── requirements.txt ├── .gitignore ├── models │ ├── staging │ │ ├── stg_commodities.sql │ │ ├── stg_movimentacao_commodities.sql │ │ └── schema.yml │ ├── datamart │ │ ├── schema.yml │ │ └── dm_commodities.sql │ └── schema.yml ├── README.md ├── dbt_project.yml └── docs │ └── homepage.md ├── app ├── requirements.txt └── app.py ├── src ├── requirements.txt └── extract_load.py ├── yfinance.cache ├── profiles.yml ├── .github └── workflows │ └── dbt_docs_deploy.yml ├── README.md └── .gitignore /datawarehouse/seeds/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /datawarehouse/requirements.txt: -------------------------------------------------------------------------------- 1 | dbt-postgres -------------------------------------------------------------------------------- /datawarehouse/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | target/ 3 | dbt_packages/ 4 | logs/ 5 | -------------------------------------------------------------------------------- /app/requirements.txt: -------------------------------------------------------------------------------- 1 | streamlit 2 | pandas 3 | sqlalchemy 4 | psycopg2-binary 5 | python-dotenv 6 | -------------------------------------------------------------------------------- /src/requirements.txt: -------------------------------------------------------------------------------- 1 | yfinance 2 | pandas 3 | sqlalchemy 4 | psycopg2-binary 5 | python-dotenv 6 | -------------------------------------------------------------------------------- /yfinance.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/workshop-aberto-dw-do-zero/HEAD/yfinance.cache -------------------------------------------------------------------------------- /datawarehouse/seeds/movimentacao_commodities.csv: -------------------------------------------------------------------------------- 1 | date,symbol,action,quantity 2 | 2024-06-04,CL=F,sell,40 3 | 2024-06-05,CL=F,buy,35 4 | 2024-06-06,CL=F,sell,30 5 | 2024-06-07,CL=F,buy,55 6 | 2024-06-10,CL=F,sell,45 7 | 2024-06-04,GC=F,buy,10 8 | 2024-06-05,GC=F,sell,5 9 | 2024-06-06,GC=F,buy,8 10 | 2024-06-07,GC=F,sell,12 11 | 2024-06-10,GC=F,buy,15 12 | 2024-06-04,SI=F,buy,18 13 | 2024-06-05,SI=F,sell,20 14 | 2024-06-06,SI=F,buy,30 15 | 2024-06-07,SI=F,sell,25 16 | 2024-06-10,SI=F,buy,22 -------------------------------------------------------------------------------- /profiles.yml: -------------------------------------------------------------------------------- 1 | datawarehouse: 2 | target: prod 3 | outputs: 4 | prod: 5 | type: postgres 6 | host: "{{ env_var('DB_HOST_PROD') }}" 7 | user: "{{ env_var('DB_USER_PROD') }}" 8 | password: "{{ env_var('DB_PASS_PROD') }}" 9 | port: "{{ env_var('DB_PORT_PROD') | int }}" 10 | dbname: "{{ env_var('DB_NAME_PROD') }}" 11 | schema: "{{ env_var('DB_SCHEMA_PROD') }}" 12 | threads: "{{ env_var('DB_THREADS_PROD') | int }}" 13 | keepalives_idle: 0 -------------------------------------------------------------------------------- /datawarehouse/models/staging/stg_commodities.sql: -------------------------------------------------------------------------------- 1 | -- models/staging/stg_commodities.sql 2 | 3 | with source as ( 4 | select 5 | "Date", 6 | "Close", 7 | simbolo 8 | from 9 | {{ source('databasesales', 'commodities') }} 10 | ), 11 | 12 | renamed as ( 13 | select 14 | cast("Date" as date) as data, 15 | "Close" as valor_fechamento, 16 | simbolo 17 | from source 18 | ) 19 | 20 | select 21 | data, 22 | valor_fechamento, 23 | simbolo 24 | from renamed 25 | -------------------------------------------------------------------------------- /datawarehouse/README.md: -------------------------------------------------------------------------------- 1 | Welcome to your new dbt project! 2 | 3 | ### Using the starter project 4 | 5 | Try running the following commands: 6 | - dbt run 7 | - dbt test 8 | 9 | 10 | ### Resources: 11 | - Learn more about dbt [in the docs](https://docs.getdbt.com/docs/introduction) 12 | - Check out [Discourse](https://discourse.getdbt.com/) for commonly asked questions and answers 13 | - Join the [chat](https://community.getdbt.com/) on Slack for live discussions and support 14 | - Find [dbt events](https://events.getdbt.com) near you 15 | - Check out [the blog](https://blog.getdbt.com/) for the latest news on dbt's development and best practices 16 | -------------------------------------------------------------------------------- /datawarehouse/models/staging/stg_movimentacao_commodities.sql: -------------------------------------------------------------------------------- 1 | -- models/staging/stg_movimentacao_commodities.sql 2 | 3 | with source as ( 4 | select 5 | date, 6 | symbol, 7 | action, 8 | quantity 9 | from 10 | {{ source('databasesales', 'movimentacao_commodities') }} 11 | ), 12 | 13 | renamed as ( 14 | select 15 | cast(date as date) as data, 16 | symbol as simbolo, 17 | action as acao, 18 | quantity as quantidade 19 | from source 20 | ) 21 | 22 | select 23 | data, 24 | simbolo, 25 | acao, 26 | quantidade 27 | from renamed 28 | -------------------------------------------------------------------------------- /datawarehouse/models/datamart/schema.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | models: 4 | - name: dm_commodities 5 | description: "Datamart para dados de commodities integrados com movimentações" 6 | columns: 7 | - name: data 8 | description: "Data da observação" 9 | - name: simbolo 10 | description: "Símbolo da commodity" 11 | - name: valor_fechamento 12 | description: "Preço de fechamento da commodity" 13 | - name: acao 14 | description: "Tipo de transação (buy/sell)" 15 | - name: quantidade 16 | description: "Quantidade transacionada" 17 | - name: valor 18 | description: "Valor da transação" 19 | - name: ganho 20 | description: "Ganho ou perda da transação" 21 | -------------------------------------------------------------------------------- /datawarehouse/models/staging/schema.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | models: 4 | - name: stg_commodities 5 | description: "Tabela de staging para dados de commodities" 6 | columns: 7 | - name: data 8 | description: "Data da observação no formato AAAA-MM-DD" 9 | - name: valor_fechamento 10 | description: "Preço de fechamento da commodity com precisão decimal 4.2" 11 | - name: simbolo 12 | description: "Símbolo da commodity" 13 | - name: stg_movimentacao_commodities 14 | description: "Tabela de staging para dados de movimentação de commodities" 15 | columns: 16 | - name: data 17 | description: "Data da transação no formato AAAA-MM-DD" 18 | - name: simbolo 19 | description: "Símbolo da commodity" 20 | - name: acao 21 | description: "Tipo de transação (buy/sell)" 22 | - name: quantidade 23 | description: "Quantidade transacionada" 24 | -------------------------------------------------------------------------------- /datawarehouse/models/schema.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | sources: 4 | - name: databasesales 5 | schema: public 6 | tables: 7 | - name: commodities 8 | description: "Tabela que contém dados históricos de commodities" 9 | columns: 10 | - name: Date 11 | description: "Data da observação" 12 | - name: Close 13 | description: "Preço de fechamento da commodity" 14 | - name: simbolo 15 | description: "Símbolo da commodity" 16 | 17 | - name: movimentacao_commodities 18 | description: "Tabela seed" 19 | columns: 20 | - name: date 21 | description: "Data da transação" 22 | - name: symbol 23 | description: "Símbolo da commodity" 24 | - name: action 25 | description: "Tipo de transação (buy/sell)" 26 | - name: quantity 27 | description: "Quantidade transacionada" 28 | -------------------------------------------------------------------------------- /.github/workflows/dbt_docs_deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy dbt docs to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@v3 15 | 16 | - name: Set up Python 17 | uses: actions/setup-python@v3 18 | with: 19 | python-version: 3.8 20 | 21 | - name: Install dbt 22 | run: pip install dbt-postgres 23 | 24 | - name: Set up dbt profile 25 | run: | 26 | mkdir -p ~/.dbt 27 | echo " 28 | datawarehouse: 29 | target: prod 30 | outputs: 31 | prod: 32 | type: postgres 33 | host: ${{ secrets.DB_HOST_PROD }} 34 | port: ${{ secrets.DB_PORT_PROD }} 35 | user: ${{ secrets.DB_USER_PROD }} 36 | password: ${{ secrets.DB_PASS_PROD }} 37 | dbname: ${{ secrets.DB_NAME_PROD }} 38 | schema: ${{ secrets.DB_SCHEMA_PROD }} 39 | threads: ${{ secrets.DB_THREADS_PROD }} 40 | " > ~/.dbt/profiles.yml 41 | 42 | - name: Install dependencies and generate docs 43 | run: | 44 | cd datawarehouse 45 | dbt docs generate 46 | 47 | - name: Deploy to GitHub Pages 48 | uses: peaceiris/actions-gh-pages@v3 49 | with: 50 | github_token: ${{ secrets.GH_PAT }} 51 | publish_dir: ./datawarehouse/target -------------------------------------------------------------------------------- /datawarehouse/models/datamart/dm_commodities.sql: -------------------------------------------------------------------------------- 1 | -- models/datamart/dm_commodities.sql 2 | 3 | with commodities as ( 4 | select 5 | data, 6 | simbolo, 7 | valor_fechamento 8 | from 9 | {{ ref('stg_commodities') }} 10 | ), 11 | 12 | movimentacao as ( 13 | select 14 | data, 15 | simbolo, 16 | acao, 17 | quantidade 18 | from 19 | {{ ref('stg_movimentacao_commodities') }} 20 | ), 21 | 22 | joined as ( 23 | select 24 | c.data, 25 | c.simbolo, 26 | c.valor_fechamento, 27 | m.acao, 28 | m.quantidade, 29 | (m.quantidade * c.valor_fechamento) as valor, 30 | case 31 | when m.acao = 'sell' then (m.quantidade * c.valor_fechamento) 32 | else -(m.quantidade * c.valor_fechamento) 33 | end as ganho 34 | from 35 | commodities c 36 | inner join 37 | movimentacao m 38 | on 39 | c.data = m.data 40 | and c.simbolo = m.simbolo 41 | ), 42 | 43 | last_day as ( 44 | select 45 | max(data) as max_date 46 | from 47 | joined 48 | ), 49 | 50 | filtered as ( 51 | select 52 | * 53 | from 54 | joined 55 | where 56 | data = (select max_date from last_day) 57 | ) 58 | 59 | select 60 | data, 61 | simbolo, 62 | valor_fechamento, 63 | acao, 64 | quantidade, 65 | valor, 66 | ganho 67 | from 68 | filtered 69 | -------------------------------------------------------------------------------- /src/extract_load.py: -------------------------------------------------------------------------------- 1 | import yfinance as yf 2 | import pandas as pd 3 | from sqlalchemy import create_engine 4 | from dotenv import load_dotenv 5 | import os 6 | 7 | # Obter as variáveis do arquivo .env 8 | DB_HOST = os.getenv('DB_HOST_PROD') 9 | DB_PORT = os.getenv('DB_PORT_PROD') 10 | DB_NAME = os.getenv('DB_NAME_PROD') 11 | DB_USER = os.getenv('DB_USER_PROD') 12 | DB_PASS = os.getenv('DB_PASS_PROD') 13 | DB_SCHEMA = os.getenv('DB_SCHEMA_PROD') 14 | 15 | # Criar a URL de conexão do banco de dados 16 | DATABASE_URL = f"postgresql://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}" 17 | 18 | engine = create_engine(DATABASE_URL) 19 | 20 | # Lista de commodities 21 | commodities = ['CL=F', 'GC=F', 'SI=F'] # Petróleo bruto, Ouro, Prata 22 | 23 | def buscar_dados_commodities(simbolo, periodo='5d', intervalo='1d'): 24 | ticker = yf.Ticker(simbolo) 25 | dados = ticker.history(period=periodo, interval=intervalo)[['Close']] 26 | dados['simbolo'] = simbolo # Adiciona a coluna do símbolo 27 | return dados 28 | 29 | def buscar_todos_dados_commodities(): 30 | todos_dados = [] 31 | for simbolo in commodities: 32 | dados = buscar_dados_commodities(simbolo) 33 | todos_dados.append(dados) 34 | return pd.concat(todos_dados) # Concatena todos os dados em um único DataFrame 35 | 36 | def salvar_no_postgres(df, schema='public'): 37 | df.to_sql('commodities', engine, if_exists='replace', index=True, index_label='Date', schema=schema) 38 | print(f"Dados salvos no schema '{schema}' do banco de dados PostgreSQL") 39 | 40 | if __name__ == "__main__": 41 | dados_concatenados = buscar_todos_dados_commodities() 42 | salvar_no_postgres(dados_concatenados, schema='public') 43 | -------------------------------------------------------------------------------- /datawarehouse/dbt_project.yml: -------------------------------------------------------------------------------- 1 | # Name your project! Project names should contain only lowercase characters 2 | # and underscores. A good package name should reflect your organization's 3 | # name or the intended use of these models 4 | name: 'datawarehouse' 5 | version: '1.0.0' 6 | 7 | # This setting configures which "profile" dbt uses for this project. 8 | profile: 'datawarehouse' 9 | 10 | # These configurations specify where dbt should look for different types of files. 11 | # The `model-paths` config, for example, states that models in this project can be 12 | # found in the "models/" directory. You probably won't need to change these! 13 | model-paths: ["models"] 14 | analysis-paths: ["analyses"] 15 | test-paths: ["tests"] 16 | seed-paths: ["seeds"] 17 | macro-paths: ["macros"] 18 | snapshot-paths: ["snapshots"] 19 | docs-paths: ["docs"] 20 | 21 | # Target-path: directory which will store compiled SQL files 22 | target-path: "target" 23 | 24 | # Clean-targets: directories to be removed by `dbt clean` 25 | clean-targets: ["target", "dbt_modules"] 26 | 27 | # The name of the schema used to store your models 28 | # For postgres, use the schema specified in profiles.yml 29 | models: 30 | datawarehouse: 31 | # Configurations for models in the staging folder 32 | staging: 33 | +schema: staging 34 | +materialized: view 35 | 36 | stg_commodities: 37 | enabled: true 38 | 39 | stg_movimentacao_commodities: 40 | enabled: true 41 | +docs: 42 | node_color: "#c0c0c0" # Cor prata 43 | 44 | # Configurations for models in the datamart folder 45 | datamart: 46 | +schema: datamart 47 | +materialized: view 48 | +docs: 49 | node_color: "#e6b530" # Cor gold 50 | 51 | dm_commodities: 52 | enabled: true -------------------------------------------------------------------------------- /app/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | import streamlit as st 4 | from sqlalchemy import create_engine 5 | from sqlalchemy.exc import ProgrammingError 6 | from dotenv import load_dotenv 7 | 8 | # Carregar variáveis de ambiente do arquivo .env 9 | load_dotenv() 10 | 11 | # Obter as variáveis do arquivo .env 12 | DB_HOST = os.getenv('DB_HOST_PROD') 13 | DB_PORT = os.getenv('DB_PORT_PROD') 14 | DB_NAME = os.getenv('DB_NAME_PROD') 15 | DB_USER = os.getenv('DB_USER_PROD') 16 | DB_PASS = os.getenv('DB_PASS_PROD') 17 | DB_SCHEMA = os.getenv('DB_SCHEMA_PROD') 18 | 19 | # Criar a URL de conexão do banco de dados 20 | DATABASE_URL = f"postgresql://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}" 21 | 22 | # Criar o engine de conexão com o banco de dados 23 | engine = create_engine(DATABASE_URL) 24 | 25 | # Consultar os dados da tabela dm_commodities 26 | def get_data(): 27 | query = f""" 28 | SELECT 29 | data, 30 | simbolo, 31 | valor_fechamento, 32 | acao, 33 | quantidade, 34 | valor, 35 | ganho 36 | FROM 37 | public.dm_commodities; 38 | """ 39 | try: 40 | df = pd.read_sql(query, engine) 41 | return df 42 | except ProgrammingError as e: 43 | st.error(f"Erro ao acessar a tabela 'dm_commodities' no schema '{DB_SCHEMA}': {e}") 44 | return pd.DataFrame() # Retorna um DataFrame vazio em caso de erro 45 | 46 | # Configurar a página do Streamlit 47 | st.set_page_config(page_title='Dashboard de Commodities', layout='wide') 48 | 49 | # Título do Dashboard 50 | st.title('Dashboard de Commodities') 51 | 52 | # Descrição 53 | st.write(""" 54 | Este dashboard mostra os dados de commodities e suas transações. 55 | """) 56 | 57 | # Obter os dados 58 | df = get_data() 59 | 60 | # Verificar se o DataFrame está vazio 61 | if df.empty: 62 | st.write("Não foi possível carregar os dados. Verifique se a tabela 'dm_commodities' existe no schema especificado.") 63 | else: 64 | # Exibir os dados 65 | st.write("### Dados das Commodities") 66 | st.dataframe(df) 67 | 68 | # Resumo estatístico 69 | st.write("### Resumo Estatístico") 70 | st.write(df.describe()) 71 | 72 | # Gráficos 73 | st.write("### Gráficos") 74 | 75 | # Gráfico de barras para ganhos e perdas 76 | st.bar_chart(df[['data', 'ganho']].set_index('data')) 77 | 78 | # Gráfico de linha para valores de fechamento 79 | st.line_chart(df[['data', 'valor_fechamento']].set_index('data')) 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Projeto de Data Warehouse de Commodities 2 | 3 | Quanto sua empresa vendeu ontem? 4 | Se você demorar mais de 3 segundos para responder esse workshop de hoje é para você! 5 | 6 | Este projeto tem como objetivo criar um Data Warehouse (DW) para armazenar e analisar dados de commodities, utilizando uma arquitetura moderna de ETL (Extract, Transform, Load). O projeto inclui: 7 | 8 | [Documentação do DBT](https://lvgalvao.github.io/workshop-aberto-dw-do-zero/#!/overview) 9 | 10 | [Dashboard](https://lvgalvao-workshop-aberto-dw-do-zero-appapp-vp0gw4.streamlit.app/) 11 | 12 | 1. **Parte de Extract_Load**: Responsável por extrair dados de uma API e carregar diretamente no banco de dados PostgreSQL. 13 | 2. **Parte de Seed**: Utiliza seeds do DBT para carregar dados de movimentações de commodities a partir de arquivos CSV. 14 | 3. **Models**: Define as transformações de dados usando DBT, criando tabelas de staging e de datamart. 15 | 4. **Dashboard**: Implementado em Streamlit, exibe dados e visualizações das commodities a partir do Data Warehouse. 16 | 17 | ## Estrutura do Projeto 18 | 19 | ### 1. Extract_Load 20 | 21 | A parte de `extract_load` é responsável por extrair dados de uma API e carregar diretamente no banco de dados PostgreSQL. O script `extract_load.py` realiza essa operação. 22 | 23 | ### 2. Seed 24 | 25 | A parte de seed utiliza o DBT para carregar dados de movimentações de commodities a partir de arquivos CSV. Esses dados são carregados diretamente no Data Warehouse. 26 | 27 | ### 3. Models 28 | 29 | Os models do DBT são usados para transformar os dados carregados em tabelas de staging e de datamart. As transformações incluem a limpeza dos dados e a criação de métricas agregadas. 30 | 31 | ### 4. Dashboard 32 | 33 | O dashboard é implementado em Streamlit e permite visualizar os dados das commodities armazenados no Data Warehouse. Ele exibe tabelas e gráficos interativos para análise dos dados. 34 | 35 | ## Gráficos Mermaid 36 | 37 | ### Movimentação entre Sistemas 38 | 39 | ```mermaid 40 | graph TD; 41 | subgraph Extract_Load 42 | A1[buscar_dados_commodities] --> B1[buscar_todos_dados_commodities] 43 | B1 --> C1[carregar_dados_no_postgres] 44 | end 45 | 46 | subgraph Transform 47 | D1[stg_commodities.sql] --> E1[stg_movimentacao_commodities.sql] 48 | E1 --> F1[dm_commodities.sql] 49 | end 50 | 51 | A[API de Commodities] -->|Extrai Dados| Extract_Load 52 | Extract_Load -->|Carrega Dados| C[PostgreSQL] 53 | C -->|Armazena Dados| D[Data Warehouse] 54 | Data_Warehouse -->|Transforma Dados| Transform 55 | Transform -->|Cria Views| F[Dashboard Streamlit] 56 | ``` 57 | 58 | ### Ideia de ETL 59 | 60 | ```mermaid 61 | graph LR; 62 | A[Extract] -->|Extrai Dados da API| B[Load] 63 | B -->|Carrega Dados no DW| C[Transform] 64 | C -->|Limpa e Transforma Dados| D[Data Warehouse] 65 | D -->|Exibe Dados| E[Dashboard Streamlit] 66 | ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | config.py 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | share/python-wheels/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | MANIFEST 33 | 34 | # PyInstaller 35 | # Usually these files are written by a python script from a template 36 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 37 | *.manifest 38 | *.spec 39 | 40 | # Installer logs 41 | pip-log.txt 42 | pip-delete-this-directory.txt 43 | 44 | # Unit test / coverage reports 45 | htmlcov/ 46 | .tox/ 47 | .nox/ 48 | .coverage 49 | .coverage.* 50 | .cache 51 | nosetests.xml 52 | coverage.xml 53 | *.cover 54 | *.py,cover 55 | .hypothesis/ 56 | .pytest_cache/ 57 | cover/ 58 | 59 | # Translations 60 | *.mo 61 | *.pot 62 | 63 | # Django stuff: 64 | *.log 65 | local_settings.py 66 | db.sqlite3 67 | db.sqlite3-journal 68 | 69 | # Flask stuff: 70 | instance/ 71 | .webassets-cache 72 | 73 | # Scrapy stuff: 74 | .scrapy 75 | 76 | # Sphinx documentation 77 | docs/_build/ 78 | 79 | # PyBuilder 80 | .pybuilder/ 81 | target/ 82 | 83 | # Jupyter Notebook 84 | .ipynb_checkpoints 85 | 86 | # IPython 87 | profile_default/ 88 | ipython_config.py 89 | 90 | # pyenv 91 | # For a library or package, you might want to ignore these files since the code is 92 | # intended to run in multiple environments; otherwise, check them in: 93 | # .python-version 94 | 95 | # pipenv 96 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 97 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 98 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 99 | # install all needed dependencies. 100 | #Pipfile.lock 101 | 102 | # poetry 103 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 104 | # This is especially recommended for binary packages to ensure reproducibility, and is more 105 | # commonly ignored for libraries. 106 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 107 | #poetry.lock 108 | 109 | # pdm 110 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 111 | #pdm.lock 112 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 113 | # in version control. 114 | # https://pdm.fming.dev/#use-with-ide 115 | .pdm.toml 116 | 117 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 118 | __pypackages__/ 119 | 120 | # Celery stuff 121 | celerybeat-schedule 122 | celerybeat.pid 123 | 124 | # SageMath parsed files 125 | *.sage.py 126 | 127 | # Environments 128 | .env 129 | .venv 130 | env/ 131 | venv/ 132 | ENV/ 133 | env.bak/ 134 | venv.bak/ 135 | 136 | # Spyder project settings 137 | .spyderproject 138 | .spyproject 139 | 140 | # Rope project settings 141 | .ropeproject 142 | 143 | # mkdocs documentation 144 | /site 145 | 146 | # mypy 147 | .mypy_cache/ 148 | .dmypy.json 149 | dmypy.json 150 | 151 | # Pyre type checker 152 | .pyre/ 153 | 154 | # pytype static type analyzer 155 | .pytype/ 156 | 157 | # Cython debug symbols 158 | cython_debug/ 159 | 160 | # PyCharm 161 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 162 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 163 | # and can be added to the global gitignore or merged into this file. For a more nuclear 164 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 165 | #.idea/ 166 | 167 | ### Python Patch ### 168 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 169 | poetry.toml 170 | 171 | # ruff 172 | .ruff_cache/ 173 | 174 | # LSP config files 175 | pyrightconfig.json 176 | 177 | # End of https://www.toptal.com/developers/gitignore/api/python 178 | 179 | # Generated using ignr.py - github.com/Antrikshy/ignr.py 180 | -------------------------------------------------------------------------------- /datawarehouse/docs/homepage.md: -------------------------------------------------------------------------------- 1 | {% docs __overview__ %} 2 | 3 | ### README do Projeto DBT-Core 4 | 5 | # Projeto DBT-Core para Data Warehouse de Commodities 6 | 7 | Este projeto utiliza DBT (Data Build Tool) para gerenciar e transformar dados de um Data Warehouse (DW) de commodities. O objetivo é criar um pipeline de dados robusto e eficiente que trata e organiza os dados de commodities e suas movimentações para análise. 8 | 9 | ## Estrutura do Projeto 10 | 11 | ### 1. Seeds 12 | 13 | Os seeds são dados estáticos que são carregados no Data Warehouse a partir de arquivos CSV. Neste projeto, usamos seeds para carregar dados de movimentações de commodities. 14 | 15 | ### 2. Models 16 | 17 | Os models definem as transformações de dados usando SQL. Eles são divididos em duas camadas principais: staging e datamart. 18 | 19 | #### Staging 20 | 21 | A camada de staging é responsável por preparar e limpar os dados antes que eles sejam carregados nas tabelas finais de análise. 22 | 23 | - **stg_commodities.sql**: Trata e formata os dados das commodities extraídos da API. 24 | - **stg_movimentacao_commodities.sql**: Trata e formata os dados de movimentações das commodities. 25 | 26 | #### Datamart 27 | 28 | A camada de datamart é onde os dados finais de análise são armazenados. Eles são baseados nos dados preparados pela camada de staging. 29 | 30 | - **dm_commodities.sql**: Integra os dados tratados das commodities e das movimentações, criando um modelo de dados final para análise. 31 | 32 | ### 3. Sources 33 | 34 | Os sources são as tabelas ou arquivos de origem dos dados que o DBT utiliza para realizar as transformações. 35 | 36 | ### 4. Snapshots 37 | 38 | Os snapshots são utilizados para manter um histórico de como os dados mudam ao longo do tempo. 39 | 40 | ## Estrutura de Diretórios 41 | 42 | ```plaintext 43 | ├── models 44 | │ ├── staging 45 | │ │ ├── stg_commodities.sql 46 | │ │ └── stg_movimentacao_commodities.sql 47 | │ └── datamart 48 | │ └── dm_commodities.sql 49 | ├── seeds 50 | │ └── movimentacao_commodities.csv 51 | ├── dbt_project.yml 52 | └── README.md 53 | ``` 54 | 55 | ## Executando o Projeto 56 | 57 | ### Requisitos 58 | 59 | - Python 3.7+ 60 | - DBT 61 | 62 | ### Passos para Execução 63 | 64 | 1. **Clonar o Repositório**: 65 | ```bash 66 | git clone 67 | cd 68 | ``` 69 | 70 | 2. **Instalar o DBT**: 71 | ```bash 72 | pip install dbt-core dbt-postgres 73 | ``` 74 | 75 | 3. **Configurar o DBT**: 76 | - Configure o arquivo `profiles.yml` para se conectar ao seu Data Warehouse. O arquivo deve estar no diretório `~/.dbt/` ou no diretório especificado pela variável de ambiente `DBT_PROFILES_DIR`. 77 | 78 | Exemplo de `profiles.yml`: 79 | ```yaml 80 | databasesales: 81 | target: dev 82 | outputs: 83 | dev: 84 | type: postgres 85 | host: 86 | user: 87 | password: 88 | port: 89 | dbname: 90 | schema: 91 | threads: 1 92 | ``` 93 | 94 | 4. **Executar os Seeds do DBT**: 95 | ```bash 96 | dbt seed 97 | ``` 98 | 99 | 5. **Executar as Transformações do DBT**: 100 | ```bash 101 | dbt run 102 | ``` 103 | 104 | 6. **Verificar o Estado do Projeto**: 105 | ```bash 106 | dbt test 107 | ``` 108 | 109 | ## Contribuição 110 | 111 | Para contribuir com o projeto, por favor, faça um fork do repositório e envie um pull request com suas alterações. 112 | 113 | --- 114 | 115 | ### Descrição dos Models 116 | 117 | #### stg_commodities.sql 118 | 119 | Este model é responsável por tratar e formatar os dados das commodities extraídos da API. Ele faz a limpeza e transformação necessárias para preparar os dados para o datamart. 120 | 121 | #### stg_movimentacao_commodities.sql 122 | 123 | Este model é responsável por tratar e formatar os dados de movimentações das commodities. Ele faz a limpeza e transformação necessárias para preparar os dados para o datamart. 124 | 125 | #### dm_commodities.sql 126 | 127 | Este model integra os dados tratados das commodities e das movimentações, criando um modelo de dados final para análise. Ele calcula métricas e agrega os dados para facilitar a análise no dashboard. 128 | 129 | {% enddocs %} --------------------------------------------------------------------------------