تحليل البيانات السريرية باستخدام أوراق الملاحظات في BigQuery وAI Platform

1. مقدمة

139d6fa46b10ab12.png

تاريخ آخر تعديل: 22-9-2022

تنفّذ تجربة البرمجة هذه نمطًا للوصول إلى بيانات الرعاية الصحية المجمّعة في BigQuery وتحليلها باستخدام BigQueryUI وAI Platform Notebooks. يوضّح هذا المستند عملية استكشاف بيانات مجموعات بيانات الرعاية الصحية الكبيرة باستخدام أدوات مألوفة، مثل Pandas وMatplotlib وما إلى ذلك، في "دفاتر ملاحظات AI Platform" المتوافقة مع قانون HIPAA. يكمن "الحل" في إجراء الجزء الأول من التجميع في BigQuery، واسترداد مجموعة بيانات Pandas، ثم معالجة مجموعة بيانات Pandas الأصغر محليًا. توفّر أجهزة الكمبيوتر الدفتري في "منصة الذكاء الاصطناعي" تجربة مُدارة في Jupyter، وبالتالي لن تحتاج إلى تشغيل خوادم الكمبيوتر الدفتري بنفسك. تتكامل خدمة AI Platform Notebooks بشكل جيد مع خدمات GCP الأخرى، مثل BigQuery وCloud Storage، ما يجعل بدء رحلة "تحليلات البيانات" و"تعلُّم الآلة" على Google Cloud Platform أمرًا سريعًا وبسيطًا.

في هذا الدرس العملي، ستتعرّف على كيفية:

  • إنشاء طلبات بحث SQL واختبارها باستخدام واجهة مستخدم BigQuery
  • أنشِئ وأطلِق مثيلاً من AI Platform Notebooks في GCP.
  • تنفيذ طلبات بحث SQL من دفتر الملاحظات وتخزين نتائج طلب البحث في Pandas DataFrame
  • إنشاء رسومات بيانية ومخططات باستخدام مكتبة مات بلوت ليب
  • إجراء عملية الإيداع ونقل دفتر الملاحظات إلى Cloud Source Repository في Google Cloud Platform

المتطلبات اللازمة لتشغيل هذا الدرس التطبيقي حول الترميز

  • يجب أن يكون لديك إذن الوصول إلى مشروع GCP.
  • يجب أن يتمّ منحك دور مالك لمشروع Google Cloud Platform.
  • يجب أن يكون لديك مجموعة بيانات رعاية صحية في BigQuery.

إذا لم يكن لديك مشروع على Google Cloud Platform، اتّبِع هذه الخطوات لإنشاء مشروع جديد على Google Cloud Platform.

2. إعداد المشروع

في هذا الدرس التطبيقي حول الترميز، سنستخدم مجموعة بيانات حالية في BigQuery (hcls-testing-data.fhir_20k_patients_analytics). تتم تعبئة مجموعة البيانات هذه مسبقًا ببيانات رعاية صحية اصطناعية.

الوصول إلى مجموعة البيانات الاصطناعية

  1. من عنوان البريد الإلكتروني الذي تستخدمه لتسجيل الدخول إلى Cloud Console، أرسِل رسالة إلكترونية إلى hcls-solutions-external+subscribe@google.com تطلب فيها الانضمام.
  2. ستتلقّى رسالة إلكترونية تتضمّن تعليمات حول كيفية تأكيد الإجراء.
  3. استخدِم الخيار للردّ على الرسالة الإلكترونية للانضمام إلى المجموعة. لا تنقر على الزر 525a0fa752e0acae.png.
  4. بعد تلقّي رسالة التأكيد الإلكترونية، يمكنك الانتقال إلى الخطوة التالية في الدرس العملي.

تثبيت المشروع

  1. في "وحدة تحكّم Google Cloud"، اختَر مشروعك، ثم انتقِل إلى 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، انقر على المزيد → إعدادات طلب البحث وتأكَّد من عدم وضع علامة في قائمة "لغة SQL القديمة" (سنستخدم لغة SQL العادية).

455c6c3ed93e9a63.png

إنشاء طلبات البحث

في نافذة "محرّر طلب البحث"، اكتب طلب البحث التالي وانقر على "تنفيذ" لتنفيذه. بعد ذلك، اعرض النتائج في نافذة "نتائج طلب البحث".

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

تنظيم طلب البحث

غيِّر معرّف المؤسسة ليتطابق مع مجموعة البيانات.

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

اتّبِع التعليمات الواردة في هذا الرابط لإنشاء مثيل جديد من AI Platform Notebooks (JupyterLab).

يُرجى التأكّد من تفعيل Compute Engine API.

يمكنك اختيار " إنشاء دفتر ملاحظات جديد باستخدام الخيارات التلقائية" أو " إنشاء دفتر ملاحظات جديد وتحديد خياراتك".

5- إنشاء دفتر ملاحظات لتحليل البيانات

فتح مثيل "دفاتر ملاحظات AI Platform"

في هذا القسم، سننشئ ونبرمج دفتر ملاحظات جديدًا في Jupyter من البداية.

  1. افتح مثيل دفتر ملاحظات من خلال الانتقال إلى صفحة AI Platform Notebooks في "وحدة تحكّم Google Cloud Platform". الانتقال إلى صفحة "دفاتر الملاحظات" في منصة الذكاء الاصطناعي
  2. انقر على فتح JupyterLab للمثيل الذي تريد فتحه.

82457955b63cbffa.png

  1. توجّهك خدمة "دفاتر ملاحظات AI Platform" إلى عنوان URL خاص بمثيل دفتر الملاحظات.

7705bf2f2d9b1b20.png

إنشاء دفتر ملاحظات

  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

إنشاء كل مجموعة رموز وتنفيذها في ورقة الملاحظات

انسخ كل مجموعة رموز مقدَّمة في هذا القسم ونفِّذها واحدة تلو الأخرى. لتنفيذ الرمز، انقر على "تشغيل" (المثلث).

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"

نفِّذ خلايا الرموز البرمجية في دفتر الملاحظات "fhir_data_from_bigquery.ipynb" لرسم رسم بياني شريطي.

على سبيل المثال، يمكنك الحصول على متوسط مدة "المواجهات" بالدقائق.

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

الرمز البرمجي ونتائج التنفيذ:

e48071e58960f124.png

7. إرسال دفتر ملاحظات إلى Cloud Source Repository

  1. في "وحدة تحكّم Google Cloud Platform"، انتقِل إلى "مستودعات المصدر". إذا كانت هذه هي المرة الأولى التي تستخدم فيها هذه الميزة، انقر على "البدء"، ثم على "إنشاء مستودع".

475d9a5c1d5dedc5.png

  1. في المرة التالية، انتقِل إلى GCP -> Cloud Source Repositories، وانقر على +إضافة مستودع لإنشاء مستودع جديد.

44416312bf155af1.png

  1. اختَر "إنشاء مستودع جديد"، ثم انقر على "متابعة".
  2. أدخِل اسم المستودع واسم المشروع، ثم انقر على "إنشاء".

ec2f3eaed74c2e0.png

  1. اختَر "استنساخ المستودع إلى مستودع Git محلي" (Clone your repository to a local Git repository)، ثمّ اختَر "بيانات الاعتماد التي تم إنشاؤها يدويًا" (Manually generated credentials).
  2. اتّبِع تعليمات الخطوة 1 "إنشاء بيانات اعتماد Git وتخزينها" (راجِع ما يلي). انسخ النص البرمجي الذي يظهر على الشاشة.

2089de5541527107.jpeg

  1. ابدأ جلسة Terminal في Jupyter.

a2b49535e36a9d5c.png

  1. الصِق جميع الأوامر من نافذة "إعداد 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. انقِل دفتر الملاحظات (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 (اكتب الرسالة، ثم انقر على الزر "تم التحقّق").
git commit -m "message goes here"
  1. أرسِل التغييرات إلى المستودع البعيد باستخدام نافذة أوامر Jupyter أو واجهة مستخدم Jupyter (انقر على رمز "إرسال التغييرات التي تمّت" 71c61a74bb205ed1.png).
git push --all
  1. في وحدة تحكّم Google Cloud Platform، انتقِل إلى Source Repositories. انقر على my-ai-notebooks. لاحظ أنّه تم الآن حفظ "fhir_data_from_bigquery.ipynb" في "مستودع المصدر" على Google Cloud Platform.

7a6b802d90743182.jpeg

8. تنظيف

لتجنُّب تحمُّل رسوم في حسابك على Google Cloud Platform مقابل الموارد المستخدَمة في هذا الدرس التطبيقي حول الترميز، يمكنك بعد الانتهاء من الدليل التوجيهي/التعليمي تنظيف الموارد التي أنشأتها على GCP لكي لا تستهلك حصتك، ولن يتم تحصيل رسوم منك مقابلها في المستقبل. توضّح الأقسام التالية كيفية حذف هذه الموارد أو إيقافها.

حذف مجموعة بيانات BigQuery

اتّبِع هذه التعليمات من أجل حذف مجموعة بيانات BigQuery التي أنشأتها كجزء من هذا البرنامج التعليمي. أو انتقِل إلى وحدة تحكّم BigQuery، وأزِل تثبيت المشروع hcls-testing-data إذا كنت قد استخدمت مجموعة البيانات التجريبية fhir_20k_patients_analytics.

إيقاف مثيل AI Platform Notebooks

اتّبِع التعليمات الواردة في هذا الرابط إيقاف مثيل دفتر ملاحظات | AI Platform Notebooks لإيقاف مثيل AI Platform Notebooks.

حذف المشروع

أسهل طريقة لإيقاف الفوترة هي حذف المشروع الذي أنشأته لتنفيذ البرنامج التعليمي.

لحذف المشروع، اتّبِع الخطوات التالية:

  1. في "وحدة تحكّم Google Cloud Platform"، انتقِل إلى صفحة المشاريع. الانتقال إلى صفحة المشاريع
  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه وانقر على حذف.
  3. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.

9- تهانينا

تهانينا، لقد أكملت بنجاح تجربة الترميز للوصول إلى بيانات الرعاية الصحية المنسّقة بتنسيق FHIR وإجراء طلبات بحث عنها وتحليلها باستخدام BigQuery وAI Platform Notebooks.

لقد وصلت إلى مجموعة بيانات عامة في BigQuery ضمن Google Cloud Platform.

لقد طوّرت واختبرت طلبات بحث SQL باستخدام واجهة مستخدم BigQuery.

لقد أنشأت مثيلاً من AI Platform Notebooks وأطلقته.

نفّذت استعلامات SQL في JupyterLab وخزّنت نتائج الاستعلام في Pandas DataFrame.

أنشأت مخططات ورسومًا بيانية باستخدام Matplotlib.

لقد نفّذت عملية الإيداع ونقلت دفترك إلى Cloud Source Repository في Google Cloud Platform.

أصبحت الآن على دراية بالخطوات الأساسية المطلوبة لبدء رحلة "تحليلات بيانات الرعاية الصحية" باستخدام BigQuery وAI Platform Notebooks على Google Cloud Platform.

‫©Google, Inc. ‎ أو الشركات التابعة لها. جميع الحقوق محفوظة. يُرجى عدم توزيعها.