ניתוח נתונים קליניים באמצעות BigQuery ו-AI Platform Notebooks

1. מבוא

139d6fa46b10ab12.png

עדכון אחרון: 22.9.2022

ה-Codelab הזה מיישם דפוס לגישה ולניתוח של נתוני בריאות שנצברו ב-BigQuery באמצעות BigQueryUI ו-AI Platform Notebooks. הוא מדגים חקירת נתונים של מערכי נתונים גדולים של שירותי בריאות באמצעות כלים מוכרים כמו Pandas, Matplotlib וכו', ב-notebooks של AI Platform שתואמים ל-HIPPA. ה"טריק" הוא לבצע את החלק הראשון של הצבירה ב-BigQuery, להחזיר מערך נתונים של Pandas ולעבוד באופן מקומי עם מערך הנתונים הקטן יותר של Pandas. notebooks של AI Platform מספקים חוויה מנוהלת של Jupyter, כך שלא צריך להריץ שרתי notebook בעצמכם. השירות 'notebooks של AI Platform' משתלב בצורה טובה עם שירותי GCP אחרים כמו Big Query ו-Cloud Storage, ובעזרתו קל ופשוט להתחיל את תהליך ניתוח הנתונים והלמידת מכונה ב-Google Cloud Platform.

בשיעור ה-Lab הזה תלמדו:

  • פיתוח ובדיקה של שאילתות SQL באמצעות BigQuery UI
  • ליצור ולהפעיל מכונה של AI Platform Notebooks ב-GCP.
  • להריץ שאילתות SQL מה-notebook ולאחסן את תוצאות השאילתות ב-Pandas DataFrame.
  • אפשר ליצור תרשימים וגרפים באמצעות Matplotlib.
  • שומרים ודוחפים את ה-notebook ל-Cloud Source Repository ב-GCP.

מה צריך כדי להריץ את ה-Codelab הזה?

  • צריכה להיות לכם גישה לפרויקט ב-GCP.
  • צריך להיות לך תפקיד בעלים בפרויקט GCP.
  • אתם צריכים מערך נתונים של שירותי בריאות ב-BigQuery.

אם אין לך פרויקט GCP, עליך לפעול לפי השלבים האלה כדי ליצור פרויקט GCP חדש.

2. הגדרת פרויקט

לצורך ה-codelab הזה נשתמש במערך נתונים קיים ב-BigQuery (hcls-testing-data.fhir_20k_patients_analytics). מערך הנתונים הזה מאוכלס מראש בנתונים של שירותי בריאות סינתטיים.

קבלת גישה למערך הנתונים הסינתטי

  1. מכתובת האימייל שמשמשת להתחברות אל Cloud Console, שולחים אימייל לכתובת hcls-solutions-external+subscribe@google.com עם בקשת הצטרפות.
  2. תקבלו אימייל עם הוראות לאישור הפעולה.
  3. משתמשים באפשרות של שליחת תשובה לאימייל והצטרפות לקבוצה. אין ללחוץ על הלחצן 525a0fa752e0acae.png.
  4. אחרי שתקבלו את הודעת האישור באימייל, תוכלו להמשיך לשלב הבא ב-Codelab.

הצמדת הפרויקט

  1. במסוף GCP, בוחרים את הפרויקט ואז עוברים אל BigQuery.
  2. לוחצים על התפריט הנפתח +הוספת נתונים ובוחרים באפשרות 'הצמדה של פרויקט'. > "Enter project name" הקצר הזה. התשובות שלך יעזרו לנו להשתפר.

55257ed5931961c6.png

  1. מזינים את שם הפרויקט hcls-testing-data ולוחצים על קוד אימות. מערך הנתונים לבדיקה ב-BigQuery "fhir_20k_patients_analytics" זמין לשימוש.

f9038e2a21e143fd.png

3. פיתוח שאילתות באמצעות ממשק המשתמש של BigQuery

הגדרת ממשק המשתמש ב-BigQuery

  1. כדי לעבור למסוף BigQuery, בוחרים באפשרות BigQuery בתפריט GCP בפינה השמאלית העליונה ('המבורגר').
  2. במסוף BigQuery, לוחצים על More → Query settings ומוודאים שתפריט ה-SQL מדור קודם לא מסומן (אנחנו נשתמש ב-SQL סטנדרטי).

455c6c3ed93e9a63.png

יצירת שאילתות

בחלון של עורך השאילתות, מקלידים את השאילתה הבאה ולוחצים על Run כדי להפעיל אותה. לאחר מכן, מעיינים בתוצאות בחלון 'Query results'.

משתני השאילתות

#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

שאילתה בעורך השאילתות ותוצאות:

fb8ef84f0cb583fb.png

תרגולי שאילתות

#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

תוצאות השאילתה:

9515eb63813617e0.png

ארגון שאילתה

צריך לשנות את מזהה הארגון בהתאם למערך הנתונים.

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

תוצאות השאילתה:

79a7afe2dd7fca87.png

שאילתות שאילתות לפי תושב

#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

תוצאות השאילתה:

18328b6506814084.png

קבלת אורך ממוצע של EN ה-Cloud לפי סוג המאגר

#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

תוצאות השאילתה:

2087792ce2a67e97.png

אני רוצה לקבל את כל הלקוחות שיש להם שיעור 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'

תוצאות השאילתה:

65be2450ecd92485.png

4. יצירת מכונה של AI Platform Notebooks

פועלים לפי ההוראות בקישור הזה כדי ליצור מכונה חדשה של AI Platform Notebooks (JupyterLab).

צריך להקפיד להפעיל את Compute Engine API.

אפשר לבחור " יצירת notebook חדש עם אפשרויות ברירת מחדל או " יוצרים notebook חדש ומציינים את האפשרויות".

5. יצירת notebook של ניתוח נתונים

פתיחת מכונה של notebooks ב-AI Platform

בקטע הזה נכתוב ונתכנת notebook חדש של Jupyter מאפס.

  1. פותחים מכונה notebook על ידי מעבר לדף notebooks של AI Platform ב-Google Cloud Platform Console. לדף רשימות החשבונות של פלטפורמת ה-AI
  2. בוחרים באפשרות Open JupyterLab בשביל המכונה שרוצים לפתוח.

82457955b63cbffa.png

  1. השירות 'notebooks של AI Platform' יפנה אתכם לכתובת URL של המכונה של ה-notebook.

7705bf2f2d9b1b20.png

יצירת notebook

  1. ב-JupyterLab, עוברים אל File -> חדש -> Notebook ובוחרים באפשרות Kernel Python 3 בחלון הקופץ, או בוחרים 'Python 3' בקטע 'Notebook' בחלון מרכז האפליקציות כדי ליצור קובץ Untitled.ipynbnotebook.

d0ae87f0bdac3205.png

  1. לוחצים לחיצה ימנית על Untitled.ipynb ומשנים את שם ה-notebook ל-'fhir_data_from_bigquery.ipynb". לוחצים לחיצה כפולה כדי לפתוח אותו, ליצור את השאילתות ולשמור את ה-notebook.
  2. כדי להוריד מחברת, לוחצים לחיצה ימנית על הקובץ *.ipynb ובוחרים באפשרות 'הורדה' מהתפריט.

fc16337ffd9b1730.png

  1. ניתן גם להעלות מחברת קיימת על ידי לחיצה על "חץ למעלה" לחצן.

49373254fbf1ddf9.png

יצירה והפעלה של כל בלוק קוד ב-notebook

מעתיקים ומפעילים כל בלוק קוד שמופיע בקטע הזה, אחד אחרי השני. כדי להריץ את הקוד, לוחצים על Run (משולש).

e6d8b08c124c675e.png

קבלת משך השהייה בשעות של המפגשים

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

פלט קוד וביצוע:

e7d37ff4d0d91518.png

בדיקת תצפיות – ערכי כולסטרול

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

פלט ביצוע:

7f43408857c0335.png

קבלת כמות משוערת של כמות מפגש

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

פלט ביצוע:

4c2313fae0ebe007.png

קבלת משך ממוצע של מפגשים בדקות

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

פלט ביצוע:

a0cdbe42751f14f7.png

מספר מפגשים לכל מטופל

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

פלט ביצוע:

3ed6b4d6a1652de0.png

אחזור של ארגונים

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

תוצאת ביצוע:

886b2e99a889422e.png

השגת מטופלים

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

תוצאות ביצוע:

61533f943001c446.png

6. יצירת תרשימים ותרשימים ב-notebooks של AI Platform

להריץ תאי קוד ב-notebook שנקרא 'fhir_data_from_bigquery.ipynb" כדי לשרטט תרשים עמודות.

לדוגמה, אפשר לקבל את משך הזמן הממוצע של 'מפגשים' בדקות.

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

הקוד ותוצאות הביצוע:

e48071e58960f124.png

7. חיוב ה-notebook ל-Cloud Source Repository

  1. במסוף GCP, עוברים אל Source Repositories. אם זו הפעם הראשונה שאתם משתמשים בו, לוחצים על Get started (תחילת העבודה) ואז על Create repository.

475d9a5c1d5dedc5.png

  1. בפעם הבאה, נכנסים ל-GCP -> Cloud Source Repositories ולוחצים על +Add repository כדי ליצור מאגר חדש.

44416312bf155af1.png

  1. בוחרים באפשרות 'יצירת מאגר חדש' ולוחצים על 'המשך'.
  2. מזינים את שם המאגר ואת שם הפרויקט ולוחצים על Create.

ec2f3eaed74c2e0.png

  1. בוחרים באפשרות Clone your repository to alocal Git repository', ולאחר מכן בוחרים באפשרות ' המדדים שנוצרו באופן ידני'.
  2. מבצעים את שלב 1: 'יצירה ואחסון של פרטי הכניסה ל-Git' הוראות להתאמה אישית (ראו בהמשך). מעתיקים את הסקריפט שמופיע במסך.

2089de5541527107.jpeg

  1. התחלת סשן במסוף ב-Jupyter.

a2b49535e36a9d5c.png

  1. להדביק את כל הפקודות מהקובץ Configuration Git בחלון במסוף של Jupyter.
  2. מעתיקים את נתיב השכפול של המאגר ממאגרי המקור של GCP Cloud (שלב 2 בצילום המסך למטה).

ba6a61ae8a4d9f9b.png

  1. מדביקים את הפקודה הזו בטרמינל JupiterLab. הפקודה תיראה כך:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. "my-ai-notebooks" תיווצר ב-Jupyterlab.

19a2b2c910b3df3.png

  1. מעבירים את ה-notebook (fhir_data_from_bigquery.ipynb) לתיקייה my-ai-notebooks.
  2. בטרמינל Jupyter, משנים את הספרייה ל-'cd my-ai-notebooks'.
  3. מתקנים את השינויים באמצעות הטרמינל של Jupyter. לחלופין, אפשר להשתמש בממשק המשתמש של Jupyter (לוחצים לחיצה ימנית על הקבצים באזור 'ללא מעקב', בוחרים באפשרות 'מעקב', הקבצים מועברים לאזור 'במעקב' ולהפך). האזור שהשתנה מכיל את הקבצים ששונו).
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. מבצעים את השינויים באמצעות הטרמינל של Jupyter או ממשק המשתמש של Jupyter (מקלידים את ההודעה ולוחצים על הלחצן 'נבדק').
git commit -m "message goes here"
  1. צריך לדחוף את השינויים למאגר המרוחק באמצעות הטרמינל Jupyter או ממשק המשתמש של Jupyter (לוחצים על הסמל 'התראות על שינויים שבוצעו' 71c61a74bb205ed1.png).
git push --all
  1. במסוף GCP, עוברים אל Source Repositories. לוחצים על my-ai-notebooks. שימו לב ש-"fhir_data_from_bigquery.ipynb" שמור עכשיו ב-GCP Source Repository.

7a6b802d90743182.jpeg

8. הסרת המשאבים

כדי להימנע מצבירת חיובים בחשבון Google Cloud Platform על המשאבים שבהם השתמשתם ב-Codelab הזה, אחרי שמסיימים את המדריך, אפשר למחוק את המשאבים שיצרתם ב-GCP כדי שהם לא ינצלו את המכסה שלכם ולא תחויבו עליהם בעתיד. בסעיפים הבאים מוסבר איך למחוק או להשבית את המשאבים האלו.

מחיקת מערך הנתונים ב-BigQuery

יש לפעול לפי ההוראות הבאות כדי למחוק את מערך הנתונים ב-BigQuery שנוצר במסגרת המדריך הזה. אפשרות אחרת היא לעבור למסוף BigQuery, בפרויקט UnPIN hcls-testing-data, אם השתמשתם במערך הנתונים לבדיקה fhir_20k_patients_analytics.

בתהליך השבתה של מכונה של notebooks ב-AI Platform

יש לפעול לפי ההוראות בקישור הזה כיבוי מופע של notebook | notebooks של AI Platform כדי להשבית מכונה של 'notebooks של AI Platform'.

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. נכנסים לדף Projects במסוף GCP. לדף 'פרויקטים'
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על מחיקה.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

9. מזל טוב

כל הכבוד, השלמת בהצלחה את שיעור ה-Lab של הקוד כדי לגשת לנתוני בריאות בפורמט FHIR, לשלוח שאילתות ולנתח אותם באמצעות BigQuery ו-AI Platform Notebooks.

נכנסת למערך נתונים ציבורי של BigQuery ב-GCP.

פיתחתם ובדקתם שאילתות SQL באמצעות ממשק המשתמש של BigQuery.

יצרתם והשקתם מכונה של AI Platform Notebooks.

הרצתם שאילתות SQL ב-JupyterLab ואחסנתם את תוצאות השאילתה ב-Pandas DataFrame.

יצרת תרשימים וגרפים באמצעות Matplotlib.

התחייבתם והעברתם את ה-notebook שלכם ל-Cloud Source Repository ב-GCP.

עכשיו אתם יודעים מהם השלבים העיקריים שנדרשים כדי להתחיל את התהליך של ניתוח נתוני בריאות עם BigQuery ו-AI Platform ב-Google Cloud Platform.

©Google, Inc. או השותפים העצמאיים שלה. כל הזכויות שמורות. אסור להפיץ.