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 o BigQueryUI e os Notebooks do AI Platform. Ele ilustra a exploração de grandes conjuntos de dados de saúde usando ferramentas conhecidas, como Pandas, Matplotlib etc. em um AI Platform Notebooks compatível com HIPPA. 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 fornece 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 o Big Query e o Cloud Storage, o que torna mais rápido e simples iniciar sua jornada de análise de dados e ML no Google Cloud Platform.

Neste codelab, você vai aprender a:

  • Desenvolver e testar consultas SQL usando a interface do BigQuery.
  • Crie e inicie uma instância do AI Platform Notebooks no GCP.
  • Executar consultas SQL no notebook e armazenar os resultados delas no Pandas DataFrame.
  • Criar gráficos usando o Matplotlib.
  • Confirme e envie o notebook para um Cloud Source Repository no GCP.

O que é necessário para executar este codelab?

  • Você precisa ter acesso a um projeto do GCP.
  • Você precisa ter um 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, usaremos 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.

Receber acesso ao conjunto de dados sintético

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

Fixar o projeto

  1. No Console do GCP, selecione o 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. Digite o nome do projeto, "hcls-testing-data", e clique em PIN. 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. Navegue até o console do BigQuery selecionando BigQuery no canto superior esquerdo do menu do GCP ("hambúrguer").
  2. No console do BigQuery, clique em Mais → Configurações de consulta e verifique se o menu SQL legado NÃO está marcado (usaremos SQL padrão).

455c6c3ed93e9a63.png

Criar consultas

Na janela "Editor de consultas", digite a consulta abaixo e clique em Executar. Em seguida, visualize os resultados na janela "Query results".

CONSULTA 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

PRÁTICAS 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

ORGANIZAÇÃO DA CONSULTA

Altere o ID da organização para corresponder ao seu 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

ENCONTRADORES DE CONSULTAS 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

RECEBER A DURAÇÃO MÉDIA DOS CONTAS POR TIPO DE ENCONTAR

#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

CONFIRA TODOS OS PACIENTES QUE TÊM UMA TAXA 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 da consulta:

65be2450ecd92485.png

4. Criar instância do AI Platform Notebooks

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

Não se esqueça de ativar a API Compute Engine.

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

5. Criar um notebook de análise de dados

Abrir instância do AI Platform Notebooks

Nesta seção, criaremos e codificaremos um novo notebook do Jupyter do zero.

  1. Abra uma instância de notebook navegando até a página Notebooks do AI Platform no console do Google Cloud Platform. ACESSAR A PÁGINA "NOTEBOOKS DO AI PLATFORM
  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 File -> Novo -> Notebook e selecione o Kernel "Python 3" no pop-up ou selecione "Python 3" na seção "Notebook" na janela de acesso rápido, 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, criar as consultas e salvar o notebook.
  2. É possível fazer o download de um notebook clicando com o botão direito do mouse no arquivo *.ipynb e selecione Download no menu.

fc16337ffd9b1730.png

  1. Também é possível fazer upload de um notebook existente clicando na "seta para cima" .

49373254fbf1ddf9.png

Crie e execute cada bloco de código no notebook

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

e6d8b08c124c675e.png

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

e7d37ff4d0d91518.png

Obter 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

Conseguir quantis de encontro aproximado

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

Obter duração média de contatos 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

Acessar organizações

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

Executar células de código no notebook "fhir_data_from_bigquery.ipynb" para desenhar um gráfico de barras.

Por exemplo, veja a duração média de encontros em minutos.

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

Resultados de código e execução:

e48071e58960f124.png

7. Notebook de confirmação para o Cloud Source Repository

  1. No console do GCP, navegue até Source Repositories. Se você estiver usando o recurso pela primeira vez, clique em "Começar" e depois em "Criar repositório".

475d9a5c1d5dedc5.png

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

44416312bf155af1.png

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

ec2f3eaed74c2e0.png

  1. Selecione "Clonar seu repositório para um repositório Git local" e, em seguida, "Credenciais geradas manualmente".
  2. Siga a etapa 1 "Gerar e armazenar credenciais do Git" instruções de configuração (confira abaixo). Copie o script que aparece na tela.

2089de5541527107.jpeg

  1. Inicie a sessão do terminal no Jupyter.

a2b49535e36a9d5c.png

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

ba6a61ae8a4d9f9b.png

  1. Cole esse comando no terminal do JupiterLab. O comando ficará assim:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. "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 suas mudanças usando o terminal do Jupyter. Como alternativa, é possível usar a interface do Jupyter (clique com o botão direito do mouse nos arquivos na área Não rastreados, selecione Rastrear e 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 suas alterações usando o terminal ou a interface do Jupyter (digite a mensagem e clique no botão "Checked").
git commit -m "message goes here"
  1. Envie as alterações para o repositório remoto usando o terminal do Jupyter ou a interface do Jupyter. Clique no ícone "Enviar alterações confirmadas" 71c61a74bb205ed1.png.
git push --all
  1. No console do GCP, navegue até Source Repositories. Clique em "my-ai-notebooks". Observe que "fhir_data_from_bigquery.ipynb" será salvo no repositório de origem do GCP.

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 que você criou como parte deste tutorial. Também é possível acessar o console do BigQuery, remover o PIN do 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 Encerrar uma instância de notebook | AI Platform Notebooks para encerrar 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 Encerrar para excluí-lo.

9. Parabéns

Parabéns, você concluiu o codelab para acessar, consultar e analisar dados de saúde formatados pelo FHIR usando o BigQuery e os Notebooks do AI Platform.

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 delas no Pandas DataFrame.

Você criou gráficos usando o Matplotlib.

Você confirmou e enviou seu notebook para um Cloud Source Repository no GCP.

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

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