/cnpj_dados_abertos

Primary LanguagePythonMIT LicenseMIT

cnpj-dados-abertos

Este projeto é impirado no projeto (https://github.com/rictom/cnpj-mysql), porém algumas melhorias foram implementadas agora apenas um script em python é responsável por baixar os arquivos de cnpj dos dados públicos da Receita Federal salvar em formato parquet que apresenta um ganho substâncial em questão de performance sobre um SGBD normal.
O código é compatível com o layout das tabelas disponibilizadas pela Receita Federal a partir de 2021.

Dados públicos de CNPJ no site da Receita:

Os arquivos csv zipados com os dados de CNPJs estão disponíveis em (http://200.152.38.155/CNPJ/).

Pré-requisitos:

Python 3.10;
O arquivo requirements.txt contém todas as dependências do projeto, para instalar utilize o código abaixo:

pip install -r requirements.txt

Utilizando o script:

O comando abaixo faz todo o trabalho:

python3 manipular_dados.py

Os seguintes passos serão executados pelo script:

  1. Os arquivos serão baixados do site da Receita Federal para a pasta dados-abertos-zip;
    1. Esta versão baixa apenas as tabelas que sofrem alteração regularmente (Empresa, Estabelecimento, Simples, Socio) e cada uma terá seus arquivos baixados e manipulados no momento em que for sendo trabalhada;
    2. Para as demais tabelas o projeto já tem os arquivos parquet criados e armazenados na pasta parquet;/base
      1. O arquivo com as CNAEs foi substituído por um com os dados completos não somente a subclasse;
      2. O arquivo de municípios foi substituído por um contendo os dados completos do IBGE, onde foi incluído também o georeferenciamento dos municípios. Foi feita a relação para os códigos utilizados na tabela Estabelecimento;
  2. Os arquivos serão descompactados na pasta dados-abertos;
  3. Será feita a manipulação dos dados;
  4. Serão criados os arquivos parquet na pasta parquet/YYYMM, onde: YYYYMM é o ano e mês que o script esta sendo executado;
  5. Os arquivos descompactados serão removidos;
  6. Um arquivo chamado cnpj.duckdb será criado e nele ficarão todas as tabelas criadas anteriormente em parquet;
  7. Por fim os arquivos parquet criados serão apagados.

Obs.: Esta versão faz a verificação se os arquivos que estão sendo baixados da RF já estão na máquina de destino e se eles são os mais recentes ou não antes de tentar baixar.

Esta versão utiliza bibliotecas como Dask para o tratamento dos dados, execução com paralelismo e criação dos arquivos parquet. Usa também o DuckDB para reunir esses arquivos parquet em um só arquivo que pode ser acessado via DuckDB ou DBeaver.

Sem levar em consideração a baixa dos arquivos toda execução durou cerca de 23 minutos em um notebook i5 de 9a geração com
Windows 11 e o dask configurado da seguinte forma: processes=3 threads=6, memory=31.78 GiB e o duckdb com threads=4.

Dockerfile

Na versão 1.3.0 foi criado o arquivo docker para facilitar a utilização da aplicação, para executála siga os seguintes passos:

  • Execute o comando abaixo para criação da imagem com o projeto:

sudo docker build . -t cnpj

  • Execute o comando abaixo para criação de um container

sudo docker run -it temp

  • Execute o comando abaixo para executar a aplicação.

python3 maniupular_dados.py

Implementações futuras

  • Geração do arquivo com os logs da aplicação
  • Download dos arquivos em paralelo

Histórico de versões

Versão Data Descrição
1.3.2 09/08/2024 Remoção da indexação feita no campo cnpj_basico
1.3.1 01/08/2024 Inclusão do arquivo Dockerfile
1.3.0 01/08/2024 Criação do arquivo Dockerfile
1.2.3 01/08/2024 Atualização das dependências
1.2.2 26/07/2024 Correção do nome da variável que permitia ou não a criação do arquivo parquet final
1.2.1 24/07/2024 Update README.md
1.2.0 24/07/2024 Implementação da possibilidade de recomeço do download interrompido de um arquivo
1.1.0 20/06/2024 Padronização PEP8, inclusão da verificação das pastas básicas para o projeto e atualização das dependências
1.0.0 14/06/2024 Versão inicial