Analise dados clínicos usando o BigQuery e o AI Platform Notebooks

1. Introdução

139d6fa46b10ab12.png

Última atualização: 22/09/2022

Este codelab implementa um padrão para acessar e analisar dados de saúde agregados no BigQuery usando a BigQueryUI e o AI Platform Notebooks. Ele ilustra a análise detalhada de grandes conjuntos de dados de saúde usando ferramentas conhecidas, como Pandas, Matplotlib etc., em um notebook do AI Platform compatível com a HIPAA. O segredo é fazer a primeira parte da agregação no BigQuery, recuperar um conjunto de dados do Pandas e trabalhar localmente com o conjunto de dados menor do Pandas. O AI Platform Notebooks oferece uma experiência gerenciada do Jupyter para que você não precise executar servidores de notebook por conta própria. O AI Platform Notebooks é bem integrado a outros serviços do GCP, como BigQuery e Cloud Storage, o que torna rápido e simples iniciar sua jornada de análise de dados e ML no Google Cloud Platform.

Neste codelab, você vai aprender a:

  • Desenvolva e teste consultas SQL usando a interface do BigQuery.
  • Crie e inicie uma instância do AI Platform Notebooks no GCP.
  • Execute consultas SQL no notebook e armazene os resultados em um DataFrame do Pandas.
  • Crie gráficos usando o Matplotlib.
  • Faça o commit e envie o notebook para um repositório do Cloud Source no GCP.

O que você precisa para executar este codelab?

  • Você precisa de acesso a um projeto do GCP.
  • Você precisa ter o papel de Proprietário no projeto do GCP.
  • Você precisa de um conjunto de dados de saúde no BigQuery.

Se você não tiver um projeto do GCP, siga estas etapas para criar um.

2. Configurar o projeto

Neste codelab, vamos usar um conjunto de dados existente no BigQuery (hcls-testing-data.fhir_20k_patients_analytics). Esse conjunto de dados é pré-preenchido com dados sintéticos de saúde.

Acessar o conjunto de dados sintéticos

  1. Envie um e-mail para hcls-solutions-external+subscribe@google.com com o endereço de e-mail que você usa para fazer login no console do Cloud e peça para participar.
  2. Você vai receber um e-mail com instruções sobre como confirmar a ação.
  3. Use a opção para responder ao e-mail e participar do grupo. NÃO clique no botão 525a0fa752e0acae.png.
  4. Depois de receber o e-mail de confirmação, siga para a próxima etapa do codelab.

Fixar o projeto

  1. No console do GCP, selecione seu projeto e navegue até o BigQuery.
  2. Clique no menu suspenso +ADICIONAR DADOS e selecione "Fixar um projeto" > "Digite o nome do projeto" .

55257ed5931961c6.png

  1. Insira o nome do projeto, "hcls-testing-data", e clique em FIXAR. O conjunto de dados de teste do BigQuery "fhir_20k_patients_analytics" está disponível para uso.

f9038e2a21e143fd.png

3. Desenvolver consultas usando a interface do BigQuery

Configuração da interface do BigQuery

  1. Selecione BigQuery no canto superior esquerdo do menu do GCP ("hambúrguer") para acessar o console do serviço.
  2. No console do BigQuery, clique em Mais → Configurações de consulta e verifique se o menu "SQL legado" NÃO está marcado (usaremos o SQL padrão).

455c6c3ed93e9a63.png

Criar consultas

Na janela do editor de consultas, digite a consulta a seguir e clique em Executar para executá-la. Em seguida, confira os resultados na janela Resultados da 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 no "Editor de consultas" e resultados:

fb8ef84f0cb583fb.png

PROFISSIONAIS DE CONSULTA

#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 da consulta:

9515eb63813617e0.png

CONSULTAR ORGANIZAÇÃO

Mude o ID da organização para corresponder ao conjunto de dados.

#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 da consulta:

79a7afe2dd7fca87.png

CONSULTAR ATENDIMENTOS 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 da consulta:

18328b6506814084.png

GET AVG LENGTH OF ENCOUNTERS BY ENCOUNTER TYPE

#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 da consulta:

2087792ce2a67e97.png

GET ALL PATIENTS WHO HAVE A1C RATE >= 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 da consulta:

65be2450ecd92485.png

4. Criar uma instância de Notebooks do AI Platform

Siga as instruções neste link para criar uma nova instância do AI Platform Notebooks (JupyterLab).

Ative a API Compute Engine.

Você pode escolher " Criar um novo notebook com opções padrão" ou " Criar um novo notebook e especificar suas opções".

5. Criar um notebook de análise de dados

Abrir a instância do AI Platform Notebooks

Nesta seção, vamos criar e programar um novo notebook do Jupyter do zero.

  1. Abra uma instância de notebook acessando a página AI Platform Notebooks no console do Google Cloud Platform. ACESSAR A PÁGINA DO AI PLATFORM NOTEBOOKS
  2. Selecione Abrir JupyterLab para a instância a ser aberta.

82457955b63cbffa.png

  1. Os notebooks do AI Platform direcionarão você para um URL da instância de notebook.

7705bf2f2d9b1b20.png

Criar um notebook

  1. No JupyterLab, acesse Arquivo -> Novo -> Notebook e selecione o kernel "Python 3" no pop-up ou selecione "Python 3" na seção "Notebook" da janela de início para criar um notebook Untitled.ipynb.

d0ae87f0bdac3205.png

  1. Clique com o botão direito do mouse em Untitled.ipynb e renomeie o notebook como "fhir_data_from_bigquery.ipynb". Clique duas vezes para abrir, crie as consultas e salve o notebook.
  2. Para fazer o download de um notebook, clique com o botão direito do mouse no arquivo *.ipynb e selecione "Download" no menu.

fc16337ffd9b1730.png

  1. Você também pode fazer upload de um notebook clicando no botão "Seta para cima".

49373254fbf1ddf9.png

Crie e execute cada bloco de código no notebook

Copie e execute cada bloco de código fornecido nesta seção um por um. Para executar o código, clique em Executar (triângulo).

e6d8b08c124c675e.png

Recebe a duração da estadia para encontros em 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 e saída de execução:

e7d37ff4d0d91518.png

Receber observações: 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()

Saída da execução:

7f43408857c0335.png

Receber quantis aproximados de encontros

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()

Saída da execução:

4c2313fae0ebe007.png

Receber a duração média dos encontros em 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()

Saída da execução:

a0cdbe42751f14f7.png

Acessar encontros 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()

Saída da execução:

3ed6b4d6a1652de0.png

Get Organizations

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 da execução:

886b2e99a889422e.png

Acessar 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 da execução:

61533f943001c446.png

6. Criar gráficos no AI Platform Notebooks

Execute as células de código no notebook "fhir_data_from_bigquery.ipynb" para criar um gráfico de barras.

Por exemplo, receba a duração média dos encontros em minutos.

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

Código e resultados da execução:

e48071e58960f124.png

7. Fazer commit do notebook no Cloud Source Repositories

  1. No Console do GCP, navegue até "Source Repositories". Se for a primeira vez que você usa, clique em "Começar" e depois em "Criar repositório".

475d9a5c1d5dedc5.png

  1. Em seguida, navegue até GCP -> Cloud Source Repositories e clique em +Adicionar repositório para criar um novo.

44416312bf155af1.png

  1. Selecione "Criar um novo repositório" e clique em "Continuar".
  2. Informe o nome do repositório e do projeto e clique em "Criar".

ec2f3eaed74c2e0.png

  1. Selecione "Clonar seu repositório em um repositório Git local" e escolha "Credenciais geradas manualmente".
  2. Siga as instruções da etapa 1 "Gerar e armazenar credenciais do Git" (veja abaixo). Copie o script que aparece na tela.

2089de5541527107.jpeg

  1. Inicie uma sessão de terminal no Jupyter.

a2b49535e36a9d5c.png

  1. Cole todos os comandos da janela "Configurar Git" no terminal do Jupyter.
  2. Copie o caminho de clonagem do repositório dos repositórios de origem do GCP Cloud (etapa 2 na captura de tela abaixo).

ba6a61ae8a4d9f9b.png

  1. Cole esse comando no terminal do JupiterLab. O comando será semelhante a este:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. A pasta "my-ai-notebooks" é criada no JupyterLab.

19a2b2c910b3df3.png

  1. Mova o notebook (fhir_data_from_bigquery.ipynb) para a pasta "my-ai-notebooks".
  2. No terminal do Jupyter, mude o diretório para "cd my-ai-notebooks".
  3. Prepare as mudanças usando o terminal do Jupyter. Você também pode usar a interface do Jupyter. Clique com o botão direito do mouse nos arquivos na área "Não rastreados", selecione "Rastrear". Os arquivos serão movidos para a área "Rastreados" e vice-versa. A área alterada contém os arquivos modificados.
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Confirme as mudanças usando o terminal ou a interface do Jupyter (digite a mensagem e clique no botão "Marcado").
git commit -m "message goes here"
  1. Envie as mudanças para o repositório remoto usando o terminal do Jupyter ou a interface do Jupyter (clique no ícone "Enviar mudanças confirmadas" 71c61a74bb205ed1.png).
git push --all
  1. No console do GCP, navegue até "Source Repositories". Clique em my-ai-notebooks. O arquivo "fhir_data_from_bigquery.ipynb" agora está salvo no GCP Source Repository.

7a6b802d90743182.jpeg

8. Limpeza

Para evitar cobranças na sua conta do Google Cloud Platform pelos recursos usados neste codelab, depois de concluir o tutorial, limpe os recursos criados no GCP para que eles não ocupem sua cota e você não seja cobrado por eles no futuro. As próximas seções descrevem como excluir ou desativar esses recursos.

Como excluir o conjunto de dados do BigQuery

Siga estas instruções para excluir o conjunto de dados do BigQuery criado como parte deste tutorial. Ou acesse o console do BigQuery, desfixe o projeto hcls-testing-data se você usou o conjunto de dados de teste fhir_20k_patients_analytics.

Como encerrar a instância do AI Platform Notebooks

Siga as instruções neste link Desligar uma instância de notebook | AI Platform Notebooks para desligar uma instância do AI Platform Notebooks.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.

Para excluir o projeto:

  1. No Console do GCP, acesse a página Projetos. ACESSAR A PÁGINA "PROJETOS"
  2. Na lista de projetos, selecione um e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Desligar para excluir o projeto.

9. Parabéns

Parabéns! Você concluiu o codelab para acessar, consultar e analisar dados de saúde formatados em FHIR usando o BigQuery e o AI Platform Notebooks.

Você acessou um conjunto de dados público do BigQuery no GCP.

Você desenvolveu e testou consultas SQL usando a interface do BigQuery.

Você criou e iniciou uma instância do AI Platform Notebooks.

Você executou consultas SQL no JupyterLab e armazenou os resultados da consulta no DataFrame do Pandas.

Você criou gráficos usando o Matplotlib.

Você fez commit e enviou o notebook para um Cloud Source Repository no GCP.

Agora você conhece as principais etapas necessárias para iniciar sua jornada de análise de dados de saúde com o BigQuery e os notebooks da AI Platform no Google Cloud Platform.

©Google, Inc. ou afiliadas. Todos os direitos reservados. Distribuição proibida.