1. Wprowadzenie

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
- 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.
- Otrzymasz e-maila z instrukcjami, jak potwierdzić działanie.
- Skorzystaj z opcji odpowiedzi na e-maila, aby dołączyć do grupy. NIE klikaj przycisku
. - Gdy otrzymasz e-maila z potwierdzeniem, możesz przejść do następnego kroku w tym przewodniku.
Przypinanie projektu
- W konsoli GCP wybierz projekt, a następnie otwórz BigQuery.
- Kliknij menu +DODAJ DANE i wybierz „Przypnij projekt” > „Wpisz nazwę projektu”.

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

3. Tworzenie zapytań w interfejsie BigQuery
Ustawienie interfejsu BigQuery
- Otwórz konsolę BigQuery, wybierając BigQuery w menu GCP w lewym górnym rogu (menu „hamburger”).
- 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).

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:

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:

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:

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:

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:

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:

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.
- Otwórz instancję notatnika, przechodząc na stronę AI Platform Notebooks w konsoli Google Cloud Platform. OTWÓRZ STRONĘ NOTATNIKÓW AI PLATFORM
- Wybierz Otwórz JupyterLab w przypadku instancji, którą chcesz otworzyć.

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

Utwórz notatnik
- 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.

- 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.
- Aby pobrać notatnik, kliknij prawym przyciskiem myszy plik *.ipynb i wybierz z menu opcję Pobierz.

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

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

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:

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:

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:

Ś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:

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:

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:

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:

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:

7. Zatwierdzanie notatnika w repozytorium Cloud Source
- W konsoli GCP otwórz Repozytoria źródłowe. Jeśli korzystasz z niego po raz pierwszy, kliknij Rozpocznij, a potem Utwórz repozytorium.

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

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

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

- Rozpocznij sesję terminala w Jupyter.

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

- 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
- W JupyterLab zostanie utworzony folder „my-ai-notebooks”.

- Przenieś notatnik (fhir_data_from_bigquery.ipynb) do folderu „my-ai-notebooks”.
- W terminalu Jupyter zmień katalog na „cd my-ai-notebooks”.
- 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

- Zatwierdź zmiany w terminalu Jupyter lub w interfejsie Jupyter (wpisz wiadomość, a potem kliknij przycisk „Sprawdzono”).
git commit -m "message goes here"
- Przekaż zmiany do zdalnego repozytorium za pomocą terminala Jupyter lub interfejsu Jupyter (kliknij ikonę „Przekaż zatwierdzone zmiany”
).
git push --all
- 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.

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:
- W konsoli GCP otwórz stronę Projekty. OTWÓRZ STRONĘ PROJEKTÓW
- Z listy projektów wybierz projekt, który chcesz usunąć, i kliknij Usuń.
- 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ć.