Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import json | |
| import os | |
| import openai | |
| openai.api_key = os.getenv('OPENAI_API_KEY') | |
| df2 = pd.read_csv('./df_emer_definitive.csv') | |
| caso_30 = df2.informacion_concatenada[30] | |
| respuesta_30 = df2.informacion_concatenada_2[30] | |
| caso_0 = df2.informacion_concatenada[0] | |
| respuesta_0 = df2.informacion_concatenada_2[0] | |
| caso_30 = df2.informacion_concatenada[30] | |
| respuesta_30 = df2.informacion_concatenada_2[30] | |
| caso_0 = df2.informacion_concatenada[0] | |
| respuesta_0 = df2.informacion_concatenada_2[0] | |
| caso_1 = df2.informacion_concatenada[1] | |
| respuesta_1 = df2.informacion_concatenada_2[1] | |
| caso_2 = df2.informacion_concatenada[2] | |
| respuesta_2 = df2.informacion_concatenada_2[2] | |
| caso_3 = df2.informacion_concatenada[3] | |
| respuesta_3 = df2.informacion_concatenada_2[3] | |
| caso_4 = df2.informacion_concatenada[4] | |
| respuesta_4 = df2.informacion_concatenada_2[4] | |
| caso_5 = df2.informacion_concatenada[5] | |
| respuesta_5 = df2.informacion_concatenada_2[5] | |
| caso_6 = df2.informacion_concatenada[6] | |
| respuesta_6 = df2.informacion_concatenada_2[6] | |
| caso_7 = df2.informacion_concatenada[7] | |
| respuesta_7 = df2.informacion_concatenada_2[7] | |
| caso_8 = df2.informacion_concatenada[8] | |
| respuesta_8 = df2.informacion_concatenada_2[8] | |
| caso_10 = df2.informacion_concatenada[10] | |
| respuesta_10 = df2.informacion_concatenada_2[10] | |
| caso_100 = df2.informacion_concatenada[100] | |
| respuesta_100 = df2.informacion_concatenada_2[100] | |
| caso_200 = df2.informacion_concatenada[200] | |
| respuesta_200 = df2.informacion_concatenada_2[200] | |
| caso_300 = df2.informacion_concatenada[300] | |
| respuesta_300 = df2.informacion_concatenada_2[300] | |
| caso_20 = df2.informacion_concatenada[20] | |
| respuesta_20 = df2.informacion_concatenada_2[20] | |
| caso_30 = df2.informacion_concatenada[30] | |
| respuesta_30 = df2.informacion_concatenada_2[30] | |
| caso_25 = df2.informacion_concatenada[25] | |
| respuesta_25 = df2.informacion_concatenada_2[25] | |
| caso_400 = df2.informacion_concatenada[400] | |
| respuesta_400 = df2.informacion_concatenada_2[400] | |
| caso_700 = df2.informacion_concatenada[700] | |
| respuesta_700 = df2.informacion_concatenada_2[700] | |
| caso_1000 = df2.informacion_concatenada[1000] | |
| respuesta_1000 = df2.informacion_concatenada_2[1000] | |
| def get_completion(prompt, model="gpt-4-1106-preview"): | |
| messages = [{"role":"system", "content":"""Actúa como un auditor médico. Tu tarea es analizar minuciosamente la atención médica para determinar si hubo una "IRREGULARIDAD GRAVE" o no. | |
| Si hay una "IRREGULARIDAD GRAVE", en el campo observaciones debes justificar tu respuesta. | |
| Este un listado de condiciones que podrían significar situaciones con riesgo de vida y deben tener una Descripción del Destino Final igual o similar a 'TRASLADO A HOSPITAL (POR UTIM)'. En caso contrario, se consideraría una irregularidad grave en la atención médica: | |
| Puntaje Glasgow Total menor a 15 (quince) | |
| Frecuencia Respiratoria mayor a 22 (veintidos) | |
| Frecuencia Cardíaca menor a 50 (cincuenta) | |
| Frecuencia Cardíaca mayor a 120 (cientoveinte) | |
| Saturación de Oxígeno (SATO2) menor a 90 (noventa) | |
| Nivel de Glucemia menor a 60 (sesenta) | |
| Tensión Arterial Máxima menos a 90 (noventa) | |
| Paciente desorientado o que NO está globalmente orientado. | |
| Paciente con mala perfusión periférica o que no está bien perfundido. | |
| Este es un listado de los diagnósticos prehospitalarios que podrían significar situaciones con riesgo de vida y deben tener una Descripción del Destino Final igual o similar a 'TRASLADO A HOSPITAL (POR UTIM)'. En caso contrario, se consideraría una irregularidad grave en la atención médica: | |
| CARV Accidente cerebrovasclar/ictus/apoplejía (301) | |
| CARV Arritmia cardíaca NE (304) | |
| CARV Choque, no clasificado en otra parte (307) CARV Hipotensión sin especificar (345) CARV Infarto agudo de miocardio (347) CARV Isquemia cardíaca con angina (351) | |
| CARV Isquemia cardíaca sin angina (352) CARV Insuficiencia cardíaca (349) | |
| DIGES Abdomen agudo (300) | |
| DIGES Cuerpo extraño en tracto digestivo (311) | |
| DIGES Hematemesis/vómito de sangre (341) DIGES Melena (356) | |
| INESP Desmayo/síncope (316) | |
| INESP Somnolencia, estupor y coma (501) | |
| METAB Hipoglucemia (344) | |
| NEURO Convulsiones/crisis convulsivas (310) | |
| NEURO Meningitis/encefalitis (357) | |
| PSICO Síntomas y signos que involucran la apariencia y el comportamiento (499) | |
| RESP Cuerpo extraño nariz/laringe/bronquios (313) | |
| TOXIC Intoxicaciones/envenenamientos/sobredosificación por medicamentos (350) | |
| TOXIC Efectos tóxicos de sustancias no medicamentosas (328) | |
| TRAUM Efectos adversos factores físicos (327) | |
| TRAUM Traumatismos/lesiones múltiples (503) | |
| Este es un listado de MOTIVOS DE CONSULTA con potencial riesgo de vida y deben tener una Descripción del Destino Final igual o similar a 'TRASLADO A HOSPITAL (POR UTIM)' . En caso contrario, se consideraría una irregularidad grave en la atención médica: | |
| Dificultad para hablar | |
| Dificultad respiratoria | |
| Dolor de pecho | |
| Dolor testicular | |
| Embarazo con problemas | |
| Hemorragia anal | |
| Hemorragia por boca Hipotensión arterial | |
| Ingestion de... | |
| Palidez | |
| Paresia | |
| Pérdida de Conciencia | |
| Perdida de control de esfinteres | |
| Problema ocular | |
| Quemadura | |
| Reacción cutánea | |
| Sudoración | |
| Temblor | |
| Trauma de abdomen | |
| Trauma de cara | |
| Trauma de craneo | |
| Trauma de cuello. | |
| Es imprescindible que el campo 'Ingreso de Electrocardiograma' cuente siempre con una descripción correspondiente en el campo 'Descripción del Electrocardiograma'; de lo contrario, se deberá clasificar como una atención irregular. Esto aplica igualmente en sentido contrario. | |
| LA REALIZACIÓN DEL ECG NO DEBE SER TOMADA EN CUENTA PARA EVALUAR LA CALIDAD DE LA ATENCIÓN."""}, | |
| {"role": "user", "content": caso_0}, | |
| {"role": "assistant", "content": respuesta_0}, | |
| {"role": "user", "content": caso_1}, | |
| {"role": "assistant", "content": respuesta_1}, | |
| {"role": "user", "content": caso_2}, | |
| {"role": "user", "content": caso_100}, | |
| {"role": "assistant", "content": respuesta_100}, | |
| {"role": "assistant", "content": respuesta_2}, | |
| {"role": "user", "content": caso_3}, | |
| {"role": "assistant", "content": respuesta_3}, | |
| {"role": "user", "content": caso_4}, | |
| {"role": "assistant", "content": respuesta_4}, | |
| {"role": "user", "content": caso_200}, | |
| {"role": "assistant", "content": respuesta_200}, | |
| {"role": "user", "content": caso_5}, | |
| {"role": "assistant", "content": respuesta_5}, | |
| {"role": "user", "content": caso_6}, | |
| {"role": "assistant", "content": respuesta_6}, | |
| {"role": "user", "content": caso_7}, | |
| {"role": "assistant", "content": respuesta_7}, | |
| {"role": "user", "content": caso_300}, | |
| {"role": "assistant", "content": respuesta_300}, | |
| {"role": "user", "content": caso_8}, | |
| {"role": "assistant", "content": respuesta_8}, | |
| {"role": "user", "content": caso_10}, | |
| {"role": "assistant", "content": respuesta_10}, | |
| {"role": "user", "content": caso_400}, | |
| {"role": "assistant", "content": respuesta_400}, | |
| {"role": "user", "content": caso_700}, | |
| {"role": "assistant", "content": respuesta_700}, | |
| {"role": "user", "content": prompt}] | |
| response = openai.ChatCompletion.create( | |
| model=model, | |
| messages=messages, | |
| temperature=0, | |
| ) | |
| return response.choices[0].message["content"] | |
| import gradio as gr | |
| import os | |
| def Audit(text1, text2, text3, text4, text5, text6, text7, text8): | |
| if text1 == "": | |
| text1 = '-' | |
| if text2 == "": | |
| text2 = '-' | |
| if text3 == "": | |
| text3 = '-' | |
| if text4 == "": | |
| text4 = '-' | |
| if text5 == "": | |
| text5 = '-' | |
| if text6 == "": | |
| text6 = '-' | |
| if text7 == "": | |
| text7 = '-' | |
| if text8 == "": | |
| text8 = '-' | |
| input = f"""Descripción de la Epicrisis: '{text1}' | |
| Descripción del Destino Final: '{text2}' | |
| ASEGURATE DE QUE LA RESPUESTA SEA EN FORMATO JSON.""" | |
| print(input) | |
| response = get_completion(input) | |
| print(response) | |
| response = json.loads(response.replace('```', "").replace('json', '')) | |
| print(response) | |
| Tag = response['IRREGULARIDAD GRAVE'] | |
| Observaciones = response['Observaciones'] | |
| ECG = response['Omisión de ECG o incompleto'] | |
| trat = response['Tratamiento no justificado'] | |
| omision = response['Omisión de tratamiento o procedimientos'] | |
| tras = response['Omisión de traslado'] | |
| incos = response['Inconsistencias en el diagnóstico o la conducta'] | |
| mala = response['Mala redacción'] | |
| print(Tag) | |
| if Tag == '1.0' or Tag == '1' or Tag == "Si": | |
| out = 'Si' | |
| else: | |
| out = 'No' | |
| if tras == '0' or tras == '0.0': | |
| tras = 'No' | |
| if tras == '1' or tras == '1.0': | |
| tras = 'Si' | |
| if ECG == '-' or ECG == '0' or ECG == '0.0': | |
| ECG = 'No' | |
| elif ECG == '1' or ECG == '1.0': | |
| ECG = 'Si' | |
| if trat == '-' or trat == '0' or trat == '0.0': | |
| trat = 'No' | |
| elif trat == '1' or trat == '1.0': | |
| trat = 'Si' | |
| if tras == '-': | |
| tras = 'No' | |
| if omision == '-': | |
| omision = 'No' | |
| elif omision == '1' or omision == '1.0': | |
| omision = 'Si' | |
| if incos == '-': | |
| incos = 'No' | |
| elif incos == '1' or incos == '1.0': | |
| incos = 'Si' | |
| if mala == '-': | |
| mala = 'No' | |
| elif mala == '1' or mala == '1.0': | |
| mala = 'Si' | |
| return f""" | |
| # Resultados de la auditoría | |
| **Irregularidad grave:** {out} | |
| **Observaciones:** {Observaciones} | |
| **Omisión de ECG o incompleto:** {ECG} | |
| **Tratamiento no justificado:** {trat} | |
| **Omisión de tratamiento o procedimientos:** {omision} | |
| **Omisión de traslado:** {tras} | |
| **Inconsistencias en el diagnóstico o la conducta:** {incos} | |
| **Mala redacción:** {mala}""" | |
| demo = gr.Blocks(theme= gr.themes.Glass()) | |
| with demo: | |
| text1 = gr.Textbox(label='Epicrisis:', value="Paciente de 63 años con antecedentes de epilepsia, consulta de lugar de trabajo por crisis convulsiva tónico clonica generalizada de 2 a 3 minutos de duración, sin traumatismo evidente. Al examen físico paciente normotenso afebril sin requerimiento de oxigeno hemodinamicamente estable, estado postictal") | |
| #text2 = gr.Textbox(label='Descripción de la Clasificación del Incidente Automático') | |
| # text3 = gr.Textbox(label='Motivo del llamado') | |
| # text4 = gr.Textbox(label='Sexo (M,F u O)') | |
| # text5 = gr.Textbox(label='Edad') | |
| # text6 = gr.Textbox(label='Diagnóstico prehospitalario') | |
| # text7 = gr.Textbox(label='Antecedentes Médico') | |
| destinos = ['DOMICILIO CON INSTRUCCIONES', 'TRASLADO A HOSPITAL (POR UTIM)', 'DOMICILIO RECHAZA TRASLADO', 'FALLECE PRE ARRIBO', 'FALLECE POST ARRIBO'] | |
| text2 = gr.Dropdown(destinos, label="Destino final:", value="DOMICILIO CON INSTRUCCIONES") | |
| b1 = gr.Button("Auditar") | |
| #b2 = gr.Button("Step 2. Medical assistance") | |
| text_last = gr.Markdown() | |
| b1.click(Audit, inputs=[text1, text2], outputs=text_last) | |
| #b2.click(q_a2, inputs=text, outputs=text) | |
| demo.launch(debug= True) |