cuducos / calculadora-do-cidadao

💵 Tool for Brazilian Reais monetary adjustment/correction
https://calculadora-do-cidadao.readthedocs.io
GNU General Public License v3.0
150 stars 15 forks source link

`IndexError` no adaptador Selic #53

Closed b-macedo closed 2 years ago

b-macedo commented 2 years ago

Prezado(a)(s), Gostaria de sanar uma dúvida:

  1. Primeiro, eu utilizei este código, e o scrip funcionou perfeitamente:
from datetime import date
from decimal import Decimal

from calculadora_do_cidadao import Ipca

ipca=Ipca()
str_date_inicial = '01/04/2010'
str_date_final = '05/05/2011'
valorInicial = 1000

multiplicador = ipca.adjust(str_date_inicial, 1, str_date_final)
print(multiplicador*valorInicial)
  1. Em seguinte, tentei rodar o mesmo script, apenas trocando as respectivas variáveis para a Selic, ou seja:
from datetime import date
from decimal import Decimal

from calculadora_do_cidadao import Selic

selic = Selic()

str_date_inicial = '01/04/2010'
str_date_final = '05/05/2011'
valorInicial = 1000

multiplicador = selic.adjust(str_date_inicial, 1, str_date_final)
print(multiplicador*valorInicial)

Foi então que o sistema retornou o erro abaixo:

`C:\Users\trtrj\AppData\Local\Programs\Python\Python310\python.exe C:\Users\trtrj\Desktop\PycharmProjects\pythonProject2\correçãoMonetária.py 
Traceback (most recent call last):
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\download.py", line 94, in __call__
    yield path
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 206, in download
    for data in self.read_from(path, **kwargs):  # type: ignore
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\rows\plugins\plugin_html.py", line 84, in import_from_html
    table = tables[index]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 617, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\trtrj\\AppData\\Local\\Temp\\tmpt07hhrhc\\taxa-de-juros-selic'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 843, in onerror
    _os.unlink(path)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\trtrj\\AppData\\Local\\Temp\\tmpt07hhrhc\\taxa-de-juros-selic'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\trtrj\Desktop\PycharmProjects\pythonProject2\correçãoMonetária.py", line 20, in <module>
    selic = Selic()
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 71, in __init__
    self.data = {key: value for key, value in self.download()}
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 71, in <dictcomp>
    self.data = {key: value for key, value in self.download()}
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\adapters\__init__.py", line 204, in download
    with download() as path:
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\contextlib.py", line 153, in __exit__
    self.gen.throw(typ, value, traceback)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\site-packages\calculadora_do_cidadao\download.py", line 86, in __call__
    with TemporaryDirectory() as tmp:
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 869, in __exit__
    self.cleanup()
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 873, in cleanup
    self._rmtree(self.name, ignore_errors=self._ignore_cleanup_errors)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 855, in _rmtree
    _shutil.rmtree(name, onerror=onerror)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 749, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 619, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 846, in onerror
    cls._rmtree(path, ignore_errors=ignore_errors)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\tempfile.py", line 855, in _rmtree
    _shutil.rmtree(name, onerror=onerror)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 749, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 600, in _rmtree_unsafe
    onerror(os.scandir, path, sys.exc_info())
  File "C:\Users\trtrj\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 597, in _rmtree_unsafe
    with os.scandir(path) as scandir_it:
NotADirectoryError: [WinError 267] The directory name is invalid: 'C:\\Users\\trtrj\\AppData\\Local\\Temp\\tmpt07hhrhc\\taxa-de-juros-selic'

Process finished with exit code 1`

Pode(m) me dar alguma sugestão? Muito obrigado

cuducos commented 2 years ago

Oi, @b-macedo. Formatei tua mensagem para facilitar a leitura com a formatação, espero que não se importe. Também editei o título para algo que descreva melhor o problema que você está reportando.

Aparentemente a fonte dos dados da Selic deve ter mudado ou a URL, ou o formato dos dados, teremos que atualizar o adaptador se for esse o caso. Ou eles estão temporariamente fora do ar (aí não tem o que fazer).

Vou tentar olhar com calma nos próximos dias, mas já marcando aqui como bug!

cuducos commented 2 years ago

Atualizando:

A URL do adaptador Selic mudou: a que temos aqui no repositório está redirecionando para a página de inicial da Receita Federal.

Provavelmente o que precisamos:

Para referência, essa é uma página da versão antiga.

cuducos commented 2 years ago

Achei os dados em outra URLm em JSON. Agora temos que refatorar o adaptador… E ver como adaptar essas faixas temporais (que agora tem dia, mês e ano, de invés de mês e ano apenas).

cuducos commented 2 years ago

Achei uma fonte melhor ainda, que dá a Selic por mês, se encaixa melhor no projeto. Um pequeno rascunho para quem for implementar:

from urllib.parse import urlencode

from requests import post

PARAMS = {
    "parametrosOrdenacao": '[{"nome":"periodo","decrescente":false}]',
    "page": 1,
    "pageSize": 48,
}
URL = "https://www3.bcb.gov.br/novoselic/rest/fatoresAcumulados/pub/search?"
HEADERS = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Encoding": "gzip, deflate, br",
}
DATA = {
    "campoPeriodo": "mensal",
    "dataInicial": "",
    "dataFinal": "",
    "ano": 1986,
    "exibirMeses": True,
}

print(post(f"{URL}?{urlencode(PARAMS)}", json=DATA, headers=HEADERS).json())

A saída:

{
    "totalItems": 7,
    "registros": [
        {
            "periodo": "Jun / 1986",
            "fator": 1.01270736,
            "fatorFormatado": "1,01270736"
        },
        {
            "periodo": "Jul / 1986",
            "fator": 1.01945876,
            "fatorFormatado": "1,01945876"
        },
        {
            "periodo": "Aug / 1986",
            "fator": 1.02567386,
            "fatorFormatado": "1,02567386"
        },
        {
            "periodo": "Sep / 1986",
            "fator": 1.02941789,
            "fatorFormatado": "1,02941789"
        },
        {
            "periodo": "Oct / 1986",
            "fator": 1.0195615,
            "fatorFormatado": "1,01956150"
        },
        {
            "periodo": "Nov / 1986",
            "fator": 1.02369179,
            "fatorFormatado": "1,02369179"
        },
        {
            "periodo": "Dec / 1986",
            "fator": 1.05466504,
            "fatorFormatado": "1,05466504"
        }
    ],
    "observacoes": null,
    "dataAtual": "01/11/2022 \u00e0s 18:57:03"
}
cuducos commented 2 years ago

@b-macedo, creio estar funcionando na versão nova, a 0.5.4 — pip install -U calculadora_do_cidadao se quiser atualizar : )

b-macedo commented 2 years ago

@cuducos não tenho como te agradecer, meu querido. Obrigado por toda a sua atenção. Pra falar a verdade, não tinha compreendido a sua primeira sugestão (sou leigo no assunto) e não quis abusar de sua ajuda. Mas agora, pela própria calculadora, a solução fica muito mais fácil pra mim. muitíssimo grato, Deus te pague.

cuducos commented 2 years ago

@b-macedo, apenas um pequeno comentário: reparei que em comparação com a ferramenta de conversão online do BC dá um diferença pequena. Acredito que seja questão de um estar indexado dia-a-dia (o deles) e esse pacote ser mês a mês. Acho bom ressaltar, pois dependendo do caso isso pode ser ou não problema : )