Введение. В сфере здравоохранения стандарт Fast Healthcare Interoperability Resources (FHIR) стал ведущей основой для обмена электронными медицинскими картами. FHIR определяет набор ресурсов и форматов данных для представления медицинской информации. Однако работа с данными FHIR иногда может быть сложной из-за их иерархической структуры. В этом сообщении блога мы рассмотрим, как мощная функция нормализатора JSON библиотеки Pandas может упростить процесс сериализации данных FHIR в Panda DataFrame и наоборот. Особое внимание мы уделим технике рекурсивного выравнивания для эффективной обработки сложных вложенных структур.

Понимание данных FHIR. Прежде чем углубляться в технические детали, давайте кратко разберемся со структурой данных FHIR. Ресурсы FHIR представлены с помощью иерархической модели с вложенными элементами. Каждый тип ресурсов имеет свой собственный набор свойств и взаимосвязей, что затрудняет непосредственную обработку и анализ данных.

Представляем Panda JSON Normalizer: Pandas — это популярная библиотека Python, которая предоставляет высокопроизводительные инструменты для обработки и анализа данных. Одной из его менее известных функций является нормализатор JSON, который позволяет нам преобразовывать вложенные структуры JSON в плоские таблицы. Эта возможность оказывается бесценной при работе с данными FHIR.

Рекурсивное выравнивание. Рекурсивное выравнивание — это метод, который итеративно выравнивает вложенные структуры, расширяя каждый уровень иерархии. Используя нормализатор Panda JSON с рекурсивным выравниванием, мы можем легко преобразовать сложные данные FHIR в Pandas DataFrame, который представляет собой двумерную табличную структуру данных.

Давайте рассмотрим пример, в котором у нас есть ресурс FHIR, такой как запись пациента, который содержит вложенные элементы, такие как адреса, контактные данные и наблюдения. С помощью рекурсивного выравнивания мы можем преобразовать эти вложенные структуры в единую плоскую таблицу, что упрощает обработку и анализ данных.

Сериализация FHIR в Panda DataFrame: Чтобы сериализовать данные FHIR в Panda DataFrame, мы можем выполнить следующие шаги:

  1. Импортируйте необходимые библиотеки. Импортируйте необходимые библиотеки, включая Pandas и любые специфичные для FHIR библиотеки, такие как библиотека FHIR-py для работы с ресурсами FHIR.
from pandas import json_normalize
import ndjson
import pandas as pd
import json
import torch
  1. Извлечение данных FHIR. Извлеките данные FHIR, либо запросив API, либо прочитав их из файла. В этом случае мы открываем файл NDJSON, где каждая строка является ресурсом FHIR.
  2. Преобразование JSON в DataFrame: используйте нормализатор Pandas JSON для преобразования данных FHIR из формата JSON в DataFrame. Примените рекурсивное выравнивание для эффективной обработки вложенных структур.
#MIT License
def flatten_json(nested_json):
    out = {}

    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x

    flatten(nested_json)
    return out

Он также нормализовал рекурсивно сплющенную структуру:

df = pd.json_normalize(flat)

Выполнение анализа и манипуляций: когда данные FHIR находятся в формате DataFrame, мы можем легко выполнять различные манипуляции с данными, такие как фильтрация, сортировка, агрегирование и визуализация данных.

Десериализация Panda DataFrame в FHIR: С другой стороны, если мы хотим преобразовать Panda DataFrame обратно в формат FHIR, мы можем выполнить следующие шаги:

#MIT License
def unnest_row(row):
    unnested = {}
    for col in row.index:
        keys = col.split('_')
        current = unnested
        for k in keys[:-1]:
            if k not in current:
                current[k] = {}
            current = current[k]
        current[keys[-1]] = row[col]
    return unnested

Полная процедура для запуска теста этого выглядит следующим образом:

#MIT License
with open('Patient.ndjson', encoding='utf-8') as f:
    data = ndjson.load(f)
    for line in data:
        # json_data is the JSON object
        df = json_normalize(line)
        flat = flatten_json(line)
        df = pd.json_normalize(flat)

        # Iterate through each row in the DataFrame
        for index, row in df.iterrows():
            print(f"Index: {index}")
            print(f"Row data: \n{row}")
            print("-----")
            # Unnest each row and convert back to JSON
            unnested_json = df.apply(unnest_row, axis=1).to_json()
            print(json.dumps(json.loads(unnested_json), separators=(',', ':')))

Как видите, FHIR трансформируется в Panda DataFrame и обратно!

Вывод: использование нормализатора Panda JSON с рекурсивным выравниванием значительно упрощает процесс сериализации данных FHIR в Panda DataFrame и наоборот. Используя этот метод, медицинские работники и разработчики могут эффективно работать с данными FHIR, выполнять анализ данных и создавать передовые приложения для взаимодействия в сфере здравоохранения. Сочетание FHIR и Panda позволяет нам раскрыть весь потенциал данных о здоровье структурированным и управляемым образом.