Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,308 +1,88 @@
|
|
1 |
-
|
2 |
-
os.system('pip install gradio==4.42.0 curl_cffi tqdm bitsandbytes tiktoken g4f pinecone-client pandas datasets sentence-transformers pydantic')
|
3 |
|
4 |
-
PINECONE_API_KEY = os.getenv("PINECONE_API_KEY")
|
5 |
-
PINECONE_ENVIRONMENT = os.getenv("PINECONE_ENVIRONMENT")
|
6 |
-
|
7 |
-
from pydantic import BaseModel, ConfigDict
|
8 |
-
|
9 |
-
class MyModel(BaseModel):
|
10 |
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
11 |
-
|
12 |
-
# Setup and load your keys
|
13 |
-
import os
|
14 |
-
from g4f import ChatCompletion
|
15 |
-
from pinecone import Pinecone
|
16 |
-
import pandas as pd
|
17 |
-
from datasets import Dataset
|
18 |
-
from sentence_transformers import SentenceTransformer
|
19 |
-
import gradio as gr
|
20 |
-
|
21 |
-
#TEMA GRADIO
|
22 |
import gradio as gr
|
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 |
-
print(f"Currently selected model: {EMBED_MODEL}")
|
92 |
-
print(f"Dimensions: {DIMENSIONS}")
|
93 |
-
|
94 |
-
# Establecer el nombre del índice automáticamente
|
95 |
-
INDEX_NAME = 'neonatos2'
|
96 |
-
|
97 |
-
def connect_to_pinecone(index_name):
|
98 |
-
global INDEX_NAME
|
99 |
-
try:
|
100 |
-
pc = Pinecone(api_key=PINECONE_API_KEY)
|
101 |
-
index = pc.Index(index_name)
|
102 |
-
|
103 |
-
# Asegurarse de que la conexión se establezca
|
104 |
-
index_stats = index.describe_index_stats()
|
105 |
-
print(f"Successfully connected to Pinecone index '{index_name}'!")
|
106 |
-
print("Index Stats:", index_stats)
|
107 |
-
|
108 |
-
# Actualizar la variable global INDEX_NAME
|
109 |
-
INDEX_NAME = index_name
|
110 |
-
print(f"Global INDEX_NAME updated to: {INDEX_NAME}")
|
111 |
-
|
112 |
-
except Exception as e:
|
113 |
-
print(f"Failed to connect to Pinecone index '{index_name}':", str(e))
|
114 |
-
|
115 |
-
# Conectar automáticamente al índice "neonatos"
|
116 |
-
connect_to_pinecone(INDEX_NAME)
|
117 |
-
|
118 |
-
# Función para imprimir el nombre del índice actual (puede ser usada en otras celdas)
|
119 |
-
def print_current_index():
|
120 |
-
print(f"Current index name: {INDEX_NAME}")
|
121 |
-
|
122 |
-
# Verificar si las variables globales necesarias están configuradas
|
123 |
-
if 'INDEX_NAME' not in globals() or INDEX_NAME is None:
|
124 |
-
raise ValueError("INDEX_NAME is not set. Please set the index name first.")
|
125 |
-
|
126 |
-
if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None:
|
127 |
-
raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.")
|
128 |
-
|
129 |
-
# Inicializar cliente de Pinecone
|
130 |
-
#PINECONE_API_KEY = userdata.get('PINECONE_API_KEY')
|
131 |
-
pc = Pinecone(api_key=PINECONE_API_KEY)
|
132 |
-
|
133 |
-
# Inicializar el índice de Pinecone
|
134 |
-
index = pc.Index(INDEX_NAME)
|
135 |
-
|
136 |
-
# Obtener la dimensión del índice
|
137 |
-
index_stats = index.describe_index_stats()
|
138 |
-
vector_dim = index_stats['dimension']
|
139 |
-
print(f"Index dimension: {vector_dim}")
|
140 |
-
|
141 |
-
# Definir manualmente los campos de contexto y enlace
|
142 |
-
CONTEXT_FIELDS = ['Tag','Pregunta','Respuesta']
|
143 |
-
LINK_FIELDS = ['Tag','Respuesta']
|
144 |
-
|
145 |
-
# Imprimir confirmación de campos seleccionados
|
146 |
-
print(f"Context fields set to: {CONTEXT_FIELDS}")
|
147 |
-
print(f"Link fields set to: {LINK_FIELDS}")
|
148 |
-
|
149 |
-
# Función para obtener las selecciones actuales de campos (puede ser usada en otras celdas)
|
150 |
-
def get_field_selections():
|
151 |
-
return {
|
152 |
-
"CONTEXT_FIELDS": CONTEXT_FIELDS,
|
153 |
-
"LINK_FIELDS": LINK_FIELDS
|
154 |
-
}
|
155 |
-
|
156 |
-
#####################################
|
157 |
-
|
158 |
-
# Check if required global variables are set
|
159 |
-
if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None:
|
160 |
-
raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.")
|
161 |
-
if 'INDEX_NAME' not in globals() or INDEX_NAME is None:
|
162 |
-
raise ValueError("INDEX_NAME is not set. Please create or select an index first.")
|
163 |
-
if 'CONTEXT_FIELDS' not in globals() or 'LINK_FIELDS' not in globals():
|
164 |
-
raise ValueError("CONTEXT_FIELDS and LINK_FIELDS are not set. Please run the field selection cell first.")
|
165 |
-
|
166 |
-
# Initialize the Sentence-Transformer model
|
167 |
-
embedding_model = SentenceTransformer(model_name)
|
168 |
-
|
169 |
-
# Initialize Pinecone with the API key and connect to the index
|
170 |
-
pinecone_client = Pinecone(api_key=PINECONE_API_KEY)
|
171 |
-
index = pinecone_client.Index(INDEX_NAME)
|
172 |
-
|
173 |
-
# Constants
|
174 |
-
LIMIT = 3750
|
175 |
-
|
176 |
-
def vector_search(query):
|
177 |
-
# Generate embedding using Sentence-Transformer model
|
178 |
-
xq = embedding_model.encode(query)
|
179 |
-
|
180 |
-
# Perform vector search on Pinecone index
|
181 |
-
res = index.query(vector=xq.tolist(), top_k=3, include_metadata=True)
|
182 |
-
if res['matches']:
|
183 |
-
return [
|
184 |
-
{
|
185 |
-
'content': ' '.join(f"{k}: {v}" for k, v in match['metadata'].items() if k in CONTEXT_FIELDS and k != 'Tag'),
|
186 |
-
'metadata': match['metadata']
|
187 |
-
}
|
188 |
-
for match in res['matches']
|
189 |
-
if 'metadata' in match
|
190 |
-
]
|
191 |
-
return []
|
192 |
-
|
193 |
-
def create_prompt(query, contexts):
|
194 |
-
prompt_start = "\n\nContexto:\n"
|
195 |
-
prompt_end = f"\n\nPregunta: {query}\nRespuesta:"
|
196 |
-
|
197 |
-
current_contexts = "\n\n---\n\n".join([context['content'] for context in contexts])
|
198 |
-
if len(prompt_start + current_contexts + prompt_end) >= LIMIT:
|
199 |
-
# Truncate contexts if they exceed the limit
|
200 |
-
available_space = LIMIT - len(prompt_start) - len(prompt_end)
|
201 |
-
truncated_contexts = current_contexts[:available_space]
|
202 |
-
return prompt_start + truncated_contexts + prompt_end
|
203 |
-
else:
|
204 |
-
return prompt_start + current_contexts + prompt_end
|
205 |
-
|
206 |
-
def complete(prompt):
|
207 |
-
return [f"🌟"]
|
208 |
-
|
209 |
-
def check_image_exists(filepath):
|
210 |
-
return os.path.exists(filepath)
|
211 |
-
|
212 |
-
def chat_function(message, history):
|
213 |
-
# Perform vector search
|
214 |
-
search_results = vector_search(message)
|
215 |
-
|
216 |
-
# Create prompt with relevant contexts
|
217 |
-
query_with_contexts = create_prompt(message, search_results)
|
218 |
-
|
219 |
-
# Generate response
|
220 |
-
response = complete(query_with_contexts)
|
221 |
-
|
222 |
-
partial_message = response[0].split("\n")[0] # Solo tomar la primera línea de la respuesta
|
223 |
-
|
224 |
-
# Handle the logic for processing tags and images internally
|
225 |
-
relevant_links = [result['metadata'].get(field) for result in search_results for field in LINK_FIELDS if field in result['metadata']]
|
226 |
-
full_response = partial_message
|
227 |
-
image_url = None
|
228 |
-
tags_detected = []
|
229 |
-
|
230 |
-
filtered_links = []
|
231 |
-
if relevant_links:
|
232 |
-
for link in relevant_links:
|
233 |
-
if any(tag in link for tag in ["rId101", "rId105", "rId109", "rId113", "rId117",
|
234 |
-
"rId121", "rId125", "rId129", "rId133", "rId136",
|
235 |
-
"rId139", "rId142", "rId145", "rId149", "rId153",
|
236 |
-
"rId157", "rId161", "rId165", "rId169", "rId173",
|
237 |
-
"rId177", "rId180", "rId184", "rId187", "rId192",
|
238 |
-
"rId195", "rId40", "rId44", "rId47", "rId50",
|
239 |
-
"rId53", "rId56", "rId59", "rId63", "rId66",
|
240 |
-
"rId70", "rId73", "rId76", "rId80", "rId83",
|
241 |
-
"rId87", "rId90", "rId94", "rId97"]):
|
242 |
-
tags_detected.append(link) # Save the tag but don't display it
|
243 |
else:
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
tags_to_images = {
|
252 |
-
"rId101": "images/rId101.png",
|
253 |
-
"rId105": "images/rId105.png",
|
254 |
-
"rId109": "images/rId109.png",
|
255 |
-
"rId113": "images/rId113.png",
|
256 |
-
"rId117": "images/rId117.png",
|
257 |
-
"rId121": "images/rId121.png",
|
258 |
-
"rId125": "images/rId125.png",
|
259 |
-
"rId129": "images/rId129.png",
|
260 |
-
"rId133": "images/rId133.png",
|
261 |
-
"rId136": "images/rId136.png",
|
262 |
-
"rId139": "images/rId139.png",
|
263 |
-
"rId142": "images/rId142.png",
|
264 |
-
"rId145": "images/rId145.png",
|
265 |
-
"rId149": "images/rId149.png",
|
266 |
-
"rId153": "images/rId153.png",
|
267 |
-
"rId157": "images/rId157.png",
|
268 |
-
"rId161": "images/rId161.png",
|
269 |
-
"rId165": "images/rId165.png",
|
270 |
-
"rId169": "images/rId169.png",
|
271 |
-
"rId173": "images/rId173.png",
|
272 |
-
"rId177": "images/rId177.png",
|
273 |
-
"rId180": "images/rId180.png",
|
274 |
-
"rId184": "images/rId184.png",
|
275 |
-
"rId187": "images/rId187.png",
|
276 |
-
"rId192": "images/rId192.png",
|
277 |
-
"rId195": "images/rId195.png",
|
278 |
-
"rId40": "images/rId40.png",
|
279 |
-
"rId44": "images/rId44.png",
|
280 |
-
"rId47": "images/rId47.png",
|
281 |
-
"rId50": "images/rId50.png",
|
282 |
-
"rId53": "images/rId53.png",
|
283 |
-
"rId56": "images/rId56.png",
|
284 |
-
"rId59": "images/rId59.png",
|
285 |
-
"rId63": "images/rId63.png",
|
286 |
-
"rId66": "images/rId66.png",
|
287 |
-
"rId70": "images/rId70.png",
|
288 |
-
"rId73": "images/rId73.png",
|
289 |
-
"rId76": "images/rId76.png",
|
290 |
-
"rId80": "images/rId80.png",
|
291 |
-
"rId83": "images/rId83.png",
|
292 |
-
"rId87": "images/rId87.png",
|
293 |
-
"rId90": "images/rId90.png",
|
294 |
-
"rId94": "images/rId94.png",
|
295 |
-
"rId97": "images/rId97.png",
|
296 |
-
}
|
297 |
-
|
298 |
-
for tag in tags_detected:
|
299 |
-
for key, path in tags_to_images.items():
|
300 |
-
if key in tag and check_image_exists(path):
|
301 |
-
image_url = path
|
302 |
-
break
|
303 |
-
|
304 |
-
return full_response, image_url
|
305 |
|
|
|
|
|
|
|
|
|
|
|
306 |
|
307 |
def update_image(image_url):
|
308 |
if image_url:
|
@@ -310,428 +90,11 @@ def update_image(image_url):
|
|
310 |
else:
|
311 |
return None
|
312 |
|
313 |
-
|
314 |
-
|
315 |
-
{"id": "rId105", "path": "images/rId105.png", "description": "🏥 Los establecimientos de nivel 3 son los más representados, con 652,948 registros, seguidos por los de nivel 4 (310,272) y nivel 2 (277,385)."},
|
316 |
-
{"id": "rId109", "path": "images/rId109.png", "description": "📊 El código UBIGEO revela que Lima (150101) lidera en registros, seguido por Trujillo (130101) y San Juan de Miraflores (150133), evidenciando la concentración de atención médica. Un gráfico de barras destaca los 10 códigos más frecuentes, facilitando la identificación de áreas con mayor actividad en salud."},
|
317 |
-
{"id": "rId113", "path": "images/rId113.png", "description": "🏥 El Instituto Nacional Materno Perinatal lidera en registros, destacando su rol en la atención materno-infantil en Perú. Le siguen el Hospital María Auxiliadora y el Hospital Nacional Cayetano Heredia. Un gráfico de barras horizontal compara los 10 establecimientos con más registros."},
|
318 |
-
{"id": "rId117", "path": "images/rId117.png", "description": "📊 El código UBIGEO muestra que Lima (150101) encabeza los registros, seguido por Trujillo (130101) y San Juan de Miraflores (150133), reflejando la concentración de atención médica. Un gráfico de barras resalta los 10 códigos más frecuentes, ayudando a identificar las áreas con mayor actividad en salud."},
|
319 |
-
{"id": "rId121", "path": "images/rId121.png", "description": "👶 La Atención Inmediata del Recién Nacido Normal es el servicio más registrado, seguido por el Internamiento del Recién Nacido con Patología No Quirúrgica. Estos reflejan los cuidados comunes en neonatología. Servicios más especializados, como Internamiento en UCI y Atención por Emergencia, son menos frecuentes. Un gráfico de barras horizontal muestra la distribución de los registros por tipo de servicio."},
|
320 |
-
{"id": "rId125", "path": "images/rId125.png", "description": "📅 El análisis de la variable FECINGHOSP muestra que los ingresos hospitalarios se distribuyen en el tiempo, con picos en ciertos períodos. El rango va del 7 de diciembre de 2021 al 30 de septiembre de 2023, con una mediana el 6 de noviembre de 2022, reflejando una demanda constante de hospitalización de recién nacidos. Un gráfico de líneas muestra los momentos de mayor afluencia hospitalaria."},
|
321 |
-
{"id": "rId129", "path": "images/rId129.png", "description": "📅 La variable FECALTAHOSP, que registra las altas hospitalarias, sigue un patrón similar a los ingresos, con fechas entre el 1 de enero de 2022 y el 30 de septiembre de 2023. La mediana es el 10 de noviembre de 2022, sugiriendo hospitalizaciones breves y un manejo eficiente. Un gráfico de líneas ilustra la distribución de las altas a lo largo del tiempo."},
|
322 |
-
{"id": "rId133", "path": "images/rId133.png", "description": "📊 El análisis muestra que la mayoría de los recién nacidos están hospitalizados por períodos cortos, con una mediana de 1 día y una media de 3.46 días. La desviación estándar de 5.25 días refleja la variabilidad según la complejidad de los casos, con estancias máximas de hasta 35 días. Histogramas y boxplots visualizan la distribución de los días de hospitalización según sexo y nivel de establecimiento de salud, destacando variaciones por factores."},
|
323 |
-
{"id": "rId136", "path": "images/rId136.png", "description": ""},
|
324 |
-
{"id": "rId139", "path": "images/rId139.png", "description": ""},
|
325 |
-
{"id": "rId142", "path": "images/rId142.png", "description": ""},
|
326 |
-
{"id": "rId145", "path": "images/rId145.png", "description": ""},
|
327 |
-
{"id": "rId149", "path": "images/rId149.png", "description": ""},
|
328 |
-
{"id": "rId153", "path": "images/rId153.png", "description": ""},
|
329 |
-
{"id": "rId157", "path": "images/rId157.png", "description": ""},
|
330 |
-
{"id": "rId161", "path": "images/rId161.png", "description": ""},
|
331 |
-
{"id": "rId165", "path": "images/rId165.png", "description": ""},
|
332 |
-
{"id": "rId169", "path": "images/rId169.png", "description": ""},
|
333 |
-
{"id": "rId173", "path": "images/rId173.png", "description": ""},
|
334 |
-
{"id": "rId177", "path": "images/rId177.png", "description": "📊 Este gráfico muestra la distribución del valor bruto de medicamentos por sexo, con mujeres en rosa y hombres en azul."},
|
335 |
-
{"id": "rId180", "path": "images/rId180.png", "description": "💊 El valor bruto de los medicamentos tiene una mediana de 0.69 soles, una media de 2.14 soles y una desviación estándar de 3.78 soles. Aunque la mayoría de los costos son bajos, algunos alcanzan hasta 17.213 soles 💰. Los histogramas 📊 muestran variaciones significativas por sexo y departamento."},
|
336 |
-
{"id": "rId184", "path": "images/rId184.png", "description": "📊 Los gráficos reflejan la distribución por sexo y departamento, mostrando diferencias en los costos de medicamentos entre hombres y mujeres, así como entre distintas regiones."},
|
337 |
-
{"id": "rId187", "path": "images/rId187.png", "description": "💊 El valor neto de los medicamentos, tras descuentos, tiene una mediana de 0.4 soles y una media de 1.93 soles, con una desviación estándar de 3.59 soles. La mayoría presenta un costo bajo, aunque algunos alcanzan hasta 16.5 soles 💰."},
|
338 |
-
{"id": "rId192", "path": "images/rId192.png", "description": "🗺️ Este mapa ilustra la distribución de los registros de atención de salud en los departamentos del Perú 🇵🇪, utilizando un gradiente de color que varía desde tonos claros (menos registros) hasta tonos oscuros (más registros) 📊. Se destacan regiones con mayor actividad médica, como Lima."},
|
339 |
-
{"id": "rId195", "path": "images/rId195.png", "description": "🗺️ Este mapa muestra los departamentos del Perú 🇵🇪 con sus nombres claramente visibles, desde Tumbes y Piura en la costa 🌊 hasta Cusco y Puno en los Andes 🏔️ y Loreto en la Amazonía 🌳."},
|
340 |
-
{"id": "rId40", "path": "images/rId40.png", "description": "📊 El análisis de la frecuencia de códigos anonimizados revela que los 10 más comunes se repiten entre 52 y 75 veces, indicando múltiples visitas o tratamientos para los mismos pacientes. Un gráfico de barras muestra la frecuencia de estos códigos, usando solo los primeros 5 caracteres para facilitar su lectura y comparación."},
|
341 |
-
{"id": "rId44", "path": "images/rId44.png", "description": "📊 El análisis de la frecuencia de códigos anonimizados muestra que los 10 más comunes se repiten entre 52 y 75 veces, lo que sugiere múltiples visitas o tratamientos de los mismos pacientes. Un gráfico de barras presenta la frecuencia de estos códigos, utilizando solo los primeros 5 caracteres para simplificar la comparación."},
|
342 |
-
{"id": "rId47", "path": "images/rId47.png", "description": ""},
|
343 |
-
{"id": "rId50", "path": "images/rId50.png", "description": ""},
|
344 |
-
{"id": "rId53", "path": "images/rId53.png", "description": ""},
|
345 |
-
{"id": "rId56", "path": "images/rId56.png", "description": ""},
|
346 |
-
{"id": "rId59", "path": "images/rId59.png", "description": ""},
|
347 |
-
{"id": "rId63", "path": "images/rId63.png", "description": "📅 La variable FECATENCION, que registra la fecha de atención a los recién nacidos, abarca del 1 de enero de 2022 al 30 de septiembre de 2023, con mayor concentración entre mayo de 2022 y abril de 2023. El análisis muestra una distribución uniforme con ligeros picos. Las visualizaciones incluyen registros por año y una serie de tiempo con líneas punteadas que destacan fechas clave para un análisis temporal detallado."},
|
348 |
-
{"id": "rId66", "path": "images/rId66.png", "description": ""},
|
349 |
-
{"id": "rId70", "path": "images/rId70.png", "description": "👶 La variable SEXO clasifica a los pacientes en femenino y masculino, con una ligera predominancia de masculinos (651,827) sobre femeninos (588,778), lo que puede aportar a la comprensión de las dinámicas de género en la atención neonatal. Un gráfico de barras con colores diferenciados (rosado y azul) facilita la comparación visual. La variable PESO, con un rango de 1.75 kg a 4.55 kg y un promedio de 3.13 kg, refleja un margen estrecho de variabilidad."},
|
350 |
-
{"id": "rId73", "path": "images/rId73.png", "description": ""},
|
351 |
-
{"id": "rId76", "path": "images/rId76.png", "description": ""},
|
352 |
-
{"id": "rId80", "path": "images/rId80.png", "description": "📊 El análisis muestra que Lima lidera en registros con 284,662, seguida por La Libertad, Cajamarca y Cusco, con entre 73,592 y 80,447 registros. Esto refleja la alta población y centralización de servicios en la capital. En contraste, Moquegua, Madre de Dios y Tacna tienen menos de 8,000 registros, posiblemente por menor población o acceso limitado a salud. Gráficos de barras visualizan los departamentos con más y menos registros."},
|
353 |
-
{"id": "rId83", "path": "images/rId83.png", "description": ""},
|
354 |
-
{"id": "rId87", "path": "images/rId87.png", "description": "📊 En cuanto a la distribución por provincia, la ciudad de Lima lidera con 83,743 registros, seguida por Trujillo, San Juan de Miraflores, y Cajamarca, que registran entre 26,721 y 32,926 casos. Estas cifras reflejan la alta demanda de atención en áreas urbanas y densamente pobladas. En contraste, provincias como Ocros y Canta, con tan solo 3 y 5 registros respectivamente, se encuentran en el extremo opuesto, lo que podría indicar áreas con menor cobertura de servicios de salud o baja densidad poblacional. La distribución de registros por provincia se presenta en gráficos de barras que ilustran tanto los valores más altos como los más bajos."},
|
355 |
-
{"id": "rId90", "path": "images/rId90.png", "description": ""},
|
356 |
-
{"id": "rId94", "path": "images/rId94.png", "description": "📊 El análisis por distrito confirma a Lima como el líder en registros con 83,743 casos, seguido por Trujillo y San Juan de Miraflores, resaltando su relevancia como centros de atención médica. En contraste, distritos como Acos Vinchos y Capachica tienen solo un registro, lo que sugiere menor cobertura o acceso a servicios de salud. Gráficos de barras visualizan tanto los distritos con más como con menos registros."},
|
357 |
-
{"id": "rId97", "path": "images/rId97.png", "description": ""},
|
358 |
-
]
|
359 |
-
|
360 |
-
# Gradio layout setup
|
361 |
-
with gr.Blocks(theme=theme) as demo:
|
362 |
-
with gr.Row():
|
363 |
-
with gr.Column(scale=1):
|
364 |
-
# Agregar el video al inicio
|
365 |
-
video = gr.Video(value="video.mp4", label="Video de Introducción")
|
366 |
-
|
367 |
-
# Crear la estructura para tres columnas de carruseles
|
368 |
-
gr.Markdown("### Carruseles de Imágenes")
|
369 |
-
|
370 |
-
# Crear grupos de imágenes y descripciones
|
371 |
-
image_groups = [
|
372 |
-
#Análisis Geográfico
|
373 |
-
[images[24], images[25]],
|
374 |
-
#Valor Bruto Medicamento
|
375 |
-
[images[21],images[20]],
|
376 |
-
#Valor Neto Medicamento
|
377 |
-
[images[23],images[22]],
|
378 |
-
|
379 |
-
#Departamento (Registro)
|
380 |
-
[images[38], images[39]],
|
381 |
-
#Provincia (Registro)
|
382 |
-
[images[40], images[41]],
|
383 |
-
#Distrito (Registro)
|
384 |
-
[images[42], images[43]],
|
385 |
-
|
386 |
-
#Peso (Análisis)
|
387 |
-
[images[35], images[36], images[37]],
|
388 |
-
#Departamento (Análisis)
|
389 |
-
[images[29], images[12], images[11]],
|
390 |
-
#Sexo (Análisis)
|
391 |
-
[images[28], images[32]],
|
392 |
-
|
393 |
-
#Establecimiento de Salud
|
394 |
-
[images[3], images[1], images[10], images[30]],
|
395 |
-
#Servicio de Salud
|
396 |
-
[images[5], images[14]],
|
397 |
-
#Medicamentos
|
398 |
-
[images[16], images[17], images[18], images[15]],
|
399 |
-
|
400 |
-
]
|
401 |
-
|
402 |
-
carousel_titles = [
|
403 |
-
"Análisis Geográfico", # Título para el primer carrusel
|
404 |
-
"Valor bruto de medicamento", # Título para el segundo carrusel
|
405 |
-
"Valor neto de medicamento", #Título Tercer carrusel
|
406 |
-
"Departamento (Registro)",
|
407 |
-
"Provincia (Registro)",
|
408 |
-
"Distrito (Registro)",
|
409 |
-
"Peso (Análisis)",
|
410 |
-
"Departamento (Análisis)",
|
411 |
-
"Sexo (Análisis)",
|
412 |
-
"Establecimiento de Salud",
|
413 |
-
"Servicio de Salud",
|
414 |
-
"Medicamentos",
|
415 |
-
]
|
416 |
-
|
417 |
-
# Crear tres columnas de carruseles
|
418 |
-
with gr.Row():
|
419 |
-
for group in range(0, len(image_groups), 3): # Iterar en sets de 3 carruseles
|
420 |
-
with gr.Column(scale=1): # Crear columna para cada carrusel
|
421 |
-
with gr.Tabs():
|
422 |
-
for idx in range(4): # N carruseles por columna
|
423 |
-
if group + idx < len(image_groups):
|
424 |
-
images_in_carousel = image_groups[group + idx]
|
425 |
-
|
426 |
-
# Comprobar si el título existe, de lo contrario usar uno predeterminado
|
427 |
-
if (group + idx) < len(carousel_titles):
|
428 |
-
title = carousel_titles[group + idx]
|
429 |
-
else:
|
430 |
-
title = f"Carrusel {group + idx + 1}" # Título predeterminado
|
431 |
-
|
432 |
-
# Verifica si image es un diccionario o un string y ajusta en consecuencia
|
433 |
-
with gr.Tab(title): # Usar el título personalizado o predeterminado
|
434 |
-
for image in images_in_carousel:
|
435 |
-
if isinstance(image, dict):
|
436 |
-
# Si `image` es un diccionario, accede a la clave "path"
|
437 |
-
gr.Image(value=image["path"]) # Mostrar la imagen
|
438 |
-
gr.Markdown(image["description"]) # Mostrar la descripción debajo de la imagen
|
439 |
-
else:
|
440 |
-
# Si `image` es un string, úsalo directamente como ruta
|
441 |
-
gr.Image(value=image) # Mostrar la imagen
|
442 |
-
|
443 |
-
# Botón de descarga de PDF
|
444 |
-
download_button = gr.File(label="Descargar Informe sobre Administración de Medicamentos a Recién Nacidos", value="Reporte.pdf")
|
445 |
-
|
446 |
-
# Chatbot
|
447 |
-
#chatbot_output = gr.Chatbot(label="ChatBot")
|
448 |
-
#chatbot_input = gr.Textbox(label="Tu mensaje")
|
449 |
-
#submit_button = gr.Button("Enviar")
|
450 |
-
#chatbot_history = gr.State(value=[])
|
451 |
-
#image_url = gr.State(value=None)
|
452 |
-
|
453 |
-
with gr.Row():
|
454 |
-
with gr.Column(scale=1):
|
455 |
-
chatbot_output = gr.Chatbot(label="ChatBot", elem_id="chatbot_output")
|
456 |
-
chatbot_input = gr.Textbox(label="Tu mensaje", elem_id="chatbot_input")
|
457 |
-
submit_button = gr.Button("Enviar")
|
458 |
-
chatbot_history = gr.State(value=[])
|
459 |
-
|
460 |
-
with gr.Column(scale=1):
|
461 |
-
image_url = gr.State(value=None)
|
462 |
-
image_output = gr.Image(label="Imagen asociada")
|
463 |
-
|
464 |
-
|
465 |
-
with gr.Column(scale=1):
|
466 |
-
# Main accordion for categories
|
467 |
-
with gr.Accordion("Categorías de Preguntas", open=True):
|
468 |
-
|
469 |
-
# Diagnósticos Accordion
|
470 |
-
with gr.Accordion("Diagnóstico y Análisis Clínico", open=False):
|
471 |
-
|
472 |
-
# Subaccordion for Diagnósticos Principales
|
473 |
-
with gr.Accordion("Diagnósticos Principales", open=False):
|
474 |
-
button_1 = gr.Button("🔍 ¿Cuál es el diagnóstico más común?")
|
475 |
-
button_2 = gr.Button("👶 ¿Qué porcentaje corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?")
|
476 |
-
button_3 = gr.Button("🏥 ¿Qué diagnósticos requieren hospitalización prolongada?")
|
477 |
-
button_4 = gr.Button("🦠 ¿Cuáles son los códigos CIE-10 de infecciones neonatales?")
|
478 |
-
button_5 = gr.Button("🍼 ¿Qué tan frecuentes son los nacimientos prematuros?")
|
479 |
-
button_6 = gr.Button("♂️♀️ ¿Cómo se distribuyen los diagnósticos entre hombres y mujeres?")
|
480 |
-
button_7 = gr.Button("🌍 ¿Existen diferencias en los diagnósticos entre departamentos?")
|
481 |
-
button_8 = gr.Button("⚠️ ¿Qué tan frecuente es el 'Síndrome de Dificultad Respiratoria' (P220)?")
|
482 |
-
button_9 = gr.Button("🧐 ¿Cuáles son los diagnósticos menos comunes?")
|
483 |
-
button_10 = gr.Button("✂️ ¿Qué porcentaje de diagnósticos requieren cirugía?")
|
484 |
-
|
485 |
-
# Subaccordion for Relación Diagnóstico-Medicamentos
|
486 |
-
with gr.Accordion("Relación Diagnóstico-Medicamentos", open=False):
|
487 |
-
button_11 = gr.Button("💊 ¿Qué diagnóstico está más asociado con antibióticos?")
|
488 |
-
button_12 = gr.Button("🍼💊 ¿Qué medicamentos se usan en neonatos con hipoglicemia?")
|
489 |
-
button_13 = gr.Button("👶💊 ¿Hay medicamentos preferidos para nacimientos prematuros?")
|
490 |
-
button_14 = gr.Button("💊📦 ¿Cómo influye el diagnóstico en la forma del medicamento?")
|
491 |
-
button_15 = gr.Button("💉 ¿Qué diagnóstico está asociado con soluciones intravenosas?")
|
492 |
-
button_16 = gr.Button("🦠💉 ¿Qué porcentaje de neonatos con sepsis reciben antibióticos inyectables?")
|
493 |
-
button_17 = gr.Button("🟡💊 ¿Qué medicamentos se usan para ictericia neonatal?")
|
494 |
-
button_18 = gr.Button("💊🫁🍽️ ¿Diferencias en medicación entre diagnósticos respiratorios y gastrointestinales?")
|
495 |
-
button_19 = gr.Button("🤰✂️💊 ¿Varía la medicación según el tipo de parto (vaginal o cesárea)?")
|
496 |
-
button_20 = gr.Button("📉💊 ¿Qué diagnóstico tiene menos medicamentos asociados?")
|
497 |
-
|
498 |
-
# Tratamientos Accordion
|
499 |
-
with gr.Accordion("Análisis Geográfico y Temporal", open=False):
|
500 |
-
|
501 |
-
# Subaccordion for Diferencias Geográficas
|
502 |
-
with gr.Accordion("Diferencias Geográficas", open=False):
|
503 |
-
button_21 = gr.Button("🌍💊 ¿Qué departamento tiene más registros de medicación?")
|
504 |
-
button_22 = gr.Button("🌍📉💊 ¿Qué departamentos tienen menos registros de medicación?")
|
505 |
-
button_23 = gr.Button("🆚💊 ¿Diferencias entre Lima y La Libertad en medicación?")
|
506 |
-
button_24 = gr.Button("❓💊 ¿Factores que explican las diferencias entre departamentos?")
|
507 |
-
button_25 = gr.Button("🏙️🏞️💊 ¿Cómo se distribuye la medicación en zonas urbanas vs rurales?")
|
508 |
-
button_26 = gr.Button("🏥🌍 ¿Relación entre nivel de salud y ubicación geográfica?")
|
509 |
-
button_27 = gr.Button("🌍💊📊 ¿Qué departamento tiene la mayor variedad de medicamentos?")
|
510 |
-
button_28 = gr.Button("💰🌍💊 ¿Diferencias en costo de medicamentos dentro de un mismo departamento?")
|
511 |
-
button_29 = gr.Button("🌍📉💊 ¿Qué provincia tiene el menor registro de medicación?")
|
512 |
-
button_30 = gr.Button("🏘️📊💊 ¿Varía la medicación entre distritos más poblados y menos poblados?")
|
513 |
-
|
514 |
-
# Subaccordion for Análisis Temporal
|
515 |
-
with gr.Accordion("Análisis Temporal", open=False):
|
516 |
-
button_31 = gr.Button("🗓️💊 ¿Cuál es el rango de fechas de medicación?")
|
517 |
-
button_32 = gr.Button("📅💊 ¿En qué meses se administran más medicamentos?")
|
518 |
-
button_33 = gr.Button("🕒💊 ¿Cómo se distribuye la medicación en la semana?")
|
519 |
-
button_34 = gr.Button("📈💊 ¿Existen picos de medicación en períodos específicos?")
|
520 |
-
button_35 = gr.Button("🔄💊 ¿Cómo ha cambiado la administración de medicamentos entre 2022 y 2023?")
|
521 |
-
button_36 = gr.Button("☀️❄️💊 ¿Influyen las estaciones en la administración de medicamentos?")
|
522 |
-
button_37 = gr.Button("🎉💊 ¿Varía la medicación en días festivos?")
|
523 |
-
button_38 = gr.Button("🏥🗓️💊 ¿Correlación entre fechas de medicación e ingresos hospitalarios?")
|
524 |
-
button_39 = gr.Button("🗓️💊🆚 ¿Diferencias entre el primer y último trimestre de 2023?")
|
525 |
-
button_40 = gr.Button("🕰️💊👶 ¿Cómo afecta la hora del día en la administración a recién nacidos?")
|
526 |
-
|
527 |
-
# Medicamentos y Costos
|
528 |
-
with gr.Accordion("Medicamentos y Costos", open=False):
|
529 |
-
|
530 |
-
# Subaccordion for Tipo de Medicamentos
|
531 |
-
with gr.Accordion("Tipo de Medicamentos", open=False):
|
532 |
-
button_41 = gr.Button("💊👶 ¿Cuál es el medicamento más común en recién nacidos?")
|
533 |
-
button_42 = gr.Button("💊📊 ¿Qué porcentaje corresponde a la Tetraciclina Clorhidrato?")
|
534 |
-
button_43 = gr.Button("🦠💊 ¿Qué medicamentos se usan para infecciones neonatales?")
|
535 |
-
button_44 = gr.Button("📦👶 ¿Cuál es la forma farmacéutica más utilizada en neonatos?")
|
536 |
-
button_45 = gr.Button("👁️💊📊 ¿Qué porcentaje corresponde a soluciones oftálmicas?")
|
537 |
-
button_46 = gr.Button("💰💊 ¿Cuáles son los medicamentos más costosos para neonatos?")
|
538 |
-
button_47 = gr.Button("💊🌍 ¿Qué medicamentos se usan más en áreas con menos recursos?")
|
539 |
-
button_48 = gr.Button("🦠💊📊 ¿Qué proporción de medicamentos son antibióticos?")
|
540 |
-
button_49 = gr.Button("🧐💊 ¿Cuáles son los medicamentos menos comunes?")
|
541 |
-
button_50 = gr.Button("💊👶📋 ¿Relación entre tipo de medicamento y diagnóstico principal?")
|
542 |
-
|
543 |
-
# Subaccordion for Costo de Medicamentos
|
544 |
-
with gr.Accordion("Costo de Medicamentos", open=False):
|
545 |
-
button_51 = gr.Button("💰👶💊 ¿Costo promedio de los medicamentos en neonatos?")
|
546 |
-
button_52 = gr.Button("💵📊 ¿Cuál es la mediana del costo neto de los medicamentos?")
|
547 |
-
button_53 = gr.Button("💊💰📈 ¿Qué medicamentos tienen el costo más alto?")
|
548 |
-
button_54 = gr.Button("📊💰💊 ¿Cuál es la desviación estándar del costo?")
|
549 |
-
button_55 = gr.Button("🌍💰💊 ¿Cómo varía el costo neto entre departamentos?")
|
550 |
-
button_56 = gr.Button("💵0️⃣💊 ¿Qué porcentaje de medicamentos tiene costo neto cero?")
|
551 |
-
button_57 = gr.Button("🏥💰💊 ¿Cómo afecta el nivel del establecimiento el costo?")
|
552 |
-
button_58 = gr.Button("💊💰🔝 ¿Cuál es el costo más alto registrado?")
|
553 |
-
button_59 = gr.Button("💊💰🔻 ¿Cuál es el valor neto mínimo registrado?")
|
554 |
-
button_60 = gr.Button("💰🏥📅 ¿Relación entre costo y duración de hospitalización?")
|
555 |
-
|
556 |
-
# Subaccordion for Duración de Hospitalización
|
557 |
-
with gr.Accordion("Duración de Hospitalización", open=False):
|
558 |
-
button_61 = gr.Button("🏥🕒👶 ¿Duración promedio de hospitalización en neonatos?")
|
559 |
-
button_62 = gr.Button("🩺🏥💊 ¿Qué diagnóstico está asociado con hospitalizaciones largas?")
|
560 |
-
button_63 = gr.Button("🏥📊👶 ¿Qué proporción de neonatos está hospitalizada por más de 7 días?")
|
561 |
-
button_64 = gr.Button("🏥🕒📉 ¿Mediana de días para diagnósticos menos graves?")
|
562 |
-
button_65 = gr.Button("🌍🏥🕒 ¿Cómo varía la duración entre departamentos?")
|
563 |
-
button_66 = gr.Button("💊📦🏥🕒 ¿Impacto de la forma farmacéutica en la duración?")
|
564 |
-
button_67 = gr.Button("💊📊🏥🕒 ¿Relación entre cantidad de medicamento y duración?")
|
565 |
-
button_68 = gr.Button("🏥🕒💰 ¿Impacto del nivel del hospital en la duración?")
|
566 |
-
button_69 = gr.Button("🩺🏥🕒 ¿Qué diagnósticos están asociados con hospitalizaciones cortas?")
|
567 |
-
button_70 = gr.Button("📉🏥🕒 ¿Cuál es la hospitalización más corta registrada?")
|
568 |
-
|
569 |
-
# Calidad de datos y recomendaciones
|
570 |
-
with gr.Accordion("Calidad de Datos y Recomendaciones", open=False):
|
571 |
-
|
572 |
-
# Subaccordion for Calidad y Limitaciones de los Datos
|
573 |
-
with gr.Accordion("Calidad y Limitaciones de los Datos", open=False):
|
574 |
-
button_71 = gr.Button("📉📋 ¿Qué porcentaje de registros tiene datos faltantes?")
|
575 |
-
button_72 = gr.Button("⚖️👶 ¿Cómo se manejaron los datos faltantes de peso?")
|
576 |
-
button_73 = gr.Button("📊🕒 ¿Qué método se usó para imputar días de hospitalización?")
|
577 |
-
button_74 = gr.Button("📊📉⚖️ ¿Cómo se gestionaron los outliers en peso por género?")
|
578 |
-
button_75 = gr.Button("🌍📉📊 ¿Limitaciones del análisis en cobertura geográfica?")
|
579 |
-
button_76 = gr.Button("🔒📉 ¿Cómo afecta la anonimización de datos al análisis?")
|
580 |
-
button_77 = gr.Button("🔄📋📊 ¿Desafíos en precisión y consistencia de los datos?")
|
581 |
-
button_78 = gr.Button("📅📉 ¿Impacto de las limitaciones temporales en el análisis?")
|
582 |
-
button_79 = gr.Button("📊⚖️📝 ¿Cómo se verificó la imputación de outliers en CANTIDAD, VALOR_BRUTO y VALOR_NETO?")
|
583 |
-
button_80 = gr.Button("📈🔧 ¿Recomendaciones para mejorar la calidad de datos en futuros estudios?")
|
584 |
-
|
585 |
-
# Subaccordion for Mejoras y Recomendaciones en Atención Neonatal
|
586 |
-
with gr.Accordion("Recomendaciones y Mejoras en Atención Neonatal", open=False):
|
587 |
-
button_81 = gr.Button("🏥🌍📈 ¿Recomendaciones para descentralizar los servicios neonatales?")
|
588 |
-
button_82 = gr.Button("🔧👶💊 ¿Cómo fortalecer la atención neonatal en Perú?")
|
589 |
-
button_83 = gr.Button("📋🛠️👶 ¿Papel de la estandarización de protocolos en atención neonatal?")
|
590 |
-
button_84 = gr.Button("🔬👶 ¿Importancia de la investigación continua en neonatología?")
|
591 |
-
button_85 = gr.Button("📈📊 ¿Cómo mejorar la calidad de los datos en investigaciones futuras?")
|
592 |
-
button_86 = gr.Button("🏥🌍🔧 ¿Impacto de mejorar infraestructura hospitalaria en áreas rurales?")
|
593 |
-
button_87 = gr.Button("🌍💊⚖️ ¿Beneficio de un acceso equitativo a medicamentos en zonas con menos recursos?")
|
594 |
-
button_88 = gr.Button("📜🏥💊 ¿Impacto de nuevas políticas de salud en la atención neonatal?")
|
595 |
-
button_89 = gr.Button("🩺🛡️👶 ¿Recomendaciones para prevenir condiciones críticas como la sepsis neonatal?")
|
596 |
-
button_90 = gr.Button("📊📉👶 ¿Cómo las recomendaciones pueden reducir la mortalidad neonatal en Perú?")
|
597 |
-
|
598 |
-
# Impacto en la salud neonatal
|
599 |
-
with gr.Accordion("Impacto en la salud neonatal", open=False):
|
600 |
-
|
601 |
-
# Subaccordion for Impacto en la salud neonatal
|
602 |
-
with gr.Accordion("Impacto en la salud neonatal", open=False):
|
603 |
-
button_91 = gr.Button("💉👶🛡️ ¿Impacto de Fitomenadiona en la mortalidad neonatal?")
|
604 |
-
button_92 = gr.Button("💊🏥🕒 ¿Cómo influyen los antibióticos en la duración de hospitalización?")
|
605 |
-
button_93 = gr.Button("🩺👶💨 ¿Resultados clínicos en neonatos que reciben oxígeno medicinal?")
|
606 |
-
button_94 = gr.Button("🏥🔄🦠👶 ¿Tasa de reingreso en neonatos que recibieron antibióticos?")
|
607 |
-
button_95 = gr.Button("💉⚠️👶 ¿Efectos secundarios de medicamentos inyectables en neonatos?")
|
608 |
-
button_96 = gr.Button("💉🛡️🦠👶 ¿Impacto de medicamentos en la supervivencia de neonatos con sepsis?")
|
609 |
-
button_97 = gr.Button("💧🛡️👶 ¿Impacto de soluciones intravenosas en neonatos con deshidratación?")
|
610 |
-
button_98 = gr.Button("💊🏥🔄👶 ¿Relación entre medicamentos y complicaciones posthospitalarias?")
|
611 |
-
button_99 = gr.Button("🦠💊👶 ¿Medicamentos asociados con mejor recuperación en neonatos con infecciones?")
|
612 |
-
button_100 = gr.Button("💊📏👶 ¿Influencia de la dosis en los resultados de salud neonatal?")
|
613 |
-
|
614 |
-
|
615 |
-
def process_input(message, history):
|
616 |
-
full_response, image = chat_function(message, history)
|
617 |
-
history.append((message, full_response))
|
618 |
-
return history, history, image
|
619 |
-
|
620 |
-
# Function to update chatbot input with preset question
|
621 |
-
def send_preset_question(question, history):
|
622 |
-
return process_input(question, history)
|
623 |
-
|
624 |
-
# Assign the buttons to send the respective categorized questions
|
625 |
-
# Assign the buttons to send the respective categorized questions
|
626 |
-
button_assignments = [
|
627 |
-
(button_1, "¿Cuál es el diagnóstico más común registrado en el dataset?"),
|
628 |
-
(button_2, "¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?"),
|
629 |
-
(button_3, "¿Cuáles son los diagnósticos más frecuentes que requieren hospitalización prolongada?"),
|
630 |
-
(button_4, "¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?"),
|
631 |
-
(button_5, "¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?"),
|
632 |
-
(button_6, "¿Cómo se distribuyen los diagnósticos entre pacientes masculinos y femeninos?"),
|
633 |
-
(button_7, "¿Existen diferencias significativas en los diagnósticos entre diferentes departamentos?"),
|
634 |
-
(button_8, "¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?"),
|
635 |
-
(button_9, "¿Cuáles son los diagnósticos menos comunes en el dataset?"),
|
636 |
-
(button_10, "¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?"),
|
637 |
-
(button_11, "¿Qué diagnóstico está más frecuentemente asociado con la administración de antibióticos?"),
|
638 |
-
(button_12, "¿Qué medicamentos son comúnmente administrados a neonatos con hipoglicemia?"),
|
639 |
-
(button_13, "¿Existe una preferencia por ciertos medicamentos según el diagnóstico de nacimiento pretermino?"),
|
640 |
-
(button_14, "¿Cómo influye el diagnóstico en la forma farmacéutica del medicamento administrado?"),
|
641 |
-
(button_15, "¿Qué diagnóstico está asociado con el uso frecuente de soluciones intravenosas?"),
|
642 |
-
(button_16, "¿Qué porcentaje de neonatos con sepsis bacteriana reciben antibióticos inyectables?"),
|
643 |
-
(button_17, "¿Cuál es la relación entre el diagnóstico de ictericia neonatal y los medicamentos administrados?"),
|
644 |
-
(button_18, "¿Qué diferencias se observan en la administración de medicamentos entre diagnósticos respiratorios y gastrointestinales?"),
|
645 |
-
(button_19, "¿Cómo varía la administración de medicamentos según el tipo de parto (vaginal o cesárea)?"),
|
646 |
-
(button_20, "¿Qué diagnóstico tiene la menor cantidad de registros asociados con la administración de medicamentos?"),
|
647 |
-
(button_21, "¿Cuál es el departamento con el mayor número de registros de administración de medicamentos?"),
|
648 |
-
(button_22, "¿Qué departamentos tienen los menores registros de administración de medicamentos?"),
|
649 |
-
(button_23, "¿Cuál es la diferencia en la administración de medicamentos entre Lima y La Libertad?"),
|
650 |
-
(button_24, "¿Qué factores podrían explicar las diferencias en la administración de medicamentos entre departamentos?"),
|
651 |
-
(button_25, "¿Cómo se distribuyen los registros de administración de medicamentos en áreas urbanas versus rurales?"),
|
652 |
-
(button_26, "¿Cuál es la relación entre el nivel de establecimiento de salud y la geografía?"),
|
653 |
-
(button_27, "¿Qué departamento muestra la mayor variedad de medicamentos administrados?"),
|
654 |
-
(button_28, "¿Existen diferencias en el costo de los medicamentos entre diferentes provincias dentro de un mismo departamento?"),
|
655 |
-
(button_29, "¿Qué provincia tiene el menor registro de administración de medicamentos?"),
|
656 |
-
(button_30, "¿Cómo varía la administración de medicamentos en los distritos más poblados versus los menos poblados?"),
|
657 |
-
(button_31, "¿Cuál es el rango de fechas de administración de medicamentos registrado en el dataset?"),
|
658 |
-
(button_32, "¿En qué meses se registra la mayor cantidad de administración de medicamentos?"),
|
659 |
-
(button_33, "¿Cuál es la distribución de la administración de medicamentos a lo largo de los días de la semana?"),
|
660 |
-
(button_34, "¿Existen picos en la administración de medicamentos durante períodos específicos?"),
|
661 |
-
(button_35, "¿Cómo ha evolucionado la administración de medicamentos desde 2022 hasta 2023?"),
|
662 |
-
(button_36, "¿Qué impacto tienen las estaciones del año en la administración de medicamentos?"),
|
663 |
-
(button_37, "¿Cómo varía la administración de medicamentos durante días festivos o feriados?"),
|
664 |
-
(button_38, "¿Cuál es la correlación entre las fechas de administración de medicamentos y los ingresos hospitalarios?"),
|
665 |
-
(button_39, "¿Qué variación se observa en la administración de medicamentos al comparar el primer y el último trimestre de 2023?"),
|
666 |
-
(button_40, "¿Cómo afecta la hora del día en la administración de medicamentos a los recién nacidos?"),
|
667 |
-
(button_41, "¿Cuál es el medicamento más comúnmente administrado en recién nacidos?"),
|
668 |
-
(button_42, "¿Qué porcentaje del total de medicamentos administrados corresponde a la Tetraciclina Clorhidrato?"),
|
669 |
-
(button_43, "¿Cuáles son los principales medicamentos administrados para infecciones neonatales?"),
|
670 |
-
(button_44, "¿Qué tipo de forma farmacéutica es la más utilizada en neonatos?"),
|
671 |
-
(button_45, "¿Qué porcentaje de los medicamentos administrados corresponde a soluciones oftálmicas?"),
|
672 |
-
(button_46, "¿Cuáles son los medicamentos más costosos administrados a recién nacidos?"),
|
673 |
-
(button_47, "¿Qué medicamentos se utilizan con mayor frecuencia en los departamentos con menos recursos?"),
|
674 |
-
(button_48, "¿Qué proporción de medicamentos administrados son antibióticos?"),
|
675 |
-
(button_49, "¿Cuáles son los medicamentos menos comunes administrados en el dataset?"),
|
676 |
-
(button_50, "¿Qué relación existe entre el tipo de medicamento y el diagnóstico principal?"),
|
677 |
-
(button_51, "¿Cuál es el costo promedio bruto de los medicamentos administrados a los recién nacidos?"),
|
678 |
-
(button_52, "¿Cuál es la mediana del valor neto de los medicamentos?"),
|
679 |
-
(button_53, "¿Qué medicamentos tienen el costo bruto más alto?"),
|
680 |
-
(button_54, "¿Cuál es la desviación estándar del costo bruto de los medicamentos?"),
|
681 |
-
(button_55, "¿Cómo varía el costo neto de los medicamentos entre diferentes departamentos?"),
|
682 |
-
(button_56, "¿Qué porcentaje de los medicamentos administrados tienen un valor neto igual a cero?"),
|
683 |
-
(button_57, "¿Cómo afecta el nivel del establecimiento de salud el costo de los medicamentos?"),
|
684 |
-
(button_58, "¿Cuál es el costo bruto máximo registrado para un medicamento?"),
|
685 |
-
(button_59, "¿Cuál es el valor neto mínimo registrado para un medicamento?"),
|
686 |
-
(button_60, "¿Cuál es la correlación entre el costo del medicamento y la duración de la hospitalización?"),
|
687 |
-
(button_61, "¿Cuál es la duración promedio de la hospitalización para los recién nacidos?"),
|
688 |
-
(button_62, "¿Qué diagnóstico está asociado con las hospitalizaciones más prolongadas?"),
|
689 |
-
(button_63, "¿Qué proporción de recién nacidos es hospitalizada por más de 7 días?"),
|
690 |
-
(button_64, "¿Cuál es la mediana de días de hospitalización para neonatos con diagnósticos menos graves?"),
|
691 |
-
(button_65, "¿Cómo varía la duración de la hospitalización entre los diferentes departamentos?"),
|
692 |
-
(button_66, "¿Cuál es el impacto de la forma farmacéutica en la duración de la hospitalización?"),
|
693 |
-
(button_67, "¿Qué relación existe entre la cantidad de medicamento administrado y la duración de la hospitalizaci��n?"),
|
694 |
-
(button_68, "¿Cómo afecta el nivel del establecimiento de salud la duración de la hospitalización?"),
|
695 |
-
(button_69, "¿Qué diagnósticos están asociados con hospitalizaciones de corta duración?"),
|
696 |
-
(button_70, "¿Cuál es la duración de hospitalización más corta registrada?"),
|
697 |
-
(button_71, "¿Cuál es el porcentaje de registros con valores faltantes en el dataset?"),
|
698 |
-
(button_72, "¿Cómo se manejaron los valores faltantes en la variable de peso (PESO)?"),
|
699 |
-
(button_73, "¿Qué método se utilizó para imputar valores faltantes en la variable de días de hospitalización?"),
|
700 |
-
(button_74, "¿Cómo se gestionaron los outliers en la variable de peso por género?"),
|
701 |
-
(button_75, "¿Qué limitaciones presenta el análisis en cuanto a la cobertura geográfica?"),
|
702 |
-
(button_76, "¿Cómo afecta la anonimización de datos la capacidad de análisis detallado?"),
|
703 |
-
(button_77, "¿Qué desafíos presenta la calidad de los datos en términos de precisión y consistencia?"),
|
704 |
-
(button_78, "¿Qué impacto tienen las limitaciones temporales de los datos en el análisis?"),
|
705 |
-
(button_79, "¿Cómo se verificó la imputación de outliers en las variables CANTIDAD, VALOR_BRUTO y VALOR_NETO?"),
|
706 |
-
(button_80, "¿Qué recomendaciones se hicieron para mejorar la calidad de los datos en futuros estudios?"),
|
707 |
-
(button_81, "¿Qué mejoras se recomendaron para la descentralización de los servicios de salud neonatal?"),
|
708 |
-
(button_82, "¿Cómo se puede fortalecer la atención neonatal en Perú según el análisis?"),
|
709 |
-
(button_83, "¿Qué papel juega la estandarización de protocolos en la atención neonatal?"),
|
710 |
-
(button_84, "¿Cuál es la importancia de la investigación continua en la atención neonatal?"),
|
711 |
-
(button_85, "¿Cómo podría mejorar la calidad de los datos recolectados en futuras investigaciones?"),
|
712 |
-
(button_86, "¿Qué impacto tendría la mejora de infraestructura hospitalaria en áreas rurales?"),
|
713 |
-
(button_87, "¿Cuál es el beneficio de un acceso más equitativo a medicamentos en áreas con menos recursos?"),
|
714 |
-
(button_88, "¿Cómo podría la implementación de nuevas políticas de salud afectar la atención neonatal?"),
|
715 |
-
(button_89, "¿Qué enfoque se recomienda para la prevención de condiciones críticas como la sepsis neonatal?"),
|
716 |
-
(button_90, "¿Cómo podrían las recomendaciones del análisis contribuir a la reducción de la mortalidad neonatal en Perú?"),
|
717 |
-
(button_91, "¿Qué impacto tiene la administración de Fitomenadiona en la reducción de la mortalidad neonatal?"),
|
718 |
-
(button_92, "¿Cómo influye el uso de antibióticos en la duración de la hospitalización?"),
|
719 |
-
(button_93, "¿Qué resultados clínicos se observan en neonatos que reciben Oxígeno Medicinal?"),
|
720 |
-
(button_94, "¿Cuál es la tasa de reingreso hospitalario en neonatos que recibieron antibióticos?"),
|
721 |
-
(button_95, "¿Qué efectos secundarios se asocian con el uso de medicamentos inyectables en neonatos?"),
|
722 |
-
(button_96, "¿Cómo afecta la administración de medicamentos en la tasa de supervivencia de neonatos con sepsis?"),
|
723 |
-
(button_97, "¿Qué impacto tiene la administración de soluciones intravenosas en neonatos con deshidratación?"),
|
724 |
-
(button_98, "¿Cuál es la relación entre el uso de medicamentos y la tasa de complicaciones posthospitalarias?"),
|
725 |
-
(button_99, "¿Qué medicamentos están asociados con una mejor recuperación en neonatos con infecciones?"),
|
726 |
-
(button_100, "¿Cómo influye la dosis de medicamentos en los resultados de salud neonatal?"),
|
727 |
-
]
|
728 |
-
|
729 |
-
|
730 |
-
for button, question in button_assignments:
|
731 |
-
button.click(send_preset_question, inputs=[gr.State(value=question), chatbot_history], outputs=[chatbot_output, chatbot_history, image_url])
|
732 |
|
733 |
-
|
734 |
-
|
735 |
|
736 |
-
|
737 |
-
demo.launch(
|
|
|
1 |
+
# app.py
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
import gradio as gr
|
4 |
+
from models import load_embedding_model, load_yi_coder_model
|
5 |
+
from pinecone_utils import connect_to_pinecone, vector_search
|
6 |
+
from ui import build_interface
|
7 |
+
from config import SIMILARITY_THRESHOLD_DEFAULT, SYSTEM_PROMPT, MAX_LENGTH_DEFAULT
|
8 |
+
from decorators import gpu_decorator
|
9 |
+
import torch
|
10 |
+
import spaces
|
11 |
+
|
12 |
+
# Cargar modelos
|
13 |
+
embedding_model = load_embedding_model()
|
14 |
+
tokenizer, yi_coder_model, yi_coder_device = load_yi_coder_model()
|
15 |
+
|
16 |
+
# Conectar a Pinecone
|
17 |
+
index = connect_to_pinecone()
|
18 |
+
|
19 |
+
# Función para generar código utilizando Yi-Coder
|
20 |
+
@gpu_decorator(duration=100)
|
21 |
+
def generate_code(system_prompt, user_prompt, max_length):
|
22 |
+
device = yi_coder_device
|
23 |
+
model = yi_coder_model
|
24 |
+
tokenizer_ = tokenizer # Ya lo tenemos cargado
|
25 |
+
|
26 |
+
messages = [
|
27 |
+
{"role": "system", "content": system_prompt},
|
28 |
+
{"role": "user", "content": user_prompt}
|
29 |
+
]
|
30 |
+
|
31 |
+
# Preparamos el input para el modelo
|
32 |
+
prompt = system_prompt + "\n" + user_prompt
|
33 |
+
model_inputs = tokenizer_(prompt, return_tensors="pt").to(device)
|
34 |
+
|
35 |
+
with torch.no_grad():
|
36 |
+
generated_ids = model.generate(
|
37 |
+
model_inputs.input_ids,
|
38 |
+
max_new_tokens=max_length,
|
39 |
+
eos_token_id=tokenizer_.eos_token_id
|
40 |
+
)
|
41 |
+
|
42 |
+
# Extraer solo la parte generada
|
43 |
+
generated_text = tokenizer_.batch_decode(generated_ids, skip_special_tokens=True)[0]
|
44 |
+
response = generated_text[len(prompt):].strip()
|
45 |
+
|
46 |
+
return response
|
47 |
+
|
48 |
+
# Función para combinar búsqueda vectorial y Yi-Coder
|
49 |
+
@gpu_decorator(duration=100)
|
50 |
+
def combined_function(user_prompt, similarity_threshold, selected_option, system_prompt, max_length):
|
51 |
+
if selected_option == "Solo Búsqueda Vectorial":
|
52 |
+
# Realizar búsqueda vectorial
|
53 |
+
search_results = vector_search(user_prompt, embedding_model, index)
|
54 |
+
if search_results:
|
55 |
+
# Usar el primer resultado
|
56 |
+
content = search_results[0]['content']
|
57 |
+
return content, None
|
58 |
+
else:
|
59 |
+
return "No se encontraron resultados en Pinecone.", None
|
60 |
+
elif selected_option == "Solo Yi-Coder":
|
61 |
+
# Generar respuesta usando Yi-Coder
|
62 |
+
yi_coder_response = generate_code(system_prompt, user_prompt, max_length)
|
63 |
+
return yi_coder_response, None
|
64 |
+
elif selected_option == "Ambos (basado en umbral de similitud)":
|
65 |
+
# Realizar búsqueda vectorial
|
66 |
+
search_results = vector_search(user_prompt, embedding_model, index)
|
67 |
+
if search_results:
|
68 |
+
top_result = search_results[0]
|
69 |
+
if top_result['score'] >= similarity_threshold:
|
70 |
+
content = top_result['content']
|
71 |
+
return content, None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
else:
|
73 |
+
yi_coder_response = generate_code(system_prompt, user_prompt, max_length)
|
74 |
+
return yi_coder_response, None
|
75 |
+
else:
|
76 |
+
yi_coder_response = generate_code(system_prompt, user_prompt, max_length)
|
77 |
+
return yi_coder_response, None
|
78 |
+
else:
|
79 |
+
return "Opción no válida.", None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
|
81 |
+
# Funciones para el procesamiento de entradas y actualización de imágenes
|
82 |
+
def process_input(message, history, selected_option, similarity_threshold, system_prompt, max_length):
|
83 |
+
response, image = combined_function(message, similarity_threshold, selected_option, system_prompt, max_length)
|
84 |
+
history.append((message, response))
|
85 |
+
return history, history, image
|
86 |
|
87 |
def update_image(image_url):
|
88 |
if image_url:
|
|
|
90 |
else:
|
91 |
return None
|
92 |
|
93 |
+
def send_preset_question(question, history, selected_option, similarity_threshold, system_prompt, max_length):
|
94 |
+
return process_input(question, history, selected_option, similarity_threshold, system_prompt, max_length)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
|
96 |
+
# Construir y lanzar la interfaz
|
97 |
+
demo = build_interface(process_input, send_preset_question, update_image)
|
98 |
|
99 |
+
if __name__ == "__main__":
|
100 |
+
demo.launch()
|