drguilhermeapolinario commited on
Commit
d81fa03
·
verified ·
1 Parent(s): a7cd097

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +1429 -0
app.py ADDED
@@ -0,0 +1,1429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import colorsys
2
+ from datetime import datetime
3
+
4
+ import pandas as pd
5
+ import plotly.express as px
6
+ import plotly.graph_objects as go
7
+ import pyperclip
8
+ import streamlit as st
9
+ from plotly.subplots import make_subplots
10
+ from streamlit_extras.add_vertical_space import add_vertical_space
11
+ from streamlit_extras.stylable_container import stylable_container
12
+ from streamlit_option_menu import option_menu
13
+
14
+ # Configuração da página
15
+ st.set_page_config(
16
+ page_title="Transtornos de Ansiedade - Guia Médico",
17
+ layout="wide",
18
+ page_icon=":brain:",
19
+ initial_sidebar_state="expanded",
20
+ )
21
+ @st.fragment
22
+ def apply_neumorphic_style():
23
+ """
24
+ Aplica estilos CSS para criar um tema neumórfico light na aplicação Streamlit.
25
+ Inclui estilos para elementos gerais, sidebar, sliders, e outros componentes específicos.
26
+ """
27
+ st.markdown(
28
+ """
29
+ <style>
30
+ /* Estilo geral neumórfico */
31
+ .neuromorphic {
32
+ background: #f0f0f0;
33
+ border-radius: 50px;
34
+ box-shadow: 20px 20px 60px #cccccc,
35
+ -20px -20px 60px #ffffff;
36
+ padding: 20px;
37
+ margin: 10px;
38
+ }
39
+ .stMetric {
40
+ background: #ffffff;
41
+ border-radius: 20px;
42
+ box-shadow: inset 5px 5px 10px #d9d9d9,
43
+ inset -5px -5px 10px #ffffff;
44
+ padding: 10px;
45
+ }
46
+ .stApp {
47
+ background-color: #e0e5ec;
48
+ }
49
+ .stButton>button {
50
+ color: #5a5a5a;
51
+ border-radius: 10px;
52
+ border: none;
53
+ padding: 10px 20px;
54
+ font-weight: bold;
55
+ box-shadow: 5px 5px 10px #b8b9be, -5px -5px 10px #ffffff;
56
+ }
57
+
58
+ /* Estilo para a sidebar neumórfica */
59
+ .neuromorphic-sidebar {
60
+ background: #f0f0f0;
61
+ border-radius: 20px;
62
+ box-shadow: 5px 5px 10px #cccccc,
63
+ -5px -5px 10px #ffffff;
64
+ padding: 20px;
65
+ margin: 10px;
66
+ }
67
+ .neuromorphic-sidebar .nav-link {
68
+ background: #f0f0f0;
69
+ border-radius: 10px;
70
+ box-shadow: 3px 3px 6px #cccccc,
71
+ -3px -3px 6px #ffffff;
72
+ margin-bottom: 10px;
73
+ transition: all 0.3s ease;
74
+ }
75
+ .neuromorphic-sidebar .nav-link:hover,
76
+ .neuromorphic-sidebar .nav-link.active {
77
+ background: #e0e0e0;
78
+ box-shadow: inset 3px 3px 6px #cccccc,
79
+ inset -3px -3px 6px #ffffff;
80
+ }
81
+ .neuromorphic-sidebar .nav-link-text {
82
+ font-weight: 500;
83
+ }
84
+
85
+ /* Estilos adicionais para sliders e containers */
86
+ .slider-container {
87
+ background: #81D0F9;
88
+ border-radius: 10px;
89
+ padding: 10px;
90
+ margin-bottom: 10px;
91
+ }
92
+ .slider-cont {
93
+ background: #8CCE90;
94
+ border-radius: 10px;
95
+ padding: 8px;
96
+ margin-bottom: 8px;
97
+ }
98
+ .stSlider {
99
+ padding-top: 1rem;
100
+ padding-bottom: 1rem;
101
+ }
102
+ .vertical-line {
103
+ border-left: 1px solid #cccccc;
104
+ height: 100%;
105
+ position: absolute;
106
+ left: 50%;
107
+ }
108
+
109
+ /* Estilo para imagens */
110
+ img {
111
+ width: 1800px;
112
+ height: 400px;
113
+ overflow: hidden;
114
+ position: relative;
115
+ object-fit: cover;
116
+ border-radius: 18px;
117
+ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
118
+ -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
119
+ }
120
+ </style>
121
+ """,
122
+ unsafe_allow_html=True,
123
+ )
124
+
125
+ # Aplicar o estilo
126
+ apply_neumorphic_style()
127
+
128
+
129
+ def copy_to_clipboard(text):
130
+ pyperclip.copy(text)
131
+
132
+
133
+ def create_copy_button(text, button_text="Copiar para o Prontuário"):
134
+ copy_button = st.button(button_text)
135
+ if copy_button:
136
+ copy_to_clipboard(text)
137
+ st.success("Texto copiado para a área de transferência!")
138
+
139
+
140
+ # Menu lateral
141
+ with st.sidebar:
142
+ st.markdown('<div class="neuromorphic-sidebar">', unsafe_allow_html=True)
143
+ selected = option_menu(
144
+ menu_title="Menu Principal",
145
+ options=[
146
+ "Home",
147
+ "Escalas de Ansiedade",
148
+ "Tratamentos",
149
+ "Efeitos Colaterais",
150
+ "Chatbot Dr. Karl",
151
+ ],
152
+ icons=[
153
+ "house",
154
+ "clipboard-check",
155
+ "capsule",
156
+ "exclamation-triangle",
157
+ "chat-dots",
158
+ ],
159
+ menu_icon="cast",
160
+ default_index=0,
161
+ styles={
162
+ "container": {"padding": "0!important", "background-color": "transparent"},
163
+ "icon": {"color": "#0066cc", "font-size": "18px"},
164
+ "nav-link": {
165
+ "font-size": "16px",
166
+ "text-align": "left",
167
+ "margin": "0px",
168
+ "--hover-color": "#e0e0e0",
169
+ },
170
+ "nav-link-selected": {"background-color": "#e0e0e0"},
171
+ },
172
+ )
173
+ st.markdown("</div>", unsafe_allow_html=True)
174
+
175
+
176
+
177
+ ###############################################################################################################
178
+ ###############################################################################################################
179
+ # Conteúdo principal baseado na seleção do menu
180
+ if selected == "Home":
181
+ st.title("Transtornos de Ansiedade - Dashboard")
182
+
183
+ @st.fragment
184
+ def prevalencia():
185
+ """
186
+ Função para calcular a prevalência de transtornos psiquiátricos
187
+ Gráfico de barras com a prevalência global, feminina e masculina
188
+ Estatísticas chave com a prevalência global, custo anual global e idade média de início
189
+ Informações adicionais sobre os transtornos psiquiátricos
190
+ """
191
+ # Dados das prevalências dos transtornos psiquiátricos
192
+ prevalence_data = {
193
+ "Transtorno": ["TAG", "Pânico", "Fobia Social", "TOC", "TEPT"],
194
+ "Prevalência Global (%)": [3.1, 2.7, 6.8, 1.2, 3.6],
195
+ "Prevalência Mulheres (%)": [4.2, 3.5, 8.2, 1.4, 5.3],
196
+ "Prevalência Homens (%)": [2.0, 1.8, 5.3, 1.0, 1.9],
197
+ }
198
+
199
+ # Criar gráfico
200
+ fig = go.Figure()
201
+
202
+ # Adicionar barras para cada categoria de prevalência
203
+ fig.add_trace(
204
+ go.Bar(
205
+ x=prevalence_data["Transtorno"],
206
+ y=prevalence_data["Prevalência Global (%)"],
207
+ name="Prevalência Global",
208
+ marker_color="rgba(54, 162, 235, 0.8)",
209
+ hoverinfo="text",
210
+ text=[f"{x}%" for x in prevalence_data["Prevalência Global (%)"]],
211
+ textposition="auto",
212
+ )
213
+ )
214
+
215
+ fig.add_trace(
216
+ go.Bar(
217
+ x=prevalence_data["Transtorno"],
218
+ y=prevalence_data["Prevalência Mulheres (%)"],
219
+ name="Prevalência Mulheres",
220
+ marker_color="rgba(255, 99, 132, 0.8)",
221
+ hoverinfo="text",
222
+ text=[f"{x}%" for x in prevalence_data["Prevalência Mulheres (%)"]],
223
+ textposition="auto",
224
+ )
225
+ )
226
+
227
+ fig.add_trace(
228
+ go.Bar(
229
+ x=prevalence_data["Transtorno"],
230
+ y=prevalence_data["Prevalência Homens (%)"],
231
+ name="Prevalência Homens",
232
+ marker_color="rgba(75, 192, 192, 0.8)",
233
+ hoverinfo="text",
234
+ text=[f"{x}%" for x in prevalence_data["Prevalência Homens (%)"]],
235
+ textposition="auto",
236
+ )
237
+ )
238
+
239
+ # Atualizar layout do gráfico
240
+ fig.update_layout(
241
+ title={
242
+ "text": "Prevalência de Transtornos Psiquiátricos",
243
+ "y": 0.95,
244
+ "x": 0.5,
245
+ "xanchor": "center",
246
+ "yanchor": "top",
247
+ },
248
+ barmode="group",
249
+ template="plotly_white",
250
+ xaxis_title="Transtorno",
251
+ yaxis_title="Prevalência (%)",
252
+ legend_title="Categorias",
253
+ font=dict(family="Arial", size=12),
254
+ margin=dict(l=50, r=50, t=80, b=50),
255
+ width=900,
256
+ height=600,
257
+ paper_bgcolor="#f0f0f0",
258
+ plot_bgcolor="#f0f0f0",
259
+ shapes=[
260
+ dict(
261
+ type="rect",
262
+ xref="paper",
263
+ yref="paper",
264
+ x0=0,
265
+ y0=0,
266
+ x1=1,
267
+ y1=1,
268
+ line=dict(color="#e0e0e0", width=2),
269
+ fillcolor="#f0f0f0",
270
+ layer="below",
271
+ )
272
+ ],
273
+ )
274
+
275
+ # Adicionar sombras para efeito neumórfico
276
+ fig.update_layout(
277
+ shapes=[
278
+ dict(
279
+ type="rect",
280
+ xref="paper",
281
+ yref="paper",
282
+ x0=-0.05,
283
+ y0=-0.05,
284
+ x1=1.05,
285
+ y1=1.05,
286
+ line=dict(color="#ffffff", width=5),
287
+ fillcolor="rgba(255,255,255,0)",
288
+ layer="below",
289
+ ),
290
+ dict(
291
+ type="rect",
292
+ xref="paper",
293
+ yref="paper",
294
+ x0=-0.05,
295
+ y0=-0.05,
296
+ x1=1.05,
297
+ y1=1.05,
298
+ line=dict(color="#d0d0d0", width=5),
299
+ fillcolor="rgba(255,255,255,0)",
300
+ layer="below",
301
+ ),
302
+ ]
303
+ )
304
+ # Configurar interatividade
305
+ fig.update_traces(
306
+ hovertemplate="<b>%{x}</b><br>%{y}%<extra></extra>",
307
+ hoverlabel=dict(bgcolor="white", font_size=12),
308
+ )
309
+ return st.plotly_chart(fig)
310
+
311
+ c1, c2, c3 = st.columns([3, 0.5, 3])
312
+ with c1:
313
+ prevalencia()
314
+ with c2:
315
+ st.write("")
316
+ with c3:
317
+ # Dados atualizados do estudo
318
+ st.markdown("<div class='neuromorphic'>", unsafe_allow_html=True)
319
+ col1, col2, col3 = st.columns(3)
320
+ with col1:
321
+ st.metric(
322
+ label="Prevalência Global",
323
+ value="3.8%",
324
+ delta="0.2%",
325
+ delta_color="normal",
326
+ )
327
+ with col2:
328
+ st.metric(label="Custo Anual Global", value="$1 Trilhão", delta="-")
329
+ with col3:
330
+ st.metric(label="Idade Média de Início", value="21-35 anos", delta="-")
331
+ st.markdown("</div>", unsafe_allow_html=True)
332
+
333
+ st.write("")
334
+
335
+ # Informações adicionais do estudo
336
+ st.markdown(
337
+ """
338
+ <div class='neuromorphic'>
339
+ <h3>Informações Adicionais:</h3>
340
+ <ul>
341
+ <li>Os transtornos de ansiedade afetam cerca de 301 milhões de pessoas globalmente.</li>
342
+ <li>A fobia social é o transtorno de ansiedade mais comum, com prevalência global de 6.8%.</li>
343
+ <li>Mulheres têm maior prevalência de transtornos de ansiedade comparado aos homens.</li>
344
+ <li>A prevalência varia significativamente entre diferentes regiões e países.</li>
345
+ </ul>
346
+ </div>
347
+ """,
348
+ unsafe_allow_html=True,
349
+ )
350
+
351
+ # Informações adicionais
352
+ st.info(
353
+ """
354
+ Fonte:
355
+ Javaid, S.F., Hashim, I.J., Hashim, M.J. et al. Epidemiology of anxiety disorders: global burden and sociodemographic
356
+ associations.Middle East Curr Psychiatry 30, 44 (2023).
357
+ Acesse: https://doi.org/10.1186/s43045-023-00315-3"""
358
+ )
359
+
360
+ ##################################################################################################
361
+
362
+ if selected == "Escalas de Ansiedade":
363
+
364
+ st.title("Escalas de Avaliação de Ansiedade")
365
+ # Usando option_menu para selecionar as escalas
366
+ scale_selected = option_menu(
367
+ menu_title=None,
368
+ options=["Escala de Hamilton (HAM-A)", "Escala GAD-7", "Inventário de Beck (BAI)"],
369
+ icons=["clipboard-check", "list-check", "clipboard-pulse"], # Você pode escolher ícones apropriados
370
+ menu_icon="cast",
371
+ default_index=0,
372
+ orientation="horizontal",
373
+ styles={
374
+ "container": {"padding": "0!important", "background-color": "transparent"},
375
+ "icon": {"color": "#0066cc", "font-size": "18px"},
376
+ "nav-link": {
377
+ "font-size": "16px",
378
+ "text-align": "center",
379
+ "margin": "0px",
380
+ "--hover-color": "#e0e0e0",
381
+ },
382
+ "nav-link-selected": {"background-color": "#e0e0e0"},
383
+ },
384
+ )
385
+
386
+ if scale_selected == "Escala de Hamilton (HAM-A)":
387
+ st.title(":blue[Guia de Diagnóstico Interativo] :stethoscope:")
388
+ st.write("##### :notebook: Escala de Ansiedade de Hamilton (HAM-A)")
389
+
390
+ st.divider()
391
+ add_vertical_space(2)
392
+ # Divisão em três colunas
393
+ col1, col_divider, col2 = st.columns([3, 0.5, 3])
394
+
395
+ with col1:
396
+ st.write("Intensidade dos sintomas nas últimas semanas :calendar:")
397
+ # Campos para nome e data
398
+ cx1, cx2 = st.columns(2)
399
+ with cx1:
400
+ nome = st.text_input("Nome da Pessoa:")
401
+ with cx2:
402
+ data = st.date_input("Data:", datetime.now(), format="DD/MM/YYYY")
403
+
404
+ # Itens da Escala de Ansiedade de Hamilton
405
+ ham_a_items = [
406
+ "Humor ansioso",
407
+ "Tensão",
408
+ "Medos",
409
+ "Insônia",
410
+ "Dificuldades intelectuais",
411
+ "Humor deprimido",
412
+ "Sintomas somáticos gerais (musculares)",
413
+ "Sintomas somáticos gerais (sensoriais)",
414
+ "Sintomas cardiovasculares",
415
+ "Sintomas respiratórios",
416
+ "Sintomas gastrointestinais",
417
+ "Sintomas gênito-urinários",
418
+ "Sintomas autonômicos",
419
+ "Comportamento na entrevista",
420
+ ]
421
+
422
+ add_vertical_space(2)
423
+ st.divider()
424
+
425
+ # Dicionário para armazenar as respostas
426
+ responses = {}
427
+ # Criar o questionário em duas colunas
428
+ subcol1, subcol2 = st.columns(2)
429
+ for i, item in enumerate(ham_a_items):
430
+ with subcol1 if i % 2 == 0 else subcol2:
431
+ st.markdown('<div class="slider-container">', unsafe_allow_html=True)
432
+ responses[item] = st.select_slider(
433
+ item,
434
+ options=["Ausente", "Leve", "Moderado", "Grave", "Muito grave"],
435
+ value="Ausente",
436
+ )
437
+ st.markdown("</div>", unsafe_allow_html=True)
438
+
439
+ with col_divider:
440
+ st.markdown('')
441
+
442
+ with col2:
443
+
444
+ st.image("psiq1.jpg")
445
+ st.subheader("Resultado")
446
+
447
+ # Botão para calcular o resultado
448
+ if st.button(
449
+ "Calcular Resultado",
450
+ key="ham_calculate_button",
451
+ help="Clique para calcular o resultado",
452
+ ):
453
+ # Converter respostas para pontuação numérica
454
+ score_map = {
455
+ "Ausente": 0,
456
+ "Leve": 1,
457
+ "Moderado": 2,
458
+ "Grave": 3,
459
+ "Muito grave": 4,
460
+ }
461
+ total_score = sum(score_map[resp] for resp in responses.values())
462
+
463
+ # Interpretação do resultado
464
+ if total_score < 17:
465
+ severity = "Ansiedade leve"
466
+ elif 18 <= total_score <= 24:
467
+ severity = "Ansiedade moderada"
468
+ elif 25 <= total_score <= 30:
469
+ severity = "Ansiedade grave"
470
+ else:
471
+ severity = "Ansiedade muito grave"
472
+
473
+ # Exibir resultado
474
+ st.success(f"Pontuação total: {total_score}")
475
+ st.info(f"Interpretação: {severity}")
476
+
477
+ result_ham = {}
478
+ # Texto para copiar
479
+ result_ham = (
480
+ f"Nome da Pessoa: {nome}\n"
481
+ f"Data: {data.strftime('%d/%m/%Y')}\n"
482
+ f"Escala de Ansiedade de Hamilton (HAM-A)\n"
483
+ f"Pontuação total: {total_score}\n"
484
+ f"Interpretação: {severity}"
485
+ )
486
+
487
+ st.text_area("## Resultado detalhado:", value=result_ham, height=200, key="ham_result_text")
488
+
489
+ if result_ham is not None:
490
+ st.button("Copiar",key="ham_copy_button", on_click=copy_to_clipboard(result_ham))
491
+
492
+ # Informações adicionais sobre a escala
493
+ st.markdown('<div class="slider-cont">', unsafe_allow_html=True)
494
+ with st.expander("Mais informações sobre a Escala de Ansiedade de Hamilton"):
495
+ st.write(
496
+ """
497
+ A Escala de Ansiedade de Hamilton (HAM-A) é uma das escalas de avaliação de ansiedade mais amplamente utilizadas em contextos clínicos e de pesquisa. Desenvolvida por Max Hamilton em 1959, ela avalia a gravidade dos sintomas de ansiedade.
498
+
499
+ **Pontos importantes:**
500
+ - A escala consiste em 14 itens, cada um avaliado de 0 (não presente) a 4 (muito grave).
501
+ - A pontuação total varia de 0 a 56.
502
+ - É particularmente útil para avaliar a gravidade do Transtorno de Ansiedade Generalizada (TAG).
503
+ - A escala avalia tanto sintomas psíquicos quanto somáticos da ansiedade.
504
+
505
+ **Limitações:**
506
+ - Não é uma ferramenta diagnóstica, mas sim uma medida de gravidade.
507
+ - Pode ser influenciada por sintomas depressivos coexistentes.
508
+ - Requer treinamento para administração adequada em contextos clínicos.
509
+
510
+ Sempre consulte um profissional de saúde mental para interpretação adequada dos resultados e diagnóstico.
511
+ """
512
+ )
513
+ st.markdown("</div>", unsafe_allow_html=True)
514
+ st.warning(
515
+ """
516
+ Nota:\n
517
+ Esta escala é uma ferramenta de triagem e não substitui uma avaliação clínica completa.\n
518
+ Um diagnóstico preciso requer avaliação por um profissional de saúde qualificado."""
519
+ )
520
+
521
+ st.markdown('<div class="neuromorphic">', unsafe_allow_html=True)
522
+ st.markdown("</div>", unsafe_allow_html=True)
523
+
524
+ elif scale_selected == "Escala GAD-7":
525
+ st.title(":blue[Escala GAD-7] :stethoscope:")
526
+
527
+ st.divider()
528
+ add_vertical_space(2)
529
+ # Divisão em três colunas
530
+ col1, col_divider, col2 = st.columns([3, 0.5, 3])
531
+
532
+ with col1:
533
+ st.write("Intensidade dos sintomas nas últimas duas semanas :calendar:")
534
+ # Campos para nome e data
535
+ cx1, cx2 = st.columns(2)
536
+ with cx1:
537
+ nome = st.text_input("Nome da Pessoa:", key="gad7_nome")
538
+ with cx2:
539
+ data = st.date_input("Data:", datetime.now(), format="DD/MM/YYYY", key="gad7_data")
540
+
541
+ # Função para calcular os resultados do GAD-7
542
+ def gad7_calculate(responses):
543
+ score = sum(responses.values())
544
+ if score < 5:
545
+ severity = "Ansiedade mínima"
546
+ elif 5 <= score < 10:
547
+ severity = "Ansiedade leve"
548
+ elif 10 <= score < 15:
549
+ severity = "Ansiedade moderada"
550
+ else:
551
+ severity = "Ansiedade severa"
552
+ return score, severity
553
+
554
+ # Questionário GAD-7
555
+ gad7_items = [
556
+ "Sentir-se nervoso, ansioso ou muito tenso",
557
+ "Não ser capaz de impedir ou de controlar as preocupações",
558
+ "Preocupar-se muito com diversas coisas",
559
+ "Dificuldade para relaxar",
560
+ "Ficar tão agitado que se torna difícil permanecer sentado",
561
+ "Ficar facilmente aborrecido ou irritado",
562
+ "Sentir medo como se algo terrível fosse acontecer"
563
+ ]
564
+
565
+ add_vertical_space(2)
566
+ st.divider()
567
+ # Dicionário para armazenar as respostas
568
+ responses = {}
569
+ # Criar o questionário em duas colunas
570
+ subcol1, subcol2 = st.columns(2)
571
+ for i, item in enumerate(gad7_items):
572
+ with subcol1 if i % 2 == 0 else subcol2:
573
+ st.markdown('<div class="slider-container">', unsafe_allow_html=True)
574
+ responses[item] = st.select_slider(
575
+ item,
576
+ options=["Nenhuma vez", "Vários dias", "Mais da metade dos dias", "Quase todos os dias"],
577
+ value="Nenhuma vez",
578
+ key=f"gad7_{i}"
579
+ )
580
+ st.markdown("</div>", unsafe_allow_html=True)
581
+
582
+ with col_divider:
583
+ st.markdown('')
584
+
585
+ with col2:
586
+ st.image("psiq1.jpg") # Você pode querer substituir esta imagem por uma específica para GAD-7
587
+
588
+ st.subheader("Resultado")
589
+
590
+ # Botão para calcular o resultado
591
+ if st.button(
592
+ "Calcular Resultado",
593
+ key="gad7_calculate_button",
594
+ help="Clique para calcular o resultado",
595
+ ):
596
+ score_map = {"Nenhuma vez": 0, "Vários dias": 1, "Mais da metade dos dias": 2, "Quase todos os dias": 3}
597
+ numeric_responses = {k: score_map[v] for k, v in responses.items()}
598
+ total_score, severity = gad7_calculate(numeric_responses)
599
+
600
+ result_gad7 = {}
601
+ # Texto para copiar
602
+ result_gad7 = (
603
+ f"Nome: {nome}\n"
604
+ f"Data: {data.strftime('%d/%m/%Y')}\n"
605
+ f"Escala GAD-7\n"
606
+ f"Pontuação total: {total_score}\n"
607
+ f"Interpretação: {severity}"
608
+ )
609
+
610
+ st.text_area("## Resultado detalhado:", value=result_gad7, height=200, key="gad7_result_text")
611
+
612
+ if result_gad7 is not None:
613
+ st.button("Copiar", key="gad7_copy_button", on_click=copy_to_clipboard(result_gad7))
614
+
615
+
616
+ # Informações adicionais sobre a escala
617
+ st.markdown('<div class="slider-cont">', unsafe_allow_html=True)
618
+ with st.expander("Mais informações sobre a Escala GAD-7"):
619
+ st.write(
620
+ """
621
+ A Escala de Transtorno de Ansiedade Generalizada (GAD-7) é um instrumento de triagem para ansiedade generalizada. Desenvolvida por Spitzer et al. em 2006, é amplamente utilizada na prática clínica e em pesquisas.
622
+
623
+ **Pontos importantes:**
624
+ - A escala consiste em 7 itens, cada um avaliado de 0 (não apresentou) a 3 (quase todos os dias).
625
+ - A pontuação total varia de 0 a 21.
626
+ - É uma ferramenta eficaz para avaliar a gravidade dos sintomas de ansiedade generalizada.
627
+ - Pode ser usada para monitorar a resposta ao tratamento ao longo do tempo.
628
+
629
+ **Interpretação dos resultados:**
630
+ - 0-4: Ansiedade mínima
631
+ - 5-9: Ansiedade leve
632
+ - 10-14: Ansiedade moderada
633
+ - 15-21: Ansiedade severa
634
+
635
+ **Limitações:**
636
+ - Não é uma ferramenta diagnóstica definitiva, mas um instrumento de triagem.
637
+ - Deve ser usado em conjunto com avaliação clínica para diagnóstico preciso.
638
+
639
+ Sempre consulte um profissional de saúde mental para interpretação adequada dos resultados e diagnóstico.
640
+ """
641
+ )
642
+ st.markdown("</div>", unsafe_allow_html=True)
643
+ st.warning(
644
+ """
645
+ Nota:\n
646
+ Esta escala é uma ferramenta de triagem e não substitui uma avaliação clínica completa.\n
647
+ Um diagnóstico preciso requer avaliação por um profissional de saúde qualificado."""
648
+ )
649
+
650
+ st.markdown('<div class="neuromorphic">', unsafe_allow_html=True)
651
+ st.markdown("</div>", unsafe_allow_html=True)
652
+
653
+ elif scale_selected == "Inventário de Beck (BAI)":
654
+ st.title(":blue[Inventário de Beck (BAI)] :stethoscope:")
655
+
656
+ st.divider()
657
+ add_vertical_space(2)
658
+ # Divisão em três colunas
659
+ col1, col_divider, col2 = st.columns([3, 0.5, 3])
660
+
661
+ with col1:
662
+ st.write("Intensidade dos sintomas na última semana :calendar:")
663
+ # Campos para nome e data
664
+ cx1, cx2 = st.columns(2)
665
+ with cx1:
666
+ nome = st.text_input("Nome da Pessoa:", key="bai_nome")
667
+ with cx2:
668
+ data = st.date_input("Data:", datetime.now(), format="DD/MM/YYYY", key="bai_data")
669
+
670
+ # Função para calcular os resultados do BAI
671
+ def bai_calculate(responses):
672
+ score = sum(responses.values())
673
+ if score <= 7:
674
+ severity = "Ansiedade mínima"
675
+ elif 8 <= score <= 15:
676
+ severity = "Ansiedade leve"
677
+ elif 16 <= score <= 25:
678
+ severity = "Ansiedade moderada"
679
+ else:
680
+ severity = "Ansiedade grave"
681
+ return score, severity
682
+
683
+ bai_items = [
684
+ "Dormência ou formigamento",
685
+ "Sensação de calor",
686
+ "Tremores nas pernas",
687
+ "Incapaz de relaxar",
688
+ "Medo que aconteça o pior",
689
+ "Atordoado ou tonto",
690
+ "Palpitação ou aceleração do coração",
691
+ "Sem equilíbrio",
692
+ "Aterrorizado",
693
+ "Nervoso",
694
+ "Sensação de sufocação",
695
+ "Tremores nas mãos",
696
+ "Trêmulo",
697
+ "Medo de perder o controle",
698
+ "Dificuldade de respirar",
699
+ "Medo de morrer",
700
+ "Assustado",
701
+ "Indigestão ou desconforto no abdômen",
702
+ "Sensação de desmaio",
703
+ "Rosto afogueado",
704
+ "Suor (não devido ao calor)"
705
+ ]
706
+
707
+ add_vertical_space(2)
708
+ st.divider()
709
+
710
+ # Dicionário para armazenar as respostas
711
+ responses = {}
712
+ # Criar o questionário em duas colunas
713
+ subcol1, subcol2 = st.columns(2)
714
+ for i, item in enumerate(bai_items):
715
+ with subcol1 if i % 2 == 0 else subcol2:
716
+ st.markdown('<div class="slider-container">', unsafe_allow_html=True)
717
+ responses[item] = st.select_slider(
718
+ item,
719
+ options=["Absolutamente não", "Levemente", "Moderadamente", "Gravemente"],
720
+ value="Absolutamente não",
721
+ key=f"bai_{i}"
722
+ )
723
+ st.markdown("</div>", unsafe_allow_html=True)
724
+
725
+ with col_divider:
726
+ st.markdown('')
727
+
728
+ with col2:
729
+ st.image("psiq1.jpg")
730
+ st.subheader("Resultado")
731
+
732
+ # Botão para calcular o resultado
733
+ if st.button(
734
+ "Calcular Resultado",
735
+ key="bai_calculate_button",
736
+ help="Clique para calcular o resultado",
737
+ ):
738
+ score_map = {"Absolutamente não": 0, "Levemente": 1, "Moderadamente": 2, "Gravemente": 3}
739
+ numeric_responses = {k: score_map[v] for k, v in responses.items()}
740
+ total_score, severity = bai_calculate(numeric_responses)
741
+
742
+
743
+ result_bai = {}
744
+ # Texto para copiar
745
+ result_bai = (
746
+ f"Nome: {nome}\n"
747
+ f"Data: {data.strftime('%d/%m/%Y')}\n"
748
+ f"Escala de Ansiedade de Hamilton (HAM-A)\n"
749
+ f"Pontuação total: {total_score}\n"
750
+ f"Interpretação: {severity}"
751
+ )
752
+
753
+ st.text_area("## Resultado detalhado:", value=result_bai, height=200, key="bai_result_text")
754
+
755
+ if result_bai is not None:
756
+ st.button("Copiar", key="bai_copy_button", on_click=copy_to_clipboard(result_bai))
757
+
758
+ # Informações adicionais sobre a escala
759
+ st.markdown('<div class="slider-cont">', unsafe_allow_html=True)
760
+ with st.expander("Mais informações sobre o Inventário de Ansiedade de Beck (BAI)"):
761
+ st.write(
762
+ """
763
+ O Inventário de Ansiedade de Beck (BAI) é uma escala de auto-relato amplamente utilizada para medir a severidade da ansiedade em adolescentes e adultos. Desenvolvido por Aaron T. Beck e colegas, o BAI foi publicado em 1988 e desde então tem sido uma ferramenta valiosa na avaliação clínica e na pesquisa.
764
+
765
+ **Pontos importantes:**
766
+ - O BAI consiste em 21 itens, cada um descrevendo um sintoma comum de ansiedade.
767
+ - Cada item é avaliado em uma escala de 4 pontos, variando de 0 (não apresentou) a 3 (gravemente).
768
+ - A pontuação total varia de 0 a 63.
769
+ - O BAI foi projetado para minimizar a sobreposição com sintomas depressivos.
770
+
771
+ **Interpretação dos resultados:**
772
+ - 0-7: Ansiedade mínima
773
+ - 8-15: Ansiedade leve
774
+ - 16-25: Ansiedade moderada
775
+ - 26-63: Ansiedade grave
776
+
777
+ **Aplicações:**
778
+ - Avaliação da severidade dos sintomas de ansiedade em contextos clínicos.
779
+ - Monitoramento da resposta ao tratamento ao longo do tempo.
780
+ - Ferramenta de triagem em pesquisas sobre ansiedade.
781
+
782
+ **Limitações:**
783
+ - Como todas as escalas de auto-relato, as respostas podem ser influenciadas pela subjetividade do respondente.
784
+ - Não é um instrumento diagnóstico, mas uma medida de severidade dos sintomas.
785
+ - Pode não capturar todos os aspectos da ansiedade, especialmente os cognitivos.
786
+
787
+ Sempre consulte um profissional de saúde mental para interpretação adequada dos resultados e diagnóstico.
788
+ """
789
+ )
790
+ st.markdown("</div>", unsafe_allow_html=True)
791
+ st.warning(
792
+ """
793
+ Nota:\n
794
+ Este inventário é uma ferramenta de avaliação e não substitui uma avaliação clínica completa.\n
795
+ Um diagnóstico preciso requer avaliação por um profissional de saúde qualificado."""
796
+ )
797
+
798
+ st.markdown('<div class="neuromorphic">', unsafe_allow_html=True)
799
+ st.markdown("</div>", unsafe_allow_html=True)
800
+
801
+
802
+ ##########################################################################################################################
803
+ ##########################################################################################################################
804
+
805
+ elif selected == "Tratamentos":
806
+ st.title("Opções de Tratamento Farmacológico")
807
+
808
+ st.write("### ")
809
+
810
+ # Dados dos tratamentos
811
+ treatments = {
812
+ "ISRSs": {
813
+ "Descrição": "Inibidores Seletivos da Recaptação de Serotonina. Primeira linha de tratamento para a maioria dos transtornos de ansiedade.",
814
+ "Medicamentos": {
815
+ "Sertralina": {
816
+ "Dose inicial": "25-50 mg/dia",
817
+ "Dose máxima": "200 mg/dia",
818
+ "Meia-vida": "26 horas",
819
+ },
820
+ "Escitalopram": {
821
+ "Dose inicial": "10 mg/dia",
822
+ "Dose máxima": "20 mg/dia",
823
+ "Meia-vida": "27-32 horas",
824
+ },
825
+ "Fluoxetina": {
826
+ "Dose inicial": "10-20 mg/dia",
827
+ "Dose máxima": "60 mg/dia",
828
+ "Meia-vida": "1-4 dias (norfluoxetina: 7-15 dias)",
829
+ },
830
+ "Fluvoxamina": {
831
+ "Dose inicial": "50-100 mg/dia",
832
+ "Dose máxima": "300 mg/dia",
833
+ "Meia-vida": "9-28 horas",
834
+ },
835
+ "Citalopram": {
836
+ "Dose inicial": "10-20 mg/dia",
837
+ "Dose máxima": "60 mg/dia",
838
+ "Meia-vida": "35 horas",
839
+ },
840
+ "Paroxetina": {
841
+ "Dose inicial": "10-20 mg/dia",
842
+ "Dose máxima": "60 mg/dia",
843
+ "Meia-vida": "21 horas",
844
+ },
845
+ "Vilazodona": {
846
+ "Dose inicial": "10 mg/dia",
847
+ "Dose máxima": "40 mg/dia",
848
+ "Meia-vida": "25 horas",
849
+ },
850
+ "Vortioxetina": {
851
+ "Dose inicial": "10 mg/dia",
852
+ "Dose máxima": "20 mg/dia",
853
+ "Meia-vida": "66 horas",
854
+ },
855
+ },
856
+ },
857
+ "IRSNs": {
858
+ "Descrição": "Inibidores da Recaptação de Serotonina e Noradrenalina. Eficazes em casos resistentes aos ISRSs.",
859
+ "Medicamentos": {
860
+ "Venlafaxina": {
861
+ "Dose inicial": "37,5-75 mg/dia",
862
+ "Dose máxima": "225 mg/dia",
863
+ "Meia-vida": "5 horas",
864
+ },
865
+ "Desvenlafaxina": {
866
+ "Dose inicial": "25-50 mg/dia",
867
+ "Dose máxima": "200 mg/dia",
868
+ "Meia-vida": "11 horas",
869
+ },
870
+ "Duloxetina": {
871
+ "Dose inicial": "30 mg/dia",
872
+ "Dose máxima": "120 mg/dia",
873
+ "Meia-vida": "12 horas",
874
+ },
875
+ },
876
+ },
877
+ "Tricíclicos": {
878
+ "Descrição": "Antidepressivos tricíclicos. Eficazes, mas com mais efeitos colaterais que ISRSs e IRSNs.",
879
+ "Medicamentos": {
880
+ "Amitriptilina": {
881
+ "Dose inicial": "25-50 mg/dia",
882
+ "Dose máxima": "300 mg/dia",
883
+ "Meia-vida": "10-50 horas",
884
+ },
885
+ "Nortriptilina": {
886
+ "Dose inicial": "25 mg/dia",
887
+ "Dose máxima": "150 mg/dia",
888
+ "Meia-vida": "18-44 horas",
889
+ },
890
+ "Imipramina": {
891
+ "Dose inicial": "25-50 mg/dia",
892
+ "Dose máxima": "300 mg/dia",
893
+ "Meia-vida": "8-20 horas",
894
+ },
895
+ "Desipramina": {
896
+ "Dose inicial": "25-50 mg/dia",
897
+ "Dose máxima": "300 mg/dia",
898
+ "Meia-vida": "12-24 horas",
899
+ },
900
+ "Clomipramina": {
901
+ "Dose inicial": "25 mg/dia",
902
+ "Dose máxima": "250 mg/dia",
903
+ "Meia-vida": "19-37 horas",
904
+ },
905
+ "Doxepina": {
906
+ "Dose inicial": "25-50 mg/dia",
907
+ "Dose máxima": "300 mg/dia",
908
+ "Meia-vida": "8-24 horas",
909
+ },
910
+ "Trimipramina": {
911
+ "Dose inicial": "25-50 mg/dia",
912
+ "Dose máxima": "300 mg/dia",
913
+ "Meia-vida": "20-24 horas",
914
+ },
915
+ "Protriptilina": {
916
+ "Dose inicial": "10-20 mg/dia",
917
+ "Dose máxima": "60 mg/dia",
918
+ "Meia-vida": "67-89 horas",
919
+ },
920
+ },
921
+ },
922
+ "Benzodiazepínicos": {
923
+ "Descrição": "Uso de curto prazo devido ao risco de dependência. Eficazes para alívio rápido de sintomas.",
924
+ "Medicamentos": {
925
+ "Alprazolam": {
926
+ "Dose inicial": "0.25-0.5 mg 2-3x/dia",
927
+ "Dose máxima": "4 mg/dia",
928
+ "Meia-vida": "6-27 horas",
929
+ },
930
+ "Clonazepam": {
931
+ "Dose inicial": "0.25 mg 2x/dia",
932
+ "Dose máxima": "4 mg/dia",
933
+ "Meia-vida": "18-50 horas",
934
+ },
935
+ "Diazepam": {
936
+ "Dose inicial": "2-10 mg 2-4x/dia",
937
+ "Dose máxima": "40 mg/dia",
938
+ "Meia-vida": "20-50 horas",
939
+ },
940
+ "Lorazepam": {
941
+ "Dose inicial": "1-3 mg 2-3x/dia",
942
+ "Dose máxima": "10 mg/dia",
943
+ "Meia-vida": "10-20 horas",
944
+ },
945
+ "Bromazepam": {
946
+ "Dose inicial": "1.5-3 mg 2-3x/dia",
947
+ "Dose máxima": "6-12 mg/dia",
948
+ "Meia-vida": "10-20 horas",
949
+ },
950
+ "Clobazam": {
951
+ "Dose inicial": "10 mg/dia",
952
+ "Dose máxima": "30 mg/dia",
953
+ "Meia-vida": "18-42 horas",
954
+ },
955
+ "Temazepam": {
956
+ "Dose inicial": "7.5-15 mg ao deitar",
957
+ "Dose máxima": "30 mg/dia",
958
+ "Meia-vida": "8-22 horas",
959
+ },
960
+ "Triazolam": {
961
+ "Dose inicial": "0.125-0.25 mg ao deitar",
962
+ "Dose máxima": "0.5 mg/dia",
963
+ "Meia-vida": "1.5-5.5 horas",
964
+ },
965
+ "Midazolam": {
966
+ "Dose inicial": "1-2 mg (pré-operatório)",
967
+ "Dose máxima": "10 mg/dia",
968
+ "Meia-vida": "1.5-2.5 horas",
969
+ },
970
+ "Oxazepam": {
971
+ "Dose inicial": "10-15 mg 3-4x/dia",
972
+ "Dose máxima": "120 mg/dia",
973
+ "Meia-vida": "5-15 horas",
974
+ },
975
+ "Chlordiazepoxide": {
976
+ "Dose inicial": "5-10 mg 3-4x/dia",
977
+ "Dose máxima": "100 mg/dia",
978
+ "Meia-vida": "5-30 horas",
979
+ },
980
+ "Flurazepam": {
981
+ "Dose inicial": "15-30 mg ao deitar",
982
+ "Dose máxima": "30 mg/dia",
983
+ "Meia-vida": "40-250 horas",
984
+ },
985
+ },
986
+ },
987
+ "Outros": {
988
+ "Descrição": "Medicamentos alternativos ou adjuvantes para tratamento de ansiedade.",
989
+ "Medicamentos": {
990
+ "Mirtazapina": {
991
+ "Dose inicial": "15 mg/dia",
992
+ "Dose máxima": "45 mg/dia",
993
+ "Meia-vida": "20-40 horas",
994
+ },
995
+ "Bupropiona": {
996
+ "Dose inicial": "150 mg/dia",
997
+ "Dose máxima": "450 mg/dia",
998
+ "Meia-vida": "21 horas",
999
+ },
1000
+ "Trazodona": {
1001
+ "Dose inicial": "50 mg/dia",
1002
+ "Dose máxima": "400 mg/dia (ambulatorial) / 600 mg/dia (hospitalar)",
1003
+ "Meia-vida": "7-13 horas",
1004
+ },
1005
+ "Buspirona": {
1006
+ "Dose inicial": "7.5 mg duas vezes ao dia",
1007
+ "Dose máxima": "60 mg/dia",
1008
+ "Meia-vida": "2-3 horas",
1009
+ },
1010
+ "Hidroxizina": {
1011
+ "Dose inicial": "25-50 mg/dia",
1012
+ "Dose máxima": "400 mg/dia",
1013
+ "Meia-vida": "3-20 horas",
1014
+ },
1015
+ "Pregabalina": {
1016
+ "Dose inicial": "150 mg/dia",
1017
+ "Dose máxima": "600 mg/dia",
1018
+ "Meia-vida": "6.3 horas",
1019
+ },
1020
+ },
1021
+ },
1022
+ }
1023
+
1024
+
1025
+ # Função para gerar cores baseadas no valor
1026
+ def get_color(value, min_value, max_value):
1027
+ normalized = (value - min_value) / (max_value - min_value) if max_value > min_value else 0
1028
+ hue = (1 - normalized) * 0.7
1029
+ rgb = colorsys.hsv_to_rgb(hue, 0.8, 0.9)
1030
+ return f'rgb({int(rgb[0]*255)},{int(rgb[1]*255)},{int(rgb[2]*255)})'
1031
+
1032
+ # Função para extrair valor numérico da meia-vida
1033
+ def extract_numeric_value(meia_vida_str):
1034
+ try:
1035
+ return float(meia_vida_str.split()[0].split("-")[0])
1036
+ except (ValueError, IndexError):
1037
+ return None
1038
+
1039
+ col1, col2, col3, col4, col5 = st.columns([1, 3, 0.5, 3, 1])
1040
+ with col1:
1041
+ selected_class = st.selectbox(
1042
+ " :pill: Classe de medicamentos:", list(treatments.keys())
1043
+ )
1044
+
1045
+ with col2:
1046
+ if selected_class:
1047
+ st.subheader(selected_class)
1048
+ st.write(treatments[selected_class]["Descrição"])
1049
+
1050
+ with col3:
1051
+ st.write("")
1052
+
1053
+ with col4:
1054
+ st.write("")
1055
+
1056
+ # with col5:
1057
+ # st.write('')
1058
+
1059
+ # Tabela de medicamentos
1060
+ data = []
1061
+ for med, info in treatments[selected_class]["Medicamentos"].items():
1062
+ row = [
1063
+ med,
1064
+ info.get("Dose inicial", "N/A"),
1065
+ info.get("Dose máxima", "N/A"),
1066
+ info.get("Meia-vida", "N/A"),
1067
+ ]
1068
+ data.append(row)
1069
+
1070
+ columns = ["Medicamento", "Dose Inicial", "Dose Máxima", "Meia-vida"]
1071
+
1072
+ cs1,cs2 = st.columns(2)
1073
+ with cs1:
1074
+ st.write(
1075
+ pd.DataFrame(data, columns=columns).to_html(index=False), unsafe_allow_html=True
1076
+ )
1077
+
1078
+ with cs2:
1079
+ # Considerações especiais
1080
+ st.subheader("Considerações Especiais")
1081
+
1082
+ cj1,cj2,cj3 = st.columns([1,1,1])
1083
+ with cj1:
1084
+ with st.expander("Gestantes", expanded=False, icon="🤰"):
1085
+ st.info(
1086
+ "A American College of Obstetricians and Gynecologists (ACOG) recomenda ISRSs como primeira linha para ansiedade perinatal, com sertralina e escitalopram sendo opções preferenciais."
1087
+ )
1088
+ with cj2:
1089
+ with st.expander("Crianças e Adolescentes", expanded=False, icon="🧒"):
1090
+ st.info(
1091
+ "A American Academy of Child and Adolescent Psychiatry recomenda ISRSs como primeira linha para crianças e adolescentes."
1092
+ )
1093
+ with cj3:
1094
+ with st.expander("Idosos", expanded=False, icon="👴"):
1095
+ st.info(
1096
+ "A AGS recomenda ISRSs como primeira linha para ansiedade em idosos, com sertralina e escitalopram sendo opções preferenciais."
1097
+ )
1098
+
1099
+ st.warning(
1100
+ "Essas dosagens são ajustadas com base na resposta clínica e tolerabilidade do paciente. O monitoramento contínuo é essencial para otimizar o tratamento e minimizar efeitos adversos."
1101
+ )
1102
+
1103
+
1104
+
1105
+ # Gráfico de meia-vida
1106
+ st.subheader(f"Meia-vida dos {selected_class}")
1107
+
1108
+ meia_vidas = {}
1109
+ for med, info in treatments[selected_class]["Medicamentos"].items():
1110
+ meia_vida = info.get("Meia-vida", "N/A")
1111
+ if meia_vida != "N/A":
1112
+ meia_vida_num = extract_numeric_value(meia_vida)
1113
+ if meia_vida_num is not None:
1114
+ meia_vidas[med] = meia_vida_num
1115
+
1116
+ if meia_vidas:
1117
+ medicamentos = list(meia_vidas.keys())
1118
+ valores = list(meia_vidas.values())
1119
+ min_valor = min(valores)
1120
+ max_valor = max(valores)
1121
+ cores = [get_color(valor, min_valor, max_valor) for valor in valores]
1122
+
1123
+ fig = go.Figure()
1124
+
1125
+ fig.add_trace(
1126
+ go.Bar(
1127
+ x=medicamentos,
1128
+ y=valores,
1129
+ marker_color=cores,
1130
+ text=[f"{valor:.2f}" for valor in valores],
1131
+ textposition='auto',
1132
+ )
1133
+ )
1134
+
1135
+ fig.update_layout(
1136
+ title=f'Comparação da Meia-vida dos {selected_class}',
1137
+ plot_bgcolor='rgba(240,240,240,1)',
1138
+ paper_bgcolor='rgba(240,240,240,1)',
1139
+ font_color='#444',
1140
+ title_font_color='#444',
1141
+ height=600,
1142
+ margin=dict(t=100, b=50, l=50, r=50),
1143
+ xaxis=dict(
1144
+ title='Medicamento',
1145
+ tickangle=45,
1146
+ tickfont=dict(size=10),
1147
+ gridcolor='white'
1148
+ ),
1149
+ yaxis=dict(
1150
+ title='Meia-vida (horas)',
1151
+ gridcolor='white'
1152
+ ),
1153
+ )
1154
+
1155
+ fig.update_traces(
1156
+ marker=dict(
1157
+ line=dict(width=0),
1158
+ color=cores,
1159
+ ),
1160
+ hoverlabel=dict(bgcolor="white", font_size=12),
1161
+ )
1162
+
1163
+ fig.update_layout(
1164
+ shapes=[
1165
+ dict(
1166
+ type="rect",
1167
+ xref="paper",
1168
+ yref="paper",
1169
+ x0=0,
1170
+ y0=0,
1171
+ x1=1,
1172
+ y1=1,
1173
+ fillcolor="white",
1174
+ opacity=0.3,
1175
+ layer="below",
1176
+ line_width=0,
1177
+ ),
1178
+ ]
1179
+ )
1180
+
1181
+ st.plotly_chart(fig, use_container_width=True)
1182
+ else:
1183
+ st.info(f"Dados de meia-vida não disponíveis para {selected_class}")
1184
+
1185
+ st.info(
1186
+ "Nota: As meias-vidas apresentadas são valores aproximados e podem variar dependendo de fatores individuais."
1187
+ )
1188
+
1189
+ elif selected == "Efeitos Colaterais":
1190
+ st.title("🧠 Efeitos Colaterais e Receptores Associados")
1191
+
1192
+ st.write("### ")
1193
+
1194
+ # Dados dos efeitos colaterais e receptores associados
1195
+ receptor_effects = {
1196
+ "Serotoninérgicos (5-HT)": {
1197
+ "Ícone": "😊",
1198
+ "Descrição": "Relacionados à modulação da serotonina, afetando humor, ansiedade e funções gastrointestinais.",
1199
+ "Efeitos": {
1200
+ "Náusea 🤢": {
1201
+ "Gravidade": "Leve a moderada",
1202
+ "Duração": "Geralmente transitória",
1203
+ "Manejo": "Tomar com alimentos, iniciar com doses baixas",
1204
+ },
1205
+ "Disfunção sexual 💔": {
1206
+ "Gravidade": "Moderada a grave",
1207
+ "Duração": "Pode persistir durante o tratamento",
1208
+ "Manejo": "Ajuste de dose, troca de medicação, tratamento adjuvante",
1209
+ },
1210
+ "Alterações de apetite 🍽️": {
1211
+ "Gravidade": "Leve a moderada",
1212
+ "Duração": "Variável",
1213
+ "Manejo": "Monitoramento do peso, orientação nutricional",
1214
+ },
1215
+ },
1216
+ },
1217
+ "Noradrenérgicos (NA)": {
1218
+ "Ícone": "⚡",
1219
+ "Descrição": "Associados à modulação da noradrenalina, afetando atenção, vigília e pressão arterial.",
1220
+ "Efeitos": {
1221
+ "Boca seca 🏜️": {
1222
+ "Gravidade": "Leve",
1223
+ "Duração": "Persistente",
1224
+ "Manejo": "Hidratação frequente, goma de mascar sem açúcar",
1225
+ },
1226
+ "Sudorese 💦": {
1227
+ "Gravidade": "Leve a moderada",
1228
+ "Duração": "Variável",
1229
+ "Manejo": "Roupas leves, antitranspirantes",
1230
+ },
1231
+ "Tremor 🤕": {
1232
+ "Gravidade": "Leve",
1233
+ "Duração": "Geralmente transitória",
1234
+ "Manejo": "Redução da dose, se necessário",
1235
+ },
1236
+ },
1237
+ },
1238
+ "Muscarínicos (M1)": {
1239
+ "Ícone": "🔍",
1240
+ "Descrição": "Relacionados à ação anticolinérgica, afetando secreções, motilidade intestinal e visão.",
1241
+ "Efeitos": {
1242
+ "Constipação 🚽": {
1243
+ "Gravidade": "Leve a moderada",
1244
+ "Duração": "Pode persistir",
1245
+ "Manejo": "Aumento da ingestão de fibras e líquidos",
1246
+ },
1247
+ "Visão turva 👁️": {
1248
+ "Gravidade": "Leve",
1249
+ "Duração": "Geralmente transitória",
1250
+ "Manejo": "Avaliação oftalmológica se persistente",
1251
+ },
1252
+ "Retenção urinária 🚱": {
1253
+ "Gravidade": "Moderada",
1254
+ "Duração": "Variável",
1255
+ "Manejo": "Ajuste de dose, monitoramento da função urinária",
1256
+ },
1257
+ },
1258
+ },
1259
+ "Histamínicos (H1)": {
1260
+ "Ícone": "💤",
1261
+ "Descrição": "Associados à ação anti-histamínica, afetando o estado de alerta e o apetite.",
1262
+ "Efeitos": {
1263
+ "Sonolência 😴": {
1264
+ "Gravidade": "Moderada",
1265
+ "Duração": "Pode diminuir com o tempo",
1266
+ "Manejo": "Administração noturna, ajuste de dose",
1267
+ },
1268
+ "Aumento de apetite 🍔": {
1269
+ "Gravidade": "Leve a moderada",
1270
+ "Duração": "Variável",
1271
+ "Manejo": "Monitoramento do peso, orientação nutricional",
1272
+ },
1273
+ "Tontura 🌀": {
1274
+ "Gravidade": "Leve",
1275
+ "Duração": "Geralmente transitória",
1276
+ "Manejo": "Levantar-se lentamente, evitar mudanças bruscas de posição",
1277
+ },
1278
+ },
1279
+ },
1280
+ "Dopaminérgicos (D2)": {
1281
+ "Ícone": "🎭",
1282
+ "Descrição": "Relacionados à modulação da dopamina, afetando movimento, cognição e secreção de prolactina.",
1283
+ "Efeitos": {
1284
+ "Aumento de prolactina 🥛": {
1285
+ "Gravidade": "Moderada",
1286
+ "Duração": "Persistente durante o uso",
1287
+ "Manejo": "Monitoramento dos níveis de prolactina, ajuste de dose",
1288
+ },
1289
+ "Alterações motoras 🚶": {
1290
+ "Gravidade": "Moderada a grave",
1291
+ "Duração": "Pode ser persistente",
1292
+ "Manejo": "Ajuste de dose, troca de medicação",
1293
+ },
1294
+ "Alterações cognitivas 🧠": {
1295
+ "Gravidade": "Leve a moderada",
1296
+ "Duração": "Variável",
1297
+ "Manejo": "Avaliação cognitiva, ajuste de dose",
1298
+ },
1299
+ },
1300
+ },
1301
+ }
1302
+
1303
+ # Seletor de receptor
1304
+ col1, col2, col3 = st.columns([1, 3, 1])
1305
+ with col1:
1306
+ selected_receptor = st.selectbox(
1307
+ "🔬 Selecione um receptor:", list(receptor_effects.keys())
1308
+ )
1309
+
1310
+ with col2:
1311
+ if selected_receptor:
1312
+ st.subheader(f"{receptor_effects[selected_receptor]['Ícone']} {selected_receptor}")
1313
+ st.write(receptor_effects[selected_receptor]["Descrição"])
1314
+
1315
+ # Tabela de efeitos colaterais
1316
+ data = []
1317
+ for effect, info in receptor_effects[selected_receptor]["Efeitos"].items():
1318
+ row = [
1319
+ effect,
1320
+ info.get("Gravidade", "N/A"),
1321
+ info.get("Duração", "N/A"),
1322
+ info.get("Manejo", "N/A"),
1323
+ ]
1324
+ data.append(row)
1325
+
1326
+ columns = ["Efeito Colateral", "Gravidade", "Duração", "Manejo"]
1327
+
1328
+ st.write(
1329
+ pd.DataFrame(data, columns=columns).to_html(index=False), unsafe_allow_html=True
1330
+ )
1331
+
1332
+ # Visualização interativa
1333
+ st.subheader("📊 Comparação de Efeitos Colaterais entre Receptores")
1334
+ effect_options = list(set([effect for receptor in receptor_effects.values() for effect in receptor["Efeitos"].keys()]))
1335
+ selected_effects = st.multiselect("🔍 Selecione os efeitos colaterais para comparar:", effect_options)
1336
+
1337
+ if selected_effects:
1338
+ comparison_data = []
1339
+ for receptor, effects in receptor_effects.items():
1340
+ for effect in selected_effects:
1341
+ comparison_data.append({
1342
+ "Receptor": f"{effects['Ícone']} {receptor}",
1343
+ "Efeito Colateral": effect,
1344
+ "Presença": 1 if effect in effects["Efeitos"] else 0
1345
+ })
1346
+
1347
+ fig = px.bar(comparison_data, x="Receptor", y="Presença", color="Efeito Colateral",
1348
+ title="Comparação de Efeitos Colaterais entre Receptores",
1349
+ barmode="group")
1350
+ st.plotly_chart(fig)
1351
+
1352
+ # Considerações especiais
1353
+ st.subheader("⚠️ Considerações Especiais")
1354
+
1355
+ col1, col2, col3 = st.columns(3)
1356
+ with col1:
1357
+ with st.expander("💊 Interações Medicamentosas", expanded=False):
1358
+ st.info(
1359
+ "Medicamentos que afetam os mesmos receptores podem potencializar efeitos colaterais. Por exemplo, combinar medicamentos serotoninérgicos pode aumentar o risco de síndrome serotoninérgica."
1360
+ )
1361
+ with col2:
1362
+ with st.expander("🛑 Descontinuação", expanded=False):
1363
+ st.info(
1364
+ "A descontinuação abrupta de medicamentos que afetam certos receptores (como serotoninérgicos) pode levar a sintomas de descontinuação. A redução gradual é geralmente recomendada."
1365
+ )
1366
+ with col3:
1367
+ with st.expander("👤 Variabilidade Individual", expanded=False):
1368
+ st.info(
1369
+ "A resposta aos medicamentos e a ocorrência de efeitos colaterais podem variar significativamente entre indivíduos devido a diferenças genéticas e outros fatores."
1370
+ )
1371
+
1372
+ st.warning(
1373
+ "⚠️ Importante: A ocorrência e gravidade dos efeitos colaterais podem variar. Sempre consulte um médico para orientações específicas e manejo adequado dos efeitos colaterais."
1374
+ )
1375
+
1376
+ elif selected == "Chatbot Dr. Karl":
1377
+ st.title("Chatbot Dr. Karl")
1378
+
1379
+ st.write(
1380
+ "Bem-vindo ao Chatbot Dr. Karl, seu assistente virtual para dúvidas sobre transtornos de ansiedade."
1381
+ )
1382
+
1383
+ # Área de entrada do usuário
1384
+ user_input = st.text_input("Faça sua pergunta aqui:")
1385
+
1386
+ if user_input:
1387
+ # Aqui você pode integrar a lógica do chatbot
1388
+ st.write(
1389
+ "Dr. Karl: Obrigado pela sua pergunta. Estou processando sua solicitação..."
1390
+ )
1391
+ # Placeholder para a resposta do chatbot
1392
+ st.write(
1393
+ "Dr. Karl: Esta é uma resposta de exemplo. A integração completa do chatbot será implementada posteriormente."
1394
+ )
1395
+
1396
+ st.info(
1397
+ "Nota: O Chatbot Dr. Karl está em desenvolvimento. Por favor, consulte um profissional de saúde para orientações médicas específicas."
1398
+ )
1399
+ # Aqui irá a estrutura para o chatbot
1400
+
1401
+
1402
+ footer="""<style>
1403
+ a:link , a:visited{
1404
+ color: blue;
1405
+ background-color: transparent;
1406
+ text-decoration: underline;
1407
+ }
1408
+
1409
+ a:hover, a:active {
1410
+ color: red;
1411
+ background-color: transparent;
1412
+ text-decoration: underline;
1413
+ }
1414
+
1415
+ .footer {
1416
+ position: fixed;
1417
+ left: 0;
1418
+ bottom: 0;
1419
+ width: 100%;
1420
+ background-color: white;
1421
+ color: black;
1422
+ text-align: center;
1423
+ }
1424
+ </style>
1425
+ <div class="footer">
1426
+ <p>Desenvolvido por <a style='display: block; text-align: center;' href="https://dr-guilhermeapolinario.com/Dr.+Guilherme+Apolin%C3%A1rio" target="_blank">Dr. Guilherme Apolinário</a></p>
1427
+ </div>
1428
+ """
1429
+ st.markdown(footer,unsafe_allow_html=True)