Source code for fhirpack.extraction.patient

from typing import Union

from fhirpy.lib import SyncFHIRResource
from fhirpy.lib import SyncFHIRReference

from tqdm import tqdm
import pandas as pd

import fhirpack.utils as utils
import fhirpack.base as base
import fhirpack.extraction.base as extractionBase


[docs]class ExtractorPatientMixin(extractionBase.BaseExtractorMixin): # TODO test len(references) = 0 # TODO test len(references) = 1 # TODO test len(references) > 1 # TODO raise len(references) = 0?
[docs] def getPatients( self, input: Union[ list[str], list[SyncFHIRReference], list[SyncFHIRResource], ] = None, searchParams: dict = None, params: dict = None, ignoreFrame: bool = False, *args, **kwargs, ): """Retrieves FHIR Patient resources. Returns: Frame: Frame object storing the Patients. """ return self.getResources( input=input, searchParams=searchParams, params=params, ignoreFrame=ignoreFrame, resourceType="Patient", *args, **kwargs, )
# TODO test len(result) = 0 # TODO test len(result) = 1 # TODO test len(result) > 1 # TODO raise len(result) > 1
[docs] def getRootPatients( self, input: Union[ list[str], list[SyncFHIRReference], list[SyncFHIRResource], ] = None, searchParams: dict = None, params: dict = None, ignoreFrame: bool = False, raw: bool = False, ): searchActive = False if searchParams is None else searchParams searchParams = {} if searchParams is None else searchParams params = {} if params is None else params input = [] if input is None else input result = [] if len(input): return self.getPatients(input).getRootPatients() elif self.isFrame and not ignoreFrame: input = self if input.resourceType in ["Patient", "LinkedPatient"]: result = input.getResources( resourceType="Patient", metaResourceType="RootPatient", raw=True, ) result = self.prepareOutput(result, "RootPatient") input, result = self.attachOperandIds(input, result, "RootPatient") # return input when no root patients exist result = pd.merge( result, input, on=self.resourceType, # 'Patient', suffixes=["", "_self"], how="right", ) result["data"] = result["data"].mask( result["data"].isna(), result["data_self"] ) result[result.resourceType] = result[result.resourceType].mask( result[result.resourceType].isna(), result[self.resourceType] ) result.drop(columns=["data_self"], inplace=True) else: raise NotImplementedError elif searchActive: raise NotImplementedError else: raise NotImplementedError return result
[docs] def getLinkedPatients( self, input: Union[ list[str], list[SyncFHIRReference], list[SyncFHIRResource], ] = None, searchParams: dict = None, params: dict = None, ignoreFrame: bool = False, raw: bool = False, ): searchActive = False if searchParams is None else searchParams searchParams = {} if searchParams is None else searchParams params = {} if params is None else params input = [] if input is None else input result = [] if len(input): return self.getPatients(input).getLinkedPatients() elif self.isFrame and not ignoreFrame: input = self if input.resourceTypeIs("Patient"): return input.getRootPatients().getLinkedPatients() elif input.resourceTypeIs("RootPatient"): result = self.getResources( resourceType="Patient", metaResourceType="LinkedPatient", raw=True, ) result = self.prepareOutput(result, "LinkedPatient") input, result = self.attachOperandIds(self, result, "LinkedPatient") # return input when no linked patients exist result = pd.merge( result, input, on=result.resourceType, suffixes=["", "_self"], how="right", ) result["data"] = result["data"].mask( result["data"].isna(), result["data_self"] ) result["Patient"] = result["Patient"].mask( result["Patient"].isna(), result["Patient_self"] ) result[input.resourceType] = result[input.resourceType].mask( result[input.resourceType].isna(), result[f"{input.resourceType}_self"], ) result[result.resourceType] = result[result.resourceType].mask( result[result.resourceType].isna(), result[f"{input.resourceType}_self"], ) toDrop = [e for e in result.columns if e.endswith("_self")] result.drop(columns=toDrop, inplace=True) else: raise NotImplementedError elif searchActive: raise NotImplementedError else: raise NotImplementedError return result