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.
Files changed (99) hide show
  1. bacen_ifdata_scraper-0.0.2/LICENSE +21 -0
  2. bacen_ifdata_scraper-0.0.2/PKG-INFO +269 -0
  3. bacen_ifdata_scraper-0.0.2/README.md +205 -0
  4. bacen_ifdata_scraper-0.0.2/pyproject.toml +146 -0
  5. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/__init__.py +33 -0
  6. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/application.py +187 -0
  7. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_cleaner/__init__.py +0 -0
  8. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_cleaner/processing.py +160 -0
  9. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_loader/__init__.py +29 -0
  10. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_loader/controller.py +59 -0
  11. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_loader/storage.py +166 -0
  12. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/__init__.py +29 -0
  13. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/controller.py +193 -0
  14. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/interfaces/__init__.py +29 -0
  15. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/interfaces/controller.py +44 -0
  16. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/__init__.py +281 -0
  17. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/base_schema.py +141 -0
  18. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/__init__.py +58 -0
  19. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/assets.py +204 -0
  20. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/capital_information.py +192 -0
  21. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/income_statement.py +262 -0
  22. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/liabilities.py +221 -0
  23. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_geographic_region.py +191 -0
  24. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_indexer.py +243 -0
  25. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_individuals_type_maturity.py +399 -0
  26. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_legal_person_business_size.py +175 -0
  27. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_legal_person_economic_activity.py +473 -0
  28. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_legal_person_type_maturity.py +468 -0
  29. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_number_clients_operations.py +168 -0
  30. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/portfolio_risk_level.py +173 -0
  31. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates/summary.py +168 -0
  32. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/__init__.py +65 -0
  33. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_geographic_region.py +203 -0
  34. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_indexer.py +235 -0
  35. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_individuals_type_maturity.py +206 -0
  36. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_legal_person_business_size.py +198 -0
  37. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_legal_person_economic_activity.py +542 -0
  38. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_legal_person_type_maturity.py +476 -0
  39. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_number_clients_operations.py +182 -0
  40. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/financial_conglomerates_scr/portfolio_risk_level.py +212 -0
  41. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/foreign_exchange/__init__.py +37 -0
  42. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/foreign_exchange/quarterly_foreign_currency_flow.py +222 -0
  43. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/__init__.py +58 -0
  44. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/assets.py +220 -0
  45. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/income_statement.py +278 -0
  46. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/liabilities.py +237 -0
  47. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/individual_institutions/summary.py +175 -0
  48. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/interfaces.py +34 -0
  49. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/mapper.py +131 -0
  50. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/assets.py +182 -0
  51. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/capital_information.py +252 -0
  52. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/income_statement.py +195 -0
  53. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/liabilities.py +193 -0
  54. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_geographic_region.py +191 -0
  55. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_indexer.py +243 -0
  56. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_individuals_type_maturity.py +399 -0
  57. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_legal_person_business_size.py +175 -0
  58. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_legal_person_economic_activity.py +473 -0
  59. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_legal_person_type_maturity.py +468 -0
  60. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_number_clients_operations.py +168 -0
  61. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/portfolio_risk_level.py +173 -0
  62. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/segmentation.py +183 -0
  63. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/schemas/prudential_conglomerate/summary.py +165 -0
  64. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformer_factory.py +53 -0
  65. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/__init__.py +29 -0
  66. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/base.py +165 -0
  67. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/financial_conglomerates.py +60 -0
  68. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/individual_institutions.py +61 -0
  69. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/interfaces/__init__.py +29 -0
  70. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/interfaces/dataframe_transformer.py +55 -0
  71. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/data_transformer/transformers/prudential_conglomerates.py +60 -0
  72. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/interfaces/__init__.py +25 -0
  73. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/interfaces/pipeline_manager.py +48 -0
  74. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/interfaces/session.py +58 -0
  75. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/__init__.py +0 -0
  76. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/cleaner.py +65 -0
  77. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/loader.py +77 -0
  78. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/scraper.py +95 -0
  79. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/main/transformer.py +108 -0
  80. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/manager.py +120 -0
  81. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/pipeline.py +132 -0
  82. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/__init__.py +0 -0
  83. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/exceptions.py +35 -0
  84. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/institutions.py +55 -0
  85. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/interfaces/__init__.py +25 -0
  86. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/interfaces/browser.py +83 -0
  87. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/interfaces/interacting.py +165 -0
  88. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/reports.py +125 -0
  89. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/session.py +164 -0
  90. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/storage/__init__.py +0 -0
  91. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/storage/processing.py +142 -0
  92. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/scraper/utils.py +185 -0
  93. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/__init__.py +0 -0
  94. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/clean.py +108 -0
  95. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/configurations.py +51 -0
  96. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/csv_loader.py +54 -0
  97. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/geographic_regions.py +68 -0
  98. bacen_ifdata_scraper-0.0.2/src/bacen_ifdata/utilities/humanize.py +76 -0
  99. 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
+ [![LinkedIn](https://img.shields.io/badge/%40alexcamargos-230A66C2?style=social&logo=LinkedIn&label=LinkedIn&color=white)](https://www.linkedin.com/in/alexcamargos)
68
+
69
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](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
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://www.python.org/)
74
+ [![uv](https://img.shields.io/badge/uv-blue?style=for-the-badge&logo=bun&logoColor=white)](https://github.com/astral-sh/uv)
75
+ [![Selenium](https://img.shields.io/badge/Selenium-43B02A?style=for-the-badge&logo=selenium&logoColor=white)](https://www.selenium.dev/)
76
+ [![Polars](https://img.shields.io/badge/Polars-000000?style=for-the-badge&logo=polars&logoColor=white)](https://pola.rs/)
77
+ [![DuckDB](https://img.shields.io/badge/DuckDB-FFFFFF?style=for-the-badge&logo=duckdb&logoColor=black)](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
+ ![scraper running](assets/scraper_running.png)
130
+
131
+ ![Firefox Webdriver running](assets/scraper_webdriver.png)
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
+ [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/alexcamargos/)
265
+ [![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge&logo=gmail&logoColor=white)](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
+ [![LinkedIn](https://img.shields.io/badge/%40alexcamargos-230A66C2?style=social&logo=LinkedIn&label=LinkedIn&color=white)](https://www.linkedin.com/in/alexcamargos)
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](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
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://www.python.org/)
10
+ [![uv](https://img.shields.io/badge/uv-blue?style=for-the-badge&logo=bun&logoColor=white)](https://github.com/astral-sh/uv)
11
+ [![Selenium](https://img.shields.io/badge/Selenium-43B02A?style=for-the-badge&logo=selenium&logoColor=white)](https://www.selenium.dev/)
12
+ [![Polars](https://img.shields.io/badge/Polars-000000?style=for-the-badge&logo=polars&logoColor=white)](https://pola.rs/)
13
+ [![DuckDB](https://img.shields.io/badge/DuckDB-FFFFFF?style=for-the-badge&logo=duckdb&logoColor=black)](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
+ ![scraper running](assets/scraper_running.png)
66
+
67
+ ![Firefox Webdriver running](assets/scraper_webdriver.png)
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
+ [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/alexcamargos/)
201
+ [![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge&logo=gmail&logoColor=white)](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