Phân tích dữ liệu lâm sàng bằng Sổ tay BigQuery và AI Platform

1. Giới thiệu

139d6fa46b10ab12.png

Lần cập nhật gần đây nhất: ngày 22 tháng 9 năm 2022

Lớp học lập trình này triển khai một mẫu để truy cập và phân tích dữ liệu chăm sóc sức khoẻ được tổng hợp trong BigQuery bằng BigQueryUI và Notebooks trên Nền tảng Trí tuệ nhân tạo. Ví dụ này minh hoạ việc khám phá dữ liệu của các tập dữ liệu lớn về sức khoẻ bằng các công cụ quen thuộc như Pandas, Matplotlib, v.v. trong một Sổ tay Nền tảng Trí tuệ nhân tạo tuân thủ HIPPA. "Mẹo" là thực hiện phần đầu tiên của quá trình tổng hợp trong BigQuery, nhận lại một tập dữ liệu Pandas rồi làm việc với tập dữ liệu Pandas nhỏ hơn đó trên thiết bị. AI Platform Notebooks cung cấp trải nghiệm Jupyter được quản lý, vì vậy bạn không cần tự chạy máy chủ sổ tay. AI Platform Notebooks được tích hợp tốt với các dịch vụ khác của GCP như BigQuery và Cloud Storage, giúp bạn nhanh chóng và dễ dàng bắt đầu hành trình Phân tích dữ liệu và học máy trên Google Cloud Platform.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách:

  • Phát triển và kiểm thử các truy vấn SQL bằng giao diện người dùng BigQuery.
  • Tạo và chạy một phiên bản AI Platform Notebooks trong GCP.
  • Thực thi các truy vấn SQL từ sổ tay và lưu trữ kết quả truy vấn trong Pandas DataFrame.
  • Tạo biểu đồ và đồ thị bằng Matplotlib.
  • Xác nhận và đẩy sổ tay lên Cloud Source Repository trong GCP.

Bạn cần những gì để chạy lớp học lập trình này?

  • Bạn cần có quyền truy cập vào một Dự án trên Google Cloud Platform.
  • Bạn cần được chỉ định vai trò Chủ sở hữu cho Dự án GCP.
  • Bạn cần có tập dữ liệu về sức khoẻ trong BigQuery.

Nếu bạn chưa có Dự án GCP, hãy làm theo các bước này để tạo một Dự án GCP mới.

2. Thiết lập dự án

Trong lớp học lập trình này, chúng ta sẽ sử dụng một tập dữ liệu hiện có trong BigQuery (hcls-testing-data.fhir_20k_patients_analytics). Tập dữ liệu này được điền sẵn dữ liệu y tế tổng hợp.

Truy cập vào tập dữ liệu tổng hợp

  1. Từ địa chỉ email mà bạn đang dùng để đăng nhập vào Cloud Console, hãy gửi email đến hcls-solutions-external+subscribe@google.com để yêu cầu tham gia.
  2. Bạn sẽ nhận được email hướng dẫn cách xác nhận hành động này.
  3. Sử dụng lựa chọn trả lời email để tham gia nhóm. KHÔNG nhấp vào nút 525a0fa752e0acae.png.
  4. Sau khi nhận được email xác nhận, bạn có thể chuyển sang bước tiếp theo trong lớp học lập trình.

Ghim dự án

  1. Trong Bảng điều khiển GCP, hãy chọn dự án của bạn, rồi chuyển đến BigQuery.
  2. Nhấp vào trình đơn thả xuống +THÊM DỮ LIỆU, rồi chọn "Ghim dự án" > "Nhập tên dự án" .

55257ed5931961c6.png

  1. Nhập tên dự án "hcls-testing-data", rồi nhấp vào PIN. Bạn có thể sử dụng tập dữ liệu kiểm thử BigQuery "fhir_20k_patients_analytics".

f9038e2a21e143fd.png

3. Phát triển truy vấn bằng giao diện người dùng BigQuery

Chế độ cài đặt giao diện người dùng BigQuery

  1. Chuyển đến bảng điều khiển BigQuery bằng cách chọn BigQuery trong trình đơn GCP ("hamburger") ở trên cùng bên trái.
  2. Trong bảng điều khiển BigQuery, hãy nhấp vào Tuỳ chọn khác → Cài đặt truy vấn và đảm bảo rằng bạn KHÔNG đánh dấu vào trình đơn SQL cũ (chúng ta sẽ sử dụng SQL chuẩn).

455c6c3ed93e9a63.png

Tạo truy vấn

Trong cửa sổ Trình chỉnh sửa truy vấn, hãy nhập truy vấn sau rồi nhấp vào "Chạy" để thực thi truy vấn đó. Sau đó, hãy xem kết quả trong cửa sổ "Query results" (Kết quả truy vấn).

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

Truy vấn trong "Trình chỉnh sửa truy vấn" và kết quả:

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

Kết quả truy vấn:

9515eb63813617e0.png

TỔ CHỨC TRUY VẤN

Thay đổi mã nhận dạng tổ chức cho phù hợp với tập dữ liệu của bạn.

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

Kết quả truy vấn:

79a7afe2dd7fca87.png

TRUY VẤN CÁC LẦN GẶP GỠ CỦA BỆNH NHÂN

#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

Kết quả truy vấn:

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

Kết quả truy vấn:

2087792ce2a67e97.png

LẤY TẤT CẢ BỆNH NHÂN CÓ TỶ LỆ 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'

Kết quả truy vấn:

65be2450ecd92485.png

4. Tạo phiên bản AI Platform Notebooks

Làm theo hướng dẫn trong đường liên kết này để tạo một phiên bản AI Platform Notebooks (JupyterLab) mới.

Vui lòng nhớ bật Compute Engine API.

Bạn có thể chọn " Tạo sổ tay mới bằng các lựa chọn mặc định" hoặc " Tạo sổ tay mới và chỉ định các lựa chọn của bạn".

5. Tạo sổ tay phân tích dữ liệu

Mở phiên bản Sổ tay Nền tảng Trí tuệ nhân tạo

Trong phần này, chúng ta sẽ tạo và viết mã cho một sổ tay Jupyter mới từ đầu.

  1. Mở một phiên bản sổ tay bằng cách chuyển đến trang AI Platform Notebooks trong Bảng điều khiển Google Cloud Platform. CHUYỂN ĐẾN TRANG SỔ TAY CỦA NỀN TẢNG AI
  2. Chọn Open JupyterLab (Mở JupyterLab) cho phiên bản mà bạn muốn mở.

82457955b63cbffa.png

  1. Nền tảng Trí tuệ nhân tạo Notebooks sẽ chuyển hướng bạn đến một URL cho phiên bản sổ tay của bạn.

7705bf2f2d9b1b20.png

Tạo sổ ghi chú

  1. Trong JupyterLab, hãy chuyển đến File (Tệp) -> New (Mới) -> Notebook (Sổ tay) rồi chọn Kernel (Nhân) "Python 3" trong cửa sổ bật lên, hoặc chọn "Python 3" trong phần Notebook (Sổ tay) trong cửa sổ trình chạy để tạo một sổ tay Untitled.ipynb.

d0ae87f0bdac3205.png

  1. Nhấp chuột phải vào Untitled.ipynb rồi đổi tên sổ tay thành "fhir_data_from_bigquery.ipynb". Nhấp đúp để mở, tạo truy vấn và lưu sổ tay.
  2. Bạn có thể tải sổ tay xuống bằng cách nhấp chuột phải vào tệp *.ipynb rồi chọn Tải xuống trong trình đơn.

fc16337ffd9b1730.png

  1. Bạn cũng có thể tải một sổ tay hiện có lên bằng cách nhấp vào nút "Mũi tên lên".

49373254fbf1ddf9.png

Tạo và thực thi từng khối mã trong sổ tay

Sao chép và thực thi từng khối mã được cung cấp trong phần này theo từng bước. Để thực thi mã, hãy nhấp vào "Run" (Chạy) (Hình tam giác).

e6d8b08c124c675e.png

Lấy thời gian lưu trú cho các lần gặp mặt tính bằng giờ

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

Mã và kết quả thực thi:

e7d37ff4d0d91518.png

Nhận thông tin quan sát – Giá trị cholesterol

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

Kết quả thực thi:

7f43408857c0335.png

Nhận các phân vị tương đối của lượt gặp gỡ

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

Kết quả thực thi:

4c2313fae0ebe007.png

Nhận Thời lượng trung bình của các cuộc hẹn (tính bằng phút)

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

Kết quả thực thi:

a0cdbe42751f14f7.png

Nhận số lượt gặp gỡ mỗi bệnh nhân

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

Kết quả thực thi:

3ed6b4d6a1652de0.png

Lấy thông tin về tổ chức

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

Kết quả thực thi:

886b2e99a889422e.png

Thu hút bệnh nhân

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

Kết quả thực thi:

61533f943001c446.png

6. Tạo biểu đồ và đồ thị trong Nền tảng Trí tuệ nhân tạo Notebooks

Thực thi các ô mã trong sổ tay "fhir_data_from_bigquery.ipynb" để vẽ biểu đồ thanh.

Ví dụ: lấy độ dài trung bình của các Lượt truy cập tính bằng phút.

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

Mã và kết quả thực thi:

e48071e58960f124.png

7. Cam kết Sổ tay với Cloud Source Repository

  1. Trong Bảng điều khiển GCP, hãy chuyển đến Source Repositories (Kho lưu trữ mã nguồn). Nếu đây là lần đầu tiên bạn sử dụng, hãy nhấp vào Bắt đầu, rồi nhấp vào Tạo kho lưu trữ.

475d9a5c1d5dedc5.png

  1. Vào lần tiếp theo, hãy chuyển đến GCP -> Cloud Source Repositories rồi nhấp vào +Thêm kho lưu trữ để tạo một kho lưu trữ mới.

44416312bf155af1.png

  1. Chọn "Create a new Repository" (Tạo kho lưu trữ mới), sau đó nhấp vào Continue (Tiếp tục).
  2. Cung cấp tên kho lưu trữ và tên dự án, sau đó nhấp vào Tạo.

ec2f3eaed74c2e0.png

  1. Chọn "Sao chép kho lưu trữ của bạn vào một kho lưu trữ Git cục bộ", sau đó chọn Thông tin đăng nhập được tạo theo cách thủ công.
  2. Làm theo hướng dẫn ở bước 1 "Tạo và lưu trữ thông tin đăng nhập Git" (xem bên dưới). Sao chép tập lệnh xuất hiện trên màn hình.

2089de5541527107.jpeg

  1. Bắt đầu phiên thiết bị đầu cuối trong Jupyter.

a2b49535e36a9d5c.png

  1. Dán tất cả các lệnh trong cửa sổ "Configure Git" (Định cấu hình Git) vào cửa sổ dòng lệnh Jupyter.
  2. Sao chép đường dẫn sao chép kho lưu trữ từ kho lưu trữ nguồn trên đám mây của GCP (bước 2 trong ảnh chụp màn hình bên dưới).

ba6a61ae8a4d9f9b.png

  1. Dán lệnh này vào dòng lệnh JupiterLab. Lệnh sẽ có dạng như sau:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. Thư mục "my-ai-notebooks" được tạo trong Jupyterlab.

19a2b2c910b3df3.png

  1. Di chuyển sổ tay (fhir_data_from_bigquery.ipynb) vào thư mục "my-ai-notebooks".
  2. Trong thiết bị đầu cuối Jupyter, hãy thay đổi thư mục thành "cd my-ai-notebooks".
  3. Giai đoạn thay đổi bằng thiết bị đầu cuối Jupyter. Ngoài ra, bạn có thể sử dụng giao diện người dùng Jupyter (nhấp chuột phải vào các tệp trong khu vực Untracked (Chưa được theo dõi), chọn Track (Theo dõi), sau đó các tệp sẽ được chuyển vào khu vực Tracked (Đã được theo dõi) và ngược lại. Vùng thay đổi chứa các tệp đã sửa đổi).
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Xác nhận các thay đổi bằng cách sử dụng thiết bị đầu cuối Jupyter hoặc giao diện người dùng Jupyter (nhập thông báo, sau đó nhấp vào nút "Đã kiểm tra").
git commit -m "message goes here"
  1. Đẩy các thay đổi của bạn lên kho lưu trữ từ xa bằng cách sử dụng thiết bị đầu cuối Jupyter hoặc giao diện người dùng Jupyter (nhấp vào biểu tượng "đẩy các thay đổi đã cam kết" 71c61a74bb205ed1.png).
git push --all
  1. Trong bảng điều khiển GCP, hãy chuyển đến Source Repositories (Kho lưu trữ nguồn). Nhấp vào my-ai-notebooks. Xin lưu ý rằng "fhir_data_from_bigquery.ipynb" hiện đã được lưu trong Kho lưu trữ nguồn GCP.

7a6b802d90743182.jpeg

8. Dọn dẹp

Để tránh phát sinh phí cho tài khoản Google Cloud Platform của bạn đối với các tài nguyên được dùng trong lớp học lập trình này, sau khi hoàn tất hướng dẫn, bạn có thể dọn dẹp các tài nguyên mà bạn đã tạo trên GCP để chúng không chiếm hạn mức của bạn và bạn sẽ không bị tính phí cho các tài nguyên đó trong tương lai. Các phần sau đây mô tả cách xoá hoặc tắt các tài nguyên này.

Xoá tập dữ liệu BigQuery

Hãy làm theo các hướng dẫn này để xoá tập dữ liệu BigQuery mà bạn đã tạo trong hướng dẫn này. Hoặc chuyển đến bảng điều khiển BigQuery, bỏ GHI dự án hcls-testing-data nếu bạn đã sử dụng tập dữ liệu thử nghiệm fhir_20k_patients_analytics.

Tắt phiên bản AI Platform Notebooks

Làm theo hướng dẫn trong đường liên kết này Tắt một phiên bản sổ tay | Sổ tay Nền tảng Trí tuệ nhân tạo để tắt một phiên bản Sổ tay Nền tảng Trí tuệ nhân tạo.

Xoá dự án

Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.

Cách xoá dự án:

  1. Trong Bảng điều khiển của GCP, hãy chuyển đến trang Dự án. CHUYỂN ĐẾN TRANG DỰ ÁN
  2. Trong danh sách dự án, hãy chọn dự án bạn muốn xoá rồi nhấp vào Xoá.
  3. Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.

9. Xin chúc mừng

Chúc mừng bạn đã hoàn thành thành công lớp học lập trình để truy cập, truy vấn và phân tích dữ liệu chăm sóc sức khoẻ được định dạng FHIR bằng BigQuery và Nền tảng Trí tuệ nhân tạo Notebooks.

Bạn đã truy cập vào một tập dữ liệu công khai trên BigQuery trong GCP.

Bạn đã phát triển và kiểm thử các truy vấn SQL bằng giao diện người dùng BigQuery.

Bạn đã tạo và chạy một phiên bản AI Platform Notebooks.

Bạn đã thực thi các truy vấn SQL trong JupyterLab và lưu trữ kết quả truy vấn trong Pandas DataFrame.

Bạn đã tạo biểu đồ và đồ thị bằng Matplotlib.

Bạn đã xác nhận và chuyển sổ tay của mình lên Cloud Source Repository trong GCP.

Giờ đây, bạn đã biết các bước chính cần thiết để bắt đầu hành trình Phân tích dữ liệu y tế bằng BigQuery và Nền tảng Trí tuệ nhân tạo Notebooks trên Google Cloud Platform.

©Google, Inc. hoặc các đơn vị liên kết của Google. Bảo lưu mọi quyền. Không được phân phối.