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

1. Wprowadzenie

139d6fa46b10ab12.png

Ostatnia aktualizacja: 22.09.2022

W ramach tego ćwiczenia w Codelabs wdrożysz wzorzec uzyskiwania dostępu do danych o stanie zdrowia zagregowanych w BigQuery i ich analizowania za pomocą BigQueryUI i notatników AI Platform. Pokazuje on eksplorację danych w dużych zbiorach danych z sektora opieki zdrowotnej przy użyciu znanych narzędzi, takich jak Pandas czy Matplotlib, w notatkach AI Platform zgodnych z HIPPA. „Sztuczka” pierwszą część agregacji w BigQuery, odzyskanie zbioru danych Pandas, a następnie lokalną pracę z mniejszym zbiorem danych Pandas. Notatniki w AI Platform udostępniają zarządzane środowisko Jupyter, więc nie musisz samodzielnie uruchamiać serwerów notatników. Usługa Notatniki w AI Platform jest dobrze zintegrowana z innymi usługami GCP, takimi jak Big Query czy Cloud Storage, dzięki czemu możesz szybko i łatwo zacząć korzystać z analizy danych i systemów uczących się w Google Cloud Platform.

Z tego modułu nauczysz się:

  • Twórz i testuj zapytania SQL za pomocą interfejsu użytkownika BigQuery.
  • Utwórz i uruchom w GCP instancję Notatników w AI Platform.
  • Uruchamiaj zapytania SQL z notatnika i zapisuj wyniki zapytań w Pandas DataFrame.
  • Twórz wykresy w Matplotlib.
  • Zatwierdź i przekaż notatnik do repozytorium Cloud Source Repositories w GCP.

Czego potrzebujesz do uruchomienia tego ćwiczenia z programowania?

  • Musisz mieć dostęp do projektu GCP.
  • Musisz mieć przypisaną rolę właściciela projektu GCP.
  • Musisz mieć zbiór danych dotyczących opieki zdrowotnej w BigQuery.

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

2. Konfigurowanie projektu

W tym ćwiczeniu w programowaniu 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 o stanie zdrowia.

Uzyskiwanie dostępu do syntetycznego zbioru danych

  1. Korzystając z adresu e-mail, którego używasz do logowania się w konsoli Cloud, wyślij na hcls-solutions-external+subscribe@google.com e-maila z prośbą o dołączenie.
  2. Otrzymasz e-maila z instrukcjami, jak potwierdzić tę czynność.
  3. Użyj tej opcji, by odpowiedzieć na e-maila, aby dołączyć do grupy. NIE klikaj przycisku 525a0fa752e0acae.png.
  4. Po otrzymaniu e-maila z potwierdzeniem możesz przejść do następnego kroku ćwiczenia z programowania.

Przypnij projekt

  1. W konsoli GCP wybierz projekt i 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 Kod PIN. Testowy zbiór danych BigQuery „fhir_20k_patients_analytics” jest dostępna do użycia.

f9038e2a21e143fd.png

3. Tworzenie zapytań za pomocą interfejsu BigQuery

Ustawienie interfejsu BigQuery

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

455c6c3ed93e9a63.png

Tworzenie zapytań

W oknie edytora zapytań wpisz podane niżej zapytanie i kliknij „Uruchom”, aby je wykonać. Następnie wyświetl wyniki w oknie „Wyniki zapytania”.

ZAPYTANIE PACYFIKÓ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 wyników:

fb8ef84f0cb583fb.png

MINIATURY 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

ORGANIZACJA ZAPYTAŃ

Zmień identyfikator organizacji, aby pasował do 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

REKLAMY ZAPYTAŃ WEDŁUG PATYENTA

#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

UZYSKAJ ŚREDNI DŁUGOŚĆ ENCOUNTERÓW WEDŁUG TYPU ENCOUNTERA

#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

UZYSKAJ WSZYSTKICH PRACOWNIKÓW, KTÓRE MAJĄ CZĘSTOTLIWOŚĆ 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'

Wyniki zapytania:

65be2450ecd92485.png

4. Tworzenie instancji notatek w AI Platform

Wykonaj instrukcje podane w tym linku, aby utworzyć nową instancję Notatników platformy AI (JupyterLab).

Pamiętaj, aby włączyć Compute Engine API.

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

5. Tworzenie notatnika analizy danych

Otwórz instancję Notatników w AI Platform

W tej sekcji utworzymy od podstaw nowy notatnik Jupyter i zakodujemy go.

  1. Otwórz instancję notatnika, przechodząc na stronę Notatniki w AI Platform 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 przekierowują Cię do adresu URL instancji notatnika.

7705bf2f2d9b1b20.png

Utwórz notatnik

  1. W JupyterLab otwórz Plik -> Nowe -> Notatnik i wybierz jądro „Python 3”. w wyskakującym okienku lub wybierz „Python 3”. w sekcji Notatnik w oknie programu uruchamiającego, aby utworzyć plik Untitled.ipynbnotebook.

d0ae87f0bdac3205.png

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

fc16337ffd9b1730.png

  1. Możesz też przesłać istniejący notatnik. Aby to zrobić, kliknij strzałkę w górę. Przycisk

49373254fbf1ddf9.png

Kompilowanie i uruchamianie każdego bloku kodu w notatniku

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

e6d8b08c124c675e.png

Określ długość 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 wynik wykonania:

e7d37ff4d0d91518.png

Sprawdź obserwacje – 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

Pobierz przybliżone kwantyle spotkania

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

Poznaj średnią długość 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

Pobieranie liczby spotkań na 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

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

Możesz na przykład poznać średnią długość spotkań w minutach.

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

Wyniki dotyczące kodu i wykonania:

e48071e58960f124.png

7. Zatwierdź notatnik w Cloud Source Repositories

  1. W konsoli GCP otwórz Repozytoria źródłowe. Jeśli używasz go po raz pierwszy, kliknij Rozpocznij, a następnie Utwórz repozytorium.

475d9a5c1d5dedc5.png

  1. Następnym razem przejdź do GCP -> Cloud Source Repositories i kliknij +Dodaj repozytorium, aby utworzyć nowe.

44416312bf155af1.png

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

ec2f3eaed74c2e0.png

  1. Wybierz „Sklonuj repozytorium do lokalnego repozytorium Git”, a następnie wybierz Ręcznie wygenerowane dane uwierzytelniające.
  2. Wykonaj krok 1 „Wygeneruj i zapisz dane logowania Git” instrukcji (patrz poniżej). Skopiuj skrypt, który pojawi się na ekranie.

2089de5541527107.jpeg

  1. Uruchom sesję terminala w Jupyter.

a2b49535e36a9d5c.png

  1. Wklej wszystkie polecenia z „konfiguracji Git” do terminala Jupyter.
  2. Skopiuj ścieżkę klonowania repozytorium z repozytoriów źródłowych 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. „my-ai-notebooki” zostanie utworzony w Jupyterlab.

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 przy użyciu terminala Jupyter. Możesz też skorzystać z interfejsu użytkownika Jupyter – kliknij prawym przyciskiem myszy pliki w obszarze Nieśledzone dane i wybierz opcję Monitoruj. Pliki zostaną przeniesione do obszaru Śledzone, i odwrotnie. Zawiera on 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 za pomocą terminala Jupyter lub interfejsu użytkownika Jupyter (wpisz wiadomość, a następnie kliknij przycisk „Zaznaczone”).
git commit -m "message goes here"
  1. Przekaż zmiany do repozytorium zdalnego za pomocą terminala Jupyter lub interfejsu użytkownika Jupyter (kliknij ikonę „wypchnij zatwierdzone zmiany” 71c61a74bb205ed1.png).
git push --all
  1. W konsoli GCP otwórz Source Repositories (Repozytoria źródłowe). Kliknij my-ai-notebooks. Zwróć uwagę, że plik „fhir_data_from_bigquery.ipynb” zostanie zapisany w repozytorium źródłowym GCP.

7a6b802d90743182.jpeg

8. Czyszczenie

Aby uniknąć obciążenia konta Google Cloud Platform opłatami za zasoby zużyte w ramach tego ćwiczenia z programowania, po ukończeniu samouczka możesz wyczyścić zasoby utworzone w GCP, aby nie zajmowały Twojego limitu. W przyszłości nie będziemy też naliczać za nie opłat. W poniższych sekcjach opisano, jak usunąć lub wyłączyć te zasoby.

Usuwam zbiór danych BigQuery

Wykonaj te instrukcje, aby usunąć zbiór danych BigQuery utworzony w ramach tego samouczka. Jeśli korzystasz z testowego zbioru danych fhir_20k_patients_analytics, przejdź do konsoli BigQuery i odepnij projekt hcls-testing-data.

Wyłączam instancję Notatników AI Platform

Postępuj zgodnie z instrukcjami podanymi w tym linku Wyłączanie instancji notatnika | Notatniki w AI Platform, aby wyłączyć instancję Notatników w AI Platform.

Usuwam projekt

Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego na potrzeby samouczka.

Aby usunąć projekt:

  1. W konsoli GCP otwórz stronę Projekty. OTWÓRZ STRONĘ PROJEKTY
  2. Na liście projektów wybierz projekt do usunięcia, a następnie kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

9. Gratulacje

Gratulacje! Udało Ci się ukończyć moduł dotyczący kodu, który pozwala uzyskiwać dostęp do sformatowanych danych o stanie zdrowia, a także tworzyć zapytania i analizować je za pomocą notatników BigQuery i AI Platform.

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

Masz opracowane i przetestowane zapytania SQL za pomocą interfejsu użytkownika BigQuery.

Udało Ci się utworzyć i uruchomić instancję Notatników w AI Platform.

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

Wykresy i diagramy zostały utworzone za pomocą Matplotlib.

Twój notatnik został zatwierdzony i przekazany do Cloud Source Repositories w GCP.

Znasz już najważniejsze kroki, które musisz wykonać, aby zacząć korzystać z Notatników w BigQuery i AI Platform w Google Cloud Platform w usłudze Healthcare Data Analytics.

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