Spaces:
Running
Running
lucas23padawan
commited on
Commit
•
1a1e3df
1
Parent(s):
8082a14
Upload 2 files
Browse files- app.py +212 -0
- requirements.txt +2 -0
app.py
ADDED
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
|
3 |
+
# ---- Funções de Cálculo ----
|
4 |
+
|
5 |
+
# Função para escala SPICT
|
6 |
+
def analisar_spict(respostas_spict):
|
7 |
+
spict_perguntas = [
|
8 |
+
"Internações hospitalares não programadas.",
|
9 |
+
"Capacidade funcional ruim ou em declínio (a pessoa passa na cama ou cadeira mais de 50% do dia).",
|
10 |
+
"Dependente de outros para cuidados pessoais devido a problemas físicos e/ou mentais (necessita maior suporte do cuidador).",
|
11 |
+
"Perda de peso significativa nos últimos 3-6 meses e/ou baixo índice de massa corporal.",
|
12 |
+
"Sintomas persistentes apesar do tratamento otimizado das condições de base.",
|
13 |
+
"A pessoa ou sua família solicita cuidados paliativos, interrupção ou limitação do tratamento ou um foco na qualidade de vida."
|
14 |
+
]
|
15 |
+
|
16 |
+
afirmativas = [p for p, r in zip(spict_perguntas, respostas_spict) if r == 1]
|
17 |
+
negativas = [p for p, r in zip(spict_perguntas, respostas_spict) if r == 0]
|
18 |
+
|
19 |
+
texto_afirmativas = "**Itens marcados como 'Sim':**<br>" + ("<br>".join(afirmativas) if afirmativas else "Nenhum")
|
20 |
+
texto_negativas = "<br><br>**Itens marcados como 'Não':**<br>" + ("<br>".join(negativas) if negativas else "Nenhum")
|
21 |
+
|
22 |
+
texto_final = (
|
23 |
+
f"{texto_afirmativas}{texto_negativas}<br><br>"
|
24 |
+
"**Recomendações SPICT:**<br>"
|
25 |
+
"Revisar o cuidado atual e planejar o cuidado para o futuro.<br>"
|
26 |
+
"- Reavaliar o tratamento atual e medicação para que o paciente receba o cuidado otimizado.<br>"
|
27 |
+
"- Considerar o encaminhamento para avaliação de um especialista se os sintomas ou necessidades forem complexos.<br>"
|
28 |
+
"- Acordar sobre objetivos do cuidado atual e futuro e planejar o cuidado com a pessoa e sua família.<br>"
|
29 |
+
"- Planejar com antecedência caso a pessoa esteja em risco de perda cognitiva.<br>"
|
30 |
+
"- Registrar em prontuário, comunicar e coordenar o plano geral de cuidados."
|
31 |
+
)
|
32 |
+
|
33 |
+
return texto_final
|
34 |
+
|
35 |
+
# Função para escala Zarit
|
36 |
+
def analisar_zarit(respostas_zarit):
|
37 |
+
zarit_score = sum(respostas_zarit)
|
38 |
+
|
39 |
+
if zarit_score <= 14:
|
40 |
+
classificacao = "Leve"
|
41 |
+
elif zarit_score <= 21:
|
42 |
+
classificacao = "Moderada"
|
43 |
+
else:
|
44 |
+
classificacao = "Grave"
|
45 |
+
|
46 |
+
texto_final = (
|
47 |
+
f"**Pontuação total:** {zarit_score}<br>"
|
48 |
+
f"**Classificação da sobrecarga:** {classificacao}<br><br>"
|
49 |
+
"**Sobre a Escala Zarit:**<br>"
|
50 |
+
"Tem por objetivo avaliar a sobrecarga dos cuidadores de idosos. Esta escala **não** deve ser realizada na presença do idoso.<br>"
|
51 |
+
"A cada afirmativa o cuidador indica a frequência (nunca, quase nunca, às vezes, frequentemente ou quase sempre).<br>"
|
52 |
+
"Não existem respostas certas ou erradas. O estresse dos cuidadores será indicado por altos escores."
|
53 |
+
)
|
54 |
+
|
55 |
+
return texto_final
|
56 |
+
|
57 |
+
# Função para escala NECPAL
|
58 |
+
def analisar_necpal(respostas_necpal):
|
59 |
+
# perguntas NECPAL para referência
|
60 |
+
# Índices para referência interna (0-based):
|
61 |
+
# 0 - Pergunta Surpresa
|
62 |
+
# 1 - Demanda / necessidade
|
63 |
+
# 2,3,4 - Indicadores clínicos gerais (declínio nutricional, funcional, cognitivo)
|
64 |
+
# 5 - Dependência grave
|
65 |
+
# 6 - Síndromes geriátricas (≥2 recorrentes ou persistentes)
|
66 |
+
# 7 - Sintomas persistentes (≥2 sintomas recorrentes ou persistentes)
|
67 |
+
# 8 - Sofrimento emocional ou transtorno adaptativo grave (DME≥9)
|
68 |
+
# 9 - Vulnerabilidade social grave
|
69 |
+
# 10 - Multi-morbilidade (≥2 doenças crônicas avançadas)
|
70 |
+
# 11 - Uso de recursos (mais que duas admissões urgentes em 6 meses)
|
71 |
+
# 12 - Indicadores específicos (câncer, DPOC, ICC, etc.)
|
72 |
+
|
73 |
+
sum_necpal = sum(respostas_necpal)
|
74 |
+
# Pergunta surpresa: se resposta = 1 => PS+ (não me surpreenderia)
|
75 |
+
ps = respostas_necpal[0]
|
76 |
+
ps_str = "PS+ (Não me surpreenderia se o paciente morresse no próximo ano)" if ps == 1 else "PS- (Me surpreenderia)"
|
77 |
+
necpal_str = "NECPAL+" if sum_necpal > 0 else "NECPAL-"
|
78 |
+
|
79 |
+
texto_final = (
|
80 |
+
f"**Classificação NECPAL:**<br>"
|
81 |
+
f"Pergunta Surpresa: {ps_str}<br>"
|
82 |
+
f"Parâmetros NECPAL: {necpal_str}<br><br>"
|
83 |
+
"Se PS+ e NECPAL+ => Propor codificação como Paciente com Cronicidade Avançada (PCA)."
|
84 |
+
)
|
85 |
+
|
86 |
+
return texto_final
|
87 |
+
|
88 |
+
|
89 |
+
def interface_geral(
|
90 |
+
# SPICT (6 questões, Sim/Não)
|
91 |
+
# Respostas: 0=Não, 1=Sim
|
92 |
+
s1, s2, s3, s4, s5, s6,
|
93 |
+
|
94 |
+
# Zarit (7 questões, escala 0-4, vamos somar +1 depois)
|
95 |
+
z1, z2, z3, z4, z5, z6, z7,
|
96 |
+
|
97 |
+
# NECPAL (13 questões, Sim/Não)
|
98 |
+
n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13
|
99 |
+
):
|
100 |
+
|
101 |
+
todos = [s1, s2, s3, s4, s5, s6,
|
102 |
+
z1, z2, z3, z4, z5, z6, z7,
|
103 |
+
n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13]
|
104 |
+
|
105 |
+
if any(v is None for v in todos):
|
106 |
+
return "Erro: Todas as questões devem ser preenchidas."
|
107 |
+
|
108 |
+
for v in todos:
|
109 |
+
if not isinstance(v, int):
|
110 |
+
return "Erro: Respostas inválidas. Verifique se todos os campos foram preenchidos corretamente."
|
111 |
+
|
112 |
+
# Análise SPICT (questões 1-6)
|
113 |
+
spict_respostas = [s1, s2, s3, s4, s5, s6]
|
114 |
+
resultado_spict = analisar_spict(spict_respostas)
|
115 |
+
|
116 |
+
# Análise Zarit (questões 7-13)
|
117 |
+
zarit_respostas = [z1+1, z2+1, z3+1, z4+1, z5+1, z6+1, z7+1]
|
118 |
+
resultado_zarit = analisar_zarit(zarit_respostas)
|
119 |
+
|
120 |
+
# Análise NECPAL (questões 14-26)
|
121 |
+
necpal_respostas = [n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13]
|
122 |
+
resultado_necpal = analisar_necpal(necpal_respostas)
|
123 |
+
|
124 |
+
resultado_final = (
|
125 |
+
"<h3>Resultado da Escala SPICT</h3>"
|
126 |
+
f"{resultado_spict}<br><br>"
|
127 |
+
"<h3>Resultado da Escala Zarit</h3>"
|
128 |
+
f"{resultado_zarit}<br><br>"
|
129 |
+
"<h3>Resultado da Escala NECPAL</h3>"
|
130 |
+
f"{resultado_necpal}"
|
131 |
+
)
|
132 |
+
|
133 |
+
return resultado_final
|
134 |
+
|
135 |
+
|
136 |
+
with gr.Blocks() as demo:
|
137 |
+
gr.Markdown("# Ferramenta para Avaliação Completa (SPICT, Zarit, NECPAL)")
|
138 |
+
|
139 |
+
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.")
|
140 |
+
|
141 |
+
# Lista de perguntas
|
142 |
+
# 1-6 SPICT
|
143 |
+
perguntas_spict = [
|
144 |
+
"Internações hospitalares não programadas?",
|
145 |
+
"Capacidade funcional ruim ou em declínio (a pessoa passa na cama ou cadeira mais de 50% do dia)?",
|
146 |
+
"Dependência de outros para cuidados pessoais devido a problemas físicos/mentais (necessita maior suporte do cuidador)?",
|
147 |
+
"Perda de peso significativa nos últimos 3-6 meses e/ou baixo IMC?",
|
148 |
+
"Sintomas persistentes apesar do tratamento otimizado das condições de base?",
|
149 |
+
"A pessoa ou família solicita cuidados paliativos, interrupção/limitação do tratamento ou foco na qualidade de vida?"
|
150 |
+
]
|
151 |
+
|
152 |
+
# 7-13 Zarit
|
153 |
+
perguntas_zarit = [
|
154 |
+
"Sente que, por causa do tempo que utiliza com o seu familiar/doente, já não tem tempo suficiente para você mesmo?",
|
155 |
+
"Sente-se estressado/angustiado por ter que cuidar do seu familiar/doente e ao mesmo tempo ser responsável por outras tarefas?",
|
156 |
+
"Acha que a situação atual afeta a sua relação com amigos ou outros membros da família de forma negativa?",
|
157 |
+
"Sente-se exausto quando tem de estar junto do seu familiar/doente?",
|
158 |
+
"Sente que sua saúde tem sido afetada por ter que cuidar do seu familiar/doente?",
|
159 |
+
"Sente que tem perdido o controle da sua vida desde que a doença do seu familiar/doente se manifestou?",
|
160 |
+
"No geral, sente-se muito sobrecarregado por ter que cuidar do seu familiar/doente?"
|
161 |
+
]
|
162 |
+
|
163 |
+
# 14-26 NECPAL
|
164 |
+
perguntas_necpal = [
|
165 |
+
"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)",
|
166 |
+
"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?",
|
167 |
+
"Declínio nutricional: Perda de peso >10% nos últimos 6 meses.",
|
168 |
+
"Declínio funcional: Piora do Karnofsky ou Barthel >30%, ou perda de mais que duas Atividades Básicas da Vida Diária (ABVDs).",
|
169 |
+
"Declínio cognitivo: Perda ≥5 no Minimental ou ≥3 no Pfeiffer indicando deterioração cognitiva.",
|
170 |
+
"Dependência grave: Karnofsky <50 ou Barthel <20.",
|
171 |
+
"Síndromes geriátricas: Lesão por pressão, infecções de repetição, delirium, disfagia, quedas. ≥2 sintomas recorrentes/persistentes.",
|
172 |
+
"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.",
|
173 |
+
"Sofrimento emocional ou transtorno adaptativo grave: Detecção de mal-estar emocional (DME ≥9).",
|
174 |
+
"Vulnerabilidade social grave: Avaliação social e familiar indicando fragilidade social significativa.",
|
175 |
+
"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).",
|
176 |
+
"Uso de recursos: Mais que duas admissões urgentes (não programadas) em 6 meses, aumento da demanda de intervenções.",
|
177 |
+
"Indicadores específicos: Presença de condições avançadas que reforçam a complexidade do caso (Câncer, DPOC, ICC, etc.)."
|
178 |
+
]
|
179 |
+
|
180 |
+
perguntas = perguntas_spict + perguntas_zarit + perguntas_necpal
|
181 |
+
|
182 |
+
inputs = []
|
183 |
+
numero = 1
|
184 |
+
# 1-6: SPICT (0=Não, 1=Sim)
|
185 |
+
for p in perguntas_spict:
|
186 |
+
gr.Markdown(f"**{numero}. {p}**")
|
187 |
+
inputs.append(gr.Radio(choices=[0,1], label="Selecione: 0=Não, 1=Sim"))
|
188 |
+
numero += 1
|
189 |
+
|
190 |
+
# 7-13: Zarit (0-4, representando Nunca(0), Quase nunca(1), Às vezes(2), Frequentemente(3), Quase sempre(4))
|
191 |
+
for p in perguntas_zarit:
|
192 |
+
gr.Markdown(f"**{numero}. {p}**<br>(0 - Nunca, 1 - Quase nunca, 2 - Às vezes, 3 - Frequentemente, 4 - Quase sempre)")
|
193 |
+
inputs.append(gr.Slider(minimum=0, maximum=4, step=1))
|
194 |
+
numero += 1
|
195 |
+
|
196 |
+
|
197 |
+
# 14-26: NECPAL (0=Não, 1=Sim)
|
198 |
+
for p in perguntas_necpal:
|
199 |
+
gr.Markdown(f"**{numero}. {p}**")
|
200 |
+
inputs.append(gr.Radio(choices=[0,1], label="Selecione: 0=Não, 1=Sim"))
|
201 |
+
numero += 1
|
202 |
+
|
203 |
+
calcular_btn = gr.Button("Calcular Avaliação Completa")
|
204 |
+
resultado_output = gr.HTML()
|
205 |
+
|
206 |
+
calcular_btn.click(
|
207 |
+
interface_geral,
|
208 |
+
inputs,
|
209 |
+
resultado_output
|
210 |
+
)
|
211 |
+
|
212 |
+
demo.launch(share=True)
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
gradio==3.35.2 # Biblioteca usada para criar a interface
|
2 |
+
numpy # Pode ser usada indiretamente no projeto
|