Manipulating FHIR Resource: client-py API

SIL-Thailand
SIL-Thailand
Published in
4 min readApr 10, 2020

จัดการ FHIR Resource ด้วย Python Programming API: client-py

client-py

หลังจากที่ทดลอง operation ต่างๆ กับ FHIR resource ผ่าน RESTful APIs กันแล้ว ในตอนนี้ จะทำการอ่านข้อมูลของ Resource จาก FHIR server ผ่าน Programming APIs โดยใช้ Python

Open Source FHIR implementations ที่เป็น Python คือ client-py

Installation

client-py ใน pip package ยังเป็นเวอร์ชั่น 3.2.0 หากต้องการเวอร์ชั่น 4.0.0 ต้องติดตั้งจาก GitHub โดยตรง โดยใช้ pip3 หรือ python3 -m pip

python3 -m pip install git+https://github.com/smart-on-fhir/client-py.git

ตรวจสอบ package ที่ติดตั้งโดยใช้

python3 -m pip list | grep fhirclient หรือ

python -m pip list | findstr fhirclient (Windows)

Code

ในการติดต่อกับ FHIR server จะใช้ class FHIRServer ที่อยู่ใน namespace fhirclient.server

from fhirclient.server import FHIRServer

และ class Patient อยู่ใน namespace fhirclient.models ที่เป็น Python implementation ของ Resource models ต่างๆ ตาม FHIR specifications

from fhirclient.models.patient import Patient

สร้าง server object โดยใช้ constructor ของ class FHIRServer ตามนิยาม

Source: http://docs.smarthealthit.org/client-py/classfhirclient_1_1server_1_1_f_h_i_r_server.html

ในตอนนี้ยังไม่ได้สร้าง client object, parameter client จึงใส่ค่าเป็น None ไว้ก่อน parameter base_uri ใส่ค่าเป็น URL ของ FHIR Server ที่ต้องการใช้งาน

server = FHIRServer( None, "http://hapi.fhir.org/baseR4" )

อ่าน Patient resource จาก FHIR server โดยใช้ method read ใน FHIRAbstractResource ซึ่งเป็น base class ของ Patient resource

Source: http://docs.smarthealthit.org/client-py/classfhirclient_1_1models_1_1fhirabstractresource_1_1_f_h_i_r_abstract_resource.html#a5af139d800a3d05c0a9caf13b4dbb428

parameter rem_id คือ id ของ resource บน server ที่ต้องการ read ในที่นี้คือ id ของ Patient resource ที่ต้องการ

p = Patient.read( "921009", server )

เนื่องจาก models ต่างๆ ใน fhirclient.models เขียนขึ้นตาม FHIR specifications ดังนั้น attributes ต่างๆ รวมทั้ง Data types ของ Patient class ก็จะเป็นไปตาม elements ของ Patient resource

Source: http://docs.smarthealthit.org/client-py/classfhirclient_1_1models_1_1patient_1_1_patient.html
Source: http://hl7.org/fhir/patient.html#resource

ทำให้เข้าถึง elements ต่างๆ ของ resource ได้โดยผ่าน attributes ของ class

print( f"NAME: {p.name[0].text}" )
print( f"BIRTHDATE: {p.birthDate.date.isoformat()}" )
  • เนื่องจากนิยามของ element name ใน Patient resource มี Cardinality เป็น 0..* (มีได้มากกว่า 1) ใน Python implementation จึงเป็น Sequence
  • นอกจากนี้ element name ยังมี data type เป็นแบบ HumanName ซึ่งเป็น Complex data type เมื่อ output ออกมาทาง console จะเป็น object ของ class นั้นใน Python แต่ข้อดีของ FHIR specifications คือ มีการกำหนดให้แต่ละ resource มี Narrative/Text section ที่เป็น human-readable summary (https://medium.com/thai-fhir-sig/resource-part-3-ce17f1d6b108) ใน resource HumanName มี element text ซึ่งมี data type เป็น string จึงสามารถ output ออกมาทาง console ได้โดยตรง
  • element birthDate มี data type ตาม FHIR specifications เป็น date ซึ่งเป็น Primitive data type แต่ใน Python implementation นี้ birthDate จะมี data type เป็น class FHIRDate ใน namespace fhirclient.models.fhirdate แทน
  • ใน class FHIRDate จะมี attribute date อีกทีหนึ่งซึ่งมี data type เป็น date class ของ Python ใน module datetime ทำให้สามารถเรียกใช้ method isoformat() ของ class date ซึ่งจะ return วันที่เป็น string ตามรูปแบบ ISO กลับมา

ในครั้งก่อนนี้ ใช้ clinFHIR (http://clinfhir.com) ช่วยสร้าง Patient resource, นอกจาก Patient resource แล้ว clinFHIR ยังสร้างตัวอย่าง resource ต่างๆ เพื่อการศึกษาและทดลองใช้งาน FHIR ทางคลินิกให้อีกด้วย

สร้าง Problem list ของผู้ป่วย จาก Condition resources

Import class ที่ต้องการใช้งานเพิ่มเติมได้แก่ Condition

from fhirclient.models.condition import Condition

ทำการค้นหา Condition resource ที่มี subject=921009 โดยใช้ class method where() ที่อยู่ใน base class FHIRAbstractResource ซึ่งจะ return ค่ากลับมาเป็น FHIRSearch object

srch = Condition.where( { “subject”: “921009” } )

เรียกใช้งาน method perform_resources() ของ FHIRSearch ซึ่งจะทำการค้นหา resource ที่ตรงกับ search parameter แล้ว return ค่ากลับมาเป็น list ของ resource นั้น

conditions = srch.perform_resources( server )

สามารถเขียน code แบบ method chaining ได้ ให้ code อยู่บรรทัดเดียวกัน

conditions = Condition.where( { “subject”: “921009” } ).perform_resources( server )

ถ้า list conditions ไม่ empty แสดงว่ามี Condition resource ที่มี subject=921009 แสดงผลการค้นหาแต่ละ Condition resource ที่ได้ ในที่นี้เลือกแสดงเฉพาะ condition และ severity

if not conditions:
print( "PROBLEM LIST: None" )
else:
print( "PROBLEM LIST:" )
i = 1
for cond in conditions:
print( f"{i:>3d}. {cond.code.text:<40s} Severity: {cond.severity.text:<12s}" )
i += 1

Full code listing:

Output:

----------------------------------------
Patient Information
----------------------------------------
NAME: Edward Melonseed
BIRTHDATE: 1988-03-25
PROBLEM LIST:
1. high cholesterol Severity: Moderate
2. GERD Severity: Moderate
3. onychomycosis Severity: severe
4. asthma Severity: mild to moderate
5. angina Severity: Moderate
6. hypertension Severity: Mild
7. diabetes Severity: moderate
8. neuropathic pain Severity: moderate
9. depression Severity: Moderate
10. rheumatoid arthritis - left elbow Severity: Diagnosis
11. rheumatoid arthritis - both hands Severity: Moderate

Official FHIR Implementation

--

--