Spaces:
Running
Running
Update views/pdf_chat.py
Browse files- views/pdf_chat.py +295 -64
views/pdf_chat.py
CHANGED
@@ -11,17 +11,15 @@ st.title("Utilidades")
|
|
11 |
nested_menu = option_menu(
|
12 |
menu_title=None,
|
13 |
options=[
|
14 |
-
"Incidências radiológicas", "
|
15 |
],
|
16 |
-
icons=['lungs', 'gear', 'envelope'],
|
17 |
menu_icon="cast",
|
18 |
default_index=0,
|
19 |
orientation="horizontal",
|
20 |
)
|
21 |
|
22 |
|
23 |
-
st.markdown('Calculadoras')
|
24 |
-
|
25 |
|
26 |
# Conteúdo das subpáginas
|
27 |
if nested_menu == "Incidências radiológicas":
|
@@ -137,14 +135,14 @@ if nested_menu == "Incidências radiológicas":
|
|
137 |
Feito com ❤️ e ☕ por **[Dr. Guilherme]**
|
138 |
""")
|
139 |
|
140 |
-
elif nested_menu == "
|
141 |
import pathlib
|
142 |
|
143 |
import streamlit as st
|
144 |
import streamlit.components.v1 as components
|
145 |
from streamlit_extras.add_vertical_space import add_vertical_space
|
146 |
|
147 |
-
st.header("
|
148 |
|
149 |
static_dir = pathlib.Path('static').absolute()
|
150 |
html_with_js= ''
|
@@ -631,12 +629,11 @@ elif nested_menu == "RAG":
|
|
631 |
with st.expander(label='Recomendações', expanded=False, icon="🔥"):
|
632 |
st.markdown(recomendacoes, unsafe_allow_html=True)
|
633 |
|
634 |
-
elif nested_menu == "
|
635 |
import pandas as pd
|
636 |
import streamlit as st
|
637 |
|
638 |
-
st.header("
|
639 |
-
|
640 |
|
641 |
STYLE = "static/style.css"
|
642 |
with open(STYLE, "r", encoding="utf-8") as f:
|
@@ -686,7 +683,7 @@ elif nested_menu == "Geral":
|
|
686 |
st.title("📊 Calculadora da Escala de Risco de Coelho e Savassi")
|
687 |
|
688 |
# Criando colunas para organizar o layout
|
689 |
-
col1, col2 = st.columns(
|
690 |
|
691 |
# Fatores de risco
|
692 |
fatores = [{
|
@@ -753,72 +750,306 @@ elif nested_menu == "Geral":
|
|
753 |
min_value=1,
|
754 |
value=1)
|
755 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
756 |
# Botão para calcular o risco
|
757 |
if st.button("Calcular Risco"):
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
#
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
774 |
-
|
775 |
-
|
776 |
-
|
777 |
-
|
778 |
-
|
779 |
-
else:
|
780 |
-
|
781 |
-
|
782 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
783 |
|
784 |
# Exibição do resultado
|
785 |
st.markdown(f"""
|
786 |
<div class='risk-result {classe_css}'>
|
787 |
-
|
788 |
-
|
789 |
-
|
790 |
</div>
|
791 |
""",
|
792 |
unsafe_allow_html=True)
|
793 |
|
794 |
# Tabela de detalhes
|
795 |
st.subheader("Detalhes da Pontuação")
|
796 |
-
detalhes = [
|
797 |
-
|
798 |
-
|
799 |
-
|
800 |
-
|
801 |
-
|
802 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
803 |
df_detalhes = pd.DataFrame(detalhes)
|
804 |
st.table(df_detalhes)
|
805 |
|
806 |
-
|
807 |
-
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
|
819 |
-
|
820 |
-
|
821 |
-
|
822 |
-
|
823 |
-
|
824 |
-
|
|
|
|
|
|
|
|
|
|
11 |
nested_menu = option_menu(
|
12 |
menu_title=None,
|
13 |
options=[
|
14 |
+
"Incidências radiológicas", "Calculadora TFG", "Escala de Risco de Coelho e Savassi", "Escore de Risco Global (ERG)"
|
15 |
],
|
16 |
+
icons=['lungs', 'gear', 'envelope', 'heart'],
|
17 |
menu_icon="cast",
|
18 |
default_index=0,
|
19 |
orientation="horizontal",
|
20 |
)
|
21 |
|
22 |
|
|
|
|
|
23 |
|
24 |
# Conteúdo das subpáginas
|
25 |
if nested_menu == "Incidências radiológicas":
|
|
|
135 |
Feito com ❤️ e ☕ por **[Dr. Guilherme]**
|
136 |
""")
|
137 |
|
138 |
+
elif nested_menu == "Calculadora TFG":
|
139 |
import pathlib
|
140 |
|
141 |
import streamlit as st
|
142 |
import streamlit.components.v1 as components
|
143 |
from streamlit_extras.add_vertical_space import add_vertical_space
|
144 |
|
145 |
+
st.header("Calculadora TFG")
|
146 |
|
147 |
static_dir = pathlib.Path('static').absolute()
|
148 |
html_with_js= ''
|
|
|
629 |
with st.expander(label='Recomendações', expanded=False, icon="🔥"):
|
630 |
st.markdown(recomendacoes, unsafe_allow_html=True)
|
631 |
|
632 |
+
elif nested_menu == "Escala de Risco de Coelho e Savassi":
|
633 |
import pandas as pd
|
634 |
import streamlit as st
|
635 |
|
636 |
+
st.header("Escala de Risco de Coelho e Savassi")
|
|
|
637 |
|
638 |
STYLE = "static/style.css"
|
639 |
with open(STYLE, "r", encoding="utf-8") as f:
|
|
|
683 |
st.title("📊 Calculadora da Escala de Risco de Coelho e Savassi")
|
684 |
|
685 |
# Criando colunas para organizar o layout
|
686 |
+
col1, col2, col3 = st.columns(3)
|
687 |
|
688 |
# Fatores de risco
|
689 |
fatores = [{
|
|
|
750 |
min_value=1,
|
751 |
value=1)
|
752 |
|
753 |
+
# Botão para calcular o risco
|
754 |
+
if st.button("Calcular Risco", use_container_width=True, icon="🧮️" ):
|
755 |
+
pontuacao_total = sum(fator["peso"] for fator in fatores
|
756 |
+
if checkboxes[fator["id"]])
|
757 |
+
|
758 |
+
# Cálculo do escore de cômodos por pessoa
|
759 |
+
escore_comodo_pessoa = num_comodos / num_moradores
|
760 |
+
if escore_comodo_pessoa < 1:
|
761 |
+
pontuacao_total += 3
|
762 |
+
|
763 |
+
# Determinação da classificação de risco
|
764 |
+
if pontuacao_total <= 4:
|
765 |
+
classificacao = "Risco Menor"
|
766 |
+
classe_css = "risk-menor"
|
767 |
+
icone = "✅"
|
768 |
+
elif pontuacao_total <= 6:
|
769 |
+
classificacao = "Risco Médio"
|
770 |
+
classe_css = "risk-medio"
|
771 |
+
icone = "⚠️"
|
772 |
+
elif pontuacao_total <= 8:
|
773 |
+
classificacao = "Risco Maior"
|
774 |
+
classe_css = "risk-maior"
|
775 |
+
icone = "🚨"
|
776 |
+
else:
|
777 |
+
classificacao = "Risco Máximo"
|
778 |
+
classe_css = "risk-maximo"
|
779 |
+
icone = "☠️"
|
780 |
+
|
781 |
+
# Exibição do resultado
|
782 |
+
st.markdown(f"""
|
783 |
+
<div class='risk-result {classe_css}'>
|
784 |
+
{icone} Classificação: {classificacao}<br>
|
785 |
+
📊 Pontuação: {pontuacao_total}<br>
|
786 |
+
🏠 Cômodos por pessoa: {escore_comodo_pessoa:.2f}
|
787 |
+
</div>
|
788 |
+
""",
|
789 |
+
unsafe_allow_html=True)
|
790 |
+
|
791 |
+
st.subheader("Detalhes da Pontuação")
|
792 |
+
detalhes = []
|
793 |
+
for fator in fatores:
|
794 |
+
if checkboxes[fator["id"]]:
|
795 |
+
detalhes.append({"Fator": fator["label"], "Peso": fator["peso"]})
|
796 |
+
if escore_comodo_pessoa < 1:
|
797 |
+
detalhes.append({"Fator": "🏠 Menos de 1 cômodo por pessoa", "Peso": 3})
|
798 |
+
|
799 |
+
df_detalhes = pd.DataFrame(detalhes)
|
800 |
+
st.table(df_detalhes)
|
801 |
+
|
802 |
+
|
803 |
+
with col3, st.expander("Sobre a Escala de Risco de Coelho e Savassi", icon='❤️', expanded=False):
|
804 |
+
st.markdown("""
|
805 |
+
---
|
806 |
+
### Sobre a Escala de Risco de Coelho e Savassi
|
807 |
+
|
808 |
+
A Escala de Risco de Coelho e Savassi é uma ferramenta utilizada na Atenção Primária à Saúde no Brasil para avaliar o risco familiar em territórios de saúde.
|
809 |
+
Ela foi desenvolvida pelos médicos brasileiros Marcos Alencar Abaide Balbinotti Coelho e Maria Inês Ribeiro de Miranda Savassi.
|
810 |
+
|
811 |
+
#### Como interpretar os resultados:
|
812 |
+
- **Risco Menor (≤ 4 pontos)**: Acompanhamento de rotina
|
813 |
+
- **Risco Médio (5-6 pontos)**: Acompanhamento programado
|
814 |
+
- **Risco Maior (7-8 pontos)**: Acompanhamento prioritário
|
815 |
+
- **Risco Máximo (≥ 9 pontos)**: Acompanhamento intensivo
|
816 |
+
|
817 |
+
Esta calculadora é uma ferramenta de apoio e não substitui a avaliação profissional.
|
818 |
+
""")
|
819 |
+
|
820 |
+
elif nested_menu == "Escore de Risco Global (ERG)":
|
821 |
+
import streamlit as st
|
822 |
+
import pandas as pd
|
823 |
+
import numpy as np
|
824 |
+
|
825 |
+
# CSS personalizado
|
826 |
+
st.markdown("""
|
827 |
+
<style>
|
828 |
+
.stRadio > label {
|
829 |
+
font-weight: bold;
|
830 |
+
color: #4A4A4A;
|
831 |
+
}
|
832 |
+
.stButton > button {
|
833 |
+
width: 100%;
|
834 |
+
}
|
835 |
+
.risk-result {
|
836 |
+
font-size: 24px;
|
837 |
+
font-weight: bold;
|
838 |
+
padding: 10px;
|
839 |
+
border-radius: 5px;
|
840 |
+
margin-top: 20px;
|
841 |
+
text-align: center;
|
842 |
+
}
|
843 |
+
.risk-baixo {
|
844 |
+
background-color: #2ecc71;
|
845 |
+
color: white;
|
846 |
+
}
|
847 |
+
.risk-intermediario {
|
848 |
+
background-color: #f39c12;
|
849 |
+
color: white;
|
850 |
+
}
|
851 |
+
.risk-alto {
|
852 |
+
background-color: #e74c3c;
|
853 |
+
color: white;
|
854 |
+
}
|
855 |
+
.risk-muito-alto {
|
856 |
+
background-color: #c0392b;
|
857 |
+
color: white;
|
858 |
+
}
|
859 |
+
</style>
|
860 |
+
""",
|
861 |
+
unsafe_allow_html=True)
|
862 |
+
|
863 |
+
# Título
|
864 |
+
st.header("Escore de Risco Global (ERG)")
|
865 |
+
st.markdown("Recomendado pela Sociedade Brasileira de Cardiologia")
|
866 |
+
|
867 |
+
# Criando colunas para organizar o layout
|
868 |
+
col1, col2 = st.columns(2)
|
869 |
+
|
870 |
+
# Inputs
|
871 |
+
with col1:
|
872 |
+
st.subheader("Dados Pessoais")
|
873 |
+
sexo = st.radio("Sexo", ["Masculino", "Feminino"])
|
874 |
+
idade = st.number_input("Idade", min_value=30, max_value=74, value=45)
|
875 |
+
tabagismo = st.checkbox("Tabagismo")
|
876 |
+
diabetes = st.checkbox("Diabetes")
|
877 |
+
|
878 |
+
with col2:
|
879 |
+
st.subheader("Dados Clínicos")
|
880 |
+
colesterol_total = st.number_input("Colesterol Total (mg/dL)",
|
881 |
+
min_value=0,
|
882 |
+
value=200)
|
883 |
+
hdl = st.number_input("HDL Colesterol (mg/dL)", min_value=0, value=50)
|
884 |
+
pas = st.number_input("Pressão Arterial Sistólica (mmHg)",
|
885 |
+
min_value=0,
|
886 |
+
value=120)
|
887 |
+
|
888 |
+
|
889 |
+
# Função para calcular o ERG
|
890 |
+
def calcular_erg(sexo, idade, tabagismo, diabetes, colesterol_total, hdl, pas):
|
891 |
+
pontos = 0
|
892 |
+
|
893 |
+
# Idade
|
894 |
+
if sexo == "Masculino":
|
895 |
+
if idade < 35: pontos -= 1
|
896 |
+
elif 35 <= idade <= 39: pontos += 0
|
897 |
+
elif 40 <= idade <= 44: pontos += 1
|
898 |
+
elif 45 <= idade <= 49: pontos += 2
|
899 |
+
elif 50 <= idade <= 54: pontos += 3
|
900 |
+
elif 55 <= idade <= 59: pontos += 4
|
901 |
+
elif 60 <= idade <= 64: pontos += 5
|
902 |
+
elif 65 <= idade <= 69: pontos += 6
|
903 |
+
else: pontos += 7
|
904 |
+
else: # Feminino
|
905 |
+
if idade < 35: pontos -= 9
|
906 |
+
elif 35 <= idade <= 39: pontos -= 4
|
907 |
+
elif 40 <= idade <= 44: pontos += 0
|
908 |
+
elif 45 <= idade <= 49: pontos += 3
|
909 |
+
elif 50 <= idade <= 54: pontos += 6
|
910 |
+
elif 55 <= idade <= 59: pontos += 7
|
911 |
+
elif 60 <= idade <= 64: pontos += 8
|
912 |
+
elif 65 <= idade <= 69: pontos += 8
|
913 |
+
else: pontos += 8
|
914 |
+
|
915 |
+
# Colesterol Total
|
916 |
+
if sexo == "Masculino":
|
917 |
+
if colesterol_total < 160: pontos -= 3
|
918 |
+
elif 160 <= colesterol_total <= 199: pontos += 0
|
919 |
+
elif 200 <= colesterol_total <= 239: pontos += 1
|
920 |
+
elif 240 <= colesterol_total <= 279: pontos += 2
|
921 |
+
else: pontos += 3
|
922 |
+
else: # Feminino
|
923 |
+
if colesterol_total < 160: pontos -= 2
|
924 |
+
elif 160 <= colesterol_total <= 199: pontos += 0
|
925 |
+
elif 200 <= colesterol_total <= 239: pontos += 1
|
926 |
+
elif 240 <= colesterol_total <= 279: pontos += 1
|
927 |
+
else: pontos += 3
|
928 |
+
|
929 |
+
# HDL
|
930 |
+
if hdl < 40: pontos += 2
|
931 |
+
elif 40 <= hdl <= 49: pontos += 1
|
932 |
+
elif 50 <= hdl <= 59: pontos += 0
|
933 |
+
else: pontos -= 2
|
934 |
+
|
935 |
+
# Pressão Arterial Sistólica
|
936 |
+
if pas < 120: pontos += 0
|
937 |
+
elif 120 <= pas <= 129: pontos += 0
|
938 |
+
elif 130 <= pas <= 139: pontos += 1
|
939 |
+
elif 140 <= pas <= 159: pontos += 2
|
940 |
+
else: pontos += 3
|
941 |
+
|
942 |
+
# Diabetes
|
943 |
+
if diabetes:
|
944 |
+
if sexo == "Masculino": pontos += 2
|
945 |
+
else: pontos += 4
|
946 |
+
|
947 |
+
# Tabagismo
|
948 |
+
if tabagismo:
|
949 |
+
if sexo == "Masculino": pontos += 2
|
950 |
+
else: pontos += 2
|
951 |
+
|
952 |
+
return pontos
|
953 |
+
|
954 |
+
|
955 |
# Botão para calcular o risco
|
956 |
if st.button("Calcular Risco"):
|
957 |
+
pontos = calcular_erg(sexo, idade, tabagismo, diabetes, colesterol_total,
|
958 |
+
hdl, pas)
|
959 |
+
|
960 |
+
# Interpretação do risco
|
961 |
+
if sexo == "Masculino":
|
962 |
+
if pontos <= 5:
|
963 |
+
risco = "Baixo"
|
964 |
+
classe_css = "risk-baixo"
|
965 |
+
probabilidade = "< 5%"
|
966 |
+
elif 6 <= pontos <= 10:
|
967 |
+
risco = "Intermediário"
|
968 |
+
classe_css = "risk-intermediario"
|
969 |
+
probabilidade = "5 a 10%"
|
970 |
+
elif 11 <= pontos <= 14:
|
971 |
+
risco = "Alto"
|
972 |
+
classe_css = "risk-alto"
|
973 |
+
probabilidade = "10 a 20%"
|
974 |
+
else:
|
975 |
+
risco = "Muito Alto"
|
976 |
+
classe_css = "risk-muito-alto"
|
977 |
+
probabilidade = "> 20%"
|
978 |
+
else: # Feminino
|
979 |
+
if pontos <= 7:
|
980 |
+
risco = "Baixo"
|
981 |
+
classe_css = "risk-baixo"
|
982 |
+
probabilidade = "< 5%"
|
983 |
+
elif 8 <= pontos <= 12:
|
984 |
+
risco = "Intermediário"
|
985 |
+
classe_css = "risk-intermediario"
|
986 |
+
probabilidade = "5 a 10%"
|
987 |
+
elif 13 <= pontos <= 17:
|
988 |
+
risco = "Alto"
|
989 |
+
classe_css = "risk-alto"
|
990 |
+
probabilidade = "10 a 20%"
|
991 |
+
else:
|
992 |
+
risco = "Muito Alto"
|
993 |
+
classe_css = "risk-muito-alto"
|
994 |
+
probabilidade = "> 20%"
|
995 |
|
996 |
# Exibição do resultado
|
997 |
st.markdown(f"""
|
998 |
<div class='risk-result {classe_css}'>
|
999 |
+
Risco Cardiovascular: {risco}<br>
|
1000 |
+
Pontuação: {pontos}<br>
|
1001 |
+
Probabilidade de evento cardiovascular em 10 anos: {probabilidade}
|
1002 |
</div>
|
1003 |
""",
|
1004 |
unsafe_allow_html=True)
|
1005 |
|
1006 |
# Tabela de detalhes
|
1007 |
st.subheader("Detalhes da Pontuação")
|
1008 |
+
detalhes = [{
|
1009 |
+
"Fator": "Idade",
|
1010 |
+
"Valor": f"{idade} anos"
|
1011 |
+
}, {
|
1012 |
+
"Fator": "Sexo",
|
1013 |
+
"Valor": sexo
|
1014 |
+
}, {
|
1015 |
+
"Fator": "Colesterol Total",
|
1016 |
+
"Valor": f"{colesterol_total} mg/dL"
|
1017 |
+
}, {
|
1018 |
+
"Fator": "HDL Colesterol",
|
1019 |
+
"Valor": f"{hdl} mg/dL"
|
1020 |
+
}, {
|
1021 |
+
"Fator": "Pressão Arterial Sistólica",
|
1022 |
+
"Valor": f"{pas} mmHg"
|
1023 |
+
}, {
|
1024 |
+
"Fator": "Diabetes",
|
1025 |
+
"Valor": "Sim" if diabetes else "Não"
|
1026 |
+
}, {
|
1027 |
+
"Fator": "Tabagismo",
|
1028 |
+
"Valor": "Sim" if tabagismo else "Não"
|
1029 |
+
}]
|
1030 |
df_detalhes = pd.DataFrame(detalhes)
|
1031 |
st.table(df_detalhes)
|
1032 |
|
1033 |
+
with st.expander("Sobre o Escore de Risco Global (ERG)", icon='❤️', expanded=False):
|
1034 |
+
st.markdown("""
|
1035 |
+
---
|
1036 |
+
### Sobre o Escore de Risco Global (ERG)
|
1037 |
+
|
1038 |
+
O Escore de Risco Global (ERG) é a ferramenta principal recomendada pela Sociedade Brasileira de Cardiologia para avaliação do risco cardiovascular. Foi desenvolvido com base em dados da população brasileira e considera os seguintes fatores:
|
1039 |
+
|
1040 |
+
- Idade
|
1041 |
+
- Sexo
|
1042 |
+
- Tabagismo
|
1043 |
+
- Diabetes
|
1044 |
+
- Níveis de colesterol total e HDL
|
1045 |
+
- Pressão arterial sistólica
|
1046 |
+
|
1047 |
+
#### Como interpretar os resultados:
|
1048 |
+
- **Baixo Risco**: Probabilidade < 5% de eventos cardiovasculares em 10 anos
|
1049 |
+
- **Risco Intermediário**: Probabilidade de 5 a 10% de eventos cardiovasculares em 10 anos
|
1050 |
+
- **Alto Risco**: Probabilidade de 10 a 20% de eventos cardiovasculares em 10 anos
|
1051 |
+
- **Muito Alto Risco**: Probabilidade > 20% de eventos cardiovasculares em 10 anos
|
1052 |
+
|
1053 |
+
Esta calculadora é uma ferramenta de apoio e não substitui a avaliação profissional. Consulte sempre um médico para interpretação adequada dos resultados e recomendações personalizadas.
|
1054 |
+
""")
|
1055 |
+
|