Analiza datos clínicos con BigQuery y AI Platform Notebooks

1. Introducción

139d6fa46b10ab12.png

Última actualización: 22/9/2022

En este codelab, se implementa un patrón para acceder a los datos de atención médica agregados en BigQuery y analizarlos con BigQueryUI y AI Platform Notebooks. En él, se ilustra la exploración de grandes conjuntos de datos de atención médica con herramientas conocidas, como Pandas, Matplotlib, etcétera, en una instancia de AI Platform Notebooks que cumple con la HIPAA. El "truco" es hacer la primera parte de su agregación en BigQuery, utilizar Pandas para obtener un conjunto de datos reducido y luego trabajar con este de forma local. AI Platform Notebooks proporciona una experiencia de Jupyter administrada, por lo que no necesitas ejecutar servidores de notebook por tu cuenta. AI Platform Notebooks se integra bien con otros servicios de GCP, como BigQuery y Cloud Storage, lo que hace que sea rápido y sencillo comenzar tu recorrido por el análisis de datos y el AA en Google Cloud Platform.

En este codelab, aprenderás a hacer lo siguiente:

  • Desarrolla y prueba consultas en SQL con la IU de BigQuery.
  • Crea y lanza una instancia de AI Platform Notebooks en GCP.
  • Ejecutar consultas de SQL desde el notebook y almacenar los resultados de las consultas en un DataFrame de Pandas
  • Crear gráficos con Matplotlib
  • Confirma y envía el notebook a un repositorio de Cloud Source en GCP.

¿Qué necesitas para ejecutar este codelab?

  • Necesitas acceso a un proyecto de GCP.
  • Se te debe asignar el rol de Propietario para el proyecto de GCP.
  • Necesitas un conjunto de datos de atención médica en BigQuery.

Si no tienes un proyecto de GCP, sigue estos pasos para crear uno nuevo.

2. Configura el proyecto

En este codelab, usaremos un conjunto de datos existente en BigQuery (hcls-testing-data.fhir_20k_patients_analytics). Este conjunto de datos se completa previamente con datos sintéticos de atención médica.

Accede al conjunto de datos sintéticos

  1. Desde la dirección de correo electrónico que usas para acceder a Cloud Console, envía un correo electrónico a hcls-solutions-external+subscribe@google.com para solicitar unirte.
  2. Recibirás un correo electrónico con instrucciones para confirmar la acción.
  3. Usa la opción para responder el correo electrónico y unirte al grupo. NO hagas clic en el botón 525a0fa752e0acae.png.
  4. Una vez que recibas el correo electrónico de confirmación, puedes continuar con el siguiente paso del codelab.

Fija el proyecto

  1. En GCP Console, selecciona tu proyecto y, luego, navega a BigQuery.
  2. Haz clic en el menú desplegable +AGREGAR DATOS y selecciona "Fijar un proyecto" > "Ingresar nombre del proyecto" .

55257ed5931961c6.png

  1. Ingresa el nombre del proyecto, "hcls-testing-data", y, luego, haz clic en FIJAR. El conjunto de datos de prueba de BigQuery "fhir_20k_patients_analytics" está disponible para su uso.

f9038e2a21e143fd.png

3. Desarrolla consultas con la IU de BigQuery

Configuración de la IU de BigQuery

  1. En el menú de GCP de la esquina superior izquierda (el "hamburguesa"), selecciona BigQuery para ir a la consola de BigQuery.
  2. En la consola de BigQuery, haz clic en Más → Configuración de consulta y asegúrate de que el menú SQL heredado NO esté marcado (usaremos SQL estándar).

455c6c3ed93e9a63.png

Crea consultas

En la ventana Editor de consultas, escribe la siguiente consulta y haz clic en "Ejecutar" para ejecutarla. Luego, visualiza los resultados en la ventana "Resultados de la consulta".

CONSULTAR PACIENTES

#standardSQL - Query Patients
SELECT
  id AS patient_id,
  name[safe_offset(0)].given AS given_name,
  name[safe_offset(0)].family AS family,
  telecom[safe_offset(0)].value AS phone,
  birthDate AS birth_date,
  deceased.dateTime AS deceased_datetime,
  Gender AS fhir_gender_code,
  Address[safe_offset(0)].line AS address1_line_1,
  Address[safe_offset(0)].city AS address1_city,
  Address[safe_offset(0)].state AS address1_state,
  Address[safe_offset(0)].postalCode AS address1_postalCode,
  Address[safe_offset(0)].country AS address1_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Patient` AS Patient 
LIMIT 10

Consulta en el “Editor de consultas” y resultados:

fb8ef84f0cb583fb.png

PROFESIONALES DE LAS BÚSQUEDAS

#standardSQL - Query Practitioners
SELECT 
  id AS practitioner_id, 
  name[safe_offset(0)].given AS given_name,
  name[safe_offset(0)].family AS family_name, 
  gender 
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Practitioner` 
LIMIT 10

Resultados de la consulta:

9515eb63813617e0.png

CONSULTAR ORGANIZACIÓN

Cambia el ID de la organización para que coincida con tu conjunto de datos.

#standardSQL - Query Organization
SELECT
  id AS org_id,
  type[safe_offset(0)].text AS org_type,
  name AS org_name,
  address[safe_offset(0)].line AS org_addr,
  address[safe_offset(0)].city AS org_addr_city,
  address[safe_offset(0)].state AS org_addr_state,
  address[safe_offset(0)].postalCode AS org_addr_postalCode,
  address[safe_offset(0)].country AS org_addr_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Organization` AS Organization
WHERE 
  id = "b81688f5-bd0e-3c99-963f-860d3e90ab5d"

Resultados de la consulta:

79a7afe2dd7fca87.png

ENCUENTROS DE CONSULTA POR PACIENTE

#standardSQL - Query Encounters by Patient
SELECT
  id AS encounter_id,
  period.start AS encounter_start,
  period.end AS encounter_end,
  status AS encounter_status,
  class.code AS encounter_type,
  subject.patientId as patient_id,
  participant[safe_OFFSET(0)].individual.practitionerId as parctitioner_id,
  serviceProvider.organizationId as encounter_location_id,
  type[safe_OFFSET(0)].text AS encounter_reason
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter` AS Encounter
WHERE
  subject.patientId = "900820eb-4166-4981-ae2d-b183a064ac18"
ORDER BY
  encounter_end

Resultados de la consulta:

18328b6506814084.png

OBTÉN LA DURACIÓN PROMEDIO DE LOS ENCUENTROS POR TIPO DE ENCUENTRO

#standardSQL - Get Average length of Encounters by Encounter type 
SELECT
  class.code encounter_class,
  ROUND(AVG(TIMESTAMP_DIFF(TIMESTAMP(period.end),    TIMESTAMP(period.start), HOUR)),1) as avg_minutes
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter` AS Encounter
WHERE
  period.end >= period.start
GROUP BY
  1
ORDER BY
  2 DESC

Resultados de la consulta:

2087792ce2a67e97.png

OBTÉN TODOS LOS PACIENTES QUE TIENEN UN PORCENTAJE DE A1C >= 6.5

# Query Patients who have A1C rate >= 6.5
SELECT 
  id AS observation_id,
  subject.patientId AS patient_id,
  context.encounterId AS encounter_id,
  value.quantity.value,
  value.quantity.unit,
  code.coding[safe_offset(0)].code,
  code.coding[safe_offset(0)].display AS description
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Observation` 
WHERE 
  code.text like '%A1c/Hemoglobin%' AND 
  value.quantity.value >= 6.5 AND 
  status = 'final'

Resultados de la consulta:

65be2450ecd92485.png

4. Crea una instancia de AI Platform Notebooks

Sigue las instrucciones de este vínculo para crear una nueva instancia de AI Platform Notebooks (JupyterLab).

Asegúrate de habilitar la API de Compute Engine.

Puedes elegir " Crea un notebook nuevo con opciones predeterminadas" o " Crea un notebook nuevo y especifica tus opciones".

5. Crea un notebook de análisis de datos

Abre la instancia de AI Platform Notebooks

En esta sección, crearemos y codificaremos un nuevo notebook de Jupyter desde cero.

  1. Para abrir una instancia de notebook, navega a la página AI Platform Notebooks en Google Cloud Platform Console. IR A LA PÁGINA DE AI PLATFORM NOTEBOOKS
  2. Selecciona Abrir JupyterLab (Open JupyterLab) para la instancia que deseas abrir.

82457955b63cbffa.png

  1. AI Platform Notebooks te dirige a la URL de tu instancia de notebook.

7705bf2f2d9b1b20.png

Crea un notebook

  1. En JupyterLab, ve a File -> New -> Notebook y selecciona el kernel "Python 3" en la ventana emergente, o bien selecciona "Python 3" en la sección Notebook de la ventana de inicio para crear un notebook Untitled.ipynb.

d0ae87f0bdac3205.png

  1. Haz clic con el botón derecho en Untitled.ipynb y cambia el nombre del notebook a "fhir_data_from_bigquery.ipynb". Haz doble clic para abrirlo, compila las consultas y guarda el notebook.
  2. Para descargar un notebook, haz clic con el botón derecho en el archivo *.ipynb y selecciona Descargar en el menú.

fc16337ffd9b1730.png

  1. También puedes subir un notebook existente haciendo clic en el botón de "flecha hacia arriba".

49373254fbf1ddf9.png

Compila y ejecuta cada bloque de código en el notebook

Copia y ejecuta cada bloque de código que se proporciona en esta sección uno por uno. Para ejecutar el código, haz clic en “Ejecutar” (triángulo).

e6d8b08c124c675e.png

Obtener la duración de la estadía para las visitas en horas

from google.cloud import bigquery

client = bigquery.Client()

lengthofstay="""
SELECT
    class.code as encounter_class,
    period.start as start_timestamp,
    period.end as end_timestamp, 
    TIMESTAMP_DIFF(TIMESTAMP(period.end), TIMESTAMP(period.start), HOUR) 
        as length_of_stay_in_hours
FROM 
    `hcls-testing-data.fhir_20k_patients_analytics.Encounter`
WHERE
    period.end >= period.start
ORDER BY
    4 DESC
LIMIT 10
"""
df = client.query(lengthofstay).to_dataframe()
df.head()

Código y resultado de la ejecución:

e7d37ff4d0d91518.png

Obtén observaciones: valores de colesterol

observation="""
SELECT
  cc.code loinc_code,
  cc.display loinc_name,
  approx_quantiles(round(o.value.quantity.value,1),4) as quantiles,
  count(*) as num_obs
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Observation` o, o.code.coding cc
WHERE
  cc.system like '%loinc%' and lower(cc.display) like '%cholesterol%'
GROUP BY 1,2
ORDER BY 4 desc
"""
df2 = client.query(observation).to_dataframe()
df2.head()

Resultado de la ejecución:

7f43408857c0335.png

Obtén los cuantiles aproximados de encuentros

encounters="""
SELECT
  encounter_class,
  APPROX_QUANTILES(num_encounters, 4) num_encounters_quantiles
FROM (
  SELECT
    class.code encounter_class,
    subject.reference patient_id,
    COUNT(DISTINCT id) AS num_encounters
  FROM
    `hcls-testing-data.fhir_20k_patients_analytics.Encounter`
  GROUP BY
    1,2
  )
GROUP BY 1
ORDER BY 1
"""
df3 = client.query(encounters).to_dataframe()
df3.head()

Resultado de la ejecución:

4c2313fae0ebe007.png

Obtén la duración promedio de los encuentros en minutos

avgstay="""
SELECT
  class.code encounter_class,
  ROUND(AVG(TIMESTAMP_DIFF(TIMESTAMP(period.end), TIMESTAMP(period.start), MINUTE)),1) as avg_minutes
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter`
WHERE
  period.end >= period.start
GROUP BY
  1
ORDER BY
  2 DESC
  """
df4 = client.query(avgstay).to_dataframe()
df4.head()

Resultado de la ejecución:

a0cdbe42751f14f7.png

Obtén encuentros por paciente

patientencounters="""
SELECT
  id AS encounter_id,
  period.start AS encounter_start,
  period.end AS encounter_end,
  status AS encounter_status,
  class.code AS encounter_type,
  subject.patientId as patient_id,
  participant[safe_OFFSET(0)].individual.practitionerId as parctitioner_id,
  serviceProvider.organizationId as encounter_location_id,
  type[safe_OFFSET(0)].text AS encounter_reason
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter` AS Encounter
WHERE
  subject.patientId = "900820eb-4166-4981-ae2d-b183a064ac18"
ORDER BY
  encounter_end
"""

df5 = client.query(patientencounters).to_dataframe()
df5.head()

Resultado de la ejecución:

3ed6b4d6a1652de0.png

Obtener organizaciones

orgs="""
SELECT
  id AS org_id,
  type[safe_offset(0)].text AS org_type,
  name AS org_name,
  address[safe_offset(0)].line AS org_addr,
  address[safe_offset(0)].city AS org_addr_city,
  address[safe_offset(0)].state AS org_addr_state,
  address[safe_offset(0)].postalCode AS org_addr_postalCode,
  address[safe_offset(0)].country AS org_addr_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Organization` AS Organization
WHERE 
  id = "b81688f5-bd0e-3c99-963f-860d3e90ab5d"
"""

df6 = client.query(orgs).to_dataframe()
df6.head()

Resultado de la ejecución:

886b2e99a889422e.png

Otorga permiso para obtener pacientes.

patients="""
SELECT
  id AS patient_id,
  name[safe_offset(0)].given AS given_name,
  name[safe_offset(0)].family AS family,
  telecom[safe_offset(0)].value AS phone,
  birthDate AS birth_date,
  deceased.dateTime AS deceased_datetime,
  Gender AS fhir_gender_code,
  Address[safe_offset(0)].line AS address1_line_1,
  Address[safe_offset(0)].city AS address1_city,
  Address[safe_offset(0)].state AS address1_state,
  Address[safe_offset(0)].postalCode AS address1_postalCode,
  Address[safe_offset(0)].country AS address1_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Patient` AS Patient 
LIMIT 10
"""

df7 = client.query(patients).to_dataframe()
df7.head()

Resultados de la ejecución:

61533f943001c446.png

6. Crea gráficos en Notebooks de AI Platform

Ejecuta celdas de código en el notebook "fhir_data_from_bigquery.ipynb" para dibujar un gráfico de barras.

Por ejemplo, obtén la duración promedio de los Encuentros en minutos.

df4.plot(kind='bar', x='encounter_class', y='avg_minutes');

Código y resultados de la ejecución:

e48071e58960f124.png

7. Confirma el notebook en Cloud Source Repository

  1. En GCP Console, navega a Source Repositories. Si es la primera vez que lo usas, haz clic en Comenzar y, luego, en Crear repositorio.

475d9a5c1d5dedc5.png

  1. En una ocasión posterior, navega a GCP -> Cloud Source Repositories y haz clic en +Add repository para crear un repositorio nuevo.

44416312bf155af1.png

  1. Selecciona "Crear un repositorio nuevo" y, luego, haz clic en Continuar.
  2. Proporciona el nombre del repositorio y el nombre del proyecto, y, luego, haz clic en Crear.

ec2f3eaed74c2e0.png

  1. Selecciona "Clonar tu repositorio en un repositorio de Git local" y, luego, selecciona Credenciales generadas de forma manual.
  2. Sigue las instrucciones del paso 1 "Genera y almacena credenciales de Git" (consulta a continuación). Copia el código que aparece en la pantalla.

2089de5541527107.jpeg

  1. Inicia una sesión de terminal en Jupyter.

a2b49535e36a9d5c.png

  1. Pega todos los comandos de la ventana "Configure Git" en la terminal de Jupyter.
  2. Copia la ruta de clonación del repositorio de los repositorios de código fuente de GCP Cloud (paso 2 en la captura de pantalla a continuación).

ba6a61ae8a4d9f9b.png

  1. Pega este comando en la terminal de JupiterLab. El comando se verá de la siguiente manera:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. La carpeta "my-ai-notebooks" se crea en JupyterLab.

19a2b2c910b3df3.png

  1. Mueve tu notebook (fhir_data_from_bigquery.ipynb) a la carpeta "my-ai-notebooks".
  2. En la terminal de Jupyter, cambia el directorio a "cd my-ai-notebooks".
  3. Almacena tus cambios en etapa intermedia con la terminal de Jupyter. Como alternativa, puedes usar la IU de Jupyter (haz clic con el botón derecho en los archivos del área Sin seguimiento, selecciona Seguimiento y, luego, los archivos se moverán al área Con seguimiento, y viceversa). El área cambiada contiene los archivos modificados.
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Confirma tus cambios con la terminal de Jupyter o la IU de Jupyter (escribe el mensaje y, luego, haz clic en el botón "Checked").
git commit -m "message goes here"
  1. Envía los cambios al repositorio remoto con la terminal de Jupyter o la IU de Jupyter (haz clic en el ícono "push committed changes" 71c61a74bb205ed1.png).
git push --all
  1. En GCP Console, navega a Source Repositories. Haz clic en my-ai-notebooks. Observa que "fhir_data_from_bigquery.ipynb" ahora se guardó en GCP Source Repository.

7a6b802d90743182.jpeg

8. Limpieza

Para evitar que se generen cargos en tu cuenta de Google Cloud Platform por los recursos que usaste en este codelab, una vez que termines el instructivo, puedes limpiar los recursos que creaste en GCP para que no consuman tu cuota y no se te cobre por ellos en el futuro. En las secciones siguientes, se describe cómo borrar o desactivar estos recursos.

Borra el conjunto de datos de BigQuery

Sigue estas instrucciones para borrar el conjunto de datos de BigQuery que creaste como parte de este instructivo. O bien, navega a la consola de BigQuery y desancla el proyecto hcls-testing-data si usaste el conjunto de datos de prueba fhir_20k_patients_analytics.

Cierre de la instancia de AI Platform Notebooks

Sigue las instrucciones de este vínculo Cierra una instancia de notebook | AI Platform Notebooks para cerrar una instancia de AI Platform Notebooks.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En GCP Console, ve a la página Proyectos. IR A LA PÁGINA PROYECTOS
  2. En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrarlo.

9. Felicitaciones

¡Felicitaciones! Completaste correctamente el codelab para acceder, consultar y analizar datos de atención médica con formato de FHIR usando BigQuery y AI Platform Notebooks.

Accediste a un conjunto de datos públicos de BigQuery en GCP.

Desarrollaste y probaste consultas en SQL con la IU de BigQuery.

Creaste y ejecutaste una instancia de AI Platform Notebooks.

Ejecutaste consultas de SQL en JupyterLab y almacenaste los resultados de las consultas en un DataFrame de Pandas.

Creaste gráficos con Matplotlib.

Confirmaste y enviaste tu notebook a un repositorio de Cloud Source en GCP.

Ahora conoces los pasos clave necesarios para comenzar tu recorrido por el análisis de datos de atención médica con BigQuery y AI Platform Notebooks en Google Cloud.

©Google LLC o sus afiliados. Todos los derechos reservados. Do not distribute.