1. Introduzione

Ultimo aggiornamento: 22/09/2022
Questo codelab implementa un pattern per accedere e analizzare i dati sanitari aggregati in BigQuery utilizzando BigQueryUI e AI Platform Notebooks. Illustra l'esplorazione dei dati di grandi set di dati sanitari utilizzando strumenti familiari come Pandas, Matplotlib e così via in AI Platform Notebooks conforme alla legge HIPAA. Il trucco è eseguire la prima parte dell'aggregazione in BigQuery, ricevere un set di dati Pandas e quindi lavorare localmente con il set di dati Pandas di dimensioni più contenute. AI Platform Notebooks fornisce un'esperienza Jupyter gestita, che ti evita di dover eseguire i server di blocchi note. AI Platform Notebooks è ben integrato con altri servizi GCP come BigQuery e Cloud Storage, il che rende semplice e veloce iniziare il tuo percorso di analisi dei dati e ML su Google Cloud.
In questo lab di programmazione imparerai a:
- Sviluppa e testa query SQL utilizzando la UI di BigQuery.
- Crea e avvia un'istanza di AI Platform Notebooks in Google Cloud.
- Esegui query SQL dal notebook e archivia i risultati delle query in Pandas DataFrame.
- Crea grafici e diagrammi utilizzando Matplotlib.
- Esegui il commit e il push del blocco note in un repository Cloud Source Repositories in GCP.
Cosa ti serve per eseguire questo codelab?
- Devi avere accesso a un progetto Google Cloud.
- Devi disporre del ruolo Proprietario per il progetto Google Cloud.
- Devi disporre di un set di dati sanitari in BigQuery.
Se non hai un progetto Google Cloud, segui questi passaggi per crearne uno nuovo.
2. Configurazione del progetto
Per questo codelab, utilizzeremo un set di dati esistente in BigQuery (hcls-testing-data.fhir_20k_patients_analytics). Questo set di dati è precompilato con dati sanitari sintetici.
Ottenere l'accesso al set di dati sintetici
- Dall'indirizzo email che utilizzi per accedere a Cloud Console, invia un'email a hcls-solutions-external+subscribe@google.com richiedendo di partecipare.
- Riceverai un'email con le istruzioni su come confermare l'azione.
- Utilizza l'opzione per rispondere all'email per iscriverti al gruppo. NON fare clic sul pulsante
. - Una volta ricevuta l'email di conferma, puoi procedere al passaggio successivo del codelab.
Bloccare il progetto
- Nella console GCP, seleziona il tuo progetto, quindi vai a BigQuery.
- Fai clic sul menu a discesa +AGGIUNGI DATI e seleziona "Blocca un progetto" > "Inserisci il nome del progetto" .

- Inserisci il nome del progetto "hcls-testing-data", poi fai clic su PIN. Il set di dati di test BigQuery "fhir_20k_patients_analytics" è disponibile per l'uso.

3. Sviluppare query utilizzando la UI di BigQuery
Impostazione dell'interfaccia utente BigQuery
- Vai alla console BigQuery selezionando BigQuery dal menu GCP (a forma di "hamburger") nell'angolo in alto a sinistra.
- Nella console BigQuery, fai clic su Altro → Impostazioni query e assicurati che il menu SQL precedente NON sia selezionato (utilizzeremo SQL standard).

Creare query
Nella finestra dell'editor di query, digita la seguente query e fai clic su "Esegui" per eseguirla. Poi, visualizza i risultati nella finestra "Risultati delle query".
QUERY PAZIENTI
#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
Query nell'editor query e risultati:

QUERY PRACTITIONERS
#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
Risultati della query:

QUERY ORGANIZATION
Modifica l'ID organizzazione in modo che corrisponda al tuo set di dati.
#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"
Risultati della query:

QUERY INCONTRI PER PAZIENTE
#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
Risultati della query:

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
Risultati della query:

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'
Risultati della query:

4. Crea un'istanza di AI Platform Notebooks
Segui le istruzioni riportate in questo link per creare una nuova istanza AI Platform Notebooks (JupyterLab).
Assicurati di abilitare l'API Compute Engine.
Puoi scegliere "Crea un nuovo notebook con le opzioni predefinite" o "Crea un nuovo notebook e specifica le opzioni".
5. Creare un notebook di analisi dei dati
Apri l'istanza di AI Platform Notebooks
In questa sezione creeremo e codificheremo un nuovo notebook Jupyter da zero.
- Apri un'istanza notebook andando alla pagina AI Platform Notebooks nella console Google Cloud. VAI ALLA PAGINA AI PLATFORM NOTEBOOKS
- Seleziona Apri JupyterLab per l'istanza che vuoi aprire.

- AI Platform Notebooks ti indirizza a un URL per l'istanza del notebook.

Crea un notebook
- In JupyterLab, vai a File -> Nuovo -> Notebook e seleziona il kernel "Python 3" nel popup oppure seleziona "Python 3" nella sezione Notebook della finestra di avvio per creare un notebook Untitled.ipynb.

- Fai clic con il tasto destro del mouse su Untitled.ipynb e rinomina il notebook in "fhir_data_from_bigquery.ipynb". Fai doppio clic per aprirlo, crea le query e salva il blocco note.
- Per scaricare un notebook, fai clic con il tasto destro del mouse sul file *.ipynb e seleziona Scarica dal menu.

- Puoi anche caricare un notebook esistente facendo clic sul pulsante "Freccia su".

Crea ed esegui ogni blocco di codice nel notebook
Copia ed esegui uno alla volta ogni blocco di codice fornito in questa sezione. Per eseguire il codice, fai clic su "Esegui" (triangolo).

Ottenere la durata del soggiorno per gli incontri in ore
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()
Codice e output di esecuzione:

Recupero osservazioni - Valori del colesterolo
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()
Output esecuzione:

Ottieni i quantili di incontri approssimativi
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()
Output esecuzione:

Ottieni la durata media degli incontri in minuti
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()
Output esecuzione:

Recupera incontri per paziente
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()
Output esecuzione:

Recupera organizzazioni
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()
Risultato dell'esecuzione:

Recupero pazienti
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()
Risultati dell'esecuzione:

6. Creare grafici in AI Platform Notebooks
Esegui le celle di codice nel notebook "fhir_data_from_bigquery.ipynb" per disegnare un grafico a barre.
Ad esempio, ottieni la durata media degli incontri in minuti.
df4.plot(kind='bar', x='encounter_class', y='avg_minutes');
Codice e risultati dell'esecuzione:

7. Esegui il commit del notebook in Cloud Source Repository
- Nella console Google Cloud, vai a Source Repositories. Se è la prima volta che lo utilizzi, fai clic su Inizia, poi su Crea repository.

- Per le volte successive, vai a Google Cloud -> Cloud Source Repositories e fai clic su +Aggiungi repository per creare un nuovo repository.

- Seleziona "Crea un nuovo repository", quindi fai clic su Continua.
- Fornisci il nome del repository e del progetto, poi fai clic su Crea.

- Seleziona "Clona il repository in un repository Git locale", quindi seleziona Credenziali generate manualmente.
- Segui le istruzioni del passaggio 1 "Genera e archivia le credenziali Git" (vedi di seguito). Copia lo script visualizzato sullo schermo.

- Avvia la sessione del terminale in Jupyter.

- Incolla tutti i comandi dalla finestra "Configura Git" nel terminale Jupyter.
- Copia il percorso di clonazione del repository da GCP Cloud Source Repositories (passaggio 2 nello screenshot di seguito).

- Incolla questo comando nel terminale di JupiterLab. Il comando sarà simile al seguente:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
- La cartella "my-ai-notebooks" viene creata in JupyterLab.

- Sposta il notebook (fhir_data_from_bigquery.ipynb) nella cartella "my-ai-notebooks".
- Nel terminale Jupyter, cambia la directory in "cd my-ai-notebooks".
- Organizza le modifiche utilizzando il terminale Jupyter. In alternativa, puoi utilizzare l'interfaccia utente di Jupyter (fai clic con il tasto destro del mouse sui file nell'area Non monitorati, seleziona Monitora, quindi i file vengono spostati nell'area Monitorati e viceversa). L'area modificata contiene i file modificati.
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

- Esegui il commit delle modifiche utilizzando il terminale Jupyter o la relativa UI (digita il messaggio, quindi fai clic sul pulsante "Controllato").
git commit -m "message goes here"
- Esegui il push delle modifiche al repository remoto utilizzando il terminale Jupyter o la UI Jupyter (fai clic sull'icona "Esegui il push delle modifiche di cui è stato eseguito il commit"
).
git push --all
- Nella console Google Cloud, vai a Source Repositories. Fai clic su my-ai-notebooks. Tieni presente che "fhir_data_from_bigquery.ipynb" è ora salvato nel repository di origine GCP.

8. Esegui la pulizia
Per evitare che al tuo account Google Cloud Platform vengano addebitati costi relativi alle risorse utilizzate in questo codelab, al termine del tutorial puoi eliminare le risorse che hai creato su GCP in modo che non occupino la tua quota e non ti vengano addebitate in futuro. Le sezioni seguenti descrivono come eliminare o disattivare queste risorse.
Eliminazione del set di dati BigQuery
Segui queste istruzioni per eliminare il set di dati BigQuery che hai creato nell'ambito di questo tutorial. In alternativa, vai alla console BigQuery, UNPIN project hcls-testing-data,se hai utilizzato il set di dati di test fhir_20k_patients_analytics.
Chiusura dell'istanza di AI Platform Notebooks
Segui le istruzioni riportate in questo link Chiusura di un'istanza di notebook | AI Platform Notebooks per chiudere un'istanza di AI Platform Notebooks.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.
Per eliminare il progetto:
- Nella console di GCP, vai alla pagina Progetti. VAI ALLA PAGINA PROGETTI
- Nell'elenco dei progetti, seleziona quello da eliminare e fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.
9. Complimenti
Congratulazioni, hai completato correttamente il codelab per accedere, eseguire query e analizzare i dati sanitari in formato FHIR utilizzando BigQuery e AI Platform Notebooks.
Hai eseguito l'accesso a un set di dati BigQuery pubblico in GCP.
Hai sviluppato e testato query SQL utilizzando l'interfaccia utente BigQuery.
Hai creato e avviato un'istanza di AI Platform Notebooks.
Hai eseguito query SQL in JupyterLab e hai archiviato i risultati delle query in Pandas DataFrame.
Hai creato grafici utilizzando Matplotlib.
Hai eseguito il commit e il push del notebook in un repository Cloud Source Repositories in Google Cloud.
Ora conosci i passaggi chiave necessari per iniziare il tuo percorso di analisi dei dati sanitari con BigQuery e AI Platform Notebooks su Google Cloud.
©Google, Inc. e/o le sue società consociate. Tutti i diritti riservati. Distribuzione vietata.