import colorsys
from datetime import datetime
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import pyperclip
import streamlit as st
from plotly.subplots import make_subplots
from streamlit_extras.add_vertical_space import add_vertical_space
from streamlit_extras.stylable_container import stylable_container
from streamlit_option_menu import option_menu
import streamlit.components.v1 as components
# Configuração da página
st.set_page_config(
page_title="Transtornos de Ansiedade - Guia Médico",
layout="wide",
page_icon=":brain:",
initial_sidebar_state="expanded",
)
@st.fragment
def apply_neumorphic_style():
"""
Aplica estilos CSS para criar um tema neumórfico light na aplicação Streamlit.
Inclui estilos para elementos gerais, sidebar, sliders, e outros componentes específicos.
"""
st.html(
"""
"""
)
# Aplicar o estilo
apply_neumorphic_style()
def copy_to_clipboard(text):
# Cria um componente HTML com JavaScript para copiar o texto
copy_button = components.html(
f"""
""",
height=70
)
# Menu lateral
with st.sidebar:
st.markdown('
", unsafe_allow_html=True)
###############################################################################################################
###############################################################################################################
# Conteúdo principal baseado na seleção do menu
if selected == "Home":
st.title("Transtornos de Ansiedade - Dashboard")
@st.fragment
def prevalencia():
"""
Função para calcular a prevalência de transtornos psiquiátricos
Gráfico de barras com a prevalência global, feminina e masculina
Estatísticas chave com a prevalência global, custo anual global e idade média de início
Informações adicionais sobre os transtornos psiquiátricos
"""
# Dados das prevalências dos transtornos psiquiátricos
prevalence_data = {
"Transtorno": ["TAG", "Pânico", "Fobia Social", "TOC", "TEPT"],
"Prevalência Global (%)": [3.1, 2.7, 6.8, 1.2, 3.6],
"Prevalência Mulheres (%)": [4.2, 3.5, 8.2, 1.4, 5.3],
"Prevalência Homens (%)": [2.0, 1.8, 5.3, 1.0, 1.9],
}
# Criar gráfico
fig = go.Figure()
# Adicionar barras para cada categoria de prevalência
fig.add_trace(
go.Bar(
x=prevalence_data["Transtorno"],
y=prevalence_data["Prevalência Global (%)"],
name="Prevalência Global",
marker_color="rgba(54, 162, 235, 0.8)",
hoverinfo="text",
text=[f"{x}%" for x in prevalence_data["Prevalência Global (%)"]],
textposition="auto",
)
)
fig.add_trace(
go.Bar(
x=prevalence_data["Transtorno"],
y=prevalence_data["Prevalência Mulheres (%)"],
name="Prevalência Mulheres",
marker_color="rgba(255, 99, 132, 0.8)",
hoverinfo="text",
text=[f"{x}%" for x in prevalence_data["Prevalência Mulheres (%)"]],
textposition="auto",
)
)
fig.add_trace(
go.Bar(
x=prevalence_data["Transtorno"],
y=prevalence_data["Prevalência Homens (%)"],
name="Prevalência Homens",
marker_color="rgba(75, 192, 192, 0.8)",
hoverinfo="text",
text=[f"{x}%" for x in prevalence_data["Prevalência Homens (%)"]],
textposition="auto",
)
)
# Atualizar layout do gráfico
fig.update_layout(
title={
"text": "Prevalência de Transtornos Psiquiátricos",
"y": 0.95,
"x": 0.5,
"xanchor": "center",
"yanchor": "top",
},
barmode="group",
template="plotly_white",
xaxis_title="Transtorno",
yaxis_title="Prevalência (%)",
legend_title="Categorias",
font=dict(family="Arial", size=12),
margin=dict(l=50, r=50, t=80, b=50),
width=900,
height=600,
paper_bgcolor="#f0f0f0",
plot_bgcolor="#f0f0f0",
shapes=[
dict(
type="rect",
xref="paper",
yref="paper",
x0=0,
y0=0,
x1=1,
y1=1,
line=dict(color="#e0e0e0", width=2),
fillcolor="#f0f0f0",
layer="below",
)
],
)
# Adicionar sombras para efeito neumórfico
fig.update_layout(
shapes=[
dict(
type="rect",
xref="paper",
yref="paper",
x0=-0.05,
y0=-0.05,
x1=1.05,
y1=1.05,
line=dict(color="#ffffff", width=5),
fillcolor="rgba(255,255,255,0)",
layer="below",
),
dict(
type="rect",
xref="paper",
yref="paper",
x0=-0.05,
y0=-0.05,
x1=1.05,
y1=1.05,
line=dict(color="#d0d0d0", width=5),
fillcolor="rgba(255,255,255,0)",
layer="below",
),
]
)
# Configurar interatividade
fig.update_traces(
hovertemplate="%{x} %{y}%",
hoverlabel=dict(bgcolor="white", font_size=12),
)
return st.plotly_chart(fig)
c1, c2, c3 = st.columns([3, 0.5, 3])
with c1:
prevalencia()
with c2:
st.write("")
with c3:
# Dados atualizados do estudo
st.markdown("
", unsafe_allow_html=True)
col1, col2, col3 = st.columns(3)
with col1:
st.metric(
label="Prevalência Global",
value="3.8%",
delta="0.2%",
delta_color="normal",
)
with col2:
st.metric(label="Custo Anual Global", value="$1 Trilhão", delta="-")
with col3:
st.metric(label="Idade Média de Início", value="21-35 anos", delta="-")
st.markdown("
", unsafe_allow_html=True)
st.write("")
# Informações adicionais do estudo
st.markdown(
"""
Informações Adicionais:
Os transtornos de ansiedade afetam cerca de 301 milhões de pessoas globalmente.
A fobia social é o transtorno de ansiedade mais comum, com prevalência global de 6.8%.
Mulheres têm maior prevalência de transtornos de ansiedade comparado aos homens.
A prevalência varia significativamente entre diferentes regiões e países.
""",
unsafe_allow_html=True,
)
# Informações adicionais
st.info(
"""
Fonte:
Javaid, S.F., Hashim, I.J., Hashim, M.J. et al. Epidemiology of anxiety disorders: global burden and sociodemographic
associations.Middle East Curr Psychiatry 30, 44 (2023).
Acesse: https://doi.org/10.1186/s43045-023-00315-3"""
)
##################################################################################################
if selected == "Escalas de Ansiedade":
st.title("Escalas de Avaliação de Ansiedade")
# Usando option_menu para selecionar as escalas
scale_selected = option_menu(
menu_title=None,
options=["Escala de Hamilton (HAM-A)", "Escala GAD-7", "Inventário de Beck (BAI)"],
icons=["clipboard-check", "list-check", "clipboard-pulse"], # Você pode escolher ícones apropriados
menu_icon="cast",
default_index=0,
orientation="horizontal",
styles={
"container": {"padding": "0!important", "background-color": "transparent"},
"icon": {"color": "#0066cc", "font-size": "18px"},
"nav-link": {
"font-size": "16px",
"text-align": "center",
"margin": "0px",
"--hover-color": "#e0e0e0",
},
"nav-link-selected": {"background-color": "#e0e0e0"},
},
)
if scale_selected == "Escala de Hamilton (HAM-A)":
st.title(":blue[Guia de Diagnóstico Interativo] :stethoscope:")
st.write("##### :notebook: Escala de Ansiedade de Hamilton (HAM-A)")
st.divider()
add_vertical_space(2)
# Divisão em três colunas
col1, col_divider, col2 = st.columns([3, 0.5, 3])
with col1:
st.write("Intensidade dos sintomas nas últimas semanas :calendar:")
# Campos para nome e data
cx1, cx2 = st.columns(2)
with cx1:
nome = st.text_input("Nome da Pessoa:")
with cx2:
data = st.date_input("Data:", datetime.now(), format="DD/MM/YYYY")
# Itens da Escala de Ansiedade de Hamilton
ham_a_items = [
"Humor ansioso",
"Tensão",
"Medos",
"Insônia",
"Dificuldades intelectuais",
"Humor deprimido",
"Sintomas somáticos gerais (musculares)",
"Sintomas somáticos gerais (sensoriais)",
"Sintomas cardiovasculares",
"Sintomas respiratórios",
"Sintomas gastrointestinais",
"Sintomas gênito-urinários",
"Sintomas autonômicos",
"Comportamento na entrevista",
]
add_vertical_space(2)
st.divider()
# Dicionário para armazenar as respostas
responses = {}
# Criar o questionário em duas colunas
subcol1, subcol2 = st.columns(2)
for i, item in enumerate(ham_a_items):
with subcol1 if i % 2 == 0 else subcol2:
st.markdown('
", unsafe_allow_html=True)
with col_divider:
st.markdown('')
with col2:
st.image("psiq1.jpg")
st.subheader("Resultado")
# Botão para calcular o resultado
if st.button(
"Calcular Resultado",
key="ham_calculate_button",
help="Clique para calcular o resultado",
):
# Converter respostas para pontuação numérica
score_map = {
"Ausente": 0,
"Leve": 1,
"Moderado": 2,
"Grave": 3,
"Muito grave": 4,
}
total_score = sum(score_map[resp] for resp in responses.values())
# Interpretação do resultado
if total_score < 17:
severity = "Ansiedade leve"
elif 18 <= total_score <= 24:
severity = "Ansiedade moderada"
elif 25 <= total_score <= 30:
severity = "Ansiedade grave"
else:
severity = "Ansiedade muito grave"
# Exibir resultado
st.success(f"Pontuação total: {total_score}")
st.info(f"Interpretação: {severity}")
result_ham = {}
# Texto para copiar
result_ham = (
f"Nome da Pessoa: {nome}\n"
f"Data: {data.strftime('%d/%m/%Y')}\n"
f"Escala de Ansiedade de Hamilton (HAM-A)\n"
f"Pontuação total: {total_score}\n"
f"Interpretação: {severity}"
)
#st.text_area("## Resultado detalhado:", value=result_ham, height=200, key="ham_result_text")
# if result_ham is not None:
# st.button("Copiar",key="ham_copy_button", on_click=copy_to_clipboard(result_ham))
if result_ham is not None:
st.text_area("## Resultado detalhado:", value=result_ham, height=200, key="ham_result_text")
copy_to_clipboard(result_ham)
# Informações adicionais sobre a escala
st.markdown('
', unsafe_allow_html=True)
with st.expander("Mais informações sobre a Escala de Ansiedade de Hamilton"):
st.write(
"""
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.
**Pontos importantes:**
- A escala consiste em 14 itens, cada um avaliado de 0 (não presente) a 4 (muito grave).
- A pontuação total varia de 0 a 56.
- É particularmente útil para avaliar a gravidade do Transtorno de Ansiedade Generalizada (TAG).
- A escala avalia tanto sintomas psíquicos quanto somáticos da ansiedade.
**Limitações:**
- Não é uma ferramenta diagnóstica, mas sim uma medida de gravidade.
- Pode ser influenciada por sintomas depressivos coexistentes.
- Requer treinamento para administração adequada em contextos clínicos.
Sempre consulte um profissional de saúde mental para interpretação adequada dos resultados e diagnóstico.
"""
)
st.markdown("
", unsafe_allow_html=True)
st.warning(
"""
Nota:\n
Esta escala é uma ferramenta de triagem e não substitui uma avaliação clínica completa.\n
Um diagnóstico preciso requer avaliação por um profissional de saúde qualificado."""
)
st.markdown('
', unsafe_allow_html=True)
st.markdown("
", unsafe_allow_html=True)
elif scale_selected == "Escala GAD-7":
st.title(":blue[Escala GAD-7] :stethoscope:")
st.divider()
add_vertical_space(2)
# Divisão em três colunas
col1, col_divider, col2 = st.columns([3, 0.5, 3])
with col1:
st.write("Intensidade dos sintomas nas últimas duas semanas :calendar:")
# Campos para nome e data
cx1, cx2 = st.columns(2)
with cx1:
nome = st.text_input("Nome da Pessoa:", key="gad7_nome")
with cx2:
data = st.date_input("Data:", datetime.now(), format="DD/MM/YYYY", key="gad7_data")
# Função para calcular os resultados do GAD-7
def gad7_calculate(responses):
score = sum(responses.values())
if score < 5:
severity = "Ansiedade mínima"
elif 5 <= score < 10:
severity = "Ansiedade leve"
elif 10 <= score < 15:
severity = "Ansiedade moderada"
else:
severity = "Ansiedade severa"
return score, severity
# Questionário GAD-7
gad7_items = [
"Sentir-se nervoso, ansioso ou muito tenso",
"Não ser capaz de impedir ou de controlar as preocupações",
"Preocupar-se muito com diversas coisas",
"Dificuldade para relaxar",
"Ficar tão agitado que se torna difícil permanecer sentado",
"Ficar facilmente aborrecido ou irritado",
"Sentir medo como se algo terrível fosse acontecer"
]
add_vertical_space(2)
st.divider()
# Dicionário para armazenar as respostas
responses = {}
# Criar o questionário em duas colunas
subcol1, subcol2 = st.columns(2)
for i, item in enumerate(gad7_items):
with subcol1 if i % 2 == 0 else subcol2:
st.markdown('
', unsafe_allow_html=True)
responses[item] = st.select_slider(
item,
options=["Nenhuma vez", "Vários dias", "Mais da metade dos dias", "Quase todos os dias"],
value="Nenhuma vez",
key=f"gad7_{i}"
)
st.markdown("
", unsafe_allow_html=True)
with col_divider:
st.markdown('')
with col2:
st.image("psiq1.jpg") # Você pode querer substituir esta imagem por uma específica para GAD-7
st.subheader("Resultado")
# Botão para calcular o resultado
if st.button(
"Calcular Resultado",
key="gad7_calculate_button",
help="Clique para calcular o resultado",
):
score_map = {"Nenhuma vez": 0, "Vários dias": 1, "Mais da metade dos dias": 2, "Quase todos os dias": 3}
numeric_responses = {k: score_map[v] for k, v in responses.items()}
total_score, severity = gad7_calculate(numeric_responses)
result_gad7 = {}
# Texto para copiar
result_gad7 = (
f"Nome: {nome}\n"
f"Data: {data.strftime('%d/%m/%Y')}\n"
f"Escala GAD-7\n"
f"Pontuação total: {total_score}\n"
f"Interpretação: {severity}"
)
#st.text_area("## Resultado detalhado:", value=result_gad7, height=200, key="gad7_result_text")
# if result_gad7 is not None:
# st.button("Copiar", key="gad7_copy_button", on_click=copy_to_clipboard(result_gad7))
if result_gad7 is not None:
st.text_area("## Resultado detalhado:", value=result_gad7, height=200, key="gad7_result_text")
copy_to_clipboard(result_gad7)
# Informações adicionais sobre a escala
st.markdown('
', unsafe_allow_html=True)
with st.expander("Mais informações sobre a Escala GAD-7"):
st.write(
"""
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.
**Pontos importantes:**
- A escala consiste em 7 itens, cada um avaliado de 0 (não apresentou) a 3 (quase todos os dias).
- A pontuação total varia de 0 a 21.
- É uma ferramenta eficaz para avaliar a gravidade dos sintomas de ansiedade generalizada.
- Pode ser usada para monitorar a resposta ao tratamento ao longo do tempo.
**Interpretação dos resultados:**
- 0-4: Ansiedade mínima
- 5-9: Ansiedade leve
- 10-14: Ansiedade moderada
- 15-21: Ansiedade severa
**Limitações:**
- Ele deve ser usado como uma primeira etapa para identificar possíveis casos de transtorno de ansiedade generalizada.
- Não é uma ferramenta diagnóstica definitiva, mas um instrumento de triagem.
- A interpretação dos resultados deve ser feita em conjunto com uma avaliação clínica completa, para fornecer um diagnóstico preciso.
- Sempre consulte um profissional de saúde mental para a interpretação adequada dos resultados e o planejamento do tratamento.
"""
)
st.markdown("
", unsafe_allow_html=True)
st.warning(
"""
Nota:\n
Esta escala é uma ferramenta de triagem e não substitui uma avaliação clínica completa.\n
Um diagnóstico preciso requer avaliação por um profissional de saúde qualificado."""
)
st.markdown('
', unsafe_allow_html=True)
st.markdown("
", unsafe_allow_html=True)
elif scale_selected == "Inventário de Beck (BAI)":
st.title(":blue[Inventário de Beck (BAI)] :stethoscope:")
st.divider()
add_vertical_space(2)
# Divisão em três colunas
col1, col_divider, col2 = st.columns([3, 0.5, 3])
with col1:
st.write("Intensidade dos sintomas na última semana :calendar:")
# Campos para nome e data
cx1, cx2 = st.columns(2)
with cx1:
nome = st.text_input("Nome da Pessoa:", key="bai_nome")
with cx2:
data = st.date_input("Data:", datetime.now(), format="DD/MM/YYYY", key="bai_data")
# Função para calcular os resultados do BAI
def bai_calculate(responses):
score = sum(responses.values())
if score <= 7:
severity = "Ansiedade mínima"
elif 8 <= score <= 15:
severity = "Ansiedade leve"
elif 16 <= score <= 25:
severity = "Ansiedade moderada"
else:
severity = "Ansiedade grave"
return score, severity
bai_items = [
"Dormência ou formigamento",
"Sensação de calor",
"Tremores nas pernas",
"Incapaz de relaxar",
"Medo que aconteça o pior",
"Atordoado ou tonto",
"Palpitação ou aceleração do coração",
"Sem equilíbrio",
"Aterrorizado",
"Nervoso",
"Sensação de sufocação",
"Tremores nas mãos",
"Trêmulo",
"Medo de perder o controle",
"Dificuldade de respirar",
"Medo de morrer",
"Assustado",
"Indigestão ou desconforto no abdômen",
"Sensação de desmaio",
"Rosto afogueado",
"Suor (não devido ao calor)"
]
add_vertical_space(2)
st.divider()
# Dicionário para armazenar as respostas
responses = {}
# Criar o questionário em duas colunas
subcol1, subcol2 = st.columns(2)
for i, item in enumerate(bai_items):
with subcol1 if i % 2 == 0 else subcol2:
st.markdown('
", unsafe_allow_html=True)
with col_divider:
st.markdown('')
with col2:
st.image("psiq1.jpg")
st.subheader("Resultado")
# Botão para calcular o resultado
if st.button(
"Calcular Resultado",
key="bai_calculate_button",
help="Clique para calcular o resultado",
):
score_map = {"Absolutamente não": 0, "Levemente": 1, "Moderadamente": 2, "Gravemente": 3}
numeric_responses = {k: score_map[v] for k, v in responses.items()}
total_score, severity = bai_calculate(numeric_responses)
result_bai = {}
# Texto para copiar
result_bai = (
f"Nome: {nome}\n"
f"Data: {data.strftime('%d/%m/%Y')}\n"
f"Inventário de Ansiedade de Beck\n"
f"Pontuação total: {total_score}\n"
f"Interpretação: {severity}"
)
# st.text_area("## Resultado detalhado:", value=result_bai, height=200, key="bai_result_text")
# if result_bai is not None:
# st.button("Copiar", key="bai_copy_button", on_click=copy_to_clipboard(result_bai))
if result_bai is not None:
st.text_area("## Resultado detalhado:", value=result_bai, height=200, key="bai_result_text")
copy_to_clipboard(result_bai)
# Informações adicionais sobre a escala
st.markdown('
', unsafe_allow_html=True)
with st.expander("Mais informações sobre o Inventário de Ansiedade de Beck (BAI)"):
st.write("""
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 tem sido
uma ferramenta valiosa tanto na avaliação clínica quanto na pesquisa.
**Pontos importantes:**
O BAI consiste em 21 itens, cada um descrevendo um sintoma comum de ansiedade.
Cada item é avaliado em uma escala de 4 pontos, variando de 0 (não apresentou)
a 3 (gravemente), de acordo com a intensidade dos sintomas nos últimos 7 dias.
A pontuação total varia de 0 a 63, com resultados mais altos indicando maior
severidade da ansiedade.
Ele foi projetado para minimizar a sobreposição com sintomas depressivos,
focando principalmente em sintomas fisiológicos da ansiedade.
**Interpretação dos resultados:**
- 0-7: Ansiedade mínima
- 8-15: Ansiedade leve
- 16-25: Ansiedade moderada
- 26-63: Ansiedade grave
**Aplicações:**
Avaliação da severidade dos sintomas de ansiedade em contextos clínicos.
Monitoramento da resposta ao tratamento ao longo do tempo.
Ferramenta de triagem em pesquisas sobre ansiedade e saúde mental.
**Limitações:**
- Como todas as escalas de auto-relato, as respostas podem ser influenciadas pela subjetividade do respondente.
- Não é um instrumento diagnóstico definitivo, mas sim uma medida da severidade dos sintomas.
- Pode não capturar todos os aspectos da ansiedade, especialmente os cognitivos (como preocupações excessivas ou ruminativas).
**Sempre consulte um profissional de saúde mental para uma interpretação adequada dos resultados e um diagnóstico preciso.**
"""
)
st.markdown("
", unsafe_allow_html=True)
st.warning(
"""
Nota:\n
Este inventário é uma ferramenta de avaliação e não substitui uma avaliação clínica completa.\n
Um diagnóstico preciso requer avaliação por um profissional de saúde qualificado."""
)
st.markdown('
', unsafe_allow_html=True)
st.markdown("
", unsafe_allow_html=True)
##########################################################################################################################
##########################################################################################################################
elif selected == "Tratamentos":
st.title("Opções de Tratamento Farmacológico")
st.write("### ")
# Dados dos tratamentos
treatments = {
"ISRSs": {
"Descrição": "Inibidores Seletivos da Recaptação de Serotonina. Primeira linha de tratamento para a maioria dos transtornos de ansiedade.",
"Medicamentos": {
"Sertralina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "200 mg/dia",
"Meia-vida": "26 horas",
},
"Escitalopram": {
"Dose inicial": "10 mg/dia",
"Dose máxima": "20 mg/dia",
"Meia-vida": "27-32 horas",
},
"Fluoxetina": {
"Dose inicial": "10-20 mg/dia",
"Dose máxima": "60 mg/dia",
"Meia-vida": "1-4 dias (norfluoxetina: 7-15 dias)",
},
"Fluvoxamina": {
"Dose inicial": "50-100 mg/dia",
"Dose máxima": "300 mg/dia",
"Meia-vida": "9-28 horas",
},
"Citalopram": {
"Dose inicial": "10-20 mg/dia",
"Dose máxima": "60 mg/dia",
"Meia-vida": "35 horas",
},
"Paroxetina": {
"Dose inicial": "10-20 mg/dia",
"Dose máxima": "60 mg/dia",
"Meia-vida": "21 horas",
},
"Vilazodona": {
"Dose inicial": "10 mg/dia",
"Dose máxima": "40 mg/dia",
"Meia-vida": "25 horas",
},
"Vortioxetina": {
"Dose inicial": "10 mg/dia",
"Dose máxima": "20 mg/dia",
"Meia-vida": "66 horas",
},
},
},
"IRSNs": {
"Descrição": "Inibidores da Recaptação de Serotonina e Noradrenalina. Eficazes em casos resistentes aos ISRSs.",
"Medicamentos": {
"Venlafaxina": {
"Dose inicial": "37,5-75 mg/dia",
"Dose máxima": "225 mg/dia",
"Meia-vida": "5 horas",
},
"Desvenlafaxina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "200 mg/dia",
"Meia-vida": "11 horas",
},
"Duloxetina": {
"Dose inicial": "30 mg/dia",
"Dose máxima": "120 mg/dia",
"Meia-vida": "12 horas",
},
},
},
"Tricíclicos": {
"Descrição": "Antidepressivos tricíclicos. Eficazes, mas com mais efeitos colaterais que ISRSs e IRSNs.",
"Medicamentos": {
"Amitriptilina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "300 mg/dia",
"Meia-vida": "10-50 horas",
},
"Nortriptilina": {
"Dose inicial": "25 mg/dia",
"Dose máxima": "150 mg/dia",
"Meia-vida": "18-44 horas",
},
"Imipramina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "300 mg/dia",
"Meia-vida": "8-20 horas",
},
"Desipramina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "300 mg/dia",
"Meia-vida": "12-24 horas",
},
"Clomipramina": {
"Dose inicial": "25 mg/dia",
"Dose máxima": "250 mg/dia",
"Meia-vida": "19-37 horas",
},
"Doxepina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "300 mg/dia",
"Meia-vida": "8-24 horas",
},
"Trimipramina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "300 mg/dia",
"Meia-vida": "20-24 horas",
},
"Protriptilina": {
"Dose inicial": "10-20 mg/dia",
"Dose máxima": "60 mg/dia",
"Meia-vida": "67-89 horas",
},
},
},
"Benzodiazepínicos": {
"Descrição": "Uso de curto prazo devido ao risco de dependência. Eficazes para alívio rápido de sintomas.",
"Medicamentos": {
"Alprazolam": {
"Dose inicial": "0.25-0.5 mg 2-3x/dia",
"Dose máxima": "4 mg/dia",
"Meia-vida": "6-27 horas",
},
"Clonazepam": {
"Dose inicial": "0.25 mg 2x/dia",
"Dose máxima": "4 mg/dia",
"Meia-vida": "18-50 horas",
},
"Diazepam": {
"Dose inicial": "2-10 mg 2-4x/dia",
"Dose máxima": "40 mg/dia",
"Meia-vida": "20-50 horas",
},
"Lorazepam": {
"Dose inicial": "1-3 mg 2-3x/dia",
"Dose máxima": "10 mg/dia",
"Meia-vida": "10-20 horas",
},
"Bromazepam": {
"Dose inicial": "1.5-3 mg 2-3x/dia",
"Dose máxima": "6-12 mg/dia",
"Meia-vida": "10-20 horas",
},
"Clobazam": {
"Dose inicial": "10 mg/dia",
"Dose máxima": "30 mg/dia",
"Meia-vida": "18-42 horas",
},
"Temazepam": {
"Dose inicial": "7.5-15 mg ao deitar",
"Dose máxima": "30 mg/dia",
"Meia-vida": "8-22 horas",
},
"Triazolam": {
"Dose inicial": "0.125-0.25 mg ao deitar",
"Dose máxima": "0.5 mg/dia",
"Meia-vida": "1.5-5.5 horas",
},
"Midazolam": {
"Dose inicial": "1-2 mg (pré-operatório)",
"Dose máxima": "10 mg/dia",
"Meia-vida": "1.5-2.5 horas",
},
"Oxazepam": {
"Dose inicial": "10-15 mg 3-4x/dia",
"Dose máxima": "120 mg/dia",
"Meia-vida": "5-15 horas",
},
"Chlordiazepoxide": {
"Dose inicial": "5-10 mg 3-4x/dia",
"Dose máxima": "100 mg/dia",
"Meia-vida": "5-30 horas",
},
"Flurazepam": {
"Dose inicial": "15-30 mg ao deitar",
"Dose máxima": "30 mg/dia",
"Meia-vida": "40-250 horas",
},
},
},
"Outros": {
"Descrição": "Medicamentos alternativos ou adjuvantes para tratamento de ansiedade.",
"Medicamentos": {
"Mirtazapina": {
"Dose inicial": "15 mg/dia",
"Dose máxima": "45 mg/dia",
"Meia-vida": "20-40 horas",
},
"Bupropiona": {
"Dose inicial": "150 mg/dia",
"Dose máxima": "450 mg/dia",
"Meia-vida": "21 horas",
},
"Trazodona": {
"Dose inicial": "50 mg/dia",
"Dose máxima": "400 mg/dia (ambulatorial) / 600 mg/dia (hospitalar)",
"Meia-vida": "7-13 horas",
},
"Buspirona": {
"Dose inicial": "7.5 mg duas vezes ao dia",
"Dose máxima": "60 mg/dia",
"Meia-vida": "2-3 horas",
},
"Hidroxizina": {
"Dose inicial": "25-50 mg/dia",
"Dose máxima": "400 mg/dia",
"Meia-vida": "3-20 horas",
},
"Pregabalina": {
"Dose inicial": "150 mg/dia",
"Dose máxima": "600 mg/dia",
"Meia-vida": "6.3 horas",
},
},
},
}
# Função para gerar cores baseadas no valor
def get_color(value, min_value, max_value):
normalized = (value - min_value) / (max_value - min_value) if max_value > min_value else 0
hue = (1 - normalized) * 0.7
rgb = colorsys.hsv_to_rgb(hue, 0.8, 0.9)
return f'rgb({int(rgb[0]*255)},{int(rgb[1]*255)},{int(rgb[2]*255)})'
# Função para extrair valor numérico da meia-vida
def extract_numeric_value(meia_vida_str):
try:
return float(meia_vida_str.split()[0].split("-")[0])
except (ValueError, IndexError):
return None
col1, col2, col3, col4, col5 = st.columns([1, 3, 0.5, 3, 1])
with col1:
selected_class = st.selectbox(
" :pill: Classe de medicamentos:", list(treatments.keys())
)
with col2:
if selected_class:
st.subheader(selected_class)
st.write(treatments[selected_class]["Descrição"])
with col3:
st.write("")
with col4:
st.write("")
# with col5:
# st.write('')
# Tabela de medicamentos
data = []
for med, info in treatments[selected_class]["Medicamentos"].items():
row = [
med,
info.get("Dose inicial", "N/A"),
info.get("Dose máxima", "N/A"),
info.get("Meia-vida", "N/A"),
]
data.append(row)
columns = ["Medicamento", "Dose Inicial", "Dose Máxima", "Meia-vida"]
cs1,cs2 = st.columns(2)
with cs1:
st.write(
pd.DataFrame(data, columns=columns).to_html(index=False), unsafe_allow_html=True
)
with cs2:
# Considerações especiais
st.subheader("Considerações Especiais")
cj1,cj2,cj3 = st.columns([1,1,1])
with cj1:
with st.expander("Gestantes", expanded=False, icon="🤰"):
st.info(
"A American College of Obstetricians and Gynecologists (ACOG) recomenda ISRSs como primeira linha para ansiedade perinatal, com sertralina e escitalopram sendo opções preferenciais."
)
with cj2:
with st.expander("Crianças e Adolescentes", expanded=False, icon="🧒"):
st.info(
"A American Academy of Child and Adolescent Psychiatry recomenda ISRSs como primeira linha para crianças e adolescentes."
)
with cj3:
with st.expander("Idosos", expanded=False, icon="👴"):
st.info(
"A AGS recomenda ISRSs como primeira linha para ansiedade em idosos, com sertralina e escitalopram sendo opções preferenciais."
)
st.warning(
"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."
)
# Gráfico de meia-vida
st.subheader(f"Meia-vida dos {selected_class}")
meia_vidas = {}
for med, info in treatments[selected_class]["Medicamentos"].items():
meia_vida = info.get("Meia-vida", "N/A")
if meia_vida != "N/A":
meia_vida_num = extract_numeric_value(meia_vida)
if meia_vida_num is not None:
meia_vidas[med] = meia_vida_num
if meia_vidas:
medicamentos = list(meia_vidas.keys())
valores = list(meia_vidas.values())
min_valor = min(valores)
max_valor = max(valores)
cores = [get_color(valor, min_valor, max_valor) for valor in valores]
fig = go.Figure()
fig.add_trace(
go.Bar(
x=medicamentos,
y=valores,
marker_color=cores,
text=[f"{valor:.2f}" for valor in valores],
textposition='auto',
)
)
fig.update_layout(
title=f'Comparação da Meia-vida dos {selected_class}',
plot_bgcolor='rgba(240,240,240,1)',
paper_bgcolor='rgba(240,240,240,1)',
font_color='#444',
title_font_color='#444',
height=600,
margin=dict(t=100, b=50, l=50, r=50),
xaxis=dict(
title='Medicamento',
tickangle=45,
tickfont=dict(size=10),
gridcolor='white'
),
yaxis=dict(
title='Meia-vida (horas)',
gridcolor='white'
),
)
fig.update_traces(
marker=dict(
line=dict(width=0),
color=cores,
),
hoverlabel=dict(bgcolor="white", font_size=12),
)
fig.update_layout(
shapes=[
dict(
type="rect",
xref="paper",
yref="paper",
x0=0,
y0=0,
x1=1,
y1=1,
fillcolor="white",
opacity=0.3,
layer="below",
line_width=0,
),
]
)
st.plotly_chart(fig, use_container_width=True)
else:
st.info(f"Dados de meia-vida não disponíveis para {selected_class}")
st.info(
"Nota: As meias-vidas apresentadas são valores aproximados e podem variar dependendo de fatores individuais."
)
elif selected == "Efeitos Colaterais":
st.title("🧠 Efeitos Colaterais e Receptores Associados")
add_vertical_space(3)
cp1,cp2,cp3 = st.columns([1,1,1])
with cp1:
st.image("ser.jpg")
with cp2:
st.image("nor.jpg")
with cp3:
st.image("dop.jpg")
add_vertical_space(3)
# Dados dos efeitos colaterais e receptores associados
receptor_effects = {
"Serotoninérgicos (5-HT)": {
"Ícone": "😊",
"Descrição": "Relacionados à modulação da serotonina, afetando humor, ansiedade e funções gastrointestinais.",
"Efeitos": {
"Náusea 🤢": {
"Gravidade": "Leve a moderada",
"Duração": "Geralmente transitória",
"Manejo": "Tomar com alimentos, iniciar com doses baixas",
},
"Disfunção sexual 💔": {
"Gravidade": "Moderada a grave",
"Duração": "Pode persistir durante o tratamento",
"Manejo": "Ajuste de dose, troca de medicação, tratamento adjuvante",
},
"Alterações de apetite 🍽️": {
"Gravidade": "Leve a moderada",
"Duração": "Variável",
"Manejo": "Monitoramento do peso, orientação nutricional",
},
},
},
"Noradrenérgicos (NA)": {
"Ícone": "⚡",
"Descrição": "Associados à modulação da noradrenalina, afetando atenção, vigília e pressão arterial.",
"Efeitos": {
"Boca seca 🏜️": {
"Gravidade": "Leve",
"Duração": "Persistente",
"Manejo": "Hidratação frequente, goma de mascar sem açúcar",
},
"Sudorese 💦": {
"Gravidade": "Leve a moderada",
"Duração": "Variável",
"Manejo": "Roupas leves, antitranspirantes",
},
"Tremor 🤕": {
"Gravidade": "Leve",
"Duração": "Geralmente transitória",
"Manejo": "Redução da dose, se necessário",
},
},
},
"Muscarínicos (M1)": {
"Ícone": "🔍",
"Descrição": "Relacionados à ação anticolinérgica, afetando secreções, motilidade intestinal e visão.",
"Efeitos": {
"Constipação 🚽": {
"Gravidade": "Leve a moderada",
"Duração": "Pode persistir",
"Manejo": "Aumento da ingestão de fibras e líquidos",
},
"Visão turva 👁️": {
"Gravidade": "Leve",
"Duração": "Geralmente transitória",
"Manejo": "Avaliação oftalmológica se persistente",
},
"Retenção urinária 🚱": {
"Gravidade": "Moderada",
"Duração": "Variável",
"Manejo": "Ajuste de dose, monitoramento da função urinária",
},
},
},
"Histamínicos (H1)": {
"Ícone": "💤",
"Descrição": "Associados à ação anti-histamínica, afetando o estado de alerta e o apetite.",
"Efeitos": {
"Sonolência 😴": {
"Gravidade": "Moderada",
"Duração": "Pode diminuir com o tempo",
"Manejo": "Administração noturna, ajuste de dose",
},
"Aumento de apetite 🍔": {
"Gravidade": "Leve a moderada",
"Duração": "Variável",
"Manejo": "Monitoramento do peso, orientação nutricional",
},
"Tontura 🌀": {
"Gravidade": "Leve",
"Duração": "Geralmente transitória",
"Manejo": "Levantar-se lentamente, evitar mudanças bruscas de posição",
},
},
},
"Dopaminérgicos (D2)": {
"Ícone": "🎭",
"Descrição": "Relacionados à modulação da dopamina, afetando movimento, cognição e secreção de prolactina.",
"Efeitos": {
"Aumento de prolactina 🥛": {
"Gravidade": "Moderada",
"Duração": "Persistente durante o uso",
"Manejo": "Monitoramento dos níveis de prolactina, ajuste de dose",
},
"Alterações motoras 🚶": {
"Gravidade": "Moderada a grave",
"Duração": "Pode ser persistente",
"Manejo": "Ajuste de dose, troca de medicação",
},
"Alterações cognitivas 🧠": {
"Gravidade": "Leve a moderada",
"Duração": "Variável",
"Manejo": "Avaliação cognitiva, ajuste de dose",
},
},
},
}
# Seletor de receptor
col1, col2, col3 = st.columns([1, 3, 1])
with col1:
selected_receptor = st.selectbox(
"🔬 Selecione um receptor:", list(receptor_effects.keys())
)
with col2:
if selected_receptor:
st.subheader(f"{receptor_effects[selected_receptor]['Ícone']} {selected_receptor}")
st.write(receptor_effects[selected_receptor]["Descrição"])
# Tabela de efeitos colaterais
data = []
for effect, info in receptor_effects[selected_receptor]["Efeitos"].items():
row = [
effect,
info.get("Gravidade", "N/A"),
info.get("Duração", "N/A"),
info.get("Manejo", "N/A"),
]
data.append(row)
columns = ["Efeito Colateral", "Gravidade", "Duração", "Manejo"]
st.write(
pd.DataFrame(data, columns=columns).to_html(index=False), unsafe_allow_html=True
)
add_vertical_space(3)
# Visualização interativa
st.subheader("📊 Comparação de Efeitos Colaterais entre Receptores")
add_vertical_space(1)
effect_options = list(set([effect for receptor in receptor_effects.values() for effect in receptor["Efeitos"].keys()]))
selected_effects = st.multiselect("🔍 Selecione os efeitos colaterais para comparar:", effect_options)
if selected_effects:
comparison_data = []
for receptor, effects in receptor_effects.items():
for effect in selected_effects:
comparison_data.append({
"Receptor": f"{effects['Ícone']} {receptor}",
"Efeito Colateral": effect,
"Presença": 1 if effect in effects["Efeitos"] else 0
})
fig = px.bar(comparison_data, x="Receptor", y="Presença", color="Efeito Colateral",
title="Comparação de Efeitos Colaterais entre Receptores",
barmode="group")
st.plotly_chart(fig)
# Considerações especiais
st.subheader("⚠️ Considerações Especiais")
add_vertical_space(2)
col1, col2, col3 = st.columns(3)
with col1:
with st.expander("💊 Interações Medicamentosas", expanded=False):
st.info(
"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."
)
with col2:
with st.expander("🛑 Descontinuação", expanded=False):
st.info(
"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."
)
with col3:
with st.expander("👤 Variabilidade Individual", expanded=False):
st.info(
"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."
)
st.warning(
"⚠️ 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."
)
elif selected == "Chatbot Dr. Karl":
st.title("Chatbot Dr. Karl")
st.write(
"Bem-vindo ao Chatbot Dr. Karl, seu assistente virtual para dúvidas sobre transtornos de ansiedade."
)
# Área de entrada do usuário
user_input = st.text_input("Faça sua pergunta aqui:")
if user_input:
# Aqui você pode integrar a lógica do chatbot
st.write(
"Dr. Karl: Obrigado pela sua pergunta. Estou processando sua solicitação..."
)
# Placeholder para a resposta do chatbot
st.write(
"Dr. Karl: Esta é uma resposta de exemplo. A integração completa do chatbot será implementada posteriormente."
)
st.info(
"Nota: O Chatbot Dr. Karl está em desenvolvimento. Por favor, consulte um profissional de saúde para orientações médicas específicas."
)
# Aqui irá a estrutura para o chatbot
elif selected == "Mapas Mentais":
st.title("🧠 Mapas Mentais Interativos")
ans = 'https://www.mindomo.com/mindmap/sx-de-ax-medo-evitao-ou-alerta-7b7c0a68be8f492aada5e7370b09f5b1'
farm = 'https://www.mindomo.com/mindmap/-isrs-inibidores-seletivos-da-recaptao-de-serotonina-fb9e42a9a7db438ca001f1fc1e7181be'
sumula = 'https://www.mindomo.com/mindmap/smula-psicopatolgica-00738aa02ebc4d0da0e53b1551780293'
st.markdown("""
""", unsafe_allow_html=True)
st.markdown('
Escolha um mapa mental para explorar:
', unsafe_allow_html=True)
mapa_selecionado = st.radio(
"Selecione um mapa mental:",
["😰 Ansiedade", "💊 Farmacologia", "📚 Súmula Psicopatológica"],
label_visibility='collapsed',
horizontal=True,
key="mapa_mental_radio"
)
# Descrições dos mapas
st.markdown("""
- **Ansiedade**: Sx de Ax: Medo, Evitação ou Alerta
- **Farmacologia**: ISRSs: Inibidores Seletivos da Recaptação de Serotonina
- **Súmula Psicopatológica**: Visão geral da Psicopatologia
""")
# Função para exibir o mapa mental
@st.fragment
def exibir_mapa(url):
return components.iframe(url, height=900, width=1600)
# Seleção do mapa com base na escolha do usuário
if mapa_selecionado == "😰 Ansiedade":
mapa_url = ans
mapa_titulo = "😰 Mapa Mental: Ansiedade"
elif mapa_selecionado == "💊 Farmacologia":
mapa_url = farm
mapa_titulo = "💊 Mapa Mental: Farmacologia (ISRSs)"
elif mapa_selecionado == "📚 Súmula Psicopatológica":
mapa_url = sumula
mapa_titulo = "📚 Mapa Mental: Súmula Psicopatológica"
else:
st.warning("⚠️ Por favor, selecione um mapa mental para visualizar.")
st.stop()
# Exibir o mapa selecionado
st.subheader(mapa_titulo)
with st.expander("🔍 Clique para expandir/recolher o mapa", expanded=False):
exibir_mapa(mapa_url)
st.info("ℹ️ Dica: Clique com botão esquerdo do muse e arraste para mover o mapa, pressione CTRL e use a roda do mouse para dar zoom.")
footer="""
"""
st.markdown(footer,unsafe_allow_html=True)