From 2c77ae26b3555353b5c7822bd0195af3f9f4af90 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 19 Apr 2024 08:37:24 -0300 Subject: [PATCH 1/5] add new dirs --- .github/workflows/check-bq-project-name.yml | 56 ++++++------ ...ios_mundo__nomenclatura_comum_mercosul.sql | 52 +++++++++++ ..._diretorios_mundo__sistema_harmonizado.sql | 19 ++++ .../download_sh4_ncm.ipynb | 67 ++++++++++++++ models/br_bd_diretorios_mundo/schema.yml | 89 +++++++++++++++++++ 5 files changed, 253 insertions(+), 30 deletions(-) create mode 100644 models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__nomenclatura_comum_mercosul.sql create mode 100644 models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__sistema_harmonizado.sql create mode 100644 models/br_bd_diretorios_mundo/download_sh4_ncm.ipynb diff --git a/.github/workflows/check-bq-project-name.yml b/.github/workflows/check-bq-project-name.yml index 2b481962..9483ae5d 100644 --- a/.github/workflows/check-bq-project-name.yml +++ b/.github/workflows/check-bq-project-name.yml @@ -1,38 +1,34 @@ +--- name: Check BQ project name on: workflow_dispatch: pull_request: - paths: - - '**/*.sql' - + paths: ['**/*.sql'] jobs: check_bucket_name: runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Get changed files - id: get_files - uses: dorny/paths-filter@v2 - with: - list-files: shell - filters: | - pr: - - added|deleted|modified: '**' - - name: Install Python - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - - name: Run Python script - run: | - for file in ${{ steps.get_files.outputs.pr_files }}; do - if [[ $file == *.sql ]]; then - echo "SQL file detected: $file" - python .github/workflows/scripts/check_sql_files.py $file - else - echo "Não é um arquivo SQL: $file" - fi - done \ No newline at end of file + - name: Checkout code + uses: actions/checkout@v2 + - name: Get changed files + id: get_files + uses: dorny/paths-filter@v2 + with: + list-files: shell + filters: | + pr: + - added|deleted|modified: '**' + - name: Install Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: Run Python script + run: |- + for file in ${{ steps.get_files.outputs.pr_files }}; do + if [[ $file == *.sql ]]; then + echo "SQL file detected: $file" + python .github/workflows/scripts/check_sql_files.py $file + else + echo "Não é um arquivo SQL: $file" + fi + done diff --git a/models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__nomenclatura_comum_mercosul.sql b/models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__nomenclatura_comum_mercosul.sql new file mode 100644 index 00000000..19e826b3 --- /dev/null +++ b/models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__nomenclatura_comum_mercosul.sql @@ -0,0 +1,52 @@ +{{ config(alias="nomenclatura_comum_mercosul", schema="br_bd_diretorios_mundo") }} +select + safe_cast(co_ncm as string) id_ncm, + safe_cast(co_unid as string) id_unidade, + safe_cast(co_sh6 as string) id_sh6, + safe_cast(co_ppe as string) id_ppe, + safe_cast(co_ppi as string) id_ppi, + safe_cast(co_fat_agreg as string) id_fator_agregado_ncm, + safe_cast(co_cuci_item as string) id_cgce_n3, + safe_cast(co_cgce_n3 as string) id_isic_classe, + safe_cast(co_siit as string) id_exp_subset, + safe_cast( + case + when co_unid = '10' + then lower('QUILOGRAMA LIQUIDO') + when co_unid = '11' + then lower('NUMERO (UNIDADE)') + when co_unid = '12' + then lower('MILHEIRO') + when co_unid = '13' + then lower('PARES') + when co_unid = '14' + then lower('METRO') + when co_unid = '15' + then lower('METRO QUADRADO') + when co_unid = '16' + then lower('METRO CUBICO') + when co_unid = '17' + then lower('LITRO') + when co_unid = '18' + then lower('MIL QUILOWATT HORA') + when co_unid = '19' + then lower('QUILATE') + when co_unid = '20' + then lower('DUZIA') + when co_unid = '21' + then lower('TONELADA METRICA LIQUIDA') + when co_unid = '22' + then lower('GRAMA LIQUIDO') + when co_unid = '23' + then lower('BILHOES DE UNIDADES INTERNACIONAIS') + when co_unid = '24' + then lower('QUILOGRAMA BRUTO') + else lower(co_unid) + end as string + ) as nome_unidade, + safe_cast(co_isic_classe as string) nome_ncm_portugues, + safe_cast(co_exp_subset as string) nome_ncm_espanhol, + safe_cast(no_ncm_por as string) nome_ncm_ingles, +from + `basedosdados-staging.br_bd_diretorios_mundo_staging.nomenclatura_comum_mercosul` + as t diff --git a/models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__sistema_harmonizado.sql b/models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__sistema_harmonizado.sql new file mode 100644 index 00000000..8b3bef8c --- /dev/null +++ b/models/br_bd_diretorios_mundo/br_bd_diretorios_mundo__sistema_harmonizado.sql @@ -0,0 +1,19 @@ +{{ config(alias="sistema_harmonizado", schema="br_bd_diretorios_mundo") }} +select + safe_cast(co_sh6 as string) id_sh6, + safe_cast(co_sh4 as string) id_sh4, + safe_cast(co_sh2 as string) id_sh2, + safe_cast(co_ncm_secrom as string) id_ncm_secrom, + safe_cast(no_sh6_por as string) nome_sh6_portugues, + safe_cast(no_sh4_por as string) nome_sh4_portugues, + safe_cast(no_sh2_por as string) nome_sh2_portugues, + safe_cast(no_sec_por as string) nome_sec_portugues, + safe_cast(no_sh6_esp as string) nome_sh6_espanhol, + safe_cast(no_sh4_esp as string) nome_sh4_espanhol, + safe_cast(no_sh2_esp as string) nome_sh2_espanhol, + safe_cast(no_sec_esp as string) nome_sec_espanhol, + safe_cast(no_sh6_ing as string) nome_sh6_ingles, + safe_cast(no_sh4_ing as string) nome_sh4_ingles, + safe_cast(no_sh2_ing as string) nome_sh2_ingles, + safe_cast(no_sec_ing as string) nome_sec_ingles, +from `basedosdados-staging.br_bd_diretorios_mundo_staging.sistema_harmonizado` as t diff --git a/models/br_bd_diretorios_mundo/download_sh4_ncm.ipynb b/models/br_bd_diretorios_mundo/download_sh4_ncm.ipynb new file mode 100644 index 00000000..b38fc299 --- /dev/null +++ b/models/br_bd_diretorios_mundo/download_sh4_ncm.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import requests\n", + "from io import BytesIO\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "urls = {\n", + " 'ncm' : 'https://balanca.economia.gov.br/balanca/bd/tabelas/NCM.csv',\n", + " 'sh4': 'https://balanca.economia.gov.br/balanca/bd/tabelas/NCM_SH.csv'\n", + " }\n", + "\n", + "for k in urls:\n", + " print(f'Baixando tabela {k}')\n", + " \n", + " response = requests.get(urls[k], verify=False)\n", + " if response.status_code == 200:\n", + " \n", + " data = BytesIO(response.content)\n", + " df = pd.read_csv(data, encoding='latin-1', sep=';', dtype = str)\n", + " df.to_csv(\n", + " f'{k}.csv',\n", + " index=False,\n", + " encoding = 'utf-8',\n", + " sep=',', \n", + " )\n", + " else:\n", + " print(f'Erro! O status da requisição foi {response.status_code}')\n", + "\n", + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "bd_pipelines", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/models/br_bd_diretorios_mundo/schema.yml b/models/br_bd_diretorios_mundo/schema.yml index 2adabe5d..53f68752 100644 --- a/models/br_bd_diretorios_mundo/schema.yml +++ b/models/br_bd_diretorios_mundo/schema.yml @@ -27,3 +27,92 @@ models: description: Nacionalidade - name: sigla_continente description: Sigla do continente do país + - name: br_bd_diretorios_mundo__nomenclatura_comum_mercosul + description: A Nomenclatura Comum do Mercosul (NCM) é um sistema ordenado que + permite, pela aplicação de regras e procedimentos próprios, determinar um único + código numérico para uma dada mercadoria. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_ncm] + - not_null_proportion_multiple_columns: + at_least: 0.0 + columns: + - name: id_ncm + description: Identificador da Nomenclatura Comum do Mercosul (NCM) + - name: id_unidade + description: Identificador da unidade estátisca do id_ncm + - name: id_sh6 + description: Identificador de 6 dígitos do Sistema Harmonizado (SH6) relacionado + com o id_ncm + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__sistema_harmonizado') + field: id_sh6 + - name: id_ppe + description: Identificador da Pauta de Produtos Exportados (PPE) do id_ncm + - name: id_ppi + description: Identificador da Pauta de Produtos Importados (PPI) do id_ncm + - name: id_fator_agregado_ncm + description: Identificadores de Fator Agregado (FA) do id_ncm + - name: id_cgce_n3 + description: Identificador da Classificação por Grandes Categorias Econômicas + (CGCE) do id_ncm + - name: id_isic_classe + description: Identificador da classe da Classificação de Setores Industriais + ISIC (International Standard Industrial Classification) do id_ncm + - name: id_exp_subset + description: Não informado + - name: nome_unidade + description: Nome da unidade estatística do id_ncm + - name: nome_ncm_portugues + description: Descrição do id_ncm em português + - name: nome_ncm_espanhol + description: Descrição do id_ncm em espanhol + - name: nome_ncm_ingles + description: Descrição do id_ncm em inglês + - name: br_bd_diretorios_mundo__sistema_harmonizado + description: O "Sistema Harmonizado de Designação e de Codificação de Mercadorias", + ou simplesmente "Sistema Harmonizado", tem o objetivo maior foi a criação de + um sistema único mundial de designação e de codificação de mercadorias. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_sh6] + - not_null_proportion_multiple_columns: + at_least: 0.00 + columns: + - name: id_sh6 + description: Identificador de 6 dígitos do Sistema Harmonizado (SH6) + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__nomenclatura_comum_mercosul') + field: id_sh6 + - name: id_sh4 + description: Identificador de 4 dígitos do Sistema Harmonizado (SH6) + - name: id_sh2 + description: Identificador de 2 dígitos do Sistema Harmonizado (SH6) + - name: id_ncm_secrom + description: Não informado + - name: nome_sh6_portugues + description: Descrição do id_sh6 em português + - name: nome_sh4_portugues + description: Descrição do id_sh4 em português + - name: nome_sh2_portugues + description: Descrição do id_sh2 em português + - name: nome_sec_portugues + description: Descrição do em português + - name: nome_sh6_espanhol + description: Descrição do id_sh6 em espanhol + - name: nome_sh4_espanhol + description: Descrição do id_sh4 em espanhol + - name: nome_sh2_espanhol + description: Descrição do id_sh2 em espanhol + - name: nome_sec_espanhol + description: Descrição do em espanhol + - name: nome_sh6_ingles + description: Descrição do id_sh6 em inglês + - name: nome_sh4_ingles + description: Descrição do id_sh4 em inglês + - name: nome_sh2_ingles + description: Descrição do id_sh2 em inglês + - name: nome_sec_ingles + description: Descrição do em inglês From 5e9af5c1b37dc7125dd48090a7fab9b80c3b4d38 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 19 Apr 2024 10:35:57 -0300 Subject: [PATCH 2/5] fix: check_sql_files action --- .github/workflows/scripts/check_sql_files.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scripts/check_sql_files.py b/.github/workflows/scripts/check_sql_files.py index b30fb186..6e794fc2 100644 --- a/.github/workflows/scripts/check_sql_files.py +++ b/.github/workflows/scripts/check_sql_files.py @@ -1,23 +1,24 @@ import argparse +import os def check_sql_files(file): found_staging = False - if file.endswith(".sql"): + if os.path.exists(file) and file.endswith(".sql"): with open(file, "r") as f: lines = f.readlines() for line in lines: - if "basedosdados-dev" in line: + if "basedosdados-staging" in line: found_staging = True - print(f"Found 'basedosdados-dev' in {file}") + print(f"Found 'basedosdados-staging' in {file}") break return found_staging if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Check for 'basedosdados-dev' occurrences in SQL files.") + parser = argparse.ArgumentParser(description="Check for 'basedosdados-staging' occurrences in SQL files.") parser.add_argument("file", help="Path to the SQL file to check") args = parser.parse_args() if check_sql_files(args.file): exit(1) else: - print("No occurrences of 'basedosdados-dev' found in SQL files.") \ No newline at end of file + print("No occurrences of 'basedosdados-staging' found in SQL files.") From 906783b1231054eb36ac076969c8968700053265 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 19 Apr 2024 10:48:07 -0300 Subject: [PATCH 3/5] fix: action check_sql_files to look for dev projects --- .github/workflows/scripts/check_sql_files.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/check_sql_files.py b/.github/workflows/scripts/check_sql_files.py index 6e794fc2..70f55473 100644 --- a/.github/workflows/scripts/check_sql_files.py +++ b/.github/workflows/scripts/check_sql_files.py @@ -7,14 +7,14 @@ def check_sql_files(file): with open(file, "r") as f: lines = f.readlines() for line in lines: - if "basedosdados-staging" in line: + if "basedosdados-dev" in line: found_staging = True - print(f"Found 'basedosdados-staging' in {file}") + print(f"Found 'basedosdados-dev' in {file}") break return found_staging if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Check for 'basedosdados-staging' occurrences in SQL files.") + parser = argparse.ArgumentParser(description="Check for 'basedosdados-dev' occurrences in SQL files.") parser.add_argument("file", help="Path to the SQL file to check") args = parser.parse_args() From 6fb4dec97ba8b29107e547122d778b1896f2030f Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 19 Apr 2024 10:55:34 -0300 Subject: [PATCH 4/5] make requested changes --- models/br_bd_diretorios_mundo/schema.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/br_bd_diretorios_mundo/schema.yml b/models/br_bd_diretorios_mundo/schema.yml index 53f68752..0bff7d38 100644 --- a/models/br_bd_diretorios_mundo/schema.yml +++ b/models/br_bd_diretorios_mundo/schema.yml @@ -35,7 +35,7 @@ models: - dbt_utils.unique_combination_of_columns: combination_of_columns: [id_ncm] - not_null_proportion_multiple_columns: - at_least: 0.0 + at_least: 0.01 columns: - name: id_ncm description: Identificador da Nomenclatura Comum do Mercosul (NCM) @@ -78,7 +78,7 @@ models: - dbt_utils.unique_combination_of_columns: combination_of_columns: [id_sh6] - not_null_proportion_multiple_columns: - at_least: 0.00 + at_least: 0.01 columns: - name: id_sh6 description: Identificador de 6 dígitos do Sistema Harmonizado (SH6) From 03f154f3a4822faf198b1550816295387367df49 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 19 Apr 2024 11:16:50 -0300 Subject: [PATCH 5/5] udpate tests --- models/br_bd_diretorios_mundo/schema.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/br_bd_diretorios_mundo/schema.yml b/models/br_bd_diretorios_mundo/schema.yml index 0bff7d38..4a08d14f 100644 --- a/models/br_bd_diretorios_mundo/schema.yml +++ b/models/br_bd_diretorios_mundo/schema.yml @@ -35,7 +35,7 @@ models: - dbt_utils.unique_combination_of_columns: combination_of_columns: [id_ncm] - not_null_proportion_multiple_columns: - at_least: 0.01 + at_least: 0.99 columns: - name: id_ncm description: Identificador da Nomenclatura Comum do Mercosul (NCM) @@ -78,7 +78,7 @@ models: - dbt_utils.unique_combination_of_columns: combination_of_columns: [id_sh6] - not_null_proportion_multiple_columns: - at_least: 0.01 + at_least: 0.99 columns: - name: id_sh6 description: Identificador de 6 dígitos do Sistema Harmonizado (SH6)