emer-audit / app.py
Americo's picture
Update app.py
2347edb
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)