99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)
時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)
2021-07-15
收藏

來源:數(shù)據(jù)STUDIO

作者:云朵君

糖尿病是全球最常見的慢性非傳染性疾病之一。流行病學(xué)調(diào)查顯示,我國約11%的成年人患有糖尿病,而在住院患者中這一比例更高。

住院期間將長期服用藥物,醫(yī)院系統(tǒng)在檢測到醫(yī)囑優(yōu)先級別為長期醫(yī)囑時,會根據(jù)醫(yī)囑單上醫(yī)囑開始日期及時間,每天按時自動創(chuàng)建當(dāng)日醫(yī)囑單,在沒有停止或更改的情況下,其醫(yī)囑內(nèi)容與上一天醫(yī)囑內(nèi)容一致?;颊吒鶕?jù)每天的醫(yī)囑單上的內(nèi)容按時按量服用藥物,直至醫(yī)生停止患者用藥。

由于是重復(fù)內(nèi)容,系統(tǒng)為節(jié)約存儲空間,并未記錄每天自動創(chuàng)建的重復(fù)醫(yī)囑單。但在做數(shù)據(jù)分析時,需要進(jìn)行臨床場景重現(xiàn)。

一、需求描述

有如下數(shù)據(jù),columns = ['醫(yī)囑日期', '醫(yī)囑時間', '醫(yī)囑開始日期', '醫(yī)囑開始時間','醫(yī)囑優(yōu)先級', '停止日期', '停止時間', '項(xiàng)目名稱']

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

現(xiàn)要求從醫(yī)囑開始日期到停止日期,按照日期自增邏輯擴(kuò)充數(shù)據(jù),其中自增的日期的醫(yī)囑開始時間為當(dāng)日的01:00:00。結(jié)果如下圖:

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

二、方法一,表格合并

先上代碼

def long_advice(item):
    # 逐條處理,傳入Series     # 構(gòu)建醫(yī)囑單內(nèi)容表     item_df1 = pd.DataFrame(data=np.reshape(item.values,(1,-1)),columns=item.index)
    item_df2 = item_df1.copy()
    item_df2['醫(yī)囑開始時間'] = parse('01:00:00').time()
    item_df = pd.concat([item_df1, item_df2]).drop(columns='醫(yī)囑開始日期').reset_index(drop=True)
    
    # 構(gòu)建時間序列索引     # 擴(kuò)展的醫(yī)囑日期的醫(yī)囑時間為01:00:00,醫(yī)囑開始日期的醫(yī)囑時間為原有的醫(yī)囑時間     date_range_left = pd.DataFrame(
        data=parse('01:00:00').time(),
        index=pd.date_range(start=item.醫(yī)囑開始日期, end=item.停止日期),
        columns= ['醫(yī)囑開始時間']
                                  ).reset_index().rename(columns={'index':'醫(yī)囑開始日期'})
    date_range_left.loc[0,'醫(yī)囑開始時間']= item.醫(yī)囑時間
    
    # 以時間序列索引表為左表,以時間序列內(nèi)容表為右表     date_range_df = pd.merge(date_range_left
                         ,item_df
                         ,on = '醫(yī)囑開始時間'                          ,how='left')
    return  date_range_df

步驟詳解

導(dǎo)入Python包

import pandas as pd import numpy as np from datetime import datetime from dateutil.parser import parse

查看原始數(shù)據(jù)

# 前面步驟略,直接從主題開始 >>> item 醫(yī)囑日期      2019-08-05 00:00:00 醫(yī)囑時間                 16:34:25 醫(yī)囑開始日期    2019-08-05 00:00:00 醫(yī)囑開始時間               16:34:42 醫(yī)囑優(yōu)先級                    長期醫(yī)囑 停止日期      2019-08-27 00:00:00 停止時間                 10:49:26 項(xiàng)目名稱           格華止(500mg×30片) Name: 0, dtype: object 

pd.Series轉(zhuǎn)pd.DataFrame

# 縱向向array轉(zhuǎn)橫向array >>> np.reshape(item.values,(1,-1))
array([[Timestamp('2019-08-05 00:00:00'), datetime.time(163425),
        Timestamp('2019-08-05 00:00:00'), datetime.time(163442),
        '長期醫(yī)囑', Timestamp('2019-08-27 00:00:00'),
        datetime.time(104926)]], dtype=object) >>> item_df1 = pd.DataFrame(data=np.reshape(item.values,(1,-1)),columns=item.index) # 或者 >>> pd.DataFrame(item).T

輸出

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

構(gòu)建醫(yī)囑單內(nèi)容表

# 首先創(chuàng)建副本,避免更改原表 >>> item_df2 = item_df1.copy() # 創(chuàng)建datetime.time()格式的'01:00:00' >>> parse('01:00:00').time()
datetime.time(10) # 將原來的時間更換為新的時間 >>> item_df2['醫(yī)囑開始時間'] = parse('01:00:00').time() # 合并兩表 >>> item_df = pd.concat([item_df1, item_df2]
                       ).drop(columns='醫(yī)囑開始日期').reset_index(drop=True)

輸出

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

至此醫(yī)囑單內(nèi)容已創(chuàng)建完畢,接下來需要創(chuàng)建自增的時間序列,并以時間序列做主表,以醫(yī)囑單內(nèi)容表做從表,進(jìn)行表與表之間的連接。

構(gòu)建時間序列索引

從醫(yī)囑開始日期到停止日期創(chuàng)建pd.date_range() 索引,以醫(yī)囑開始時間等于'01:00:00' 為內(nèi)容創(chuàng)建DataFrame,并重置索引并重命名,還原醫(yī)囑開始當(dāng)日的開始時間。因?yàn)橹灰栽龅哪遣糠秩掌诘尼t(yī)囑時間為'01:00:00' ,而開始的第一天還是按照原來的開始時間。

>>> date_range_left = pd.DataFrame(data=parse('01:00:00').time(),
                                   index=pd.date_range(start=item.醫(yī)囑開始日期, end=item.停止日期),
                                   columns= ['醫(yī)囑開始時間']
                                  ).reset_index().rename(columns={'index':'醫(yī)囑開始日期'}) >>> date_range_left.loc[0,'醫(yī)囑開始時間']= item.醫(yī)囑開始時間 >>> date_range_left

輸出

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

這里主要用到了pd.date_range() 方法,可參考《時間序列》

合并時間序列索引表與醫(yī)囑單內(nèi)容表

>>> date_range_df = pd.merge(date_range_left
                             , item_df
                             , on='醫(yī)囑開始時間'                              , how='left')

至此方法一已完成。

三、方法二,時間戳重采樣

既然方法一已經(jīng)提到用時間序列內(nèi)pd.date_range() 方法,何不直接用升采用及插值的方法完成。

需要了解pandas里使用時間序列處理數(shù)據(jù)問題,可移步至《時間序列》。

上代碼

def long_advice_2(item):
    # 逐條處理,傳入Series     # 構(gòu)建醫(yī)囑單內(nèi)容表     item_df1 = pd.DataFrame(data=np.reshape(item.values,(1,-1)),columns=item.index)
    item_df2 = item_df1.copy()
    item_df2['醫(yī)囑開始時間'] = parse('01:00:00').time()
    item_df2['醫(yī)囑開始日期'] = item_df2['停止日期']
    item_df = pd.concat([item_df1, item_df2]).reset_index(drop=True)
    # 構(gòu)建時間序列,將起始時間轉(zhuǎn)換為 DatetimeIndex(['2019-08-05', '2019-08-27'], dtype='datetime64[ns]', freq=None)     frame = pd.DataFrame(item_df.drop(columns=['醫(yī)囑開始日期']).values,
             index=pd.to_datetime(item_df.醫(yī)囑開始日期.values),
             columns=item_df.drop(columns=['醫(yī)囑開始日期']).columns)
    
    # 時間戳重采樣,resampling的填充和插值方式跟fillna和reindex的一樣     date_range_df = frame.resample('D').bfill().reset_index().rename(columns={'index':'醫(yī)囑開始日期'})
    return date_range_df

構(gòu)建醫(yī)囑單內(nèi)容表

其中構(gòu)建醫(yī)囑單內(nèi)容表與前面類似,其不同之處為保留醫(yī)囑開始日期,將第二個開始日期替換為停止日期,以便后面轉(zhuǎn)換為pd.date_range()日期范圍。

>>> item_df1 = pd.DataFrame(data=np.reshape(item.values,(1,-1)),columns=item.index) >>> item_df2 = item_df1.copy() >>> item_df2['醫(yī)囑開始時間'] = parse('01:00:00').time() >>> item_df2['醫(yī)囑開始日期'] = item_df2['停止日期'] >>> item_df = pd.concat([item_df1, item_df2]).reset_index(drop=True) >>> item_df

輸出

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

構(gòu)建時間序列

>>DataFrame的軸索引或列的日期轉(zhuǎn)換為DatetimeIndex() >>> pd.to_datetime(item_df.醫(yī)囑開始日期.values)
DatetimeIndex(['2019-08-05''2019-08-27'], dtype='datetime64[ns]', freq=None) >>> frame = pd.DataFrame(item_df.drop(columns=['醫(yī)囑開始日期']).values,
                 index=pd.to_datetime(item_df.醫(yī)囑開始日期.values),
                 columns=item_df.drop(columns=['醫(yī)囑開始日期']).columns) >>> frame 

輸出

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

升采樣及插值

時間戳重采樣,resampling的填充和插值方式跟fillnareindex的一樣

>>> date_range_df = frame.resample('D').bfill() >>> date_range_df

輸出

時間序列,從開始到結(jié)束日期自增擴(kuò)充數(shù)據(jù)

最后在重置索引并重命名即可。

四、要點(diǎn)總結(jié)

  • 構(gòu)建自增時間序列
  • 時間序列內(nèi)容,即需要重復(fù)的醫(yī)囑單準(zhǔn)備
  • 醫(yī)囑開始時間準(zhǔn)備,第一天與其后幾天的時間不同
  • 插值,根據(jù)實(shí)際情況使用前插值(.ffill())或后插值(.bfill()

當(dāng)然,除了上述的兩種方法,如果您有更好的方法,歡迎搭訕交流。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }