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) selected = option_menu( menu_title="Menu Principal", options=[ "Home", "Escalas de Ansiedade", "Tratamentos", "Efeitos Colaterais", "Chatbot Dr. Karl", "Mapas Mentais", ], icons=[ "house", "clipboard-check", "capsule", "exclamation-triangle", "chat-dots", "map", ], menu_icon="cast", default_index=0, styles={ "container": {"padding": "0!important", "background-color": "transparent"}, "icon": {"color": "#0066cc", "font-size": "18px"}, "nav-link": { "font-size": "16px", "text-align": "left", "margin": "0px", "--hover-color": "#e0e0e0", }, "nav-link-selected": {"background-color": "#e0e0e0"}, }, ) 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:

""", 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) responses[item] = st.select_slider( item, options=["Ausente", "Leve", "Moderado", "Grave", "Muito grave"], value="Ausente", ) 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) responses[item] = st.select_slider( item, options=["Absolutamente não", "Levemente", "Moderadamente", "Gravemente"], value="Absolutamente não", key=f"bai_{i}" ) 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)