Analizuj dane kliniczne za pomocą notatników BigQuery i AI Platform

1. Wprowadzenie

139d6fa46b10ab12.png

Ostatnia aktualizacja: 22.09.2022

W tym laboratorium kodowania wdrażamy wzorzec dostępu do danych opieki zdrowotnej zgromadzonych w BigQuery i ich analizowania za pomocą BigQueryUI i AI Platform Notebooks. Pokazuje eksplorację dużych zbiorów danych dotyczących opieki zdrowotnej przy użyciu znanych narzędzi, takich jak Pandas, Matplotlib itp., w środowisku AI Platform Notebooks zgodnym z HIPAA. „Sztuczka” polega na wykonaniu pierwszej części agregacji w BigQuery, pobraniu zbioru danych Pandas, a następnie lokalnym przetworzeniu mniejszego zbioru danych Pandas. Notatniki AI Platform zapewniają zarządzane środowisko Jupyter, więc nie musisz samodzielnie uruchamiać serwerów notatników. AI Platform Notebooks jest dobrze zintegrowana z innymi usługami GCP, takimi jak BigQuery i Cloud Storage, co sprawia, że rozpoczęcie przygody z analizą danych i uczeniem maszynowym w Google Cloud Platform jest szybkie i proste.

W tym module nauczysz się:

  • Tworzenie i testowanie zapytań SQL w interfejsie BigQuery.
  • Utwórz i uruchom instancję Notatników w AI Platform w GCP.
  • wykonywać zapytania SQL z poziomu notatnika i przechowywać wyniki zapytań w strukturze DataFrame biblioteki pandas;
  • tworzyć wykresy za pomocą biblioteki Matplotlib;
  • Zatwierdź i wypchnij notatnik do Cloud Source Repositories w GCP.

Czego potrzebujesz, aby wykonać to ćwiczenie?

  • Musisz mieć dostęp do projektu GCP.
  • Musisz mieć przypisaną rolę Właściciel w projekcie GCP.
  • Potrzebujesz zbioru danych dotyczących opieki zdrowotnej w BigQuery.

Jeśli nie masz projektu GCP, wykonaj te czynności, aby utworzyć nowy projekt GCP.

2. Konfigurowanie projektu

W tym samouczku użyjemy istniejącego zbioru danych w BigQuery (hcls-testing-data.fhir_20k_patients_analytics). Ten zbiór danych jest wstępnie wypełniony syntetycznymi danymi dotyczącymi opieki zdrowotnej.

Uzyskiwanie dostępu do syntetycznego zbioru danych

  1. Z adresu e-mail, którego używasz do logowania się w konsoli Cloud, wyślij e-maila na adres hcls-solutions-external+subscribe@google.com z prośbą o dołączenie.
  2. Otrzymasz e-maila z instrukcjami, jak potwierdzić działanie.
  3. Skorzystaj z opcji odpowiedzi na e-maila, aby dołączyć do grupy. NIE klikaj przycisku 525a0fa752e0acae.png.
  4. Gdy otrzymasz e-maila z potwierdzeniem, możesz przejść do następnego kroku w tym przewodniku.

Przypinanie projektu

  1. W konsoli GCP wybierz projekt, a następnie otwórz BigQuery.
  2. Kliknij menu +DODAJ DANE i wybierz „Przypnij projekt” > „Wpisz nazwę projektu”.

55257ed5931961c6.png

  1. Wpisz nazwę projektu „hcls-testing-data”, a następnie kliknij PRZYPNIJ. Przykładowy zbiór danych BigQuery „fhir_20k_patients_analytics” jest dostępny do użycia.

f9038e2a21e143fd.png

3. Tworzenie zapytań w interfejsie BigQuery

Ustawienie interfejsu BigQuery

  1. Otwórz konsolę BigQuery, wybierając BigQuery w menu GCP w lewym górnym rogu (menu „hamburger”).
  2. W konsoli BigQuery kliknij Więcej → Ustawienia zapytania i upewnij się, że menu Starsza wersja SQL NIE jest zaznaczone (będziemy używać standardowej wersji SQL).

455c6c3ed93e9a63.png

Tworzenie zapytań

W oknie Edytora zapytań wpisz to zapytanie i kliknij „Uruchom”, aby je wykonać. Następnie wyświetl wyniki w oknie „Wyniki zapytania”.

ZAPYTANIE O PACJENTÓW

#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

Zapytanie w „Edytorze zapytań” i wyniki:

fb8ef84f0cb583fb.png

PRAKTYCY ZAPYTAŃ

#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

Wyniki zapytania:

9515eb63813617e0.png

ZAPYTANIE O ORGANIZACJĘ

Zmień identyfikator organizacji, aby pasował do Twojego zbioru danych.

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

Wyniki zapytania:

79a7afe2dd7fca87.png

ZAPYTANIE O WIZYTY PACJENTA

#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

Wyniki zapytania:

18328b6506814084.png

UZYSKIWANIE ŚREDNIEJ DŁUGOŚCI SPOTKAŃ WEDŁUG TYPU SPOTKANIA

#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

Wyniki zapytania:

2087792ce2a67e97.png

POBIERZ WSZYSTKICH PACJENTÓW, KTÓRYCH POZIOM HbA1c JEST >= 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'

Wyniki zapytania:

65be2450ecd92485.png

4. Tworzenie instancji notatników AI Platform

Postępuj zgodnie z instrukcjami pod tym linkiem, aby utworzyć nową instancję AI Platform Notebooks (JupyterLab).

Włącz interfejs Compute Engine API.

Możesz wybrać „ Utwórz nowy notatnik z opcjami domyślnymi” lub „ Utwórz nowy notatnik i określ opcje”.

5. Tworzenie notatnika do analizy danych

Otwieranie instancji Notatników w AI Platform

W tej sekcji utworzymy nowy notatnik Jupyter od zera.

  1. Otwórz instancję notatnika, przechodząc na stronę AI Platform Notebooks w konsoli Google Cloud Platform. OTWÓRZ STRONĘ NOTATNIKÓW AI PLATFORM
  2. Wybierz Otwórz JupyterLab w przypadku instancji, którą chcesz otworzyć.

82457955b63cbffa.png

  1. Notatniki w AI Platform przekierują Cię na adres URL instancji notatnika.

7705bf2f2d9b1b20.png

Utwórz notatnik

  1. W JupyterLab kliknij File (Plik) –> New (Nowy) –> Notebook (Notatnik) i w wyskakującym okienku wybierz jądro „Python 3” lub w sekcji Notebook (Notatnik) w oknie programu uruchamiającego wybierz „Python 3”, aby utworzyć notatnik Untitled.ipynb.

d0ae87f0bdac3205.png

  1. Kliknij prawym przyciskiem myszy plik Untitled.ipynb i zmień nazwę notatnika na „fhir_data_from_bigquery.ipynb”. Kliknij go dwukrotnie, aby otworzyć, utworzyć zapytania i zapisać notatnik.
  2. Aby pobrać notatnik, kliknij prawym przyciskiem myszy plik *.ipynb i wybierz z menu opcję Pobierz.

fc16337ffd9b1730.png

  1. Możesz też przesłać istniejący notatnik, klikając przycisk „Strzałka w górę”.

49373254fbf1ddf9.png

Kompiluj i wykonuj każdy blok kodu w notatniku.

Skopiuj i wykonaj po kolei każdy blok kodu podany w tej sekcji. Aby wykonać kod, kliknij „Uruchom” (trójkąt).

e6d8b08c124c675e.png

Pobieranie długości pobytu w godzinach

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

Kod i dane wyjściowe uruchomionego kodu:

e7d37ff4d0d91518.png

Pobieranie obserwacji – wartości cholesterolu

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

Dane wyjściowe uruchomionego kodu:

7f43408857c0335.png

Otrzymywanie przybliżonych kwantyli spotkań

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

Dane wyjściowe uruchomionego kodu:

4c2313fae0ebe007.png

Średni czas trwania spotkań w minutach

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

Dane wyjściowe uruchomionego kodu:

a0cdbe42751f14f7.png

Pobierz wizyty pacjenta

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

Dane wyjściowe uruchomionego kodu:

3ed6b4d6a1652de0.png

Pobieranie organizacji

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

Wynik wykonania:

886b2e99a889422e.png

Pobieranie pacjentów

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

Wyniki wykonania:

61533f943001c446.png

6. Tworzenie wykresów w notatnikach AI Platform

Uruchom komórki kodu w notatniku „fhir_data_from_bigquery.ipynb”, aby narysować wykres słupkowy.

Możesz na przykład uzyskać średni czas trwania wizyt w minutach.

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

Kod i wyniki wykonania:

e48071e58960f124.png

7. Zatwierdzanie notatnika w repozytorium Cloud Source

  1. W konsoli GCP otwórz Repozytoria źródłowe. Jeśli korzystasz z niego po raz pierwszy, kliknij Rozpocznij, a potem Utwórz repozytorium.

475d9a5c1d5dedc5.png

  1. Następnie otwórz GCP –> Cloud Source Repositories i kliknij +Dodaj repozytorium, aby utworzyć nowe repozytorium.

44416312bf155af1.png

  1. Kliknij „Utwórz nowe repozytorium”, a następnie kliknij Dalej.
  2. Podaj nazwę repozytorium i nazwę projektu, a potem kliknij Utwórz.

ec2f3eaed74c2e0.png

  1. Wybierz „Skopiuj repozytorium do lokalnego repozytorium Git”, a potem wybierz Ręcznie wygenerowane dane logowania.
  2. Wykonaj instrukcje z kroku 1 „Wygeneruj i zapisz dane logowania do Git” (patrz poniżej). Skopiuj skrypt wyświetlany na ekranie.

2089de5541527107.jpeg

  1. Rozpocznij sesję terminala w Jupyter.

a2b49535e36a9d5c.png

  1. Wklej wszystkie polecenia z okna „Skonfiguruj Git” do terminala Jupyter.
  2. Skopiuj ścieżkę klonowania repozytorium z repozytoriów kodu źródłowego GCP Cloud (krok 2 na zrzucie ekranu poniżej).

ba6a61ae8a4d9f9b.png

  1. Wklej to polecenie w terminalu JupiterLab. Polecenie będzie wyglądać tak:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. W JupyterLab zostanie utworzony folder „my-ai-notebooks”.

19a2b2c910b3df3.png

  1. Przenieś notatnik (fhir_data_from_bigquery.ipynb) do folderu „my-ai-notebooks”.
  2. W terminalu Jupyter zmień katalog na „cd my-ai-notebooks”.
  3. Przygotuj zmiany za pomocą terminala Jupyter. Możesz też użyć interfejsu Jupyter (kliknij pliki prawym przyciskiem myszy w obszarze Nieśledzone, wybierz Śledź, a następnie pliki zostaną przeniesione do obszaru Śledzone i odwrotnie). Zmieniony obszar zawiera zmodyfikowane pliki).
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Zatwierdź zmiany w terminalu Jupyter lub w interfejsie Jupyter (wpisz wiadomość, a potem kliknij przycisk „Sprawdzono”).
git commit -m "message goes here"
  1. Przekaż zmiany do zdalnego repozytorium za pomocą terminala Jupyter lub interfejsu Jupyter (kliknij ikonę „Przekaż zatwierdzone zmiany” 71c61a74bb205ed1.png).
git push --all
  1. W konsoli GCP otwórz Source Repositories. Kliknij my-ai-notebooks. Zwróć uwagę, że plik „fhir_data_from_bigquery.ipynb” jest teraz zapisany w repozytorium źródeł GCP.

7a6b802d90743182.jpeg

8. Czyszczenie

Aby uniknąć obciążenia konta Google Cloud Platform opłatami za zasoby użyte w tym laboratorium, po ukończeniu samouczka możesz zwolnić miejsce zajmowane przez utworzone w GCP zasoby, aby nie zajmowały miejsca w przydziale i nie generowały opłat w przyszłości. W sekcjach poniżej znajdziesz informacje o tym, jak usunąć te zasoby lub je wyłączyć.

Usuwanie zbioru danych BigQuery

Postępuj zgodnie z tymi instrukcjami, aby usunąć zbiór danych BigQuery utworzony w ramach tego samouczka. Możesz też przejść do konsoli BigQuery i odpiąć projekt hcls-testing-data, jeśli używasz zbioru danych testowych fhir_20k_patients_analytics.

Wyłączanie instancji Notatników w AI Platform

Aby wyłączyć instancję Notatników w AI Platform, postępuj zgodnie z instrukcjami pod tym linkiem: Zamykanie instancji notatnika | Notatniki w AI Platform.

Usuwanie projektu

Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego w tym samouczku.

Aby usunąć projekt:

  1. W konsoli GCP otwórz stronę Projekty. OTWÓRZ STRONĘ PROJEKTÓW
  2. Z listy projektów wybierz projekt, który chcesz usunąć, i kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

9. Gratulacje

Gratulacje! Udało Ci się ukończyć ćwiczenie z kodowania, w którym pokazaliśmy, jak uzyskiwać dostęp do danych opieki zdrowotnej w formacie FHIR, wykonywać na nich zapytania i je analizować za pomocą BigQuery i notatników AI Platform.

Udało Ci się uzyskać dostęp do publicznego zbioru danych BigQuery w GCP.

Zapytania SQL zostały opracowane i przetestowane w interfejsie BigQuery.

Utworzono i uruchomiono instancję Notatników w AI Platform.

Zapytania SQL zostały wykonane w JupyterLab, a wyniki zapytań zostały zapisane w Pandas DataFrame.

Utworzono wykresy i diagramy za pomocą biblioteki Matplotlib.

Notatnik został zatwierdzony i wypchnięty do Cloud Source Repository w GCP.

Znasz już najważniejsze kroki, które musisz wykonać, aby rozpocząć analizę danych dotyczących opieki zdrowotnej za pomocą BigQuery i notatników AI Platform na platformie Google Cloud Platform.

© Google, Inc. lub jej podmioty stowarzyszone. Wszelkie prawa zastrzeżone. Nie rozpowszechniać.