C2MV commited on
Commit
3d04cf1
1 Parent(s): 5bd0b35

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -724
app.py CHANGED
@@ -1,308 +1,88 @@
1
- import os
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
- theme = gr.themes.Default(
25
- primary_hue="indigo",
26
- secondary_hue="indigo",
27
- neutral_hue=gr.themes.Color(c100="#384b8f", c200="#d7dbe5", c300="#1d1d20", c400="#1d1d20", c50="#657ed2", c500="#fcfcfc", c600="#3d3e52", c700="#383947", c800="#242429", c900="#29292e", c950="#292932"),
28
- ).set(
29
- background_fill_primary='*background_fill_secondary',
30
- border_color_accent_subdued='*border_color_accent',
31
- link_text_color='*primary_50',
32
- link_text_color_dark='*primary_50',
33
- link_text_color_active='*primary_50',
34
- block_shadow='none',
35
- block_shadow_dark='none',
36
- form_gap_width='0px',
37
- checkbox_label_background_fill='*button_secondary_background_fill',
38
- checkbox_label_background_fill_dark='*button_secondary_background_fill',
39
- checkbox_label_background_fill_hover='*button_secondary_background_fill_hover',
40
- checkbox_label_background_fill_hover_dark='*button_secondary_background_fill_hover',
41
- checkbox_label_shadow='none',
42
- error_background_fill_dark='*background_fill_primary',
43
- input_background_fill='*neutral_100',
44
- input_background_fill_dark='*neutral_700',
45
- input_border_width='0px',
46
- input_border_width_dark='0px',
47
- input_shadow='none',
48
- input_shadow_dark='none',
49
- input_shadow_focus='*input_shadow',
50
- input_shadow_focus_dark='*input_shadow',
51
- stat_background_fill='*primary_300',
52
- stat_background_fill_dark='*primary_500',
53
- button_shadow='none',
54
- button_shadow_active='none',
55
- button_shadow_hover='none',
56
- button_transition='background-color 0.2s ease',
57
- button_primary_background_fill='*primary_200',
58
- button_primary_background_fill_dark='*primary_700',
59
- button_primary_background_fill_hover='*button_primary_background_fill',
60
- button_primary_background_fill_hover_dark='*button_primary_background_fill',
61
- button_primary_border_color_dark='*primary_600',
62
- button_secondary_background_fill='*neutral_200',
63
- button_secondary_background_fill_dark='*neutral_600',
64
- button_secondary_background_fill_hover='*button_secondary_background_fill',
65
- button_secondary_background_fill_hover_dark='*button_secondary_background_fill',
66
- button_cancel_background_fill='*button_secondary_background_fill',
67
- button_cancel_background_fill_dark='*button_secondary_background_fill',
68
- button_cancel_background_fill_hover='*button_cancel_background_fill',
69
- button_cancel_background_fill_hover_dark='*button_cancel_background_fill',
70
- button_cancel_border_color='*button_secondary_border_color',
71
- button_cancel_border_color_dark='*button_secondary_border_color',
72
- button_cancel_text_color='*button_secondary_text_color',
73
- button_cancel_text_color_dark='*button_secondary_text_color'
74
- )
75
-
76
- model_name = "BAAI/bge-m3"
77
-
78
- # Initialize Pinecone with the API key
79
- pc = Pinecone(api_key=PINECONE_API_KEY)
80
-
81
- # Global variables to store the selected model and dimensions
82
- EMBED_MODEL = 'BGE_M3-1024'
83
- DIMENSIONS = 1024
84
-
85
- # Confirm selection automatically
86
- print(f"Model selected: {EMBED_MODEL}")
87
- print(f"Dimensions set as: {DIMENSIONS}")
88
-
89
- # Function to print current selection (can be used in other cells)
90
- def print_current_selection():
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
- filtered_links.append(link)
245
-
246
- # Add the first relevant link under a single "Respuestas relevantes" section
247
- if filtered_links:
248
- full_response += filtered_links[0] #f".\n\nRespuesta:\n" + filtered_links[0]
249
-
250
- # Now handle the images based on the detected tags
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
- images = [
314
- {"id": "rId101", "path": "images/rId101.png", "description": "📊 El código UBIGEO muestra que Lima (150101) tiene el mayor número de registros, seguido por Trujillo (130101) y San Juan de Miraflores (150133), destacando la concentración de atención médica en estas zonas. Un gráfico de barras visualiza los 10 códigos UBIGEO más frecuentes, facilitando la identificación de las áreas con mayor actividad en salud."},
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
- submit_button.click(process_input, inputs=[chatbot_input, chatbot_history], outputs=[chatbot_output, chatbot_history, image_url])
734
- image_url.change(fn=update_image, inputs=image_url, outputs=image_output)
735
 
736
- # Launch the interface
737
- demo.launch(debug=True)
 
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()