1. Introdução

Ú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
- 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.
- Você vai receber um e-mail com instruções sobre como confirmar a ação.
- Use a opção para responder ao e-mail e participar do grupo. NÃO clique no botão
. - Depois de receber o e-mail de confirmação, siga para a próxima etapa do codelab.
Fixar o projeto
- No console do GCP, selecione seu projeto e navegue até o BigQuery.
- Clique no menu suspenso +ADICIONAR DADOS e selecione "Fixar um projeto" > "Digite o nome do projeto" .

- 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.

3. Desenvolver consultas usando a interface do BigQuery
Configuração da interface do BigQuery
- Selecione BigQuery no canto superior esquerdo do menu do GCP ("hambúrguer") para acessar o console do serviço.
- 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).

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:

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:

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:

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:

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:

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:

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.
- 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
- Selecione Abrir JupyterLab para a instância a ser aberta.

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

Criar um notebook
- 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.

- 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.
- Para fazer o download de um notebook, clique com o botão direito do mouse no arquivo *.ipynb e selecione "Download" no menu.

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

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

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:

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:

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:

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:

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:

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:

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:

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:

7. Fazer commit do notebook no Cloud Source Repositories
- 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".

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

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

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

- Inicie uma sessão de terminal no Jupyter.

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

- 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
- A pasta "my-ai-notebooks" é criada no JupyterLab.

- Mova o notebook (fhir_data_from_bigquery.ipynb) para a pasta "my-ai-notebooks".
- No terminal do Jupyter, mude o diretório para "cd my-ai-notebooks".
- 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

- 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"
- 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"
).
git push --all
- 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.

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:
- No Console do GCP, acesse a página Projetos. ACESSAR A PÁGINA "PROJETOS"
- Na lista de projetos, selecione um e clique em Excluir.
- 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.