lucas23padawan commited on
Commit
1a1e3df
1 Parent(s): 8082a14

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +212 -0
  2. 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