paliativo_enc / app.py
lucas23padawan's picture
Upload 2 files
1a1e3df verified
raw
history blame
10.7 kB
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)