from __future__ import absolute_import
from __future__ import print_function
import numpy as np
import os
import pandas as pd
from mimic3benchmark.util import dataframe_from_csv
# 定义了一个函数read_stays(),它的作用是从指定路径读取一个名为stays.csv的CSV文件并将其作为一个DataFrame返回。这个函数还对返回的DataFrame进行了一些预处理,包括将日期时间格式的列转换为Pandas的日期时间类型,并按照INTIME和OUTTIME列进行排序。最后,函数返回已排序的ICU停留信息数据
def read_stays(subject_path):
stays = dataframe_from_csv(os.path.join(subject_path, 'stays.csv'), index_col=None)
stays.INTIME = pd.to_datetime(stays.INTIME)
stays.OUTTIME = pd.to_datetime(stays.OUTTIME)
stays.DOB = pd.to_datetime(stays.DOB)
stays.DOD = pd.to_datetime(stays.DOD)
stays.DEATHTIME = pd.to_datetime(stays.DEATHTIME)
stays.sort_values(by=['INTIME', 'OUTTIME'], inplace=True)
return stays
def read_diagnoses(subject_path):
return dataframe_from_csv(os.path.join(subject_path, 'diagnoses.csv'), index_col=None)
# 这个函数从一个给定的患者路径读取并返回一个包含所有事件的 Pandas DataFrame 对象。如果 remove_null 参数被设置为 True,则函数将删除 VALUE 列为空的行。函数还会将 CHARTTIME 列转换为 pandas datetime 格式,将 HADM_ID 和 ICUSTAY_ID 列转换为整数,并将 VALUEUOM 列转换为字符串。最后,函数会根据 CHARTTIME、ITEMID 和 ICUSTAY_ID 进行排序,并返回结果 DataFrame 对象。
def read_events(subject_path, remove_null=True):
events = dataframe_from_csv(os.path.join(subject_path, 'events.csv'), index_col=None)
if remove_null:
events = events[events.VALUE.notnull()]
events.CHARTTIME = pd.to_datetime(events.CHARTTIME)
events.HADM_ID = events.HADM_ID.fillna(value=-1).astype(int)
events.ICUSTAY_ID = events.ICUSTAY_ID.fillna(value=-1).astype(int)
events.VALUEUOM = events.VALUEUOM.fillna('').astype(str)
# events.sort_values(by=['CHARTTIME', 'ITEMID', 'ICUSTAY_ID'], inplace=True)
return events
def get_events_for_stay(events, icustayid, intime=None, outtime=None):
idx = (events.ICUSTAY_ID == icustayid)
if intime is not None and outtime is not None:
idx = idx | ((events.CHARTTIME >= intime) & (events.CHARTTIME <= outtime))
events = events[idx]
del events['ICUSTAY_ID']
return events
# 将每个事件的发生时间转换为自入院后经过的小时数。其中,HOURS列表示自入院后经过的小时数,remove_charttime参数控制是否在返回结果中删除CHARTTIME列。
def add_hours_elpased_to_events(events, dt, remove_charttime=True):
events = events.copy()
events['HOURS'] = (events.CHARTTIME - dt).apply(lambda s: s / np.timedelta64(1, 's')) / 60./60
if remove_charttime:
del events['CHARTTIME']
return events
# 这段代码的作用是将给定的医学事件数据按照时间序列的格式进行整理,并且保留指定的变量列。函数接受以下参数:
# events:pandas DataFrame类型,包含医学事件数据。
# variable_column:字符串类型,指定变量列的列名。
# variables:列表类型,指定要保留的变量列表。
# 函数首先将metadata与timeseries分别从events DataFrame中提取出来,metadata DataFrame包含了所有ICU住院期间的时间戳和ICUSTAY_ID,而timeseries DataFrame包含了所有变量的观测值,其中包含了变量名、时间戳和变量值。然后,函数将timeseries DataFrame重新构建为以时间戳为索引、变量名为列名、变量值为元素的DataFrame,并将metadata合并到该DataFrame中。最后,函数将缺失的变量值用NaN填充,并返回时间序列DataFrame。
def convert_events_to_timeseries(events, variable_column='VARIABLE', variables=[]):
metadata = events[['CHARTTIME', 'ICUSTAY_ID']].sort_values(by=['CHARTTIME', 'ICUSTAY_ID'])\
.drop_duplicates(keep='first').set_index('CHARTTIME')
timeseries = events[['CHARTTIME', variable_column, 'VALUE']]\
.sort_values(by=['CHARTTIME', variable_column, 'VALUE'], axis=0)\
.drop_duplicates(subset=['CHARTTIME', variable_column], keep='last')
timeseries = timeseries.pivot(index='CHARTTIME', columns=variable_column, values='VALUE')\
.merge(metadata, left_index=True, right_index=True)\
.sort_index(axis=0).reset_index()
for v in variables:
if v not in timeseries:
timeseries[v] = np.nan
return timeseries
# 从时间序列数据中获取某个变量的第一个非空值。具体来说,给定一个时间序列数据集timeseries和变量名variable,如果这个变量在timeseries中存在,那么就找到它第一个非空的值并返回,否则返回NaN。
def get_first_valid_from_timeseries(timeseries, variable):
if variable in timeseries:
idx = timeseries[variable].notnull()
if idx.any():
loc = np.where(idx)[0][0]
return timeseries[variable].iloc[loc]
return np.nan
【mimic3-benchmark详解】subject.py
最新推荐文章于 2024-10-03 09:02:12 发布