AlertaDengue / PySUS

Library to download, clean and analyze openly available datasets from Brazilian Universal health system, SUS.
GNU General Public License v3.0
176 stars 68 forks source link

[Errno 110] Connection timed out #146

Open gabivaleriano opened 1 year ago

gabivaleriano commented 1 year ago

Oi,

não consigo importar a biblioteca:

TimeoutError Traceback (most recent call last) Cell In[1], line 1 ----> 1 from pysus.online_data import SINAN 2 import pandas as pd

File ~/env1/lib/python3.11/site-packages/pysus/online_data/init.py:139 135 df = df.convert_dtypes() 136 return df --> 139 class FTP_Inspect: 140 """ 141 Databases: "SINAN", "SIM", "SINASC", "SIH", "SIA", "PNI", "CNES", "CIHA" 142 FTP_Inspect will focus mainly on enter in DataSUS ftp server (...) 154 for the Database. Groups may be also required. 155 """ 157 database: str

File ~/env1/lib/python3.11/site-packages/pysus/online_data/init.py:159, in FTP_Inspect() 157 database: str 158 _ds_paths: list --> 159 ftp_server: FTP = FTP('ftp.datasus.gov.br') 160 available_dbs: list = list(DB_PATHS.keys()) 162 def init(self, database: str) -> None:

File /usr/lib/python3.11/ftplib.py:121, in FTP.init(self, host, user, passwd, acct, timeout, source_address, encoding) 119 self.timeout = timeout 120 if host: --> 121 self.connect(host) 122 if user: 123 self.login(user, passwd, acct)

File /usr/lib/python3.11/ftplib.py:158, in FTP.connect(self, host, port, timeout, source_address) 156 self.source_address = source_address 157 sys.audit("ftplib.connect", self, self.host, self.port) --> 158 self.sock = socket.create_connection((self.host, self.port), self.timeout, 159 source_address=self.source_address) 160 self.af = self.sock.family 161 self.file = self.sock.makefile('r', encoding=self.encoding)

File /usr/lib/python3.11/socket.py:850, in create_connection(address, timeout, source_address, all_errors) 848 try: 849 if not all_errors: --> 850 raise exceptions[0] 851 raise ExceptionGroup("create_connection failed", exceptions) 852 finally: 853 # Break explicitly a reference cycle

File /usr/lib/python3.11/socket.py:835, in create_connection(address, timeout, source_address, all_errors) 833 if source_address: 834 sock.bind(source_address) --> 835 sock.connect(sa) 836 # Break explicitly a reference cycle 837 exceptions.clear()

TimeoutError: [Errno 110] Connection timed out

Alguma experiência parecida?

Muito obrigada!!

fccoelho commented 1 year ago

Pela mensagem de erro, é problema de conexão, pois o PySUS tenta se conectar com o servidor do DATASUS.

Verifique se você tem uma conexão de rede ativa e tenta de novo.

gabivaleriano commented 1 year ago

Agradeço a resposta! Sim, tenho conexão de rede e mesmo assim continuo com o mesmo erro.

MarceloDuarteCunha commented 1 year ago

Boa tarde. Eu também não consigo desde ontem.

!sudo apt install python3.9 python3.9-dev python3.9-venv
!python3.9 -m venv .env
!source .env/bin/activate
!pip install pysus

Tentei todas as seguintes formas de import:

from pysus.online_data.CNES import download
from pysus.online_data.SIA import download
from pysus.ftp.databases.cnes import CNES
from pysus.online_data import SIM, CNES, IBGE, parquets_to_dataframe, search_string, download

Estou tentando conectar desde ontem, mas eu consigo fazer o download via FTP com outra bibliotecas.

Será mesmo conexão?

Outra coisa é que ao tentar abrir o arquivo .DBC, agora tem dado este erro:

anos = [23]
meses = ['08']
estados =["AC","AL","AP","AM","BA","CE","DF","ES","GO","MA","MT", "MS","MG","PA","PB","PR","PE","PI","RJ","RN","RS","RO","RR","SC","SP","SE","TO"]
nomesgrupos = {
        "Dados Complementares": "DC" ,
        "Estabelecimento de Ensino": "EE",
        "Estabelecimento Filantrópico": "EF",
        "Equipes": "EP",
        "Equipamentos": "EQ",
        "Gestão e Metas": "GM",
        "Habilitação": "HB",
        "Incentivos": "IN",
        "Leitos": "LT",
        "Profissional": "PF",
        "Regra Contratual": "RC",
        "Serviço Especializado": "SR",
        "Estabelecimentos": "ST"
    }

grupos = [nomesgrupos['Estabelecimentos']]

banco={}

ftp = FTP(f'ftp.datasus.gov.br')
ftp.login() # Login sem necessidade de usuário e senha

for y in anos:
    for m in meses:
        for uf in estados:
            for gp in grupos:

                dir = 'dissemin/publicos/CNES/200508_/Dados/' + gp

                ftp.cwd(dir) #Diretório para os arquivos do CNES

                file=gp+uf+str(y)+m+".dbc"

                # Download dos dados
                with open(file, 'wb') as fp:
                    ftp.retrbinary('RETR ' + file, fp.write, 1024)
                    print("Banco de " + file + " baixado!")

ftp.quit() # Fecha a conexão com o FTP 

df = read_dbc('/content/STTO2308.dbc', encoding='iso-8859-1')

ERROR: Failed to read DBF: unpack requires a buffer of 32 bytes

Podem me ajudar?

Muito Obrigado

aldemirfilho commented 11 months ago

Olá! Alguma novidade acerca desse problema?

Ao tentar acessar usando:

SPa = download('AL', 2023, 4, group='PA')[0] # Some large datasets are split in more than one DBC
dfSPa = parquets_to_dataframe(SPa)

Recebo o Erro:

---------------------------------------------------------------------------
TimeoutError                              Traceback (most recent call last)
[<ipython-input-6-ca3a8d608464>](https://localhost:8080/#) in <cell line: 1>()
----> 1 SPa = download('AL', 2023, 4, group='PA')[0] # Some large datasets are split in more than one DBC
      2 dfSPa = parquets_to_dataframe(SPa)

7 frames
[/usr/lib/python3.10/socket.py](https://localhost:8080/#) in create_connection(address, timeout, source_address)
    831             if source_address:
    832                 sock.bind(source_address)
--> 833             sock.connect(sa)
    834             # Break explicitly a reference cycle
    835             err = None

TimeoutError: [Errno 110] Connection timed out

Alguem poderia me ajudar, por favor?

anapaulagomes commented 4 months ago

Sobre o Connection timed out, é um problema de indisponibilidade do FTP do Datasus mesmo. Pra testar basta ir no https://datasus.saude.gov.br/transferencia-de-arquivos/# e tentar fazer acesso usando a ferramenta FTP de sua escolha.

Embora não seja culpa do PySUS, acho que dá pra melhorar a mensagem de erro e torná-la mais amigável. Posso abrir um PR pra isso.

fccoelho commented 4 months ago

Sobre o Connection timed out, é um problema de indisponibilidade do FTP do Datasus mesmo. Pra testar basta ir no https://datasus.saude.gov.br/transferencia-de-arquivos/# e tentar fazer acesso usando a ferramenta FTP de sua escolha.

Embora não seja culpa do PySUS, acho que dá pra melhorar a mensagem de erro e torná-la mais amigável. Posso abrir um PR pra isso.

Obrigado @anapaulagomes fique à vontade para abrir este PR!

anapaulagomes commented 3 months ago

Descobri que o mesmo erro acontece para quem está fora do Brasil também. Vou abrir uma reclamação (e abrir um PR com uma mensagem melhorada).

anapaulagomes commented 3 months ago

Olhando o código, percebi que não faz sentido essa pequena mensagem de erro sem a #59.