Spaces:
Running
Running
File size: 10,653 Bytes
1a1e3df |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
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) |