Анализируйте клинические данные с помощью блокнотов BigQuery и платформы искусственного интеллекта.

1. Введение

139d6fa46b10ab12.png

Последнее обновление : 22.09.2022

В этом практическом занятии реализован шаблон для доступа и анализа данных здравоохранения, агрегированных в BigQuery, с использованием BigQueryUI и AI Platform Notebooks. Он демонстрирует исследование больших наборов данных здравоохранения с помощью таких привычных инструментов, как Pandas, Matplotlib и др., в AI Platform Notebooks, соответствующих требованиям HIPPA. «Хитрость» заключается в том, чтобы выполнить первую часть агрегации в BigQuery, получить набор данных Pandas, а затем работать с меньшим набором данных Pandas локально. AI Platform Notebooks предоставляет управляемый интерфейс Jupyter, поэтому вам не нужно запускать серверы блокнотов самостоятельно. AI Platform Notebooks хорошо интегрирован с другими сервисами GCP, такими как Big Query и Cloud Storage, что делает быстрым и простым начало вашего пути в области анализа данных и машинного обучения на платформе Google Cloud Platform.

В этой практической работе по программированию вы научитесь:

  • Разрабатывайте и тестируйте SQL-запросы с использованием пользовательского интерфейса BigQuery.
  • Создайте и запустите экземпляр AI Platform Notebooks в GCP.
  • Выполняйте SQL-запросы из блокнота и сохраняйте результаты запросов в DataFrame Pandas.
  • Создавайте диаграммы и графики с помощью Matplotlib.
  • Зафиксируйте изменения и отправьте ноутбук в облачный репозиторий исходного кода в GCP.

Что вам понадобится для проведения этого практического занятия?

  • Вам необходим доступ к проекту GCP .
  • Вам необходимо присвоить роль «Владелец» для проекта GCP.
  • Вам потребуется набор данных по здравоохранению для работы в BigQuery.

Если у вас нет проекта GCP, выполните следующие шаги для создания нового проекта GCP.

2. Настройка проекта

Для этого практического занятия мы будем использовать существующий набор данных в BigQuery ( hcls-testing-data.fhir_20k_patients_analytics ). Этот набор данных предварительно заполнен синтетическими данными из сферы здравоохранения.

Получите доступ к синтетическому набору данных.

  1. Отправьте письмо на адрес hcls-solutions-external+subscribe@google.com с того адреса электронной почты, который вы используете для входа в Cloud Console, с просьбой о присоединении.
  2. Вы получите электронное письмо с инструкциями по подтверждению действия.
  3. Воспользуйтесь возможностью ответить на электронное письмо, чтобы присоединиться к группе. НЕ нажимайте на кнопку. 525a0fa752e0acae.png кнопка.
  4. После получения подтверждающего письма вы можете перейти к следующему шагу в практическом задании.

Закрепить проект

  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 нажмите «Дополнительно» → «Настройки запроса» и убедитесь, что пункт «Устаревший SQL» НЕ отмечен ( мы будем использовать стандартный SQL ).

455c6c3ed93e9a63.png

Создание запросов

В окне редактора запросов введите следующий запрос и нажмите кнопку «Выполнить» , чтобы его выполнить. Затем просмотрите результаты в окне «Результаты запроса» .

ПАЦИЕНТЫ, ЗАДАЮЩИЕ ЗАПРОСЫ

#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

Узнайте среднюю продолжительность столкновений по типу столкновения.

#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

Необходимо выявить всех пациентов с уровнем HbA1c >= 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 (JupyterLab), следуйте инструкциям по этой ссылке.

Пожалуйста, убедитесь, что API Compute Engine включен .

Вы можете выбрать « Создать новый блокнот с параметрами по умолчанию » или « Создать новый блокнот и указать свои параметры ».

5. Создайте блокнот для анализа данных.

Экземпляр Open AI Platform Notebooks

В этом разделе мы создадим и напишем новый блокнот Jupyter с нуля.

  1. Откройте экземпляр блокнота, перейдя на страницу « Блокноты платформы ИИ» в консоли Google Cloud Platform. ПЕРЕЙДИТЕ НА СТРАНИЦУ «БЛОКНОТЫ ПЛАТФОРМЫ ИИ»
  2. Выберите «Открыть JupyterLab» для того экземпляра, который вы хотите открыть.

82457955b63cbffa.png

  1. AI Platform Notebooks перенаправит вас на URL-адрес вашего экземпляра блокнота.

7705bf2f2d9b1b20.png

Создайте блокнот

  1. В JupyterLab перейдите в меню Файл -> Создать -> Блокнот и выберите ядро ​​"Python 3" во всплывающем окне или выберите "Python 3" в разделе Блокнот в окне запуска, чтобы создать Блокнот 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. Создавайте диаграммы и графики в блокнотах платформы ИИ.

Выполните код в ячейках блокнота "fhir_data_from_bigquery.ipynb", чтобы построить столбчатую диаграмму.

Например, получите среднюю продолжительность столкновений в минутах.

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

Код и результаты выполнения:

e48071e58960f124.png

7. Зафиксируйте изменения в блокноте в облачном репозитории исходного кода.

  1. В консоли GCP перейдите в раздел «Репозитории исходного кода». Если вы используете его впервые, нажмите «Начать», а затем «Создать репозиторий».

475d9a5c1d5dedc5.png

  1. В дальнейшем перейдите в GCP -> Cloud Source Repositories и нажмите +Add repository, чтобы создать новый репозиторий.

44416312bf155af1.png

  1. Выберите «Создать новый репозиторий», затем нажмите «Продолжить».
  2. Укажите название репозитория и название проекта, затем нажмите «Создать».

ec2f3eaed74c2e0.png

  1. Выберите «Клонировать репозиторий в локальный репозиторий Git», затем выберите «Учетные данные, сгенерированные вручную».
  2. Следуйте инструкциям шага 1 «Сгенерировать и сохранить учетные данные Git» (см. ниже). Скопируйте скрипт, который появится на экране.

2089de5541527107.jpeg

  1. Запустите терминальную сессию в Jupyter.

a2b49535e36a9d5c.png

  1. Вставьте все команды из окна "Настройка Git" в терминал Jupyter.
  2. Скопируйте путь к клону репозитория из исходных репозиториев облака GCP (шаг 2 на скриншоте ниже).

ba6a61ae8a4d9f9b.png

  1. Вставьте эту команду в терминал JupiterLab. Команда будет выглядеть примерно так:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. В Jupyterlab создается папка "my-ai-notebooks".

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 или пользовательский интерфейс Jupyter (введите сообщение, затем нажмите кнопку «Checked»).
git commit -m "message goes here"
  1. Отправьте изменения в удаленный репозиторий, используя терминал Jupyter или пользовательский интерфейс Jupyter (нажмите значок «Отправить зафиксированные изменения»). 71c61a74bb205ed1.png ).
git push --all
  1. В консоли GCP перейдите в раздел «Репозитории исходного кода». Щелкните my-ai-notebooks. Обратите внимание, что файл "fhir_data_from_bigquery.ipynb" теперь сохранен в репозитории исходного кода GCP.

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. В консоли GCP перейдите на страницу «Проекты» . ПЕРЕЙДИТЕ НА СТРАНИЦУ ПРОЕКТОВ
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить» .
  3. В диалоговом окне введите идентификатор проекта, затем нажмите «Завершить» , чтобы удалить проект.

9. Поздравляем!

Поздравляем, вы успешно завершили лабораторную работу по программированию, посвященную доступу, запросам и анализу медицинских данных в формате FHIR с использованием BigQuery и AI Platform Notebooks.

Вы получили доступ к общедоступному набору данных BigQuery в GCP.

Вы разрабатывали и тестировали SQL-запросы с использованием пользовательского интерфейса BigQuery.

Вы создали и запустили экземпляр AI Platform Notebooks .

Вы выполняли SQL-запросы в JupyterLab и сохраняли результаты запросов в DataFrame Pandas.

Вы создали диаграммы и графики с помощью Matplotlib.

Вы зафиксировали изменения и отправили свой ноутбук в репозиторий Cloud Source Repository в GCP.

Теперь вы знаете ключевые шаги, необходимые для начала работы с анализом данных в сфере здравоохранения с помощью BigQuery и AI Platform Notebooks на платформе Google Cloud.

©Google, Inc. или ее дочерние компании. Все права защищены. Распространение запрещено.