1. מבוא

העדכון האחרון: 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). קבוצת הנתונים הזו מאוכלסת מראש בנתונים סינתטיים של שירותי בריאות.
גישה למערך הנתונים הסינתטי
- מכתובת האימייל שבה אתם משתמשים כדי להיכנס למסוף Cloud, שולחים אימייל אל hcls-solutions-external+subscribe@google.com ומבקשים להצטרף.
- תקבלו אימייל עם הוראות לאישור הפעולה.
- משתמשים באפשרות להשיב לאימייל כדי להצטרף לקבוצה. אל תלחצו על הלחצן
. - אחרי שתקבלו את אישור ההרשמה באימייל, תוכלו להמשיך לשלב הבא ב-codelab.
הצמדת הפרויקט
- במסוף GCP, בוחרים את הפרויקט ועוברים אל BigQuery.
- לוחצים על התפריט הנפתח +הוספת נתונים, בוחרים באפשרות 'הצמדת פרויקט' > 'הזנת שם הפרויקט' .

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

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

יצירת שאילתות
בחלון עורך השאילתות, מקלידים את השאילתה הבאה ולוחצים על 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
שאילתה ב'עורך השאילתות' ותוצאות:

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
תוצאות השאילתה:

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"
תוצאות השאילתה:

שאילתות לגבי מפגשים עם מטופלים
#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
תוצאות השאילתה:

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
תוצאות השאילתה:

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'
תוצאות השאילתה:

4. יצירת מכונה של 'שירות ניסוי ופיתוח של AI Platform'
פועלים לפי ההוראות בקישור הזה כדי ליצור מופע חדש של AI Platform Notebooks (JupyterLab).
חשוב להפעיל את Compute Engine API.
אפשר לבחור באפשרות יצירת מחברת חדשה עם אפשרויות ברירת מחדל או באפשרות יצירת מחברת חדשה וציון האפשרויות.
5. יצירת מחברת לניתוח נתונים
פתיחת מכונה של 'שירות ניסוי ופיתוח של AI Platform'
בקטע הזה ניצור קוד ונכתוב מחברת Jupyter חדשה מאפס.
- פותחים מחברת של AI Platform Notebooks בדף AI Platform Notebooks ב-Google Cloud Platform Console. כניסה לדף של שירות ניסוי ופיתוח של AI Platform
- בוחרים באפשרות Open JupyterLab עבור המופע שרוצים לפתוח.

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

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

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

- אפשר גם להעלות מחברת קיימת בלחיצה על הלחצן 'חץ למעלה'.

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

קבלת משך השהייה במפגשים בשעות
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()
קוד ופלט הרצה:

קבלת תצפיות – ערכי כולסטרול
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()
פלט ההרצה:

קבלת אומדנים של אחוזונים של מפגשים
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()
פלט ההרצה:

משך המפגש הממוצע בדקות
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()
פלט ההרצה:

קבלת נתונים על מפגשים עם מטופלים
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()
פלט ההרצה:

קבלת ארגונים
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()
תוצאת ההרצה:

השגת מטופלים
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()
תוצאות ההרצה:

6. יצירת תרשימים וגרפים ב-AI Platform Notebooks
מריצים תאי קוד במחברת fhir_data_from_bigquery.ipynb כדי ליצור תרשים עמודות.
לדוגמה, אפשר לקבל את האורך הממוצע של מפגשים בדקות.
df4.plot(kind='bar', x='encounter_class', y='avg_minutes');
קוד ותוצאות הרצה:

7. שמירת ה-Notebook ב-Cloud Source Repository
- במסוף GCP, עוברים אל Source Repositories. אם זו הפעם הראשונה שאתם משתמשים ב-GitHub, לוחצים על Get started (שנתחיל?) ואז על Create repository (יצירת מאגר).

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

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

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

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

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

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

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

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

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.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.
כדי למחוק את הפרויקט:
- במסוף GCP, נכנסים לדף Projects. כניסה לדף Projects
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על מחיקה.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על 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. או השותפים העצמאיים שלה. כל הזכויות שמורות. אין להפיץ.