-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into correcoes_etl_cnes
- Loading branch information
Showing
15 changed files
with
1,747 additions
and
775 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
83 changes: 83 additions & 0 deletions
83
src/impulsoetl/sisab/relatorio_producao_resolutividade_por_condicao/carregamento.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
import pandas as pd | ||
from prefect import task | ||
from sqlalchemy import delete | ||
from sqlalchemy.orm import Query, Session | ||
|
||
from impulsoetl.bd import tabelas | ||
from impulsoetl.loggers import habilitar_suporte_loguru, logger | ||
from impulsoetl.utilitarios.bd import carregar_dataframe | ||
|
||
|
||
def obter_lista_registros_inseridos( | ||
sessao: Session, | ||
tabela_destino: str, | ||
) -> Query: | ||
"""Obtém lista de registro da períodos que já constam na tabela. | ||
Argumentos: | ||
sessao: objeto [`sqlalchemy.orm.session.Session`][] que permite | ||
acessar a base de dados da ImpulsoGov. | ||
tabela_destino: Tabela que irá acondicionar os dados. | ||
Retorna: | ||
Lista de períodos que já constam na tabela destino | ||
[`sqlalchemy.orm.session.Session`]: https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session | ||
""" | ||
|
||
tabela = tabelas[tabela_destino] | ||
registros = sessao.query(tabela.c.periodo_id, tabela.c.unidade_geografica_id).distinct( | ||
tabela.c.periodo_id, tabela.c.unidade_geografica_id | ||
) | ||
|
||
logger.info("Leitura dos períodos inseridos no banco Impulso OK!") | ||
return registros | ||
|
||
|
||
def carregar_dados( | ||
sessao: Session, | ||
df_tratado: pd.DataFrame, | ||
tabela_destino: str, | ||
periodo_id: str, | ||
unidade_geografica_id: str, | ||
) -> int: | ||
"""Carrega os dados de um arquivo validação do portal SISAB no BD da Impulso. | ||
Argumentos: | ||
sessao: objeto [`sqlalchemy.orm.session.Session`][] que permite | ||
acessar a base de dados da ImpulsoGov. | ||
df_tratado: objeto [`pandas.DataFrame`][] contendo os | ||
dados a serem carregados na tabela de destino, já no formato | ||
utilizado pelo banco de dados da ImpulsoGov. | ||
Retorna: | ||
Código de saída do processo de carregamento. Se o carregamento | ||
for bem sucedido, o código de saída será `0`. | ||
[`sqlalchemy.orm.session.Session`]: https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session | ||
[`pandas.D""" | ||
habilitar_suporte_loguru() | ||
logger.info("Excluíndo registros se houver atualização retroativa...") | ||
tabela_relatorio_producao = tabelas[tabela_destino] | ||
registros_inseridos = obter_lista_registros_inseridos( | ||
sessao, tabela_destino | ||
) | ||
|
||
if any( | ||
[registro.periodo_id == periodo_id for registro in registros_inseridos] | ||
): | ||
limpar = ( | ||
delete(tabela_relatorio_producao) | ||
.where(tabela_relatorio_producao.c.periodo_id == periodo_id) | ||
.where(tabela_relatorio_producao.c.unidade_geografica_id == unidade_geografica_id) | ||
) | ||
logger.debug(limpar) | ||
sessao.execute(limpar) | ||
|
||
logger.info("Carregando dados em tabela...") | ||
carregar_dataframe( | ||
sessao=sessao, df=df_tratado, tabela_destino=tabela_destino | ||
) | ||
|
||
logger.info( | ||
"Carregamento concluído para a tabela `{tabela_nome}`: " | ||
+ "adicionadas {linhas_adicionadas} novas linhas.", | ||
tabela_nome=tabela_destino, | ||
linhas_adicionadas=len(df_tratado), | ||
) | ||
|
||
return 0 |
62 changes: 62 additions & 0 deletions
62
src/impulsoetl/sisab/relatorio_producao_resolutividade_por_condicao/extracao.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# SPDX-FileCopyrightText: 2021, 2022 ImpulsoGov <contato@impulsogov.org> | ||
# | ||
# SPDX-License-Identifier: MIT | ||
|
||
"""Extrai dados de produção da APS a partir do SISAB.""" | ||
|
||
import warnings | ||
|
||
warnings.filterwarnings("ignore") | ||
|
||
import pandas as pd | ||
|
||
from datetime import date | ||
from prefect import task | ||
|
||
from impulsoetl.sisab.utilitarios_sisab_relatorio_producao import extrair_producao_por_municipio | ||
from impulsoetl.sisab.utilitarios_sisab_relatorio_producao import transformar_producao_por_municipio | ||
|
||
|
||
from impulsoetl.loggers import logger | ||
""" | ||
@task( | ||
name= "Extrair Dados de Produção da APS por Tipo de Condição Avaliada e Desfecho", | ||
description=( | ||
"Extrai os dados do relatório de produção da Atenção Primária à Saúde," | ||
+ "por problema/condição avaliada e desfecho a partir do portal público" | ||
+ "do Sistema de Informação em Saúde para a Atenção Básica do SUS." | ||
), | ||
tags=["aps", "sisab", "producao", "extracao"], | ||
retries=2, | ||
retry_delay_seconds=120, | ||
)""" | ||
def extrair_relatorio( | ||
periodo_competencia: date)-> pd.DataFrame(): | ||
""" | ||
Extrai relatório de produção por problema/condição avaliada e conduta a partir da página do SISAB | ||
Argumentos: | ||
periodo_data_inicio: Data da competência | ||
Retorna: | ||
Objeto [`pandas.DataFrame`] com os dados extraídos. | ||
""" | ||
df_consolidado = pd.DataFrame() | ||
|
||
try: | ||
df_parcial = extrair_producao_por_municipio( | ||
tipo_producao="Atendimento Individual", | ||
competencias=[periodo_competencia], | ||
selecoes_adicionais={ | ||
"Problema/Condição Avaliada": "Selecionar Todos", | ||
"Conduta":"Selecionar Todos", | ||
}, | ||
).pipe(transformar_producao_por_municipio) | ||
|
||
df_consolidado = df_consolidado.append(df_parcial) | ||
|
||
except Exception as e: | ||
logger.error(e) | ||
pass | ||
|
||
return df_consolidado | ||
|
Oops, something went wrong.