-
Notifications
You must be signed in to change notification settings - Fork 0
/
app_v3.py
187 lines (168 loc) · 7.77 KB
/
app_v3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
import streamlit as st
import pandas as pd
import sqlite3
from datetime import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
# Configuración inicial de la página de Streamlit.
st.set_page_config(
page_title="Monitoreo de Presión Arterial",
page_icon="💓",
initial_sidebar_state='expanded',
menu_items={
'Get Help': 'https://www.isabellaea.com',
'Report a bug': None,
'About': "Aplicación de Monitoreo de Presión Arterial"
}
)
# Título principal y descripción de la aplicación.
st.title('Monitoreo de Presión Arterial')
st.write("""
Esta aplicación permite el seguimiento continuo y detallado de la presión arterial,
registrando y visualizando datos clave como la presión sistólica y diastólica.
""")
# Conexión con la base de datos SQLite.
conn = sqlite3.connect('presion_arterial.db')
c = conn.cursor()
# Creación de las tablas en la base de datos si no existen.
c.execute('''
CREATE TABLE IF NOT EXISTS pacientes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT,
edad INTEGER,
historial TEXT
)
''')
c.execute('''
CREATE TABLE IF NOT EXISTS mediciones (
id INTEGER PRIMARY KEY AUTOINCREMENT,
id_paciente INTEGER,
fecha TIMESTAMP,
sistolica INTEGER,
diastolica INTEGER,
FOREIGN KEY(id_paciente) REFERENCES pacientes(id)
)
''')
conn.commit() # No olvides hacer commit después de crear las tablas.
# Función para agregar pacientes a la base de datos.
def agregar_paciente(nombre, edad, historial):
c.execute("INSERT INTO pacientes (nombre, edad, historial) VALUES (?, ?, ?)", (nombre, edad, historial))
conn.commit()
# Función para agregar mediciones a la base de datos.
def agregar_medicion(id_paciente, fecha, sistolica, diastolica):
c.execute("INSERT INTO mediciones (id_paciente, fecha, sistolica, diastolica) VALUES (?, ?, ?, ?)", (id_paciente, fecha, sistolica, diastolica))
conn.commit()
# Función para generar diagnósticos y recomendaciones basados en las mediciones de presión arterial.
def generar_diagnostico(sistolica, diastolica):
if sistolica < 120 and diastolica < 80:
return ("Normal", "Mantener estilo de vida saludable y monitoreo regular.")
elif (140 <= sistolica or 90 <= diastolica) and (sistolica < 180 and diastolica < 120):
return ("Presión arterial alta", "Consultar con el médico para evaluación y posible tratamiento.")
elif 130 <= sistolica or 80 <= diastolica:
return ("Presión arterial alta (con factores de riesgo)", "Seguimiento cercano con el médico y considerar cambios en el estilo de vida.")
elif 180 <= sistolica or 120 <= diastolica:
return ("Presión arterial peligrosamente alta", "Buscar atención médica inmediata.")
else:
return ("Presión arterial elevada", "Monitorizar y consultar con el médico.")
# Estilo CSS personalizado
st.markdown(
"""
<style>
.paciente-container {
border-radius: 10px;
box-shadow: 5px 5px 20px rgba(0,0,0,0.1);
padding: 20px;
margin-bottom: 20px;
transition: box-shadow 0.3s ease-in-out;
background-color: #f8f9fa;
}
.paciente-container:hover {
box-shadow: 5px 5px 30px rgba(0,0,0,0.2);
}
.paciente-header {
color: #4f8bf9;
margin-bottom: 20px;
font-weight: 500;
}
.grafica {
margin-top: 20px;
margin-bottom: 20px;
}
.grafica-title {
text-align: center;
margin-top: 10px;
font-weight: bold;
color: #333;
}
.diagnostico-recomendacion {
margin-top: 20px;
padding: 10px;
background-color: #e9ecef;
border-left: 5px solid #4f8bf9;
font-weight: 500;
}
</style>
""",
unsafe_allow_html=True
)
# Sección de la interfaz de usuario para agregar pacientes.
st.sidebar.title("Agregar Paciente")
nombre_paciente = st.sidebar.text_input("Nombre del Paciente", placeholder="Ejemplo: Juan Pérez")
edad_paciente = st.sidebar.number_input("Edad del Paciente", min_value=0, max_value=120, step=1)
historial_paciente = st.sidebar.text_area("Historial Clínico")
if st.sidebar.button("Agregar Paciente"):
agregar_paciente(nombre_paciente, edad_paciente, historial_paciente)
st.sidebar.success("Paciente agregado con éxito.")
# Sección de la interfaz de usuario para agregar mediciones.
st.sidebar.title("Agregar Mediciones")
c.execute("SELECT id, nombre FROM pacientes")
pacientes = c.fetchall()
pacientes_dict = {nombre: id for id, nombre in pacientes}
paciente_seleccionado = st.sidebar.selectbox("Seleccionar Paciente", options=pacientes_dict.keys())
fecha_medicion = st.sidebar.date_input("Fecha de Medición")
hora_medicion = st.sidebar.time_input("Hora de Medición")
fecha_hora_medicion = datetime.combine(fecha_medicion, hora_medicion)
sistolica = st.sidebar.number_input("Presión Sistólica (mmHg)", min_value=50, max_value=250)
diastolica = st.sidebar.number_input("Presión Diastólica (mmHg)", min_value=30, max_value=150)
if st.sidebar.button("Registrar Medición"):
agregar_medicion(pacientes_dict[paciente_seleccionado], fecha_hora_medicion, sistolica, diastolica)
st.sidebar.success("Medición registrada con éxito.")
# Visualización de Datos y Generación de Diagnósticos
for id_paciente, nombre in pacientes:
with st.container():
st.markdown(f"<div class='paciente-container'>", unsafe_allow_html=True)
st.markdown(f"<h2 class='paciente-header'>Paciente: {nombre} (ID: {id_paciente})</h2>", unsafe_allow_html=True)
mediciones_df = pd.read_sql_query("SELECT * FROM mediciones WHERE id_paciente = ? ORDER BY fecha", conn, params=(id_paciente,))
if not mediciones_df.empty:
mediciones_df['Fecha'] = pd.to_datetime(mediciones_df['fecha']).dt.tz_localize(None)
mediciones_df.drop(columns=['fecha'], inplace=True)
st.dataframe(mediciones_df)
fig, ax = plt.subplots()
ax.plot(mediciones_df['Fecha'], mediciones_df['sistolica'], label='Sistólica', color='blue')
ax.plot(mediciones_df['Fecha'], mediciones_df['diastolica'], label='Diastólica', color='red')
ax.set_title('Evolución de la Presión Arterial')
ax.set_xlabel('Fecha')
ax.set_ylabel('Presión Arterial (mmHg)')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
ax.xaxis.set_tick_params(rotation=45)
ax.grid(True)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.legend()
plt.tight_layout()
st.pyplot(fig)
ultima_medicion = mediciones_df.iloc[-1]
diagnostico, recomendacion = generar_diagnostico(ultima_medicion['sistolica'], ultima_medicion['diastolica'])
st.markdown(f"<div class='diagnostico-recomendacion'><strong>Diagnóstico:</strong> {diagnostico}</div>", unsafe_allow_html=True)
st.markdown(f"<div class='diagnostico-recomendacion'><strong>Recomendación:</strong> {recomendacion}</div>", unsafe_allow_html=True)
else:
st.write("No hay mediciones disponibles para este paciente.")
st.markdown("</div>", unsafe_allow_html=True)
st.markdown("---")
# Cerrar conexión con la base de datos
conn.close()
# Sección de footer.
st.sidebar.markdown('---')
st.sidebar.subheader('Creado por:')
st.sidebar.markdown('Alexander Oviedo Fadul')
st.sidebar.markdown("[GitHub](https://github.com/bladealex9848) | [Website](https://alexander.oviedo.isabellaea.com/) | [Instagram](https://www.instagram.com/alexander.oviedo.fadul) | [Twitter](https://twitter.com/alexanderofadul) | [Facebook](https://www.facebook.com/alexanderof/) | [WhatsApp](https://api.whatsapp.com/send?phone=573015930519&text=Hola%20!Quiero%20conversar%20contigo!%20)")