
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
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10