import os os.system('pip install curl_cffi tqdm bitsandbytes tiktoken g4f pinecone-client pandas datasets sentence-transformers') # Setup and load your keys import os from g4f import ChatCompletion #from google.colab import userdata from pinecone import Pinecone import pandas as pd from datasets import Dataset from sentence_transformers import SentenceTransformer import gradio as gr model_name = "BAAI/bge-m3" # Retrieve the Pinecone API key from the user PINECONE_API_KEY = "3a3e9022-381d-436e-84cb-ba93464d283e" # Use the key you set in the secrets PINECONE_ENVIRONMENT = "us-east-1" # Use the environment you set in the secrets # Initialize Pinecone with the API key pc = Pinecone(api_key=PINECONE_API_KEY) # Global variables to store the selected model and dimensions EMBED_MODEL = 'BGE_M3-1024' DIMENSIONS = 1024 # Confirm selection automatically print(f"Model selected: {EMBED_MODEL}") print(f"Dimensions set as: {DIMENSIONS}") # Function to print current selection (can be used in other cells) def print_current_selection(): print(f"Currently selected model: {EMBED_MODEL}") print(f"Dimensions: {DIMENSIONS}") # Establecer el nombre del índice automáticamente INDEX_NAME = 'neonatos' # Obtener la clave API de Pinecone #PINECONE_API_KEY = userdata.get('PINECONE_API_KEY') def connect_to_pinecone(index_name): global INDEX_NAME try: pc = Pinecone(api_key=PINECONE_API_KEY) index = pc.Index(index_name) # Asegurarse de que la conexión se establezca index_stats = index.describe_index_stats() print(f"Successfully connected to Pinecone index '{index_name}'!") print("Index Stats:", index_stats) # Actualizar la variable global INDEX_NAME INDEX_NAME = index_name print(f"Global INDEX_NAME updated to: {INDEX_NAME}") except Exception as e: print(f"Failed to connect to Pinecone index '{index_name}':", str(e)) # Conectar automáticamente al índice "neonatos" connect_to_pinecone(INDEX_NAME) # Función para imprimir el nombre del índice actual (puede ser usada en otras celdas) def print_current_index(): print(f"Current index name: {INDEX_NAME}") # Verificar si las variables globales necesarias están configuradas if 'INDEX_NAME' not in globals() or INDEX_NAME is None: raise ValueError("INDEX_NAME is not set. Please set the index name first.") if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None: raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.") # Inicializar cliente de Pinecone #PINECONE_API_KEY = userdata.get('PINECONE_API_KEY') pc = Pinecone(api_key=PINECONE_API_KEY) # Inicializar el índice de Pinecone index = pc.Index(INDEX_NAME) # Obtener la dimensión del índice index_stats = index.describe_index_stats() vector_dim = index_stats['dimension'] print(f"Index dimension: {vector_dim}") # Definir manualmente los campos de contexto y enlace CONTEXT_FIELDS = ['Tag','Pregunta','Respuesta'] LINK_FIELDS = ['Tag','Respuesta'] # Imprimir confirmación de campos seleccionados print(f"Context fields set to: {CONTEXT_FIELDS}") print(f"Link fields set to: {LINK_FIELDS}") # Función para obtener las selecciones actuales de campos (puede ser usada en otras celdas) def get_field_selections(): return { "CONTEXT_FIELDS": CONTEXT_FIELDS, "LINK_FIELDS": LINK_FIELDS } ##################################### # Check if required global variables are set if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None: raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.") if 'INDEX_NAME' not in globals() or INDEX_NAME is None: raise ValueError("INDEX_NAME is not set. Please create or select an index first.") if 'CONTEXT_FIELDS' not in globals() or 'LINK_FIELDS' not in globals(): raise ValueError("CONTEXT_FIELDS and LINK_FIELDS are not set. Please run the field selection cell first.") # Initialize the Sentence-Transformer model embedding_model = SentenceTransformer(model_name) # Initialize Pinecone with the API key and connect to the index pinecone_client = Pinecone(api_key=PINECONE_API_KEY) index = pinecone_client.Index(INDEX_NAME) # Constants LIMIT = 3750 def vector_search(query): # Generate embedding using Sentence-Transformer model xq = embedding_model.encode(query) # Perform vector search on Pinecone index res = index.query(vector=xq.tolist(), top_k=3, include_metadata=True) if res['matches']: return [ { 'content': ' '.join(f"{k}: {v}" for k, v in match['metadata'].items() if k in CONTEXT_FIELDS and k != 'Tag'), 'metadata': match['metadata'] } for match in res['matches'] if 'metadata' in match ] return [] def create_prompt(query, contexts): prompt_start = "\n\nContexto:\n" prompt_end = f"\n\nPregunta: {query}\nRespuesta:" current_contexts = "\n\n---\n\n".join([context['content'] for context in contexts]) if len(prompt_start + current_contexts + prompt_end) >= LIMIT: # Truncate contexts if they exceed the limit available_space = LIMIT - len(prompt_start) - len(prompt_end) truncated_contexts = current_contexts[:available_space] return prompt_start + truncated_contexts + prompt_end else: return prompt_start + current_contexts + prompt_end def complete(prompt): return [f"🌟"] def check_image_exists(filepath): return os.path.exists(filepath) def chat_function(message, history): # Perform vector search search_results = vector_search(message) # Create prompt with relevant contexts query_with_contexts = create_prompt(message, search_results) # Generate response response = complete(query_with_contexts) partial_message = response[0].split("\n")[0] # Solo tomar la primera línea de la respuesta # Handle the logic for processing tags and images internally relevant_links = [result['metadata'].get(field) for result in search_results for field in LINK_FIELDS if field in result['metadata']] full_response = partial_message image_url = None tags_detected = [] filtered_links = [] if relevant_links: for link in relevant_links: if any(tag in link for tag in ["rId101", "rId105", "rId109", "rId113", "rId117", "rId121", "rId125", "rId129", "rId133", "rId136", "rId139", "rId142", "rId145", "rId149", "rId153", "rId157", "rId161", "rId165", "rId169", "rId173", "rId177", "rId180", "rId184", "rId187", "rId192", "rId195", "rId40", "rId44", "rId47", "rId50", "rId53", "rId56", "rId59", "rId63", "rId66", "rId70", "rId73", "rId76", "rId80", "rId83", "rId87", "rId90", "rId94", "rId97"]): tags_detected.append(link) # Save the tag but don't display it else: filtered_links.append(link) # Add the first relevant link under a single "Respuestas relevantes" section if filtered_links: full_response += filtered_links[0] #f".\n\nRespuesta:\n" + filtered_links[0] # Now handle the images based on the detected tags tags_to_images = { "rId101": "images/rId101.png", "rId105": "images/rId105.png", "rId109": "images/rId109.png", "rId113": "images/rId113.png", "rId117": "images/rId117.png", "rId121": "images/rId121.png", "rId125": "images/rId125.png", "rId129": "images/rId129.png", "rId133": "images/rId133.png", "rId136": "images/rId136.png", "rId139": "images/rId139.png", "rId142": "images/rId142.png", "rId145": "images/rId145.png", "rId149": "images/rId149.png", "rId153": "images/rId153.png", "rId157": "images/rId157.png", "rId161": "images/rId161.png", "rId165": "images/rId165.png", "rId169": "images/rId169.png", "rId173": "images/rId173.png", "rId177": "images/rId177.png", "rId180": "images/rId180.png", "rId184": "images/rId184.png", "rId187": "images/rId187.png", "rId192": "images/rId192.png", "rId195": "images/rId195.png", "rId40": "images/rId40.png", "rId44": "images/rId44.png", "rId47": "images/rId47.png", "rId50": "images/rId50.png", "rId53": "images/rId53.png", "rId56": "images/rId56.png", "rId59": "images/rId59.png", "rId63": "images/rId63.png", "rId66": "images/rId66.png", "rId70": "images/rId70.png", "rId73": "images/rId73.png", "rId76": "images/rId76.png", "rId80": "images/rId80.png", "rId83": "images/rId83.png", "rId87": "images/rId87.png", "rId90": "images/rId90.png", "rId94": "images/rId94.png", "rId97": "images/rId97.png", } for tag in tags_detected: for key, path in tags_to_images.items(): if key in tag and check_image_exists(path): image_url = path break return full_response, image_url def update_image(image_url): if image_url: return image_url else: return None images = [ {"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."}, {"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)."}, {"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."}, {"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. El gráfico de barras horizontal compara los 10 establecimientos con más registros."}, {"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."}, {"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."}, {"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."}, {"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."}, {"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."}, {"id": "rId136", "path": "images/rId136.png", "description": "Descripción 10"}, {"id": "rId139", "path": "images/rId139.png", "description": "Descripción 11"}, {"id": "rId142", "path": "images/rId142.png", "description": "Descripción 12"}, {"id": "rId145", "path": "images/rId145.png", "description": "Descripción 13"}, {"id": "rId149", "path": "images/rId149.png", "description": "Descripción 14"}, {"id": "rId153", "path": "images/rId153.png", "description": "Descripción 15"}, {"id": "rId157", "path": "images/rId157.png", "description": "Descripción 16"}, {"id": "rId161", "path": "images/rId161.png", "description": "Descripción 17"}, {"id": "rId165", "path": "images/rId165.png", "description": "Descripción 18"}, {"id": "rId169", "path": "images/rId169.png", "description": "Descripción 19"}, {"id": "rId173", "path": "images/rId173.png", "description": "Descripción 20"}, {"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. "}, {"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."}, {"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."}, {"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 💰."}, {"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."}, {"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 🌳"}, {"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."}, {"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."}, {"id": "rId47", "path": "images/rId47.png", "description": "Descripción 29"}, {"id": "rId50", "path": "images/rId50.png", "description": "Descripción 30"}, {"id": "rId53", "path": "images/rId53.png", "description": "Descripción 31"}, {"id": "rId56", "path": "images/rId56.png", "description": "Descripción 32"}, {"id": "rId59", "path": "images/rId59.png", "description": "Descripción 33"}, {"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."}, {"id": "rId66", "path": "images/rId66.png", "description": "Descripción 35"}, {"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."}, {"id": "rId73", "path": "images/rId73.png", "description": "Descripción 37"}, {"id": "rId76", "path": "images/rId76.png", "description": "Descripción 38"}, {"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."}, {"id": "rId83", "path": "images/rId83.png", "description": "Descripción 40"}, {"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."}, {"id": "rId90", "path": "images/rId90.png", "description": "Descripción 42"}, {"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."}, {"id": "rId97", "path": "images/rId97.png", "description": "Descripción 44"}, ] # Gradio layout setup with gr.Blocks() as demo: with gr.Row(): with gr.Column(scale=1): # Agregar el video al inicio video = gr.Video(value="video.mp4", label="Video de Introducción") # Crear la estructura para tres columnas de carruseles gr.Markdown("### Carruseles de Imágenes") # Crear grupos de imágenes y descripciones image_groups = [ #Análisis Geográfico [images[24], images[25]], #Valor Bruto Medicamento [images[21],images[20]], #Valor Neto Medicamento [images[23],images[22]], #Departamento (Registro) [images[38], images[39]], #Provincia (Registro) [images[40], images[41]], #Distrito (Registro) [images[42], images[43]], #Departamento (Análisis) [images[29], images[12], images[11]], #Sexo (Análisis) [images[28], images[32]], #Peso (Análisis) [images[35], images[36], images[37]], #Establecimiento de Salud [images[3], images[1], images[10], images[30]], #Servicio de Salud [images[5], images[14]], #Medicamentos [images[16], images[17], images[18], images[15]], ] carousel_titles = [ "Análisis Geográfico", # Título para el primer carrusel "Valor bruto de medicamento", # Título para el segundo carrusel "Valor neto de medicamento", #Título Tercer carrusel "Departamento (Registro)", "Provincia (Registro)", "Distrito (Registro)", "Departamento (Análisis)", "Sexo (Análisis)", "Peso (Análisis)", "Establecimiento de Salud", "Servicio de Salud", "Medicamentos", ] # Crear tres columnas de carruseles with gr.Row(): for group in range(0, len(image_groups), 3): # Iterar en sets de 3 carruseles with gr.Column(scale=1): # Crear columna para cada carrusel with gr.Tabs(): for idx in range(3): # Tres carruseles por columna if group + idx < len(image_groups): images_in_carousel = image_groups[group + idx] # Comprobar si el título existe, de lo contrario usar uno predeterminado if (group + idx) < len(carousel_titles): title = carousel_titles[group + idx] else: title = f"Carrusel {group + idx + 1}" # Título predeterminado # Verifica si image es un diccionario o un string y ajusta en consecuencia with gr.Tab(title): # Usar el título personalizado o predeterminado for image in images_in_carousel: if isinstance(image, dict): # Si `image` es un diccionario, accede a la clave "path" gr.Image(value=image["path"]) # Mostrar la imagen gr.Markdown(image["description"]) # Mostrar la descripción debajo de la imagen else: # Si `image` es un string, úsalo directamente como ruta gr.Image(value=image) # Mostrar la imagen # Botón de descarga de PDF download_button = gr.File(label="Descargar Informe sobre Administración de Medicamentos a Recién Nacidos", value="Reporte.pdf") # Chatbot chatbot_output = gr.Chatbot(label="ChatBot") chatbot_input = gr.Textbox(label="Tu mensaje") submit_button = gr.Button("Enviar") chatbot_history = gr.State(value=[]) image_url = gr.State(value=None) # Main accordion for categories with gr.Accordion("Categorías de Preguntas", open=True): # Diagnósticos Accordion with gr.Accordion("Diagnóstico y Análisis Clínico", open=False): # Subaccordion for Diagnósticos Principales with gr.Accordion("Diagnósticos Principales", open=True): button_1 = gr.Button("¿Cuál es el diagnóstico más común registrado en el dataset?") button_2 = gr.Button("¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?") button_3 = gr.Button("¿Cuáles son los diagnósticos más frecuentes que requieren hospitalización prolongada?") button_4 = gr.Button("¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?") button_5 = gr.Button("¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?") button_6 = gr.Button("¿Cómo se distribuyen los diagnósticos entre pacientes masculinos y femeninos?") button_7 = gr.Button("¿Existen diferencias significativas en los diagnósticos entre diferentes departamentos?") button_8 = gr.Button("¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?") button_9 = gr.Button("¿Cuáles son los diagnósticos menos comunes en el dataset?") button_10 = gr.Button("¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?") # Subaccordion for Relación Diagnóstico-Medicamentos with gr.Accordion("Relación Diagnóstico-Medicamentos", open=False): button_11 = gr.Button("¿Qué diagnóstico está más frecuentemente asociado con la administración de antibióticos?") button_12 = gr.Button("¿Qué medicamentos son comúnmente administrados a neonatos con hipoglicemia?") button_13 = gr.Button("¿Existe una preferencia por ciertos medicamentos según el diagnóstico de nacimiento pretermino?") button_14 = gr.Button("¿Cómo influye el diagnóstico en la forma farmacéutica del medicamento administrado?") button_15 = gr.Button("¿Qué diagnóstico está asociado con el uso frecuente de soluciones intravenosas?") button_16 = gr.Button("¿Qué porcentaje de neonatos con sepsis bacteriana reciben antibióticos inyectables?") button_17 = gr.Button("¿Cuál es la relación entre el diagnóstico de ictericia neonatal y los medicamentos administrados?") button_18 = gr.Button("¿Qué diferencias se observan en la administración de medicamentos entre diagnósticos respiratorios y gastrointestinales?") button_19 = gr.Button("¿Cómo varía la administración de medicamentos según el tipo de parto (vaginal o cesárea)?") button_20 = gr.Button("¿Qué diagnóstico tiene la menor cantidad de registros asociados con la administración de medicamentos?") # Tratamientos Accordion with gr.Accordion("Análisis Geográfico y Temporal", open=False): # Subaccordion for Diferencias Geográficas with gr.Accordion("Diferencias Geográficas", open=False): button_21 = gr.Button("¿Cuál es el departamento con el mayor número de registros de administración de medicamentos?") button_22 = gr.Button("¿Qué departamentos tienen los menores registros de administración de medicamentos?") button_23 = gr.Button("¿Cuál es la diferencia en la administración de medicamentos entre Lima y La Libertad?") button_24 = gr.Button("¿Qué factores podrían explicar las diferencias en la administración de medicamentos entre departamentos?") button_25 = gr.Button("¿Cómo se distribuyen los registros de administración de medicamentos en áreas urbanas versus rurales?") button_26 = gr.Button("¿Cuál es la relación entre el nivel de establecimiento de salud y la geografía?") button_27 = gr.Button("¿Qué departamento muestra la mayor variedad de medicamentos administrados?") button_28 = gr.Button("¿Existen diferencias en el costo de los medicamentos entre diferentes provincias dentro de un mismo departamento?") button_29 = gr.Button("¿Qué provincia tiene el menor registro de administración de medicamentos?") button_30 = gr.Button("¿Cómo varía la administración de medicamentos en los distritos más poblados versus los menos poblados?") # Subaccordion for Análisis Temporal with gr.Accordion("Análisis Temporal", open=False): button_31 = gr.Button("¿Cuál es el rango de fechas de administración de medicamentos registrado en el dataset?") button_32 = gr.Button("¿En qué meses se registra la mayor cantidad de administración de medicamentos?") button_33 = gr.Button("¿Cuál es la distribución de la administración de medicamentos a lo largo de los días de la semana?") button_34 = gr.Button("¿Existen picos en la administración de medicamentos durante períodos específicos?") button_35 = gr.Button("¿Cómo ha evolucionado la administración de medicamentos desde 2022 hasta 2023?") button_36 = gr.Button("¿Qué impacto tienen las estaciones del año en la administración de medicamentos?") button_37 = gr.Button("¿Cómo varía la administración de medicamentos durante días festivos o feriados?") button_38 = gr.Button("¿Cuál es la correlación entre las fechas de administración de medicamentos y los ingresos hospitalarios?") button_39 = gr.Button("¿Qué variación se observa en la administración de medicamentos al comparar el primer y el último trimestre de 2023?") button_40 = gr.Button("¿Cómo afecta la hora del día en la administración de medicamentos a los recién nacidos?") # Medicamentos y Costos with gr.Accordion("Medicamentos y Costos", open=False): with gr.Accordion("Tipo de Medicamentos", open=False): button_41 = gr.Button("¿Cuál es el medicamento más comúnmente administrado en recién nacidos?") button_42 = gr.Button("¿Qué porcentaje del total de medicamentos administrados corresponde a la Tetraciclina Clorhidrato?") button_43 = gr.Button("¿Cuáles son los principales medicamentos administrados para infecciones neonatales?") button_44 = gr.Button("¿Qué tipo de forma farmacéutica es la más utilizada en neonatos?") button_45 = gr.Button("¿Qué porcentaje de los medicamentos administrados corresponde a soluciones oftálmicas?") button_46 = gr.Button("¿Cuáles son los medicamentos más costosos administrados a recién nacidos?") button_47 = gr.Button("¿Qué medicamentos se utilizan con mayor frecuencia en los departamentos con menos recursos?") button_48 = gr.Button("¿Qué proporción de medicamentos administrados son antibióticos?") button_49 = gr.Button("¿Cuáles son los medicamentos menos comunes administrados en el dataset?") button_50 = gr.Button("¿Qué relación existe entre el tipo de medicamento y el diagnóstico principal?") with gr.Accordion("Costo de Medicamentos", open=False): button_51 = gr.Button("¿Cuál es el costo promedio bruto de los medicamentos administrados a los recién nacidos?") button_52 = gr.Button("¿Cuál es la mediana del valor neto de los medicamentos?") button_53 = gr.Button("¿Qué medicamentos tienen el costo bruto más alto?") button_54 = gr.Button("¿Cuál es la desviación estándar del costo bruto de los medicamentos?") button_55 = gr.Button("¿Cómo varía el costo neto de los medicamentos entre diferentes departamentos?") button_56 = gr.Button("¿Qué porcentaje de los medicamentos administrados tienen un valor neto igual a cero?") button_57 = gr.Button("¿Cómo afecta el nivel del establecimiento de salud el costo de los medicamentos?") button_58 = gr.Button("¿Cuál es el costo bruto máximo registrado para un medicamento?") button_59 = gr.Button("¿Cuál es el valor neto mínimo registrado para un medicamento?") button_60 = gr.Button("¿Cuál es la correlación entre el costo del medicamento y la duración de la hospitalización?") with gr.Accordion("Duración de Hospitalización", open=False): button_61 = gr.Button("¿Cuál es la duración promedio de la hospitalización para los recién nacidos?") button_62 = gr.Button("¿Qué diagnóstico está asociado con las hospitalizaciones más prolongadas?") button_63 = gr.Button("¿Qué proporción de recién nacidos es hospitalizada por más de 7 días?") button_64 = gr.Button("¿Cuál es la mediana de días de hospitalización para neonatos con diagnósticos menos graves?") button_65 = gr.Button("¿Cómo varía la duración de la hospitalización entre los diferentes departamentos?") button_66 = gr.Button("¿Cuál es el impacto de la forma farmacéutica en la duración de la hospitalización?") button_67 = gr.Button("¿Qué relación existe entre la cantidad de medicamento administrado y la duración de la hospitalización?") button_68 = gr.Button("¿Cómo afecta el nivel del establecimiento de salud la duración de la hospitalización?") button_69 = gr.Button("¿Qué diagnósticos están asociados con hospitalizaciones de corta duración?") button_70 = gr.Button("¿Cuál es la duración de hospitalización más corta registrada?") # Calidad de datos y recomendaciones with gr.Accordion("Calidad de Datos y Recomendaciones", open=False): # Subaccordion for Limitaciones de la calidad de datos with gr.Accordion("Calidad y Limitaciones de los Datos", open=False): button_71 = gr.Button("¿Cuál es el porcentaje de registros con valores faltantes en el dataset?") button_72 = gr.Button("¿Cómo se manejaron los valores faltantes en la variable de peso (PESO)?") button_73 = gr.Button("¿Qué método se utilizó para imputar valores faltantes en la variable de días de hospitalización?") button_74 = gr.Button("¿Cómo se gestionaron los outliers en la variable de peso por género?") button_75 = gr.Button("¿Qué limitaciones presenta el análisis en cuanto a la cobertura geográfica?") button_76 = gr.Button("¿Cómo afecta la anonimización de datos la capacidad de análisis detallado?") button_77 = gr.Button("¿Qué desafíos presenta la calidad de los datos en términos de precisión y consistencia?") button_78 = gr.Button("¿Qué impacto tienen las limitaciones temporales de los datos en el análisis?") button_79 = gr.Button("¿Cómo se verificó la imputación de outliers en las variables CANTIDAD, VALOR_BRUTO y VALOR_NETO?") button_80 = gr.Button("¿Qué recomendaciones se hicieron para mejorar la calidad de los datos en futuros estudios?") # Subaccordion for Mejoras y Recomendaciones with gr.Accordion("Recomendaciones y Mejoras en Atención Neonatal", open=False): button_81 = gr.Button("¿Qué mejoras se recomendaron para la descentralización de los servicios de salud neonatal?") button_82 = gr.Button("¿Cómo se puede fortalecer la atención neonatal en Perú según el análisis?") button_83 = gr.Button("¿Qué papel juega la estandarización de protocolos en la atención neonatal?") button_84 = gr.Button("¿Cuál es la importancia de la investigación continua en la atención neonatal?") button_85 = gr.Button("¿Cómo podría mejorar la calidad de los datos recolectados en futuras investigaciones?") button_86 = gr.Button("¿Qué impacto tendría la mejora de infraestructura hospitalaria en áreas rurales?") button_87 = gr.Button("¿Cuál es el beneficio de un acceso más equitativo a medicamentos en áreas con menos recursos?") button_88 = gr.Button("¿Cómo podría la implementación de nuevas políticas de salud afectar la atención neonatal?") button_89 = gr.Button("¿Qué enfoque se recomienda para la prevención de condiciones críticas como la sepsis neonatal?") button_90 = gr.Button("¿Cómo podrían las recomendaciones del análisis contribuir a la reducción de la mortalidad neonatal en Perú?") # Impacto en la salud neonatal with gr.Accordion("Impacto en la salud neonatal", open=False): # Subaccordion for Impacto en la salud neonatal with gr.Accordion("Impacto en la salud neonatal", open=False): button_91 = gr.Button("¿Qué impacto tiene la administración de Fitomenadiona en la reducción de la mortalidad neonatal?") button_92 = gr.Button("¿Cómo influye el uso de antibióticos en la duración de la hospitalización?") button_93 = gr.Button("¿Qué resultados clínicos se observan en neonatos que reciben Oxígeno Medicinal?") button_94 = gr.Button("¿Cuál es la tasa de reingreso hospitalario en neonatos que recibieron antibióticos?") button_95 = gr.Button("¿Qué efectos secundarios se asocian con el uso de medicamentos inyectables en neonatos?") button_96 = gr.Button("¿Cómo afecta la administración de medicamentos en la tasa de supervivencia de neonatos con sepsis?") button_97 = gr.Button("¿Qué impacto tiene la administración de soluciones intravenosas en neonatos con deshidratación?") button_98 = gr.Button("¿Cuál es la relación entre el uso de medicamentos y la tasa de complicaciones posthospitalarias?") button_99 = gr.Button("¿Qué medicamentos están asociados con una mejor recuperación en neonatos con infecciones?") button_100 = gr.Button("¿Cómo influye la dosis de medicamentos en los resultados de salud neonatal?") with gr.Column(scale=1): image_output = gr.Image(label="Imagen asociada") def process_input(message, history): full_response, image = chat_function(message, history) history.append((message, full_response)) return history, history, image # Function to update chatbot input with preset question def send_preset_question(question, history): return process_input(question, history) # Assign the buttons to send the respective categorized questions # Assign the buttons to send the respective categorized questions button_assignments = [ (button_1, "¿Cuál es el diagnóstico más común registrado en el dataset?"), (button_2, "¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?"), (button_3, "¿Cuáles son los diagnósticos más frecuentes que requieren hospitalización prolongada?"), (button_4, "¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?"), (button_5, "¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?"), (button_6, "¿Cómo se distribuyen los diagnósticos entre pacientes masculinos y femeninos?"), (button_7, "¿Existen diferencias significativas en los diagnósticos entre diferentes departamentos?"), (button_8, "¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?"), (button_9, "¿Cuáles son los diagnósticos menos comunes en el dataset?"), (button_10, "¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?"), (button_11, "¿Qué diagnóstico está más frecuentemente asociado con la administración de antibióticos?"), (button_12, "¿Qué medicamentos son comúnmente administrados a neonatos con hipoglicemia?"), (button_13, "¿Existe una preferencia por ciertos medicamentos según el diagnóstico de nacimiento pretermino?"), (button_14, "¿Cómo influye el diagnóstico en la forma farmacéutica del medicamento administrado?"), (button_15, "¿Qué diagnóstico está asociado con el uso frecuente de soluciones intravenosas?"), (button_16, "¿Qué porcentaje de neonatos con sepsis bacteriana reciben antibióticos inyectables?"), (button_17, "¿Cuál es la relación entre el diagnóstico de ictericia neonatal y los medicamentos administrados?"), (button_18, "¿Qué diferencias se observan en la administración de medicamentos entre diagnósticos respiratorios y gastrointestinales?"), (button_19, "¿Cómo varía la administración de medicamentos según el tipo de parto (vaginal o cesárea)?"), (button_20, "¿Qué diagnóstico tiene la menor cantidad de registros asociados con la administración de medicamentos?"), (button_21, "¿Cuál es el departamento con el mayor número de registros de administración de medicamentos?"), (button_22, "¿Qué departamentos tienen los menores registros de administración de medicamentos?"), (button_23, "¿Cuál es la diferencia en la administración de medicamentos entre Lima y La Libertad?"), (button_24, "¿Qué factores podrían explicar las diferencias en la administración de medicamentos entre departamentos?"), (button_25, "¿Cómo se distribuyen los registros de administración de medicamentos en áreas urbanas versus rurales?"), (button_26, "¿Cuál es la relación entre el nivel de establecimiento de salud y la geografía?"), (button_27, "¿Qué departamento muestra la mayor variedad de medicamentos administrados?"), (button_28, "¿Existen diferencias en el costo de los medicamentos entre diferentes provincias dentro de un mismo departamento?"), (button_29, "¿Qué provincia tiene el menor registro de administración de medicamentos?"), (button_30, "¿Cómo varía la administración de medicamentos en los distritos más poblados versus los menos poblados?"), (button_31, "¿Cuál es el rango de fechas de administración de medicamentos registrado en el dataset?"), (button_32, "¿En qué meses se registra la mayor cantidad de administración de medicamentos?"), (button_33, "¿Cuál es la distribución de la administración de medicamentos a lo largo de los días de la semana?"), (button_34, "¿Existen picos en la administración de medicamentos durante períodos específicos?"), (button_35, "¿Cómo ha evolucionado la administración de medicamentos desde 2022 hasta 2023?"), (button_36, "¿Qué impacto tienen las estaciones del año en la administración de medicamentos?"), (button_37, "¿Cómo varía la administración de medicamentos durante días festivos o feriados?"), (button_38, "¿Cuál es la correlación entre las fechas de administración de medicamentos y los ingresos hospitalarios?"), (button_39, "¿Qué variación se observa en la administración de medicamentos al comparar el primer y el último trimestre de 2023?"), (button_40, "¿Cómo afecta la hora del día en la administración de medicamentos a los recién nacidos?"), (button_41, "¿Cuál es el medicamento más comúnmente administrado en recién nacidos?"), (button_42, "¿Qué porcentaje del total de medicamentos administrados corresponde a la Tetraciclina Clorhidrato?"), (button_43, "¿Cuáles son los principales medicamentos administrados para infecciones neonatales?"), (button_44, "¿Qué tipo de forma farmacéutica es la más utilizada en neonatos?"), (button_45, "¿Qué porcentaje de los medicamentos administrados corresponde a soluciones oftálmicas?"), (button_46, "¿Cuáles son los medicamentos más costosos administrados a recién nacidos?"), (button_47, "¿Qué medicamentos se utilizan con mayor frecuencia en los departamentos con menos recursos?"), (button_48, "¿Qué proporción de medicamentos administrados son antibióticos?"), (button_49, "¿Cuáles son los medicamentos menos comunes administrados en el dataset?"), (button_50, "¿Qué relación existe entre el tipo de medicamento y el diagnóstico principal?"), (button_51, "¿Cuál es el costo promedio bruto de los medicamentos administrados a los recién nacidos?"), (button_52, "¿Cuál es la mediana del valor neto de los medicamentos?"), (button_53, "¿Qué medicamentos tienen el costo bruto más alto?"), (button_54, "¿Cuál es la desviación estándar del costo bruto de los medicamentos?"), (button_55, "¿Cómo varía el costo neto de los medicamentos entre diferentes departamentos?"), (button_56, "¿Qué porcentaje de los medicamentos administrados tienen un valor neto igual a cero?"), (button_57, "¿Cómo afecta el nivel del establecimiento de salud el costo de los medicamentos?"), (button_58, "¿Cuál es el costo bruto máximo registrado para un medicamento?"), (button_59, "¿Cuál es el valor neto mínimo registrado para un medicamento?"), (button_60, "¿Cuál es la correlación entre el costo del medicamento y la duración de la hospitalización?"), (button_61, "¿Cuál es la duración promedio de la hospitalización para los recién nacidos?"), (button_62, "¿Qué diagnóstico está asociado con las hospitalizaciones más prolongadas?"), (button_63, "¿Qué proporción de recién nacidos es hospitalizada por más de 7 días?"), (button_64, "¿Cuál es la mediana de días de hospitalización para neonatos con diagnósticos menos graves?"), (button_65, "¿Cómo varía la duración de la hospitalización entre los diferentes departamentos?"), (button_66, "¿Cuál es el impacto de la forma farmacéutica en la duración de la hospitalización?"), (button_67, "¿Qué relación existe entre la cantidad de medicamento administrado y la duración de la hospitalización?"), (button_68, "¿Cómo afecta el nivel del establecimiento de salud la duración de la hospitalización?"), (button_69, "¿Qué diagnósticos están asociados con hospitalizaciones de corta duración?"), (button_70, "¿Cuál es la duración de hospitalización más corta registrada?"), (button_71, "¿Cuál es el porcentaje de registros con valores faltantes en el dataset?"), (button_72, "¿Cómo se manejaron los valores faltantes en la variable de peso (PESO)?"), (button_73, "¿Qué método se utilizó para imputar valores faltantes en la variable de días de hospitalización?"), (button_74, "¿Cómo se gestionaron los outliers en la variable de peso por género?"), (button_75, "¿Qué limitaciones presenta el análisis en cuanto a la cobertura geográfica?"), (button_76, "¿Cómo afecta la anonimización de datos la capacidad de análisis detallado?"), (button_77, "¿Qué desafíos presenta la calidad de los datos en términos de precisión y consistencia?"), (button_78, "¿Qué impacto tienen las limitaciones temporales de los datos en el análisis?"), (button_79, "¿Cómo se verificó la imputación de outliers en las variables CANTIDAD, VALOR_BRUTO y VALOR_NETO?"), (button_80, "¿Qué recomendaciones se hicieron para mejorar la calidad de los datos en futuros estudios?"), (button_81, "¿Qué mejoras se recomendaron para la descentralización de los servicios de salud neonatal?"), (button_82, "¿Cómo se puede fortalecer la atención neonatal en Perú según el análisis?"), (button_83, "¿Qué papel juega la estandarización de protocolos en la atención neonatal?"), (button_84, "¿Cuál es la importancia de la investigación continua en la atención neonatal?"), (button_85, "¿Cómo podría mejorar la calidad de los datos recolectados en futuras investigaciones?"), (button_86, "¿Qué impacto tendría la mejora de infraestructura hospitalaria en áreas rurales?"), (button_87, "¿Cuál es el beneficio de un acceso más equitativo a medicamentos en áreas con menos recursos?"), (button_88, "¿Cómo podría la implementación de nuevas políticas de salud afectar la atención neonatal?"), (button_89, "¿Qué enfoque se recomienda para la prevención de condiciones críticas como la sepsis neonatal?"), (button_90, "¿Cómo podrían las recomendaciones del análisis contribuir a la reducción de la mortalidad neonatal en Perú?"), (button_91, "¿Qué impacto tiene la administración de Fitomenadiona en la reducción de la mortalidad neonatal?"), (button_92, "¿Cómo influye el uso de antibióticos en la duración de la hospitalización?"), (button_93, "¿Qué resultados clínicos se observan en neonatos que reciben Oxígeno Medicinal?"), (button_94, "¿Cuál es la tasa de reingreso hospitalario en neonatos que recibieron antibióticos?"), (button_95, "¿Qué efectos secundarios se asocian con el uso de medicamentos inyectables en neonatos?"), (button_96, "¿Cómo afecta la administración de medicamentos en la tasa de supervivencia de neonatos con sepsis?"), (button_97, "¿Qué impacto tiene la administración de soluciones intravenosas en neonatos con deshidratación?"), (button_98, "¿Cuál es la relación entre el uso de medicamentos y la tasa de complicaciones posthospitalarias?"), (button_99, "¿Qué medicamentos están asociados con una mejor recuperación en neonatos con infecciones?"), (button_100, "¿Cómo influye la dosis de medicamentos en los resultados de salud neonatal?"), ] for button, question in button_assignments: button.click(send_preset_question, inputs=[gr.State(value=question), chatbot_history], outputs=[chatbot_output, chatbot_history, image_url]) submit_button.click(process_input, inputs=[chatbot_input, chatbot_history], outputs=[chatbot_output, chatbot_history, image_url]) image_url.change(fn=update_image, inputs=image_url, outputs=image_output) # Launch the interface demo.launch(debug=True)