Klinische Daten mit BigQuery und AI Platform Notebooks analysieren

1. Einführung

139d6fa46b10ab12.png

Zuletzt aktualisiert: 22.09.2022

In diesem Codelab wird ein Muster implementiert, um mithilfe von BigQueryUI und AI Platform Notebooks auf in BigQuery aggregierte Gesundheitsdaten zuzugreifen und diese zu analysieren. Es veranschaulicht die Datenexploration großer Datasets aus dem Gesundheitswesen mit vertrauten Tools wie Pandas, Matplotlib usw. in einem HIPPA-konformen AI Platform Notebooks. Dazu führen Sie den ersten Teil der Aggregation in BigQuery durch. Anschließend verarbeiten Sie das resultierende, kleinere Pandas-Dataset lokal weiter. AI Platform Notebooks bietet eine verwaltete Jupyter-Umgebung, sodass Sie selbst keine Notebookserver ausführen müssen. AI Platform Notebooks ist gut in andere GCP-Dienste wie BigQuery und Cloud Storage eingebunden. So können Sie sich schnell und einfach auf der Google Cloud Platform mit Datenanalysen und ML vertraut machen.

In diesem Codelab lernen Sie:

  • SQL-Abfragen mit der BigQuery-UI entwickeln und testen
  • AI Platform Notebooks-Instanz in der GCP erstellen und starten
  • SQL-Abfragen aus dem Notebook ausführen und Abfrageergebnisse in Pandas DataFrame speichern
  • Erstellen Sie Diagramme und Grafiken mit Matplotlib.
  • Führen Sie für das Notebook ein Commit durch und übertragen Sie es per Push in ein Cloud Source Repository auf der GCP.

Was benötigen Sie, um dieses Codelab auszuführen?

  • Sie benötigen Zugriff auf ein GCP-Projekt.
  • Ihnen muss die Rolle Inhaber für das GCP-Projekt zugewiesen sein.
  • Sie benötigen ein Gesundheits-Dataset in BigQuery.

Wenn Sie noch kein GCP-Projekt haben, führen Sie diese Schritte aus, um ein neues Projekt zu erstellen.

2. Projekt einrichten

Für dieses Codelab verwenden wir ein vorhandenes Dataset in BigQuery (hcls-testing-data.fhir_20k_patients_analytics). Dieses Dataset ist vorab mit synthetischen Gesundheitsdaten gefüllt.

Zugriff auf das synthetische Dataset erhalten

  1. Senden Sie von der E-Mail-Adresse, die Sie für die Anmeldung in der Cloud Console verwenden, eine E-Mail an hcls-solutions-external+subscribe@google.com und beantragen Sie die Teilnahme.
  2. Sie erhalten eine E-Mail mit einer Anleitung, wie Sie die Aktion bestätigen können.
  3. Sie können auf die E-Mail antworten, um der Gruppe beizutreten. Klicken Sie NICHT auf die 525a0fa752e0acae.png-Schaltfläche.
  4. Sobald du die Bestätigungs-E-Mail erhalten hast, kannst du mit dem nächsten Schritt im Codelab fortfahren.

Projekt anpinnen

  1. Wählen Sie in der GCP Console Ihr Projekt aus und rufen Sie BigQuery auf.
  2. Klicken Sie auf das Drop-down-Menü +DATEN HINZUFÜGEN und wählen Sie „Projekt anpinnen“ aus. > „Projektnamen eingeben“ .

55257ed5931961c6.png

  1. Geben Sie den Projektnamen hcls-testing-data ein und klicken Sie auf PIN. BigQuery-Test-Dataset „fhir_20k_patients_analytics“ zur Verfügung.

f9038e2a21e143fd.png

3. Abfragen mithilfe der BigQuery-UI entwickeln

Einstellung in der BigQuery-Benutzeroberfläche

  1. Gehen Sie zur BigQuery-Konsole, indem Sie im Google Cloud-Menü oben links („Hamburger“) die Option „BigQuery“ auswählen.
  2. Klicken Sie in der BigQuery-Konsole auf Mehr → Abfrageeinstellungen und achten Sie darauf, dass das Menü "Legacy-SQL" NICHT aktiviert ist. Wir verwenden Standard-SQL.

455c6c3ed93e9a63.png

Abfragen erstellen

Geben Sie im Abfrageeditor die folgende Abfrage ein und klicken Sie auf Ausführen. Sehen Sie sich dann die Ergebnisse im Fenster Abfrageergebnisse an.

ABFRAGE PATIENTEN

#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

Abfrage im Abfrageeditor und Ergebnisse:

fb8ef84f0cb583fb.png

ABFRAGE-VERFAHREN

#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

Abfrageergebnisse:

9515eb63813617e0.png

ABFRAGE-ORGANISATION

Ändern Sie die Organisations-ID so, dass sie mit Ihrem Dataset übereinstimmt.

#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"

Abfrageergebnisse:

79a7afe2dd7fca87.png

ANFRAGEN DURCH PATIENT

#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

Abfrageergebnisse:

18328b6506814084.png

DURCHSCHN. LÄNGE DER TEILNAHMEVORAUSSETZUNGEN NACH ENCOUNTER-TYP ERHALTEN

#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

Abfrageergebnisse:

2087792ce2a67e97.png

ERHALTE ALLE PATIENTEN MIT 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'

Abfrageergebnisse:

65be2450ecd92485.png

4. AI Platform Notebooks-Instanz erstellen

Folgen Sie der Anleitung unter diesem Link, um eine neue AI Platform Notebooks (JupyterLab)-Instanz zu erstellen.

Aktivieren Sie die Compute Engine API.

Sie können „ Neues Notebook mit Standardoptionen erstellen oder " Erstellen Sie ein neues Notebook und legen Sie die Optionen fest.

5. Datenanalyse-Notebook erstellen

AI Platform Notebooks-Instanz öffnen

In diesem Abschnitt erstellen und programmieren wir ein neues Jupyter-Notebook von Grund auf.

  1. Öffnen Sie eine Notebookinstanz. Rufen Sie dazu in der Google Cloud Platform Console die Seite AI Platform Notebooks auf. ZUR SEITE „NOTEBOOKS“ FÜR DIE AI PLATTFORM
  2. Wählen Sie JupyterLab öffnen für das Notebook aus, das Sie öffnen möchten.

82457955b63cbffa.png

  1. AI Platform Notebooks leitet Sie zu einer URL für Ihre Notebookinstanz weiter.

7705bf2f2d9b1b20.png

Notebook erstellen

  1. Klicken Sie in JupyterLab auf File -> Neu -> Notebook und wählen Sie den Kernel "Python 3" aus. im Pop-up oder wählen Sie „Python 3“ aus. im Bereich „Notebook“ (Notebook) im Launcher-Fenster, um ein Untitled.ipynbnotebook zu erstellen.

d0ae87f0bdac3205.png

  1. Klicken Sie mit der rechten Maustaste auf Untitled.ipynb und benennen Sie das Notebook in "fhir_data_from_bigquery.ipynb" um. Doppelklicken Sie darauf, um sie zu öffnen, die Abfragen zu erstellen und das Notebook zu speichern.
  2. Sie können ein Notebook herunterladen, indem Sie mit der rechten Maustaste auf die *.ipynb-Datei klicken und im Menü Download auswählen.

fc16337ffd9b1730.png

  1. Sie können auch ein vorhandenes Notizbuch hochladen, indem Sie auf den Aufwärtspfeil klicken. Schaltfläche.

49373254fbf1ddf9.png

Jeden Codeblock im Notebook erstellen und ausführen

Kopieren und führen Sie jeden in diesem Abschnitt angegebenen Codeblock einzeln aus. Klicken Sie auf Run (Ausführen), um den Code auszuführen. (Dreieck).

e6d8b08c124c675e.png

Aufenthaltsdauer für Begegnungen in Stunden berechnen

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

Code- und Ausführungsausgabe:

e7d37ff4d0d91518.png

Beobachtungen abrufen – Cholesterinwerte

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

Ausführungsausgabe:

7f43408857c0335.png

Ungefähre Begegnungsquantile abrufen

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

Ausführungsausgabe:

4c2313fae0ebe007.png

Durchschnittliche Dauer von Begegnungen in Minuten abrufen

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

Ausführungsausgabe:

a0cdbe42751f14f7.png

„Ecounters“ pro Patient abrufen

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

Ausführungsausgabe:

3ed6b4d6a1652de0.png

Organisationen abrufen

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

Ergebnis der Ausführung:

886b2e99a889422e.png

Patienten abrufen

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

Ausführungsergebnisse:

61533f943001c446.png

6. Diagramme und Grafiken in AI Platform Notebooks erstellen

Codezellen im Notebook "fhir_data_from_bigquery.ipynb" ausführen um ein Balkendiagramm zu zeichnen.

Sie können beispielsweise die durchschnittliche Länge von Begegnungen in Minuten abrufen.

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

Code- und Ausführungsergebnisse:

e48071e58960f124.png

7. Commit für Notebook an Cloud Source Repository durchführen

  1. Gehen Sie in der GCP Console zu Quell-Repositories. Wenn Sie es zum ersten Mal verwenden, klicken Sie auf „Jetzt starten“ und dann auf „Repository erstellen“.

475d9a5c1d5dedc5.png

  1. Wenn Sie später wieder GCP aufrufen möchten, klicken Sie auf -> Cloud Source Repositories auf und klicken Sie auf +Repository hinzufügen, um ein neues Repository zu erstellen.

44416312bf155af1.png

  1. Wählen Sie „Neues Repository erstellen“ aus und klicken Sie dann auf „Weiter“.
  2. Geben Sie den Repository-Namen und den Projektnamen an und klicken Sie dann auf „Erstellen“.

ec2f3eaed74c2e0.png

  1. Wählen Sie „Repository in ein lokales Git-Repository klonen“ und dann „Manuell generierte Anmeldedaten“ aus.
  2. Führen Sie Schritt 1 „Generieren und speichern Sie Git-Anmeldedaten“ aus. (siehe unten). Kopieren Sie das Skript, das auf Ihrem Bildschirm angezeigt wird.

2089de5541527107.jpeg

  1. Starten Sie eine Terminalsitzung in Jupyter.

a2b49535e36a9d5c.png

  1. Fügen Sie alle Befehle aus dem Bereich „Git konfigurieren“ ein in das Jupyter-Terminalfenster.
  2. Kopieren Sie den Repository-Klonpfad aus den Google Cloud-Quell-Repositories (Schritt 2 im Screenshot unten).

ba6a61ae8a4d9f9b.png

  1. Fügen Sie diesen Befehl in das JupiterLab-Terminal ein. Der Befehl sieht so aus:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. „my-ai-notebooks“ in Jupyterlab erstellt.

19a2b2c910b3df3.png

  1. Verschieben Sie Ihr Notebook (fhir_data_from_bigquery.ipynb) in den Ordner „my-ai-notebooks“.
  2. Ändern Sie im Jupyter-Terminal das Verzeichnis in „cd my-ai-notebooks“.
  3. Stellen Sie Ihre Änderungen über das Jupyter-Terminal bereit. Alternativ können Sie die Jupyter-Benutzeroberfläche verwenden. Klicken Sie dazu mit der rechten Maustaste auf die Dateien im Bereich „Nicht verfolgt“ und wählen Sie „Nachverfolgen“ aus. Die Dateien werden dann in den Bereich „Beobachtet“ verschoben und umgekehrt. Der geänderte Bereich enthält die geänderten Dateien).
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Führen Sie einen Commit Ihrer Änderungen über das Jupyter-Terminal oder die Jupyter-UI durch. Geben Sie dazu die Nachricht ein und klicken Sie dann auf die Schaltfläche "Überprüft".
git commit -m "message goes here"
  1. Übertragen Sie die Änderungen per Push über das Jupyter-Terminal oder die Jupyter-UI an das Remote-Repository. Klicken Sie dazu auf das Symbol „Änderungen übertragen“ 71c61a74bb205ed1.png.
git push --all
  1. Gehen Sie in der GCP Console zu Quell-Repositories. Klicken Sie auf „my-ai-notebooks“. Beachten Sie, dass "fhir_data_from_bigquery.ipynb" wird jetzt im GCP Source Repository gespeichert.

7a6b802d90743182.jpeg

8. Bereinigen

Damit Ihrem Google Cloud Platform-Konto die in diesem Codelab verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie nach Abschluss der Anleitung die auf der GCP erstellten Ressourcen bereinigen, damit sie Ihr Kontingent nicht in Anspruch nehmen und Ihnen in Zukunft nicht in Rechnung gestellt werden. In den folgenden Abschnitten wird erläutert, wie Sie diese Ressourcen löschen oder deaktivieren.

BigQuery-Dataset löschen

Folgen Sie dieser Anleitung, um das BigQuery-Dataset zu löschen, das Sie im Rahmen dieser Anleitung erstellt haben. Alternativ können Sie die BigQuery-Konsole aufrufen und die PIN des Projekts hcls-testing-data aufheben, wenn Sie das Test-Dataset fhir_20k_patients_analytics verwendet haben.

AI Platform Notebooks-Instanz herunterfahren

Folgen Sie der Anleitung unter dem Link Notebookinstanz herunterfahren | AI Platform Notebooks, um eine AI Platform Notebooks-Instanz herunterzufahren.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. Rufen Sie in der GCP Console die Seite Projekte auf. ZUR SEITE „PROJEKTE“
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

9. Glückwunsch

Herzlichen Glückwunsch! Sie haben das Codelab für den Zugriff, die Abfrage und die Analyse von FHIR-formatierten Gesundheitsdaten mit BigQuery und AI Platform Notebooks erfolgreich abgeschlossen.

Sie haben in der GCP auf ein öffentliches BigQuery-Dataset zugegriffen.

Sie haben SQL-Abfragen mithilfe der BigQuery-UI entwickelt und getestet.

Sie haben eine AI Platform Notebooks-Instanz erstellt und gestartet.

Sie haben SQL-Abfragen in JupyterLab ausgeführt und die Abfrageergebnisse in Pandas DataFrame gespeichert.

Sie haben Diagramme und Grafiken mit Matplotlib erstellt.

Sie haben für Ihr Notebook ein Commit durchgeführt und es per Push in ein Cloud Source Repository auf der GCP übertragen.

Sie kennen jetzt die wichtigsten Schritte, um mit BigQuery und AI Platform Notebooks auf der Google Cloud Platform Ihre Healthcare Data Analytics-Reise zu starten.

©Google, Inc. or its affiliates. Alle Rechte vorbehalten. Do not distribute.