def process_physiology(self): _d1 = map_devices(self.datasets['vital_signs'], self.datasets['device_types']) _d2 = map_devices(self.datasets['blood_pressure'], self.datasets['device_types']) bp_types = np.array(['diastolic_value', 'systolic_value']) df = [_d1] for bp_type in bp_types: cols = _d2.columns[~_d2.columns.str.startswith(bp_type)] _tmp = _d2[cols].copy() _tmp.source = bp_types[bp_types != bp_type][0].replace('_value', '_bp') _tmp.columns = _d1.columns df.append(_tmp) df = pd.concat(df) dtypes = { 'device_type': 'category', 'patient_id': 'category', 'home_id': 'category', 'unit': 'category', 'source': 'category', 'value': 'float' } df = df.astype(dtypes).reset_index(drop=True) df = localize_time(df, ['start_date']) return df
def process_kitchen(self): # TODO: add sensor type as a column activity = self.datasets['activity'] activity = localize_time(activity, ['start_date']) doors = self.datasets['doors'] appliances = map_devices(self.datasets['appliances'], self.datasets['device_types']) doors = doors[(doors.location_name == 'fridge door') & (doors.transition == 'opened>closed')] activity = activity[activity.location_name.isin(['kitchen', 'dining room'])] activity.insert(0, 'device_type', 'pir') doors.insert(0, 'device_type', 'door') appliances.value = appliances.value.astype(str)\ .replace({'microwave-use': 'oven-use', 'toaster-use': 'oven-use', 'iron-use': np.nan, 'multi-use socket-use': np.nan}) doors = doors[['patient_id', 'start_date', 'device_type','location_name']]\ .rename({'location_name': 'activity'}, axis=1) activity = activity[['patient_id', 'start_date', 'device_type', 'location_name']]\ .rename({'location_name': 'activity'}, axis=1) appliances = appliances[['patient_id', 'start_date', 'device_type', 'value']]\ .rename({'value': 'activity'}, axis=1) kitchen = pd.concat([doors, activity, appliances.dropna()]) kitchen = kitchen[kitchen.patient_id != ''].sort_values( ['patient_id', 'start_date']) kitchen = process_transition(kitchen, ['patient_id'], 'start_date', 'activity', ['device_type']) return kitchen.reset_index(drop=True)
def process_motion(self): activity = self.datasets['activity'] activity = localize_time(activity, ['start_date']) entryway = self.datasets['entryway'] bed_occupancy = self.datasets['bed_occupancy'] fact = ['patient_id', 'location_name', 'start_date'] motion = pd.concat([activity[fact], entryway[fact], bed_occupancy[fact]]).\ sort_values(['patient_id', 'start_date']) mapping = { 'bathroom1': 'Bathroom', 'WC1': 'Bathroom', 'kitchen': 'Kitchen', 'hallway': 'Hallway', 'corridor1': 'Hallway', 'dining room': 'Lounge', 'living room': 'Lounge', 'lounge': 'Lounge', 'bedroom1': 'Bedroom', 'front door': 'Front door', 'back door': 'Back door' } motion.location_name = motion.location_name.replace(mapping) motion = motion[~motion.location_name. isin(['office', 'conservatory', 'study', 'cellar'])] return motion.reset_index(drop=True)
def process_physiology(self): df = self.datasets['observation'] device_type = self.datasets['device_type'] devices = [ '8310-5', '150456', '55284-4', '29463-7', '251837008', '163636005', '8462-4', '8480-6', '8867-4' ] df = df.query('type in @devices') mapping = device_type.set_index('code').display.to_dict() mapping = {**mapping, **{'8867': 'raw_heart_rate'}} columns = [ 'datetimeObserved', 'type', 'subject', 'valueQuantity', 'valueUnit' ] df = df[columns].assign(source=df.type.replace(mapping)) mapper = { 'Body temperature': 'raw_body_temperature', 'Total body water': 'raw_total_body_water', 'Systolic blood pressure': 'systolic_bp', 'Diastolic blood pressure': 'diastolic_bp', 'MDC_PULS_OXIM_SAT_O2': 'raw_oxygen_saturation', 'O/E - muscle mass': 'raw_body_muscle_mass', 'Body weight': 'raw_body_weight' } df.source = df.source.replace(mapper) df.columns = [ 'start_date', 'device_type', 'patient_id', 'value', 'unit', 'source' ] df = localize_time(df, ['start_date']) return df
def process_light(self): df = self.datasets['observation'] columns = ['datetimeObserved','type','subject','location','valueQuantity','valueUnit'] df = df.query('type == "56242006"')[columns] df.columns = ['start_date', 'device_type', 'patient_id','location_name','value', 'unit'] df = df.assign(source='raw_light') df = localize_time(df,['start_date']) return df
def process_doors(self): groupby = ['patient_id', 'location_name'] datetime = 'start_date' value = 'value' covariates = ['location_name'] df = self.datasets['door'] df = localize_time(df, ['start_date']) doors = process_transition(df, groupby, datetime, value, covariates) return doors.drop('location_name', axis=1).reset_index()
def process_motion(obj): df = obj.datasets['observation'] df = (df[['subject', 'location', 'datetimeObserved', 'type']].query('type == "272149007-2"').dropna( subset=['location']).drop(columns='type')) df.columns = ['patient_id', 'location_name', 'start_date'] df = localize_time(df, ['start_date']) df = df.drop_duplicates().reset_index() return df
def process_habitat(self): df = map_devices(self.datasets['environmental'], self.datasets['device_types']) df = df[df.location_name != ''].reset_index(drop=True) dtypes = { 'home_id': 'category', 'location_id': 'category', 'unit': 'category', 'location_name': 'category', 'source': 'category', 'value': 'float' } df = df.astype(dtypes) df = localize_time(df, ['start_date']) return df
def process_doors(self): df = self.datasets['observation'] columns = ['subject', 'location', 'datetimeObserved', 'valueState', 'type'] df = (df[columns].query('type == "224751004"').dropna( subset=['location']).drop(columns='type')) df.columns = ['patient_id', 'location_name', 'start_date', 'value'] df.value = df.value.replace({'Close': 'closed', 'Open': 'opened'}) groupby = ['patient_id', 'location_name'] datetime = 'start_date' value = 'value' covariates = None df = localize_time(df, ['start_date']) doors = process_transition(df, groupby, datetime, value, covariates) doors = doors.reset_index() doors.location_name = doors.location_name.str.lower() return doors
def process_sleep(self): """process_sleep force sleep_mat to 1min frequency and localise time :return: loclaized sleep metrics timeseries :rtype: pd.DataFrame """ sleep_mat = self.datasets['sleep_mat'] sleep_mat.snoring = sleep_mat.snoring.astype(bool) sleep_mat = (sleep_mat.set_index('start_date').groupby( ['patient_id', 'home_id']).resample('1T').agg({ 'snoring': 'sum', 'heart_rate': 'mean', 'respiratory_rate': 'mean' }).dropna().reset_index()) sleep_mat = localize_time(sleep_mat, ['start_date']) return sleep_mat
def process_sleep(self): sleep_mat = self.datasets['sleep_mat'] sleep_mat = localize_time(sleep_mat, ['start_date']) return sleep_mat