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

熱線電話:13121318867

登錄
首頁精彩閱讀R語言時(shí)間序列數(shù)據(jù)應(yīng)用xts
R語言時(shí)間序列數(shù)據(jù)應(yīng)用xts
2017-07-07
收藏

R語言時(shí)間序列數(shù)據(jù)應(yīng)用xts

zoo是時(shí)間序列的基礎(chǔ)庫,是面向通用的設(shè)計(jì)。 xts 是對(duì)時(shí)間序列庫(zoo) 的一種擴(kuò)展實(shí)現(xiàn)。xts 類型繼承了zoo 類型,豐富了時(shí)間序列數(shù)據(jù)處理函數(shù)。

一、xts對(duì)象的結(jié)構(gòu)和定義

1、xts對(duì)象是一個(gè)具有時(shí)間索引的觀測(cè)值矩陣,結(jié)構(gòu)如下:

xts = matrix + times

2、創(chuàng)建xts對(duì)象,函數(shù)如下:

xts (x= ,  order.by= ,  …  )

參數(shù)   x : 數(shù)據(jù),必須是一個(gè)向量或者矩陣;

order.by: 索引(index),是一個(gè)與x行數(shù)相同的升序排列的時(shí)間對(duì)象。

創(chuàng)建示例:

data <- rnorm(5)

dates <- seq(as.Date("2016-01-01"), length = 5, by = "days")

smith <- xts(x = data, order.by = dates)

3、屬性(Attr)

xts允許數(shù)據(jù)綁定任意鍵值屬性,可用來保存對(duì)象的元數(shù)據(jù)。創(chuàng)建xts對(duì)象時(shí)添加屬性,只需要將name=value參數(shù)傳送給xts()函數(shù)。

#使用 POSIXct日期類對(duì)象創(chuàng)建bday
bday <- as.POSIXct("1899-05-08")

# 創(chuàng)建xts對(duì)象,并新增born屬性
hayek <- xts(x = data, order.by = dates, born = bday)

4、分解xts對(duì)象

xts 和 zoo的核心是一個(gè)簡(jiǎn)單的R矩陣和一些附加屬性,最重要的屬性是索引( index)。索引包含了將數(shù)據(jù)作為時(shí)間序列的所有信息。

coredata()   獲取xts對(duì)象中的矩陣部分。

index()      獲取xts對(duì)象的index部分。

5、轉(zhuǎn)換成xts對(duì)象

as.xts()

6、xts與其他時(shí)間序列的主要區(qū)別

xts與R大部分其他時(shí)間序列對(duì)象的主要區(qū)別是: xts可以使用表示時(shí)間的任何類,不管是POSIXct, Date 還是其他類,xts將它們轉(zhuǎn)換成一種內(nèi)部格式,使用戶盡可能自然地選取子集。

a <- xts(x = 1:2, as.Date("2012-01-01") + 0:1)

a[index(a)]

7、索引的屬性

查看索引的類別 indexClass() 

查看索引的時(shí)區(qū) indexTZ() 

顯示或修改索引時(shí)間格式   indexFormat() 

# 修改時(shí)間表示格式
indexFormat(temps) <- "%m/%d/%Y"

tzone(), 用于提取或設(shè)置時(shí)區(qū)。

tzone(x) <- "Time_Zone"


Xts對(duì)象的索引的原始向量是自UNIX紀(jì)元(1970-01-01)以來的累計(jì)秒數(shù)的向量

.index()可獲取索引的原始向量。

以下函數(shù)用于提取類似于POSIXlt 類型的時(shí)間組件:

.indexday()

.indexmon()

.indexyear()
#創(chuàng)建一個(gè)周末日期索引
index <- which(.indexwday(temps) == 0 | .indexwday(temps) == 6)


二、輸入和輸出xts數(shù)據(jù)

1、實(shí)際應(yīng)用中從硬盤或者網(wǎng)絡(luò)中讀取數(shù)據(jù)。

例如,硬盤中的tmp_file文件的內(nèi)容如下:

a,b

1/02/2015, 1, 3

2/03/2015, 2, 4

輸入示例1:

# 讀取tmp_file文件
dat<-read.csv(tmp_file)

#將dat轉(zhuǎn)換成xts格式
xts(dat, order.by = as.Date(rownames(dat), "%m/%d/%Y"))

輸入示例2:

#使用read.zoo讀取tmp_file文件
dat_zoo <- read.zoo(tmp_file, index.column = 0, sep = ",", format = "%m/%d/%Y")

#將dat_zoo轉(zhuǎn)換成xts
dat_xts <- xts(dat_zoo)

輸入示例3:

# FUN = as.yearmon將時(shí)間字符串轉(zhuǎn)換成更合適的時(shí)間類。

sun <- read.zoo(tmp_file, sep = ",", FUN = as.yearmon)

# 轉(zhuǎn)換成xts對(duì)象
sun_xts<-xts(sun)

2、 輸出xts對(duì)象

主要有兩種方式:

1、使用saveRDS() 和readRDS() 將單個(gè)R對(duì)象序列化。

2、使用 zoo中的函數(shù) write.zoo()

#獲取臨時(shí)文件名
tmp <- tempfile()

#使用zoo將xts對(duì)象寫入tmp文件
write.zoo(data_xts, sep = ",", file = tmp)


三、查詢時(shí)間范圍

1、查詢?nèi)掌诜秶?

Xts可快速有效地確定日期和時(shí)點(diǎn)范圍的子集,并提取相應(yīng)的觀測(cè)值。

使用特殊字符和日期搭配就可提取xts對(duì)象的日期范圍。

A["20090825"]       ## 20090825

A["201203/201212"]       ## 201203至201212

A["/201601"]       ## 自 201601開始

2、提取每日時(shí)間間隔

# 選取所有日期9:30-16:00之間的觀測(cè)值

NYSE["T09:30/T16:00"]

3、觀測(cè)值的更新或替換

# 將dates向量中對(duì)應(yīng)的觀測(cè)值設(shè)置為NA

x[dates] <- NA

# 自2016-06-09至今的觀測(cè)值修改為0

x["2016-06-09/"] <- 0

4、定位時(shí)間周期的開始和結(jié)束
last(temps, "1 week")

last(lastweek, 2)

first(lastweek, "-2 days")

可以將first()和last()組合起來使用

#第1周的后3天

last(first(Temps, '1 week'), '3 days')

5、查看時(shí)間周期性和次數(shù)

periodicity()  查看時(shí)間序列的周期

ndays() , nmonths(), nquarters()  查看周期的次數(shù)


四、xts對(duì)象的合并運(yùn)算

xts objects在做數(shù)學(xué)計(jì)算時(shí),會(huì)遵循時(shí)間并且只返回有時(shí)間交集的數(shù)據(jù)。 

1、用merge按列合并xts

merge()將一個(gè)或多個(gè)序列按列合并。適用于按固定日期來規(guī)范觀測(cè)值。

merge(a, b, join = "right", fill = 9999)

3個(gè)關(guān)鍵參數(shù):

... :用于合并的任意個(gè)的對(duì)象

Join :規(guī)定如何合并序列,例如inner或left方式。

Fill : 規(guī)定如何設(shè)置序列合并后出現(xiàn)的缺失值

2、用rbind按行合并xts

合并結(jié)果按時(shí)間升序排列


五、觀測(cè)值的NA值處理

1、前一個(gè)或下個(gè)觀測(cè)值結(jié)轉(zhuǎn)法

缺失值的前一個(gè)觀測(cè)值來填補(bǔ)缺失值??煞乐瓜雀Q偏差(look-ahead bias)

# 使用上個(gè)觀測(cè)值

na.locf(x)               

#設(shè)置fromLast = TRUE,可使用下個(gè)觀測(cè)值填補(bǔ)空缺

na.locf(x, fromLast = TRUE)

2、使用na.approx()插補(bǔ)缺值

na.approx()基于兩點(diǎn)之間的簡(jiǎn)單線性插值,數(shù)據(jù)點(diǎn)使用索引值之間的距離來估算,估算值在時(shí)間上是線性的。


六、時(shí)間序列操作

1、偏移函數(shù)lag()

k是偏移的步長(zhǎng)。在xts中,k為正,序列的觀測(cè)值將向下(時(shí)間后方)偏移;k為負(fù),觀測(cè)值將向上偏移。Zoo與xts相反。

> a

[,1]

2016-01-01    1

2016-01-02    2

2016-01-03    3

> lag(a)

[,1]

2016-01-01   NA

2016-01-02    1

2016-01-03    2

> lag(a,k=-1)

[,1]

2016-01-01    2

2016-01-02    3

2016-01-03    NA

2、差分函數(shù)diff()

一個(gè)簡(jiǎn)單的差分例如:  x(t) - x(t-k)  其中k是序列偏移的步長(zhǎng)。高階差分是對(duì)每個(gè)之前的差分計(jì)算結(jié)果的重復(fù)應(yīng)用。

diff(xtsdata,  lag = , differences = )

參數(shù)說明:

Lag:偏移數(shù);

differences:差分的次序(例如:調(diào)用多少次 diff )。

# 下面兩條指令的效果相同

diff(x, differences = 2)

diff(diff(x))

3、endpoints()函數(shù),按時(shí)間間隔分割數(shù)據(jù)

endpoints(data,on=, k= )

該函數(shù)接收一個(gè)時(shí)間序列并返回每個(gè)時(shí)間區(qū)間的最后一個(gè)觀測(cè)值的位置向量。返回值以0開始,以數(shù)據(jù)長(zhǎng)度(總行數(shù))結(jié)束。

參數(shù)on 支持各種時(shí)間周期, 包括"years", "quarters", "months","hours"和 "minutes"等。

參數(shù)K用于找到第k個(gè)周期。例如,設(shè)置on = "weeks", k = 2, 可取每?jī)芍艿淖詈笠惶臁W⒁庾詈笠粋€(gè)返回值總是數(shù)據(jù)的長(zhǎng)度,即便是與間隔周期不一致。

例如,下列代碼顯示某數(shù)據(jù)每年的最后一個(gè)觀測(cè)值

endpoints(Air, on = "years")

[1] 0 12 24 36 48 60 72 84 96 108 120 132 144

4、用period.apply按時(shí)間分割數(shù)據(jù),并運(yùn)算

period.apply(x, INDEX, FUN, ...)

使用舉例:

# 計(jì)算每周的端點(diǎn)
ep <- endpoints(temps, on = "weeks")

# 計(jì)算每周均值并顯示結(jié)果

period.apply(temps, INDEX = ep, FUN = mean)

5、用split-lapply-rbind分割數(shù)據(jù)并運(yùn)算

#按周來劃分?jǐn)?shù)據(jù),f參數(shù)是一個(gè)字符串,用于描述劃分的間隔(例如:"months", "years")

data_weekly <- split(data, f = "weeks")

#創(chuàng)建一個(gè)每周均值的列表

temps_avg <- lapply(X = data_weekly, FUN = mean)

x_list_rbind <- do.call(rbind, temps_avg)

do.call(rbind, ...)

向rbind傳送一個(gè)list,而不是一次傳送一個(gè)對(duì)象。

6、單變量序列轉(zhuǎn)換成OHLC數(shù)據(jù)(Open-High-Low-Close data)

基于常規(guī)窗口整合不同頻次的序列可以使分析更容易。

to.period()函數(shù)格式如下,參數(shù)包括序列x, 表示周期的字符k等

to.period(x,

period = "months",

k = 1,

indexAt,

name=NULL,

OHLC = TRUE,

...)

使用舉例:
usd_eur_weekly <- to.period(usd_eur, period = "weeks")
usd_eur_yearly <- to.period(usd_eur, period = "years", OHLC = FALSE)

7、轉(zhuǎn)換成低頻序列

to.period()也可將序列轉(zhuǎn)換成低調(diào)整頻次的數(shù)據(jù),類似于二次抽樣。

# 轉(zhuǎn)換成季度OHLC格式

mkt_quarterly <- to.period(eq_mkt, period = "quarters")

#使用快捷功能轉(zhuǎn)換成季度OHLC格式

mkt_quarterly2 <- to.quarterly(eq_mkt, name = "edhec_equity", indexAt = "firstof")

indexAt參數(shù)設(shè)置為firstof ,選取區(qū)間時(shí)間的起點(diǎn)。設(shè)置參數(shù)name可以改變每一列的基礎(chǔ)名。

8、計(jì)算時(shí)間序列的滾動(dòng)標(biāo)準(zhǔn)差

時(shí)間序列數(shù)據(jù)的另一個(gè)常用需求是在數(shù)據(jù)的滾動(dòng)窗口應(yīng)用函數(shù)。

xts 對(duì)象可使用zoo函數(shù)rollapply()來實(shí)行。

該函數(shù)參數(shù)有時(shí)間序列對(duì)象x,窗口大小width,應(yīng)用于每個(gè)滾動(dòng)周期的函數(shù)FUN。

Width參數(shù)規(guī)定了窗口中的觀測(cè)值數(shù)量。例如,選取一個(gè)序列的10天滾動(dòng)。

rollapply(x, width = 10, FUN = max, na.rm = TRUE)

注意:如果是日觀測(cè)值的序列是選取10天,如果是月觀測(cè)值的序列會(huì)選取10個(gè)月。


七、修改時(shí)間戳

1、在高頻次數(shù)據(jù)中發(fā)現(xiàn)具有相同時(shí)間戳的觀測(cè)值時(shí),一般有效的做法是強(qiáng)制時(shí)間唯一,增加毫秒隨機(jī)數(shù)。

make.index.unique(data,eps= ,  drop=  ,…) 

參數(shù)說明:

eps:epsilon or small change的縮寫,控制相同的時(shí)間被擾亂的程度。

drop = TRUE:移除全部重復(fù)觀測(cè)值。

舉例

make.index.unique(x, eps = 1e-4)  #  增加隨機(jī)數(shù)

make.index.unique(x, drop = TRUE) # 去除重復(fù)項(xiàng)


2、 某些情形時(shí)間戳過于精確,最好是近似到一些固定的間隔點(diǎn)。例如觀測(cè)值可能在一小時(shí)內(nèi)的任何時(shí)點(diǎn)發(fā)生,但只需記錄最近的下個(gè)整點(diǎn)。

以下一個(gè)時(shí)間對(duì)齊數(shù)據(jù),秒,分鐘,小時(shí)。

align.time(data,n= )   參數(shù)n,表示要近似到的秒數(shù)

align.time(x, n = 60) # 近似到分鐘


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

若不方便掃碼,搜微信號(hào):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)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }