Spaces:
Running
Running
import gradio as gr | |
# ---- Funções de Cálculo ---- | |
# Função para escala SPICT | |
def analisar_spict(respostas_spict): | |
spict_perguntas = [ | |
"Internações hospitalares não programadas.", | |
"Capacidade funcional ruim ou em declínio (a pessoa passa na cama ou cadeira mais de 50% do dia).", | |
"Dependente de outros para cuidados pessoais devido a problemas físicos e/ou mentais (necessita maior suporte do cuidador).", | |
"Perda de peso significativa nos últimos 3-6 meses e/ou baixo índice de massa corporal.", | |
"Sintomas persistentes apesar do tratamento otimizado das condições de base.", | |
"A pessoa ou sua família solicita cuidados paliativos, interrupção ou limitação do tratamento ou um foco na qualidade de vida." | |
] | |
afirmativas = [p for p, r in zip(spict_perguntas, respostas_spict) if r == 1] | |
negativas = [p for p, r in zip(spict_perguntas, respostas_spict) if r == 0] | |
texto_afirmativas = "**Itens marcados como 'Sim':**<br>" + ("<br>".join(afirmativas) if afirmativas else "Nenhum") | |
texto_negativas = "<br><br>**Itens marcados como 'Não':**<br>" + ("<br>".join(negativas) if negativas else "Nenhum") | |
texto_final = ( | |
f"{texto_afirmativas}{texto_negativas}<br><br>" | |
"**Recomendações SPICT:**<br>" | |
"Revisar o cuidado atual e planejar o cuidado para o futuro.<br>" | |
"- Reavaliar o tratamento atual e medicação para que o paciente receba o cuidado otimizado.<br>" | |
"- Considerar o encaminhamento para avaliação de um especialista se os sintomas ou necessidades forem complexos.<br>" | |
"- Acordar sobre objetivos do cuidado atual e futuro e planejar o cuidado com a pessoa e sua família.<br>" | |
"- Planejar com antecedência caso a pessoa esteja em risco de perda cognitiva.<br>" | |
"- Registrar em prontuário, comunicar e coordenar o plano geral de cuidados." | |
) | |
return texto_final | |
# Função para escala Zarit | |
def analisar_zarit(respostas_zarit): | |
zarit_score = sum(respostas_zarit) | |
if zarit_score <= 14: | |
classificacao = "Leve" | |
elif zarit_score <= 21: | |
classificacao = "Moderada" | |
else: | |
classificacao = "Grave" | |
texto_final = ( | |
f"**Pontuação total:** {zarit_score}<br>" | |
f"**Classificação da sobrecarga:** {classificacao}<br><br>" | |
"**Sobre a Escala Zarit:**<br>" | |
"Tem por objetivo avaliar a sobrecarga dos cuidadores de idosos. Esta escala **não** deve ser realizada na presença do idoso.<br>" | |
"A cada afirmativa o cuidador indica a frequência (nunca, quase nunca, às vezes, frequentemente ou quase sempre).<br>" | |
"Não existem respostas certas ou erradas. O estresse dos cuidadores será indicado por altos escores." | |
) | |
return texto_final | |
# Função para escala NECPAL | |
def analisar_necpal(respostas_necpal): | |
# perguntas NECPAL para referência | |
# Índices para referência interna (0-based): | |
# 0 - Pergunta Surpresa | |
# 1 - Demanda / necessidade | |
# 2,3,4 - Indicadores clínicos gerais (declínio nutricional, funcional, cognitivo) | |
# 5 - Dependência grave | |
# 6 - Síndromes geriátricas (≥2 recorrentes ou persistentes) | |
# 7 - Sintomas persistentes (≥2 sintomas recorrentes ou persistentes) | |
# 8 - Sofrimento emocional ou transtorno adaptativo grave (DME≥9) | |
# 9 - Vulnerabilidade social grave | |
# 10 - Multi-morbilidade (≥2 doenças crônicas avançadas) | |
# 11 - Uso de recursos (mais que duas admissões urgentes em 6 meses) | |
# 12 - Indicadores específicos (câncer, DPOC, ICC, etc.) | |
sum_necpal = sum(respostas_necpal) | |
# Pergunta surpresa: se resposta = 1 => PS+ (não me surpreenderia) | |
ps = respostas_necpal[0] | |
ps_str = "PS+ (Não me surpreenderia se o paciente morresse no próximo ano)" if ps == 1 else "PS- (Me surpreenderia)" | |
necpal_str = "NECPAL+" if sum_necpal > 0 else "NECPAL-" | |
texto_final = ( | |
f"**Classificação NECPAL:**<br>" | |
f"Pergunta Surpresa: {ps_str}<br>" | |
f"Parâmetros NECPAL: {necpal_str}<br><br>" | |
"Se PS+ e NECPAL+ => Propor codificação como Paciente com Cronicidade Avançada (PCA)." | |
) | |
return texto_final | |
def interface_geral( | |
# SPICT (6 questões, Sim/Não) | |
# Respostas: 0=Não, 1=Sim | |
s1, s2, s3, s4, s5, s6, | |
# Zarit (7 questões, escala 0-4, vamos somar +1 depois) | |
z1, z2, z3, z4, z5, z6, z7, | |
# NECPAL (13 questões, Sim/Não) | |
n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13 | |
): | |
todos = [s1, s2, s3, s4, s5, s6, | |
z1, z2, z3, z4, z5, z6, z7, | |
n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13] | |
if any(v is None for v in todos): | |
return "Erro: Todas as questões devem ser preenchidas." | |
for v in todos: | |
if not isinstance(v, int): | |
return "Erro: Respostas inválidas. Verifique se todos os campos foram preenchidos corretamente." | |
# Análise SPICT (questões 1-6) | |
spict_respostas = [s1, s2, s3, s4, s5, s6] | |
resultado_spict = analisar_spict(spict_respostas) | |
# Análise Zarit (questões 7-13) | |
zarit_respostas = [z1+1, z2+1, z3+1, z4+1, z5+1, z6+1, z7+1] | |
resultado_zarit = analisar_zarit(zarit_respostas) | |
# Análise NECPAL (questões 14-26) | |
necpal_respostas = [n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13] | |
resultado_necpal = analisar_necpal(necpal_respostas) | |
resultado_final = ( | |
"<h3>Resultado da Escala SPICT</h3>" | |
f"{resultado_spict}<br><br>" | |
"<h3>Resultado da Escala Zarit</h3>" | |
f"{resultado_zarit}<br><br>" | |
"<h3>Resultado da Escala NECPAL</h3>" | |
f"{resultado_necpal}" | |
) | |
return resultado_final | |
with gr.Blocks() as demo: | |
gr.Markdown("# Ferramenta para Avaliação Completa (SPICT, Zarit, NECPAL)") | |
gr.Markdown("Responda as questões a seguir. Ao final, será apresentada uma análise abrangente considerando SPICT, Zarit e NECPAL. Todas as perguntas estão numeradas continuamente para parecer um único questionário.") | |
# Lista de perguntas | |
# 1-6 SPICT | |
perguntas_spict = [ | |
"Internações hospitalares não programadas?", | |
"Capacidade funcional ruim ou em declínio (a pessoa passa na cama ou cadeira mais de 50% do dia)?", | |
"Dependência de outros para cuidados pessoais devido a problemas físicos/mentais (necessita maior suporte do cuidador)?", | |
"Perda de peso significativa nos últimos 3-6 meses e/ou baixo IMC?", | |
"Sintomas persistentes apesar do tratamento otimizado das condições de base?", | |
"A pessoa ou família solicita cuidados paliativos, interrupção/limitação do tratamento ou foco na qualidade de vida?" | |
] | |
# 7-13 Zarit | |
perguntas_zarit = [ | |
"Sente que, por causa do tempo que utiliza com o seu familiar/doente, já não tem tempo suficiente para você mesmo?", | |
"Sente-se estressado/angustiado por ter que cuidar do seu familiar/doente e ao mesmo tempo ser responsável por outras tarefas?", | |
"Acha que a situação atual afeta a sua relação com amigos ou outros membros da família de forma negativa?", | |
"Sente-se exausto quando tem de estar junto do seu familiar/doente?", | |
"Sente que sua saúde tem sido afetada por ter que cuidar do seu familiar/doente?", | |
"Sente que tem perdido o controle da sua vida desde que a doença do seu familiar/doente se manifestou?", | |
"No geral, sente-se muito sobrecarregado por ter que cuidar do seu familiar/doente?" | |
] | |
# 14-26 NECPAL | |
perguntas_necpal = [ | |
"Pergunta Surpresa: Você ficaria surpreso se este paciente morresse ao longo do próximo ano? (Se 'Não ficaria surpreso' => Sim, caso contrário => Não)", | |
"Demanda ou necessidade: Houve manifestação explícita ou implícita de limitação de esforço terapêutico ou pedido de atenção paliativa pelo paciente, família ou equipe?", | |
"Declínio nutricional: Perda de peso >10% nos últimos 6 meses.", | |
"Declínio funcional: Piora do Karnofsky ou Barthel >30%, ou perda de mais que duas Atividades Básicas da Vida Diária (ABVDs).", | |
"Declínio cognitivo: Perda ≥5 no Minimental ou ≥3 no Pfeiffer indicando deterioração cognitiva.", | |
"Dependência grave: Karnofsky <50 ou Barthel <20.", | |
"Síndromes geriátricas: Lesão por pressão, infecções de repetição, delirium, disfagia, quedas. ≥2 sintomas recorrentes/persistentes.", | |
"Sintomas persistentes: Dor, cansaço, náusea, depressão, ansiedade, sonolência, inapetência, mal-estar, dispneia, insônia. ≥2 sintomas (ESAS) recorrentes ou persistentes.", | |
"Sofrimento emocional ou transtorno adaptativo grave: Detecção de mal-estar emocional (DME ≥9).", | |
"Vulnerabilidade social grave: Avaliação social e familiar indicando fragilidade social significativa.", | |
"Multi-morbilidade: ≥2 doenças ou condições crônicas avançadas (Ex: Câncer, DPOC, ICC, insuficiência hepática, renal, AVC, demência, neurodegenerativas, SIDA).", | |
"Uso de recursos: Mais que duas admissões urgentes (não programadas) em 6 meses, aumento da demanda de intervenções.", | |
"Indicadores específicos: Presença de condições avançadas que reforçam a complexidade do caso (Câncer, DPOC, ICC, etc.)." | |
] | |
perguntas = perguntas_spict + perguntas_zarit + perguntas_necpal | |
inputs = [] | |
numero = 1 | |
# 1-6: SPICT (0=Não, 1=Sim) | |
for p in perguntas_spict: | |
gr.Markdown(f"**{numero}. {p}**") | |
inputs.append(gr.Radio(choices=[0,1], label="Selecione: 0=Não, 1=Sim")) | |
numero += 1 | |
# 7-13: Zarit (0-4, representando Nunca(0), Quase nunca(1), Às vezes(2), Frequentemente(3), Quase sempre(4)) | |
for p in perguntas_zarit: | |
gr.Markdown(f"**{numero}. {p}**<br>(0 - Nunca, 1 - Quase nunca, 2 - Às vezes, 3 - Frequentemente, 4 - Quase sempre)") | |
inputs.append(gr.Slider(minimum=0, maximum=4, step=1)) | |
numero += 1 | |
# 14-26: NECPAL (0=Não, 1=Sim) | |
for p in perguntas_necpal: | |
gr.Markdown(f"**{numero}. {p}**") | |
inputs.append(gr.Radio(choices=[0,1], label="Selecione: 0=Não, 1=Sim")) | |
numero += 1 | |
calcular_btn = gr.Button("Calcular Avaliação Completa") | |
resultado_output = gr.HTML() | |
calcular_btn.click( | |
interface_geral, | |
inputs, | |
resultado_output | |
) | |
demo.launch(share=True) |