Skip to content

feat:retorna codigo do ibge do nome do municipio e da uf#411

Merged
camilamaia merged 9 commits intobrazilian-utils:mainfrom
CarduCaldeira:feat/get_code_by_municipality_name
Dec 19, 2024
Merged

feat:retorna codigo do ibge do nome do municipio e da uf#411
camilamaia merged 9 commits intobrazilian-utils:mainfrom
CarduCaldeira:feat/get_code_by_municipality_name

Conversation

@CarduCaldeira
Copy link
Contributor

@CarduCaldeira CarduCaldeira commented Sep 13, 2024

Descrição

Implementa uma função que recebe o nome do municipio e a sigla da UF e retorna seu código do IBGE.
@mateusoliveira43, @pedromendesjr, @nettorobson

Mudanças Propostas

Checklist de Revisão

  • Eu li o Contributing.md
  • Os testes foram adicionados ou atualizados para refletir as mudanças (se aplicável).
  • Foi adicionada uma entrada no changelog / Meu PR não necessita de uma nova entrada no changelog.
  • A documentação em português foi atualizada ou criada, se necessário.
  • Se feita a documentação, a atualização do arquivo em inglês.
  • Eu documentei as minhas mudanças no código, adicionando docstrings e comentários. Instruções
  • O código segue as diretrizes de estilo e padrões de codificação do projeto.
  • Todos os testes passam. Instruções
  • O Pull Request foi testado localmente. Instruções
  • Não há conflitos de mesclagem.

Comentários Adicionais (opcional)

Estamos na dúvida na utilização de um arquivo json para leitura dos códigos referentes ao municípios (caso implementado) ou utilização de uma API externa para obter tais códigos.

Uma sugestão de desenvolvimento para melhoria seria a criação de um processo de automação para atualização do json

Issue Relacionada

Closes #399

@codecov
Copy link

codecov bot commented Sep 13, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 99.67%. Comparing base (a46eafe) to head (c88460f).
Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #411      +/-   ##
==========================================
- Coverage   99.83%   99.67%   -0.16%     
==========================================
  Files          21       21              
  Lines         591      612      +21     
==========================================
+ Hits          590      610      +20     
- Misses          1        2       +1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Member

@camilamaia camilamaia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Valeu pela contribuição! Sei que tá em rascunho, mas vim dar umas dicas, vai que ajuda... qualquer coisa é só chamar que estamos aqui!

@CarduCaldeira
Copy link
Contributor Author

@camilamaia obrigado pela ajuda, em breve aplicarei as mudanças!

@CarduCaldeira CarduCaldeira marked this pull request as ready for review September 29, 2024 01:44
@CarduCaldeira CarduCaldeira requested review from a team as code owners September 29, 2024 01:44
README.md Outdated
* str: O código IBGE do município. Retorna None se o nome não for válido ou não existir.
Exemplo:

```

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

python

README_EN.md Outdated
'RJ'
>>> convert_code_to_uf("99")
>>>
>>>>>>> main

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

essa modificação está correta?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lembra os passos/comandos para gerar esse arquivo?

seria interessante ter essa referência para uma possível automação futura

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Boa pergunta @mateusoliveira43!

@CarduCaldeira consegue passar para gente como foi gerado?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Desculpa a demora em responder @camilamaia. Vou descrever os passos realizados:

  • Foi baixado um arquivo .zip em https://www.ibge.gov.br/explica/codigos-dos-municipios.php nomeado DTB_2022, nele consta um arquivo nomeado RELATORIO_DTB_BRASIL_MUNICIPIO.xls para extrair o codigos dos municipios.

  • O arquivo é carregado em um pandas DataFrame e selecionado as colunas 'Nome_UF', 'Nome_Município' e 'Código Município Completo'.

  • São aplicadas nas colunas 'Nome_UF' e 'Nome_Município' a função _transform_text que retorna uma string normalizada.

  • A coluna 'Nome_UF' possui os nomes dos estados por extenso, para padronizar com o restante do código o nome por extenso é substituído pelo sigla do estado.

  • É gerado então o arquivo cities_code.json.

Segue abaixo o código utilizado, para roda-ló usei python3.10 com:

  • pandas==2.2.3
  • xlrd==2.0.1
import pandas as pd
import unicodedata
import json


def _transform_text(municipality_name: str): # type: (str) -> str
   """ 
   Normalize municipality name and returns the normalized string.

   Args:
        municipality_name (str): The name of the municipality.
        
    Returns:
        str: The normalized string

    Example:
        >>> _transform_text("São Paulo")
        "sao paulo"
        >>> _transform_text("Goiânia")
        "goiania"
        >>> _transform_text("Conceição do Coité")
        "'conceicao do coite'
    """

   normalized_string = (unicodedata.normalize('NFKD', municipality_name)
                        .encode('ascii','ignore').decode('ascii'))
   case_fold_string = normalized_string.casefold()

   return case_fold_string

def create_json():
    """
    Load the municipal code from an .xls file and 
    structure it in a json file
    """
    
    file_path = './RELATORIO_DTB_BRASIL_MUNICIPIO.xls'
    df = pd.read_excel(file_path)
    
    #select only 'Nome_UF','Nome_Município','Código Município Completo' columns
    df_only =  df[['Nome_UF','Nome_Município','Código Município Completo']]
    df_only.loc[:, 'Nome_UF'] = df_only['Nome_UF'].apply(_transform_text)
    df_only.loc[:, 'Nome_Município'] = (df_only['Nome_Município']
                                        .apply(_transform_text))
    
    #Change the name of the municipality to its acronym
    uf_codes = {'acre': 'AC', 'alagoas': 'AL', 
     'amapa': 'AP', 'amazonas': 'AM', 
     'bahia': 'BA', 'ceara': 'CE', 
     'distrito federal': 'DF', 'espirito santo': 'ES', 
     'goias': 'GO', 'maranhao': 'MA', 'mato grosso': 'MT', 
     'mato grosso do sul': 'MS', 'minas gerais': 'MG', 
     'para': 'PA', 'paraiba': 'PB', 'parana': 'PR', 
     'pernambuco': 'PE', 'piaui': 'PI', 
     'rio de janeiro': 'RJ', 'rio grande do norte': 'RN', 
     'rio grande do sul': 'RS', 'rondonia': 'RO', 
     'roraima': 'RR', 'santa catarina': 'SC', 
     'sao paulo': 'SP', 'sergipe': 'SE', 'tocantins': 'TO'}
    
    df_only.loc[:,'Nome_UF'] = df_only['Nome_UF'].map(uf_codes)

    #create ./cities_code.json' file
    result = {}

    for _, row in df_only.iterrows():
        
        state = row['Nome_UF']
        municipality = row['Nome_Município']
        code = row['Código Município Completo']
        
        if state not in result:
            result[state] = {}
        result[state][municipality] = code

    with open('./cities_code.json', 'w') as json_file:
        json.dump(result, json_file, indent=4)

return code


def _transform_text(municipality_name: str): # type: (str) -> str

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

valeria escrever teste só para essa função?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Como é uma função privada e parece que eles já estão testando o seu comportamento na função pública, acredito que seja meio que opcional. Você concorda @mateusoliveira43

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Boa pergunta @mateusoliveira43!

@CarduCaldeira consegue passar para gente como foi gerado?

return code


def _transform_text(municipality_name: str): # type: (str) -> str
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Como é uma função privada e parece que eles já estão testando o seu comportamento na função pública, acredito que seja meio que opcional. Você concorda @mateusoliveira43

Copy link
Member

@camilamaia camilamaia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apanhando aqui para o lint.... agora vai 🤞

@camilamaia
Copy link
Member

O problema de coverage tá dando num arquivo nada relacionado com as tuas mudanças 🤷‍♀️ Então vou mergear e depois eu vejo esse erro específico, beleza?

image

Copy link
Member

@camilamaia camilamaia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Antes revisando tarde do que mais tarde kkkk Agora vai, dale!!!!

Valeu pela paciência <3

@camilamaia camilamaia merged commit c36d581 into brazilian-utils:main Dec 19, 2024
@camilamaia camilamaia mentioned this pull request Sep 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Retornar Código IBGE a partir do Nome do Município

4 participants