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

1. מבוא

139d6fa46b10ab12.png

העדכון האחרון: 22 בספטמבר 2022

ב-codelab הזה מוטמע דפוס לגישה לנתוני בריאות שמצטברים ב-BigQuery ולניתוח שלהם באמצעות BigQueryUI ו-AI Platform Notebooks. הקורס כולל איורים של ניתוח נתונים של מערכי נתונים גדולים בתחום הבריאות באמצעות כלים מוכרים כמו Pandas,‏ Matplotlib וכו' ב-HIPPA compliant AI Platform Notebooks. הטריק הוא לבצע את החלק הראשון של הצבירה ב-BigQuery, לקבל בחזרה מערך נתונים של Pandas ואז לעבוד עם מערך הנתונים הקטן יותר של Pandas באופן מקומי. ‫AI Platform Notebooks מספקת חוויית Jupyter מנוהלת, כך שלא צריך להפעיל שרתי notebook בעצמכם. ‫AI Platform Notebooks משולב היטב עם שירותים אחרים של GCP כמו BigQuery ו-Cloud Storage, ולכן קל ופשוט להתחיל את המסע שלכם בניתוח נתונים וב-ML ב-Google Cloud Platform.

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

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

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

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

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

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

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

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

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

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

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

55257ed5931961c6.png

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

f9038e2a21e143fd.png

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

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

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

455c6c3ed93e9a63.png

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

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

QUERY PATIENTS

#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

QUERY PRACTITIONERS

#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

QUERY ORGANIZATION

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

#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

GET AVG LENGTH OF ENCOUNTERS BY ENCOUNTER TYPE

#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

GET ALL PATIENTS WHO HAVE 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'

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

65be2450ecd92485.png

4. יצירת מכונה של 'שירות ניסוי ופיתוח של AI Platform'

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

חשוב להפעיל את Compute Engine API.

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

5. יצירת מחברת לניתוח נתונים

פתיחת מכונה של 'שירות ניסוי ופיתוח של AI Platform'

בקטע הזה ניצור קוד ונכתוב מחברת Jupyter חדשה מאפס.

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

82457955b63cbffa.png

  1. שירות ניסוי ופיתוח של AI Platform מפנה אתכם לכתובת URL של מכונת ה-Notebook.

7705bf2f2d9b1b20.png

יצירת Notebook

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

d0ae87f0bdac3205.png

  1. לוחצים לחיצה ימנית על Untitled.ipynb ומשנים את שם המחברת ל-fhir_data_from_bigquery.ipynb. לוחצים לחיצה כפולה כדי לפתוח אותו, יוצרים את השאילתות ושומרים את המחברת.
  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. יצירת תרשימים וגרפים ב-AI Platform Notebooks

מריצים תאי קוד במחברת 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. אם זו הפעם הראשונה שאתם משתמשים ב-GitHub, לוחצים על Get started (שנתחיל?) ואז על Create repository (יצירת מאגר).

475d9a5c1d5dedc5.png

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

44416312bf155af1.png

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

ec2f3eaed74c2e0.png

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

2089de5541527107.jpeg

  1. מתחילים סשן טרמינל ב-Jupyter.

a2b49535e36a9d5c.png

  1. מדביקים את כל הפקודות מהחלון Configure Git (הגדרת Git) בטרמינל של Jupyter.
  2. מעתיקים את נתיב השכפול של המאגר מ-Cloud Source Repositories ב-GCP (שלב 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. מעבירים את המחברת (fhir_data_from_bigquery.ipynb) לתיקייה my-ai-notebooks.
  2. במסוף Jupyter, משנים את הספרייה ל-cd my-ai-notebooks.
  3. מכינים את השינויים באמצעות הטרמינל של Jupyter. אפשר גם להשתמש בממשק המשתמש של Jupyter (לוחצים לחיצה ימנית על הקבצים באזור Untracked, בוחרים באפשרות Track, ואז הקבצים מועברים לאזור Tracked, ולהפך). האזור 'השתנה' מכיל את הקבצים שעברו שינוי).
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.

7a6b802d90743182.jpeg

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

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

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

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

השבתת מכונה של 'שירות ניסוי ופיתוח של AI Platform'

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

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

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

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

  1. במסוף GCP, נכנסים לדף Projects. כניסה לדף Projects
  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 Notebooks ב-Google Cloud Platform.

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