【mimic3-benchmark详解】subject.py

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值