bacen-ifdata-scraper 0.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bacen_ifdata_scraper-0.0.2/LICENSE +21 -0
- bacen_ifdata_scraper-0.0.2/PKG-INFO +269 -0
- bacen_ifdata_scraper-0.0.2/README.md +205 -0
- bacen_ifdata_scraper-0.0.2/pyproject.toml +146 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/__init__.py +33 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/application.py +187 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_cleaner/__init__.py +0 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_cleaner/processing.py +160 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_loader/__init__.py +29 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_loader/controller.py +59 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_loader/storage.py +166 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/__init__.py +29 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/controller.py +193 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/interfaces/__init__.py +29 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/interfaces/controller.py +44 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/__init__.py +281 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/base_schema.py +141 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/__init__.py +58 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/assets.py +204 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/capital_information.py +192 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/income_statement.py +262 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/liabilities.py +221 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_geographic_region.py +191 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_indexer.py +243 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_individuals_type_maturity.py +399 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_legal_person_business_size.py +175 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_legal_person_economic_activity.py +473 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_legal_person_type_maturity.py +468 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_number_clients_operations.py +168 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_risk_level.py +173 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/summary.py +168 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/__init__.py +65 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_geographic_region.py +203 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_indexer.py +235 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_individuals_type_maturity.py +206 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_legal_person_business_size.py +198 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_legal_person_economic_activity.py +542 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_legal_person_type_maturity.py +476 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_number_clients_operations.py +182 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_risk_level.py +212 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/foreign_exchange/__init__.py +37 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/foreign_exchange/quarterly_foreign_currency_flow.py +222 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/__init__.py +58 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/assets.py +220 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/income_statement.py +278 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/liabilities.py +237 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/summary.py +175 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/interfaces.py +34 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/mapper.py +131 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/assets.py +182 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/capital_information.py +252 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/income_statement.py +195 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/liabilities.py +193 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_geographic_region.py +191 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_indexer.py +243 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_individuals_type_maturity.py +399 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_legal_person_business_size.py +175 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_legal_person_economic_activity.py +473 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_legal_person_type_maturity.py +468 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_number_clients_operations.py +168 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_risk_level.py +173 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/segmentation.py +183 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/summary.py +165 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformer_factory.py +53 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/__init__.py +29 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/base.py +165 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/financial_conglomerates.py +60 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/individual_institutions.py +61 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/interfaces/__init__.py +29 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/interfaces/dataframe_transformer.py +55 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/prudential_conglomerates.py +60 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/interfaces/__init__.py +25 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/interfaces/pipeline_manager.py +48 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/interfaces/session.py +58 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/__init__.py +0 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/cleaner.py +65 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/loader.py +77 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/scraper.py +95 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/transformer.py +108 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/manager.py +120 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/pipeline.py +132 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/__init__.py +0 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/exceptions.py +35 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/institutions.py +55 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/interfaces/__init__.py +25 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/interfaces/browser.py +83 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/interfaces/interacting.py +165 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/reports.py +125 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/session.py +164 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/storage/__init__.py +0 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/storage/processing.py +142 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/utils.py +185 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/__init__.py +0 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/clean.py +108 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/configurations.py +51 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/csv_loader.py +54 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/geographic_regions.py +68 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/humanize.py +76 -0
- bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/version.py +39 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 - 2026 [Alexsander Lopes Camargos]
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: bacen-ifdata-scraper
|
|
3
|
+
Version: 0.0.2
|
|
4
|
+
Summary: Um sistema ETL ponta a ponta para extrair, transformar e carregar relatórios financeiros do portal IF.data do Banco Central do Brasil.
|
|
5
|
+
Keywords: bacen,banco-central,banco-central-brasil,ifdata,if-data,web-scraping,scraper,automation,financial-data,banking-data,financial-reports,institucoes-financeiras,financial-institutions,financial-analysis,banking-analysis,etl,open-data,public-data,data-pipeline,data-processing,data-cleaning,csv-processing,data-extraction,data-transformation,data-automation,brazil,brasil,selenium,polars,duckdb
|
|
6
|
+
Author: Alexsander Lopes Camargos
|
|
7
|
+
Author-email: Alexsander Lopes Camargos <alcamargos@vivaldi.net>
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2023 - 2026 [Alexsander Lopes Camargos]
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
Classifier: Development Status :: 3 - Alpha
|
|
30
|
+
Classifier: Intended Audience :: Developers
|
|
31
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
32
|
+
Classifier: Intended Audience :: Science/Research
|
|
33
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Operating System :: OS Independent
|
|
36
|
+
Classifier: Programming Language :: Python :: 3
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
40
|
+
Classifier: Topic :: Database
|
|
41
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
|
|
42
|
+
Classifier: Topic :: Office/Business :: Financial
|
|
43
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
44
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
45
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
46
|
+
Classifier: Topic :: Text Processing
|
|
47
|
+
Classifier: Topic :: Utilities
|
|
48
|
+
Requires-Dist: selenium>=4.16.0,<5
|
|
49
|
+
Requires-Dist: loguru>=0.7.2,<0.8
|
|
50
|
+
Requires-Dist: pandas>=2.2.2,<3
|
|
51
|
+
Requires-Dist: pydantic>=2.9.2,<3
|
|
52
|
+
Requires-Dist: duckdb>=1.1.1,<2
|
|
53
|
+
Requires-Dist: polars>=1.32.2,<2
|
|
54
|
+
Requires-Dist: pyarrow>=21.0.0,<22
|
|
55
|
+
Requires-Dist: python-dotenv>=1.1.1,<2
|
|
56
|
+
Requires-Dist: fire>=0.7.0,<0.8
|
|
57
|
+
Requires-Dist: pandera>=0.26.0,<0.27
|
|
58
|
+
Requires-Dist: matplotlib>=3.10.8
|
|
59
|
+
Requires-Python: >=3.11
|
|
60
|
+
Project-URL: Homepage, https://github.com/alexcamargos/bacen-ifdata-scraper
|
|
61
|
+
Project-URL: Repository, https://github.com/alexcamargos/bacen-ifdata-scraper
|
|
62
|
+
Project-URL: Issues, https://github.com/alexcamargos/bacen-ifdata-scraper/issues
|
|
63
|
+
Description-Content-Type: text/markdown
|
|
64
|
+
|
|
65
|
+
# Bacen IF.data AutoScraper & Data Manager
|
|
66
|
+
|
|
67
|
+
[](https://www.linkedin.com/in/alexcamargos)
|
|
68
|
+
|
|
69
|
+
[](LICENSE)
|
|
70
|
+
|
|
71
|
+
*Um sistema ETL ponta a ponta para extrair, transformar e carregar relatórios financeiros do portal IF.data do Banco Central do Brasil.*
|
|
72
|
+
|
|
73
|
+
[](https://www.python.org/)
|
|
74
|
+
[](https://github.com/astral-sh/uv)
|
|
75
|
+
[](https://www.selenium.dev/)
|
|
76
|
+
[](https://pola.rs/)
|
|
77
|
+
[](https://duckdb.org/)
|
|
78
|
+
|
|
79
|
+
Este projeto automatiza a coleta, o processamento e a carga dos relatórios financeiros disponibilizados pelo Banco Central do Brasil através do portal IF.data. Diante do desafio de extrair dados valiosos de um formato de CSV não padronizado e de um processo de download manual, esta ferramenta utiliza **Selenium** para a automação da navegação e download, e scripts **Python** com **Polars** e **DuckDB** para a limpeza, transformação e estruturação dos dados.
|
|
80
|
+
|
|
81
|
+
O objetivo é transformar os dados brutos e inconsistentes do Bacen em um conjunto de dados limpo, organizado e pronto para análise, eliminando a necessidade de trabalho manual e garantindo a precisão das informações através de um pipeline ETL (Extract, Transform, Load) completo.
|
|
82
|
+
|
|
83
|
+
**Sumário**
|
|
84
|
+
|
|
85
|
+
- [Bacen IF.data AutoScraper \& Data Manager](#bacen-ifdata-autoscraper--data-manager)
|
|
86
|
+
- [Tecnologias Utilizadas](#tecnologias-utilizadas)
|
|
87
|
+
- [Funcionalidades Principais](#funcionalidades-principais)
|
|
88
|
+
- [Demonstração de Execução](#demonstração-de-execução)
|
|
89
|
+
- [Motivação](#motivação)
|
|
90
|
+
- [O Portal IF.Data](#o-portal-ifdata)
|
|
91
|
+
- [O Banco Central do Brasil](#o-banco-central-do-brasil)
|
|
92
|
+
- [Objetivo Geral](#objetivo-geral)
|
|
93
|
+
- [Instalação](#instalação)
|
|
94
|
+
- [Uso do Pipeline](#uso-do-pipeline)
|
|
95
|
+
- [Extração (Scraping)](#extração-scraping)
|
|
96
|
+
- [Limpeza (Cleaning)](#limpeza-cleaning)
|
|
97
|
+
- [Transformação (Transforming)](#transformação-transforming)
|
|
98
|
+
- [Carga (Loading)](#carga-loading)
|
|
99
|
+
- [Execução Padrão](#execução-padrão)
|
|
100
|
+
- [Arquitetura do Sistema](#arquitetura-do-sistema)
|
|
101
|
+
- [Desafios e Aprendizados](#desafios-e-aprendizados)
|
|
102
|
+
- [Autor](#autor)
|
|
103
|
+
- [Licença](#licença)
|
|
104
|
+
|
|
105
|
+
## Tecnologias Utilizadas
|
|
106
|
+
|
|
107
|
+
- **Linguagem Principal:** Python
|
|
108
|
+
- **Gerenciador de Dependências e Build:** uv
|
|
109
|
+
- **Automação Web (Scraping):** Selenium
|
|
110
|
+
- **Manipulação de Dados:** Polars
|
|
111
|
+
- **Banco de Dados Analítico:** DuckDB
|
|
112
|
+
- **Validação de Dados:** Pydantic, Pandera
|
|
113
|
+
- **CLI:** Fire
|
|
114
|
+
- **Web Driver:** GeckoDriver (para Firefox)
|
|
115
|
+
|
|
116
|
+
## Funcionalidades Principais
|
|
117
|
+
|
|
118
|
+
- [x] **Extração (Extract):** Realiza o download automático de todos os relatórios CSV do portal IF.data para um determinado período.
|
|
119
|
+
- [x] **Limpeza (Clean):** Corrige arquivos CSV com formatação não-padrão, removendo cabeçalhos e informações consolidadas indesejadas.
|
|
120
|
+
- [x] **Transformação (Transform):** Estrutura os dados limpos, aplicando schemas e transformações para prepará-los para análise.
|
|
121
|
+
- [x] **Carga (Load):** Carrega os dados transformados em um banco de dados DuckDB para consulta e análise eficientes.
|
|
122
|
+
- [x] **Setup Simplificado:** Suporte para instalação de dependências e execução com uv.
|
|
123
|
+
- [x] **Relatório de Execução:** Gera um relatório ao final da execução do scraper com o total de arquivos baixados e o tempo de execução.
|
|
124
|
+
|
|
125
|
+
## Demonstração de Execução
|
|
126
|
+
|
|
127
|
+
Veja o pipeline de automação em ação.
|
|
128
|
+
|
|
129
|
+

|
|
130
|
+
|
|
131
|
+

|
|
132
|
+
|
|
133
|
+
<!-- Project details -->
|
|
134
|
+
<details>
|
|
135
|
+
|
|
136
|
+
<summary>Clique para saber mais sobre o contexto do projeto</summary>
|
|
137
|
+
|
|
138
|
+
## Motivação
|
|
139
|
+
|
|
140
|
+
Embora o Bacen disponibilize dados para o público em geral, com o objetivo de atender ao disposto na Lei 12.527 de 2011 (popularmente conhecida como Lei de Acesso à Informação), a forma como esses dados são apresentados exige a aplicação de métodos especializados para sua interpretação. É necessário empregar uma série de procedimentos e técnicas para extrair informações mais sofisticadas desses dados. A utilização de algoritmos e técnicas de tratamento e mineração de dados é fundamental nesse contexto. Essas abordagens permitem a extração de insights mais complexos dos dados fornecidos pelo Bacen, facilitando análises mais profundas e detalhadas sobre o sistema financeiro brasileiro.
|
|
141
|
+
|
|
142
|
+
## O Portal IF.Data
|
|
143
|
+
|
|
144
|
+
O Portal IF.Data, criado pelo Banco Central do Brasil (Bacen), atende às exigências da Lei de Acesso à Informação ([Lei 12.527 de 2011](https://www.planalto.gov.br/ccivil_03/_ato2011-2014/2011/lei/l12527.htm)). Essa legislação obriga o poder público a publicar informações na internet de maneira acessível e em formatos compatíveis com processamento automatizado. O portal se caracteriza por ser interativo, armazenando e disponibilizando uma série de relatórios sobre instituições financeiras. Estes relatórios, que são atualizados trimestralmente, incluem dados abertos e podem ser visualizados online ou baixados em formato .csv.
|
|
145
|
+
|
|
146
|
+
No Portal IF.Data, é possível encontrar dados relacionados a contabilidade e capital, crédito, câmbio e segmentação das instituições financeiras. O portal abrange dados desde o ano 2000, e também oferece acesso a informações anteriores, de 1994 a 2000, embora em formatos diferentes. Para acessar os dados, o usuário pode selecionar no portal o trimestre de interesse, o tipo de instituição financeira e o relatório desejado.
|
|
147
|
+
|
|
148
|
+
## O Banco Central do Brasil
|
|
149
|
+
|
|
150
|
+
O Banco Central do Brasil, frequentemente referido como Bacen, é a autoridade monetária principal do Brasil e desempenha um papel crucial na economia do país. Sua principal função é garantir a estabilidade do poder de compra da moeda nacional, o Real, e manter um sistema financeiro sólido e eficiente. Para isso, o Bacen regula a quantidade de dinheiro em circulação, administra as reservas internacionais do país, e atua como um regulador e supervisor do sistema financeiro, controlando e fiscalizando as instituições financeiras. Além disso, é responsável pela formulação e execução da política monetária, buscando controlar a inflação e influenciar as atividades econômicas. Como parte de suas funções, o Bacen também coleta e divulga dados econômicos e financeiros importantes, como os disponibilizados no Portal IF.Data, para garantir transparência e acesso à informação para o público em geral e para instituições financeiras.
|
|
151
|
+
|
|
152
|
+
## Objetivo Geral
|
|
153
|
+
|
|
154
|
+
Este projeto visa aprimorar a coleta e o processamento de dados através da automação de atividades em navegadores web, utilizando a biblioteca [Selenium](https://www.selenium.dev). Selenium é uma ferramenta poderosa para a automação de browsers, permitindo a extração eficiente de dados de diversas fontes online. Após a coleta, o projeto focará no agrupamento e tratamento desses dados, organizando-os de maneira sistemática e coerente.
|
|
155
|
+
|
|
156
|
+
Essa abordagem não só economiza tempo e recursos, eliminando a necessidade de coleta manual de dados, mas também aumenta a precisão e a confiabilidade das informações obtidas. A fase de tratamento dos dados é crucial, pois envolve limpeza, normalização e consolidação de informações de múltiplas fontes, preparando-as para análises mais aprofundadas.
|
|
157
|
+
|
|
158
|
+
O resultado final será um conjunto de dados estruturado e de fácil acesso, proporcionando uma base sólida para análises futuras. Este conjunto de dados permitirá aos analistas e pesquisadores extrair insights valiosos e realizar avaliações detalhadas em seus respectivos campos de estudo ou indústrias. Além disso, o uso de automação e tratamento avançado de dados representa um passo importante na direção da modernização e eficiência dos processos de coleta e análise de dados.
|
|
159
|
+
</details>
|
|
160
|
+
|
|
161
|
+
## Instalação
|
|
162
|
+
|
|
163
|
+
Primeiro, clone o repositório:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
git clone https://github.com/alexcamargos/bacen-ifdata-scraper.git
|
|
167
|
+
|
|
168
|
+
cd bacen-ifdata-scraper
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Para criar um ambiente virtual e instalar as dependências com `uv`:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Crie o ambiente virtual
|
|
175
|
+
uv venv
|
|
176
|
+
|
|
177
|
+
# Ative o ambiente (Linux/macOS)
|
|
178
|
+
source .venv/bin/activate
|
|
179
|
+
|
|
180
|
+
# Ou no Windows (PowerShell)
|
|
181
|
+
.venv\Scripts\Activate.ps1
|
|
182
|
+
|
|
183
|
+
# Sincronize o ambiente com as dependências
|
|
184
|
+
uv sync
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
> **Observação:** Antes de iniciar o processo de captura, certifique-se de que o [GeckoDriver](https://github.com/mozilla/geckodriver/releases) (para Firefox) esteja devidamente instalado e configurado no `PATH` do seu sistema.
|
|
188
|
+
|
|
189
|
+
## Uso do Pipeline
|
|
190
|
+
|
|
191
|
+
O `ifdata.py` é a interface de linha de comando para controlar o pipeline ETL.
|
|
192
|
+
|
|
193
|
+
### Extração (Scraping)
|
|
194
|
+
|
|
195
|
+
Para baixar os relatórios do portal IF.data, use a flag `-s` ou `--scraper`. O script irá navegar pelo portal, selecionar as instituições e relatórios, e baixar os arquivos CSV.
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
uv run ifdata.py -s
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
O script exibirá em tempo real quais arquivos estão sendo baixados. Ao final, um relatório detalhará o número total de arquivos baixados e o tempo de execução.
|
|
202
|
+
|
|
203
|
+
### Limpeza (Cleaning)
|
|
204
|
+
|
|
205
|
+
Os arquivos CSV baixados do Bacen não seguem um padrão consistente, contendo múltiplos cabeçalhos e linhas de resumo. A etapa de limpeza corrige essas inconsistências. Use a flag `-c` ou `--cleaner`.
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
uv run ifdata.py -c
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Transformação (Transforming)
|
|
212
|
+
|
|
213
|
+
Após a limpeza, os dados são transformados para um formato estruturado e analítico, aplicando schemas e preparando-os para serem carregados. Use a flag `-t` ou `--transformer`.
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
uv run ifdata.py -t
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Carga (Loading)
|
|
220
|
+
|
|
221
|
+
Finalmente, os dados transformados são carregados em um banco de dados DuckDB para fácil consulta e análise. Use a flag `-l` ou `--loader`.
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
uv run ifdata.py -l
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Execução Padrão
|
|
228
|
+
|
|
229
|
+
Se nenhum argumento for fornecido, o pipeline executará as etapas de limpeza e transformação por padrão:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
uv run ifdata.py
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Arquitetura do Sistema
|
|
236
|
+
|
|
237
|
+
Para informações detalhadas sobre a arquitetura do projeto, padrões de design utilizados, estrutura de diretórios e guia de contribuição, consulte a [documentação de arquitetura](docs/ARCHITECTURE.md).
|
|
238
|
+
|
|
239
|
+
## Desafios e Aprendizados
|
|
240
|
+
|
|
241
|
+
- **Desafio: Construção de um Pipeline de Dados de Ponta a Ponta**
|
|
242
|
+
- **Problema:** As informações financeiras do Bacen, apesar de públicas, não são disponibilizadas através de uma API. Elas estão "presas" em um portal web que exige navegação manual e os arquivos para download estão em um formato inconsistente e "sujo". Para realizar qualquer análise séria e replicável, era necessário um sistema que superasse essas barreiras.
|
|
243
|
+
- **Solução:** Projetei e implementei um pipeline de dados em quatro etapas (ETL):
|
|
244
|
+
1. **Extração (Extract):** Um scraper automatizado com Selenium que simula a interação humana com o portal IF.data, navegando pelos menus e realizando o download sistemático de todos os relatórios necessários.
|
|
245
|
+
2. **Limpeza (Clean):** Um módulo de pré-processamento que recebe os arquivos brutos e corrige a formatação não-padrão.
|
|
246
|
+
3. **Transformação (Transform):** Um módulo que estrutura os dados limpos usando **Polars**, aplicando schemas de dados com **Pydantic** para garantir a consistência e o formato correto para análise.
|
|
247
|
+
4. **Carga (Load):** Um módulo que carrega os dados transformados em um banco de dados **DuckDB**, criando tabelas otimizadas para consultas analíticas rápidas.
|
|
248
|
+
- **Aprendizado:** Este projeto foi um exercício prático completo de **Engenharia de Dados (ETL - Extract, Transform, Load)**. Aprendi a decompor um problema complexo em etapas lógicas, selecionar as ferramentas adequadas para cada fase (Selenium, Polars, DuckDB) e a construir um fluxo de trabalho automatizado e confiável. O resultado final não é apenas um conjunto de dados, mas um **sistema replicável que transforma uma fonte de dados manual e não confiável em um ativo de informação pronto para análise**.
|
|
249
|
+
|
|
250
|
+
- **Desafio: Parsing de CSVs Não-Padronizados**
|
|
251
|
+
- **Problema:** Os arquivos CSV disponibilizados pelo Bacen não seguem o padrão convencional. Eles incluem múltiplos cabeçalhos, linhas de resumo e agrupamentos de dados dentro do mesmo arquivo, tornando a importação direta com bibliotecas padrão inviável.
|
|
252
|
+
- **Solução:** Desenvolvi um script de processamento em Python que lê cada arquivo linha por linha. Utilizando lógica condicional, o script identifica e ignora os cabeçalhos secundários e as linhas de resumo. Ele localiza o cabeçalho principal correto e extrai apenas as linhas de dados pertencentes às instituições financeiras, reescrevendo um novo arquivo CSV limpo e bem formatado.
|
|
253
|
+
- **Aprendizado:** Este desafio aprofundou minhas habilidades em manipulação de arquivos e parsing de texto em baixo nível. Aprendi a importância de não confiar cegamente em formatos de arquivo e a desenvolver soluções robustas para lidar com dados sujos e inconsistentes, uma habilidade fundamental em qualquer projeto de engenharia ou ciência de dados.
|
|
254
|
+
|
|
255
|
+
## Autor
|
|
256
|
+
|
|
257
|
+
**Alexsander Lopes Camargos**
|
|
258
|
+
|
|
259
|
+
Engenheiro de dados e inteligência artificial focado em soluções de alta performance para o mercado financeiro.
|
|
260
|
+
Este projeto reflete meu interesse em automação de processos, engenharia de dados e análise financeira.
|
|
261
|
+
|
|
262
|
+
Fique à vontade para entrar em contato para discussões técnicas, sugestões ou oportunidades:
|
|
263
|
+
|
|
264
|
+
[](https://www.linkedin.com/in/alexcamargos/)
|
|
265
|
+
[](mailto:alcamargos@vivaldi.net)
|
|
266
|
+
|
|
267
|
+
## Licença
|
|
268
|
+
|
|
269
|
+
Este projeto está sob a licença [MIT](LICENSE).
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Bacen IF.data AutoScraper & Data Manager
|
|
2
|
+
|
|
3
|
+
[](https://www.linkedin.com/in/alexcamargos)
|
|
4
|
+
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
*Um sistema ETL ponta a ponta para extrair, transformar e carregar relatórios financeiros do portal IF.data do Banco Central do Brasil.*
|
|
8
|
+
|
|
9
|
+
[](https://www.python.org/)
|
|
10
|
+
[](https://github.com/astral-sh/uv)
|
|
11
|
+
[](https://www.selenium.dev/)
|
|
12
|
+
[](https://pola.rs/)
|
|
13
|
+
[](https://duckdb.org/)
|
|
14
|
+
|
|
15
|
+
Este projeto automatiza a coleta, o processamento e a carga dos relatórios financeiros disponibilizados pelo Banco Central do Brasil através do portal IF.data. Diante do desafio de extrair dados valiosos de um formato de CSV não padronizado e de um processo de download manual, esta ferramenta utiliza **Selenium** para a automação da navegação e download, e scripts **Python** com **Polars** e **DuckDB** para a limpeza, transformação e estruturação dos dados.
|
|
16
|
+
|
|
17
|
+
O objetivo é transformar os dados brutos e inconsistentes do Bacen em um conjunto de dados limpo, organizado e pronto para análise, eliminando a necessidade de trabalho manual e garantindo a precisão das informações através de um pipeline ETL (Extract, Transform, Load) completo.
|
|
18
|
+
|
|
19
|
+
**Sumário**
|
|
20
|
+
|
|
21
|
+
- [Bacen IF.data AutoScraper \& Data Manager](#bacen-ifdata-autoscraper--data-manager)
|
|
22
|
+
- [Tecnologias Utilizadas](#tecnologias-utilizadas)
|
|
23
|
+
- [Funcionalidades Principais](#funcionalidades-principais)
|
|
24
|
+
- [Demonstração de Execução](#demonstração-de-execução)
|
|
25
|
+
- [Motivação](#motivação)
|
|
26
|
+
- [O Portal IF.Data](#o-portal-ifdata)
|
|
27
|
+
- [O Banco Central do Brasil](#o-banco-central-do-brasil)
|
|
28
|
+
- [Objetivo Geral](#objetivo-geral)
|
|
29
|
+
- [Instalação](#instalação)
|
|
30
|
+
- [Uso do Pipeline](#uso-do-pipeline)
|
|
31
|
+
- [Extração (Scraping)](#extração-scraping)
|
|
32
|
+
- [Limpeza (Cleaning)](#limpeza-cleaning)
|
|
33
|
+
- [Transformação (Transforming)](#transformação-transforming)
|
|
34
|
+
- [Carga (Loading)](#carga-loading)
|
|
35
|
+
- [Execução Padrão](#execução-padrão)
|
|
36
|
+
- [Arquitetura do Sistema](#arquitetura-do-sistema)
|
|
37
|
+
- [Desafios e Aprendizados](#desafios-e-aprendizados)
|
|
38
|
+
- [Autor](#autor)
|
|
39
|
+
- [Licença](#licença)
|
|
40
|
+
|
|
41
|
+
## Tecnologias Utilizadas
|
|
42
|
+
|
|
43
|
+
- **Linguagem Principal:** Python
|
|
44
|
+
- **Gerenciador de Dependências e Build:** uv
|
|
45
|
+
- **Automação Web (Scraping):** Selenium
|
|
46
|
+
- **Manipulação de Dados:** Polars
|
|
47
|
+
- **Banco de Dados Analítico:** DuckDB
|
|
48
|
+
- **Validação de Dados:** Pydantic, Pandera
|
|
49
|
+
- **CLI:** Fire
|
|
50
|
+
- **Web Driver:** GeckoDriver (para Firefox)
|
|
51
|
+
|
|
52
|
+
## Funcionalidades Principais
|
|
53
|
+
|
|
54
|
+
- [x] **Extração (Extract):** Realiza o download automático de todos os relatórios CSV do portal IF.data para um determinado período.
|
|
55
|
+
- [x] **Limpeza (Clean):** Corrige arquivos CSV com formatação não-padrão, removendo cabeçalhos e informações consolidadas indesejadas.
|
|
56
|
+
- [x] **Transformação (Transform):** Estrutura os dados limpos, aplicando schemas e transformações para prepará-los para análise.
|
|
57
|
+
- [x] **Carga (Load):** Carrega os dados transformados em um banco de dados DuckDB para consulta e análise eficientes.
|
|
58
|
+
- [x] **Setup Simplificado:** Suporte para instalação de dependências e execução com uv.
|
|
59
|
+
- [x] **Relatório de Execução:** Gera um relatório ao final da execução do scraper com o total de arquivos baixados e o tempo de execução.
|
|
60
|
+
|
|
61
|
+
## Demonstração de Execução
|
|
62
|
+
|
|
63
|
+
Veja o pipeline de automação em ação.
|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+

|
|
68
|
+
|
|
69
|
+
<!-- Project details -->
|
|
70
|
+
<details>
|
|
71
|
+
|
|
72
|
+
<summary>Clique para saber mais sobre o contexto do projeto</summary>
|
|
73
|
+
|
|
74
|
+
## Motivação
|
|
75
|
+
|
|
76
|
+
Embora o Bacen disponibilize dados para o público em geral, com o objetivo de atender ao disposto na Lei 12.527 de 2011 (popularmente conhecida como Lei de Acesso à Informação), a forma como esses dados são apresentados exige a aplicação de métodos especializados para sua interpretação. É necessário empregar uma série de procedimentos e técnicas para extrair informações mais sofisticadas desses dados. A utilização de algoritmos e técnicas de tratamento e mineração de dados é fundamental nesse contexto. Essas abordagens permitem a extração de insights mais complexos dos dados fornecidos pelo Bacen, facilitando análises mais profundas e detalhadas sobre o sistema financeiro brasileiro.
|
|
77
|
+
|
|
78
|
+
## O Portal IF.Data
|
|
79
|
+
|
|
80
|
+
O Portal IF.Data, criado pelo Banco Central do Brasil (Bacen), atende às exigências da Lei de Acesso à Informação ([Lei 12.527 de 2011](https://www.planalto.gov.br/ccivil_03/_ato2011-2014/2011/lei/l12527.htm)). Essa legislação obriga o poder público a publicar informações na internet de maneira acessível e em formatos compatíveis com processamento automatizado. O portal se caracteriza por ser interativo, armazenando e disponibilizando uma série de relatórios sobre instituições financeiras. Estes relatórios, que são atualizados trimestralmente, incluem dados abertos e podem ser visualizados online ou baixados em formato .csv.
|
|
81
|
+
|
|
82
|
+
No Portal IF.Data, é possível encontrar dados relacionados a contabilidade e capital, crédito, câmbio e segmentação das instituições financeiras. O portal abrange dados desde o ano 2000, e também oferece acesso a informações anteriores, de 1994 a 2000, embora em formatos diferentes. Para acessar os dados, o usuário pode selecionar no portal o trimestre de interesse, o tipo de instituição financeira e o relatório desejado.
|
|
83
|
+
|
|
84
|
+
## O Banco Central do Brasil
|
|
85
|
+
|
|
86
|
+
O Banco Central do Brasil, frequentemente referido como Bacen, é a autoridade monetária principal do Brasil e desempenha um papel crucial na economia do país. Sua principal função é garantir a estabilidade do poder de compra da moeda nacional, o Real, e manter um sistema financeiro sólido e eficiente. Para isso, o Bacen regula a quantidade de dinheiro em circulação, administra as reservas internacionais do país, e atua como um regulador e supervisor do sistema financeiro, controlando e fiscalizando as instituições financeiras. Além disso, é responsável pela formulação e execução da política monetária, buscando controlar a inflação e influenciar as atividades econômicas. Como parte de suas funções, o Bacen também coleta e divulga dados econômicos e financeiros importantes, como os disponibilizados no Portal IF.Data, para garantir transparência e acesso à informação para o público em geral e para instituições financeiras.
|
|
87
|
+
|
|
88
|
+
## Objetivo Geral
|
|
89
|
+
|
|
90
|
+
Este projeto visa aprimorar a coleta e o processamento de dados através da automação de atividades em navegadores web, utilizando a biblioteca [Selenium](https://www.selenium.dev). Selenium é uma ferramenta poderosa para a automação de browsers, permitindo a extração eficiente de dados de diversas fontes online. Após a coleta, o projeto focará no agrupamento e tratamento desses dados, organizando-os de maneira sistemática e coerente.
|
|
91
|
+
|
|
92
|
+
Essa abordagem não só economiza tempo e recursos, eliminando a necessidade de coleta manual de dados, mas também aumenta a precisão e a confiabilidade das informações obtidas. A fase de tratamento dos dados é crucial, pois envolve limpeza, normalização e consolidação de informações de múltiplas fontes, preparando-as para análises mais aprofundadas.
|
|
93
|
+
|
|
94
|
+
O resultado final será um conjunto de dados estruturado e de fácil acesso, proporcionando uma base sólida para análises futuras. Este conjunto de dados permitirá aos analistas e pesquisadores extrair insights valiosos e realizar avaliações detalhadas em seus respectivos campos de estudo ou indústrias. Além disso, o uso de automação e tratamento avançado de dados representa um passo importante na direção da modernização e eficiência dos processos de coleta e análise de dados.
|
|
95
|
+
</details>
|
|
96
|
+
|
|
97
|
+
## Instalação
|
|
98
|
+
|
|
99
|
+
Primeiro, clone o repositório:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git clone https://github.com/alexcamargos/bacen-ifdata-scraper.git
|
|
103
|
+
|
|
104
|
+
cd bacen-ifdata-scraper
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Para criar um ambiente virtual e instalar as dependências com `uv`:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Crie o ambiente virtual
|
|
111
|
+
uv venv
|
|
112
|
+
|
|
113
|
+
# Ative o ambiente (Linux/macOS)
|
|
114
|
+
source .venv/bin/activate
|
|
115
|
+
|
|
116
|
+
# Ou no Windows (PowerShell)
|
|
117
|
+
.venv\Scripts\Activate.ps1
|
|
118
|
+
|
|
119
|
+
# Sincronize o ambiente com as dependências
|
|
120
|
+
uv sync
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
> **Observação:** Antes de iniciar o processo de captura, certifique-se de que o [GeckoDriver](https://github.com/mozilla/geckodriver/releases) (para Firefox) esteja devidamente instalado e configurado no `PATH` do seu sistema.
|
|
124
|
+
|
|
125
|
+
## Uso do Pipeline
|
|
126
|
+
|
|
127
|
+
O `ifdata.py` é a interface de linha de comando para controlar o pipeline ETL.
|
|
128
|
+
|
|
129
|
+
### Extração (Scraping)
|
|
130
|
+
|
|
131
|
+
Para baixar os relatórios do portal IF.data, use a flag `-s` ou `--scraper`. O script irá navegar pelo portal, selecionar as instituições e relatórios, e baixar os arquivos CSV.
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
uv run ifdata.py -s
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
O script exibirá em tempo real quais arquivos estão sendo baixados. Ao final, um relatório detalhará o número total de arquivos baixados e o tempo de execução.
|
|
138
|
+
|
|
139
|
+
### Limpeza (Cleaning)
|
|
140
|
+
|
|
141
|
+
Os arquivos CSV baixados do Bacen não seguem um padrão consistente, contendo múltiplos cabeçalhos e linhas de resumo. A etapa de limpeza corrige essas inconsistências. Use a flag `-c` ou `--cleaner`.
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
uv run ifdata.py -c
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Transformação (Transforming)
|
|
148
|
+
|
|
149
|
+
Após a limpeza, os dados são transformados para um formato estruturado e analítico, aplicando schemas e preparando-os para serem carregados. Use a flag `-t` ou `--transformer`.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
uv run ifdata.py -t
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Carga (Loading)
|
|
156
|
+
|
|
157
|
+
Finalmente, os dados transformados são carregados em um banco de dados DuckDB para fácil consulta e análise. Use a flag `-l` ou `--loader`.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
uv run ifdata.py -l
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Execução Padrão
|
|
164
|
+
|
|
165
|
+
Se nenhum argumento for fornecido, o pipeline executará as etapas de limpeza e transformação por padrão:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
uv run ifdata.py
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Arquitetura do Sistema
|
|
172
|
+
|
|
173
|
+
Para informações detalhadas sobre a arquitetura do projeto, padrões de design utilizados, estrutura de diretórios e guia de contribuição, consulte a [documentação de arquitetura](docs/ARCHITECTURE.md).
|
|
174
|
+
|
|
175
|
+
## Desafios e Aprendizados
|
|
176
|
+
|
|
177
|
+
- **Desafio: Construção de um Pipeline de Dados de Ponta a Ponta**
|
|
178
|
+
- **Problema:** As informações financeiras do Bacen, apesar de públicas, não são disponibilizadas através de uma API. Elas estão "presas" em um portal web que exige navegação manual e os arquivos para download estão em um formato inconsistente e "sujo". Para realizar qualquer análise séria e replicável, era necessário um sistema que superasse essas barreiras.
|
|
179
|
+
- **Solução:** Projetei e implementei um pipeline de dados em quatro etapas (ETL):
|
|
180
|
+
1. **Extração (Extract):** Um scraper automatizado com Selenium que simula a interação humana com o portal IF.data, navegando pelos menus e realizando o download sistemático de todos os relatórios necessários.
|
|
181
|
+
2. **Limpeza (Clean):** Um módulo de pré-processamento que recebe os arquivos brutos e corrige a formatação não-padrão.
|
|
182
|
+
3. **Transformação (Transform):** Um módulo que estrutura os dados limpos usando **Polars**, aplicando schemas de dados com **Pydantic** para garantir a consistência e o formato correto para análise.
|
|
183
|
+
4. **Carga (Load):** Um módulo que carrega os dados transformados em um banco de dados **DuckDB**, criando tabelas otimizadas para consultas analíticas rápidas.
|
|
184
|
+
- **Aprendizado:** Este projeto foi um exercício prático completo de **Engenharia de Dados (ETL - Extract, Transform, Load)**. Aprendi a decompor um problema complexo em etapas lógicas, selecionar as ferramentas adequadas para cada fase (Selenium, Polars, DuckDB) e a construir um fluxo de trabalho automatizado e confiável. O resultado final não é apenas um conjunto de dados, mas um **sistema replicável que transforma uma fonte de dados manual e não confiável em um ativo de informação pronto para análise**.
|
|
185
|
+
|
|
186
|
+
- **Desafio: Parsing de CSVs Não-Padronizados**
|
|
187
|
+
- **Problema:** Os arquivos CSV disponibilizados pelo Bacen não seguem o padrão convencional. Eles incluem múltiplos cabeçalhos, linhas de resumo e agrupamentos de dados dentro do mesmo arquivo, tornando a importação direta com bibliotecas padrão inviável.
|
|
188
|
+
- **Solução:** Desenvolvi um script de processamento em Python que lê cada arquivo linha por linha. Utilizando lógica condicional, o script identifica e ignora os cabeçalhos secundários e as linhas de resumo. Ele localiza o cabeçalho principal correto e extrai apenas as linhas de dados pertencentes às instituições financeiras, reescrevendo um novo arquivo CSV limpo e bem formatado.
|
|
189
|
+
- **Aprendizado:** Este desafio aprofundou minhas habilidades em manipulação de arquivos e parsing de texto em baixo nível. Aprendi a importância de não confiar cegamente em formatos de arquivo e a desenvolver soluções robustas para lidar com dados sujos e inconsistentes, uma habilidade fundamental em qualquer projeto de engenharia ou ciência de dados.
|
|
190
|
+
|
|
191
|
+
## Autor
|
|
192
|
+
|
|
193
|
+
**Alexsander Lopes Camargos**
|
|
194
|
+
|
|
195
|
+
Engenheiro de dados e inteligência artificial focado em soluções de alta performance para o mercado financeiro.
|
|
196
|
+
Este projeto reflete meu interesse em automação de processos, engenharia de dados e análise financeira.
|
|
197
|
+
|
|
198
|
+
Fique à vontade para entrar em contato para discussões técnicas, sugestões ou oportunidades:
|
|
199
|
+
|
|
200
|
+
[](https://www.linkedin.com/in/alexcamargos/)
|
|
201
|
+
[](mailto:alcamargos@vivaldi.net)
|
|
202
|
+
|
|
203
|
+
## Licença
|
|
204
|
+
|
|
205
|
+
Este projeto está sob a licença [MIT](LICENSE).
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "bacen-ifdata-scraper"
|
|
3
|
+
version = "0.0.2"
|
|
4
|
+
description = "Um sistema ETL ponta a ponta para extrair, transformar e carregar relatórios financeiros do portal IF.data do Banco Central do Brasil."
|
|
5
|
+
authors = [{ name = "Alexsander Lopes Camargos", email = "alcamargos@vivaldi.net" }]
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
requires-python = ">=3.11"
|
|
8
|
+
license = { file = "LICENSE" }
|
|
9
|
+
classifiers = [
|
|
10
|
+
"Development Status :: 3 - Alpha",
|
|
11
|
+
"Intended Audience :: Developers",
|
|
12
|
+
"Intended Audience :: Financial and Insurance Industry",
|
|
13
|
+
"Intended Audience :: Science/Research",
|
|
14
|
+
"Intended Audience :: End Users/Desktop",
|
|
15
|
+
"License :: OSI Approved :: MIT License",
|
|
16
|
+
"Operating System :: OS Independent",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Topic :: Database",
|
|
22
|
+
"Topic :: Internet :: WWW/HTTP :: Browsers",
|
|
23
|
+
"Topic :: Office/Business :: Financial",
|
|
24
|
+
"Topic :: Office/Business :: Financial :: Investment",
|
|
25
|
+
"Topic :: Scientific/Engineering :: Information Analysis",
|
|
26
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
27
|
+
"Topic :: Text Processing",
|
|
28
|
+
"Topic :: Utilities",
|
|
29
|
+
]
|
|
30
|
+
keywords = [
|
|
31
|
+
"bacen",
|
|
32
|
+
"banco-central",
|
|
33
|
+
"banco-central-brasil",
|
|
34
|
+
"ifdata",
|
|
35
|
+
"if-data",
|
|
36
|
+
"web-scraping",
|
|
37
|
+
"scraper",
|
|
38
|
+
"automation",
|
|
39
|
+
"financial-data",
|
|
40
|
+
"banking-data",
|
|
41
|
+
"financial-reports",
|
|
42
|
+
"institucoes-financeiras",
|
|
43
|
+
"financial-institutions",
|
|
44
|
+
"financial-analysis",
|
|
45
|
+
"banking-analysis",
|
|
46
|
+
"etl",
|
|
47
|
+
"open-data",
|
|
48
|
+
"public-data",
|
|
49
|
+
"data-pipeline",
|
|
50
|
+
"data-processing",
|
|
51
|
+
"data-cleaning",
|
|
52
|
+
"csv-processing",
|
|
53
|
+
"data-extraction",
|
|
54
|
+
"data-transformation",
|
|
55
|
+
"data-automation",
|
|
56
|
+
"brazil",
|
|
57
|
+
"brasil",
|
|
58
|
+
"selenium",
|
|
59
|
+
"polars",
|
|
60
|
+
"duckdb",
|
|
61
|
+
]
|
|
62
|
+
dependencies = [
|
|
63
|
+
"selenium>=4.16.0,<5",
|
|
64
|
+
"loguru>=0.7.2,<0.8",
|
|
65
|
+
"pandas>=2.2.2,<3",
|
|
66
|
+
"pydantic>=2.9.2,<3",
|
|
67
|
+
"duckdb>=1.1.1,<2",
|
|
68
|
+
"polars>=1.32.2,<2",
|
|
69
|
+
"pyarrow>=21.0.0,<22",
|
|
70
|
+
"python-dotenv>=1.1.1,<2",
|
|
71
|
+
"fire>=0.7.0,<0.8",
|
|
72
|
+
"pandera>=0.26.0,<0.27",
|
|
73
|
+
"matplotlib>=3.10.8",
|
|
74
|
+
]
|
|
75
|
+
[project.urls]
|
|
76
|
+
Homepage = "https://github.com/alexcamargos/bacen-ifdata-scraper"
|
|
77
|
+
Repository = "https://github.com/alexcamargos/bacen-ifdata-scraper"
|
|
78
|
+
Issues = "https://github.com/alexcamargos/bacen-ifdata-scraper/issues"
|
|
79
|
+
|
|
80
|
+
[dependency-groups]
|
|
81
|
+
dev = [
|
|
82
|
+
"black",
|
|
83
|
+
"isort",
|
|
84
|
+
"pylint",
|
|
85
|
+
"pytest",
|
|
86
|
+
"pytest-cov",
|
|
87
|
+
"pytest-mock",
|
|
88
|
+
"ipykernel",
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
[build-system]
|
|
92
|
+
requires = ["uv_build>=0.9.18,<0.10.0"]
|
|
93
|
+
build-backend = "uv_build"
|
|
94
|
+
|
|
95
|
+
[tool.uv.build-backend]
|
|
96
|
+
module-root = "src"
|
|
97
|
+
module-name = "bacen_ifdata"
|
|
98
|
+
|
|
99
|
+
[tool.pytest.ini_options]
|
|
100
|
+
pythonpath = "src"
|
|
101
|
+
testpaths = ["tests"]
|
|
102
|
+
addopts = [
|
|
103
|
+
"--cov=bacen_ifdata",
|
|
104
|
+
"--cov-report=term-missing",
|
|
105
|
+
"--cov-report=html",
|
|
106
|
+
"--cov-report=xml",
|
|
107
|
+
"--strict-markers",
|
|
108
|
+
"--verbose",
|
|
109
|
+
]
|
|
110
|
+
markers = [
|
|
111
|
+
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
112
|
+
"integration: marks tests as integration tests",
|
|
113
|
+
"unit: marks tests as unit tests",
|
|
114
|
+
"transformation: marks tests as data transformation tests",
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
[tool.coverage.run]
|
|
118
|
+
source = ["bacen_ifdata"]
|
|
119
|
+
omit = [
|
|
120
|
+
"*/tests/*",
|
|
121
|
+
"*/__pycache__/*",
|
|
122
|
+
"*/mocks/*",
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
[tool.coverage.report]
|
|
126
|
+
exclude_lines = [
|
|
127
|
+
"pragma: no cover",
|
|
128
|
+
"def __repr__",
|
|
129
|
+
"raise AssertionError",
|
|
130
|
+
"raise NotImplementedError",
|
|
131
|
+
"if __name__ == .__main__.:",
|
|
132
|
+
"if TYPE_CHECKING:",
|
|
133
|
+
"class .*\\bProtocol\\):",
|
|
134
|
+
"@(abc\\.)?abstractmethod",
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
[tool.isort]
|
|
138
|
+
profile = "black"
|
|
139
|
+
line_length = 120
|
|
140
|
+
|
|
141
|
+
[tool.pylint.format]
|
|
142
|
+
max-line-length = 120
|
|
143
|
+
|
|
144
|
+
[tool.black]
|
|
145
|
+
line-length = 120
|
|
146
|
+
skip-string-normalization = true
|