Projeto ENV_INIT
Este projeto contém um script para a criação automática de uma estrutura de diretórios e arquivos pré-definidos para um ambiente de dados. Além disso, configura um notebook DuckDB para manipulação de dados.
Funcionalidades
- Cria uma estrutura de diretórios padronizada para o projeto, incluindo pastas para
src, utils, models, bucket (com níveis de bronze, silver e gold), entre outras.
- Cria arquivos
.gitkeep e __init__.py nos diretórios necessários para manter a estrutura de diretórios em sistemas de controle de versão.
- Gera um arquivo
.env com variáveis de ambiente, como credenciais do MySQL e caminho do banco de dados DuckDB.
- Configura o editor com preferências no arquivo
.vscode/settings.json.
- Como indicação, instale a extensão do VSCODE Material Icon Theme
EXTENSÃO VSCODE.
- Cria um notebook (
duckdb_local.ipynb) para interação com um banco de dados local DuckDB.
Como utilizar
1. Estrutura de diretórios
O script cria a seguinte estrutura de diretórios:
├── .vscode/
│ └── settings.json
├── src/
│ ├── init.py
│ ├── bucket/
│ │ ├── bronze/
│ │ │ └── .gitkeep
│ │ ├── silver/
│ │ │ └── .gitkeep
│ │ └── gold/
│ │ └── .gitkeep
│ ├── database/
│ │ └── .gitkeep
│ ├── utils/
│ └ └── init.py
├── .env
└── duckdb_local.ipynb
# Para modularização de pastas
__init__.py
# Funções em ./utils, breve descrição
def check_folder_exists(path_check: str) -> str: ... # criar pasta se nao existe
def handle_conect_db(_mysql_db_name: str) -> create_engine: ... # conexao com mysql/mariadb( lib: sqlalchemy )
def handle_strip_string_md5(str1_in: str) -> str: ... # remove objetos não visiveis no texto, e cria saida em formato md5
def handle_normalize_strings(in_string: str) -> str: ... # normaliza cabecalhos de dataframe, padrao, snake_case e remove caracteres especiais
def handle_parse_dt(value, tipo_tz="America/Sao_Paulo"): ... # padroniza datas no formato padrao: YYYY-MM-DD HH:MM:SS
def handle_headers_comparation(_header_list: List[str], _header_original: List[str]) -> List[str]: ... # compara e adcionando colunas faltantes ao dataset original
def handle_ymonth(_dt: datetime) -> int: ... # cria formato YYYYMM ( ANOMES )
def parse_xml_records(xml_path: Path, record_tag: str) -> pd.DataFrame: ... # conversão de arquivo xml para pandas dataframe com record_tag especifico
def save_to_parquet(df: pd.DataFrame, out_path: str) -> None: ... # convert pandas dataframe em .parquet
def connect_to_mysql(_db_name: str, _dict_env: Dict | None = dict_env_default) -> mysql.connector: ... # conexao com mysql/mariadb( lib: mysql.connector )
def load_data_to_mysql(_file_path: str, _table_name: str, _columns_default: list[str] | None) -> str: ... # cria padrão para load data infile
def handle_mysql_local_delete(_db_destino: str, _table_name: str, _name_col_delete: str = '', _period: int = 0, _dict_credentials= Dict ) -> str: ... # delete ou trunca tabela
def handle_update_csv_to_mysql(_db_destino: str, _table_name: str, _load_data_sql: str, _dict_credentials= Dict) -> str: ... # realiza o load data infile
def handle_load_csv_to_mysql(_file_path: str, _table_name: str, _db_destino: str, _dict_credentials: Dict, _columns_default= list[str] ) -> str: ... # encapsula 2 funções[ load_data_to_mysql, handle_update_csv_to_mysql ]
2. Variáveis de ambiente
Um arquivo .env é gerado automaticamente com as seguintes variáveis:
PATH_ROOT=./src
PATH_BUCKET=./src/bucket
PATH_EXTENSIONS=./src/extensions
ENV_BRONZE=./src/bucket/bronze
ENV_SILVER=./src/bucket/silver
ENV_GOLD=./src/bucket/gold
MYSQL_USER=usuario
MYSQL_PASS=password
MYSQL_HOST=localhost
MYSQL_PORT=3306
DUCKDB_DATABASE=./src/database/db_local.duckdb
Você pode ajustar as variáveis de acordo com seu ambiente.
3. Arquivo de configuração do VSCode
O arquivo .vscode/settings.json é gerado com as seguintes configurações:
- Salvamento automático após 50 segundos de inatividade.
- Preferências de tema, ícones e fonte.
- Configurações de exclusão de arquivos temporários como
.pyc e __pycache__.
4. Notebook DuckDB
O script também cria um notebook duckdb_local.ipynb, que inicia uma conexão com o banco de dados DuckDB e permite a execução de queries em arquivos .parquet.
Como executar o script
-
Clone este repositório.
-
Crie um ambiente virtual.
# linux
./pasta_do_projeto:~$ python -m venv .venv
# Windows
C:\pasta_do_projeto> python -m venv .venv
-
Ative o ambiente
# linux
./pasta_do_projeto:~$ source .venv/bin/activate
# Windows
./pasta_do_projeto:~$ . .venv/scripts/activate.ps1
-
Instale as dependências (caso necessário):
pip install -r requirements.txt
LIBs
- ipykernel ( conexão de notebooks com kernel python )
- nbformat ( manipular notebook )
- openpyxl ( manipular excel )
- magic_duckdb ( para queries amigaveis em duckdb )
- mysql-connector ( para conexão com mysql/mariaDb )
- numpy ( para funções matemáticas )
- sqlalchemy ( para conexão com diversos bancos de dados como mysql, postgresql, sql server, etc... )
- python-decouple ( para setar variaveis de ambiente )
- pandas ( manipulação de dados )
- pyarrow ( para estrutura parquet )
- duckdb ( criação de banco de dados local, e manipulação de dados até 50gb )
- pyyaml ( leitura de arquivos .yaml)
- xlsxwriter ( manipulação de excel)
- openpyxl ( propriedade para manipulação de excel)
-
Execute o script Python:
# Isso criará a estrutura de pastas, arquivos e o notebook( ``inicial`` ).
python start.py
-
Magic DuckDB ( Adcional )
- Extenção para manipulação de sql utilizando a expressão %%dql no inicio da celula do notebook
- Utilizamos no próprio banco local com a flag
%%dql -co -con
-co para conexão em variavel de conexão ao banco de dados.
con nossa variavel de conexão ao banco de dados local.
%%dql -co con
select
a.database_name
, a.table_name
, a.estimated_size
, a.column_count
, a.index_count
from duckdb_tables() a
-
Extensões para Duckdb ( Adcional )
- baixe conforme sua versão, neste projeto v1.4.3
# baixe o zip no site abaixo
http://extensions.duckdb.org/v1.4.3/windows_amd64/spatial.duckdb_extension.gz
# Ou Instale diretamente com o comando abaixo, direto da celula do notebook
con.execute('INSTALL spatial')
con.execute('LOAD spatial')
Requisitos
- Python 3.10+
- Pacotes: nbformat, openpyxl, magic_duckdb, sqlalchemy, decouple, pandas, duckdb, pyarrow, ipykernel
- versões no arquivo requirements.txt
Contribuição
Sinta-se à vontade para abrir um Pull Request ou sugerir melhorias para o projeto.
Para amantes de SQL, utilizar a extenxão Pretty SQL Alias ( para formatação dos scripts alinhados com seus ALIAS )
Licença
Este projeto está sob a licença MIT.