R语言时间序列数据应用xts

zoo是时间序列的基础库,是面向通用的设计。 xts 是对时间序列库(zoo) 的一种扩展实现。xts 类型继承了zoo 类型,丰富了时间序列数据处理的函数。

一、xts对象的结构和定义

1xts对象是一个具有时间索引的观测值矩阵,结构如下

  xts = matrix + times

2、创建xts对象,函数如下:

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

参数   x : 数据,必须是一个向量或者矩阵;

order.by: 索引(index),是一个与x行数相同的升序排列的时间对象。

创建示例:

data <- rnorm(5)

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

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

3属性(Attr

xts允许数据绑定任意键值属性,可用来保存对象的元数据。创建xts对象时添加属性,只需要将name=value参数传送给xts()函数。

#使用 POSIXct日期类对象创建bday
bday <- as.POSIXct("1899-05-08")

# 创建xts对象,并新增born属性
hayek <- xts(x = data, order.by = dates, born = bday)

4、分解xts对象

xts 和 zoo的核心是一个简单的R矩阵和一些附加属性,最重要的属性是索引( index)。索引包含了将数据作为时间序列的所有信息。

coredata()   获取xts对象中的矩阵部分。

index()      获取xts对象的index部分。

5、转换成xts对象

  as.xts()

6xts与其他时间序列的主要区别

xts与R大部分其他时间序列对象的主要区别是: xts可以使用表示时间的任何类,不管是POSIXct, Date 还是其他类,xts将它们转换成一种内部格式,使用户尽可能自然地选取子集。

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

a[index(a)]

7、索引的属性

查看索引的类别 indexClass() 

查看索引的时区 indexTZ() 

显示或修改索引时间格式   indexFormat() 

# 修改时间表示格式
indexFormat(temps) <- "%m/%d/%Y"

tzone(), 用于提取或设置时区。

tzone(x) <- "Time_Zone"

 

Xts对象的索引的原始向量是自UNIX纪元(1970-01-01)以来的累计秒数的向量

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

以下函数用于提取类似于POSIXlt 类型的时间组件:

.indexday()

.indexmon()

.indexyear()
#创建一个周末日期索引
index <- which(.indexwday(temps) == 0 | .indexwday(temps) == 6)

 

二、输入和输出xts数据

1、实际应用中从硬盘或者网络中读取数据。

例如,硬盘中的tmp_file文件的内容如下:

a,b

1/02/2015, 1, 3

2/03/2015, 2, 4

输入示例1:

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

#将dat转换成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转换成xts
dat_xts <- xts(dat_zoo)

输入示例3:

# FUN = as.yearmon将时间字符串转换成更合适的时间类。

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

# 转换成xts对象
sun_xts<-xts(sun)

2、 输出xts 对象

主要有两种方式:

1、使用saveRDS() 和readRDS() 将单个R对象序列化。

2、使用 zoo中的函数 write.zoo()

#获取临时文件名
tmp <- tempfile()

#使用zoo将xts对象写入tmp文件
write.zoo(data_xts, sep = ",", file = tmp)

 

三、查询时间范围

1、查询日期范围

Xts可快速有效地确定日期和时点范围的子集,并提取相应的观测值。

使用特殊字符和日期搭配就可提取xts对象的日期范围。

A["20090825"]       ## 20090825

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

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

2、提取每日时间间隔

# 选取所有日期9:30-16:00之间的观测值

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

3、观测值的更新或替换

# 将dates向量中对应的观测值设置为NA

x[dates] <- NA

# 自2016-06-09至今的观测值修改为0

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

4、定位时间周期的开始和结束
last(temps, "1 week")

last(lastweek, 2)

first(lastweek, "-2 days")

 可以将first()和last()组合起来使用

#第1周的后3天

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

5、查看时间周期性和次数

periodicity()  查看时间序列的周期

 ndays() , nmonths(), nquarters()  查看周期的次数

 

四、xts对象的合并运算

 xts objects在做数学计算时,会遵循时间并且只返回有时间交集的数据。 

1、用merge按列合并xts

merge()将一个或多个序列按列合并。适用于按固定日期来规范观测值。

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

3个关键参数:

 ... :用于合并的任意个的对象

Join :规定如何合并序列,例如inner或left方式。

 Fill : 规定如何设置序列合并后出现的缺失值

2、用rbind按行合并xts

合并结果按时间升序排列

 

五、观测值的NA值处理

1、前一个或下个观测值结转法

取缺失值的前一个观测值来填补缺失值。可防止先窥偏差(look-ahead bias)

# 使用上个观测值

na.locf(x)               

#设置fromLast = TRUE,可使用下个观测值填补空缺

na.locf(x, fromLast = TRUE)

2、使用 na.approx()插补缺值

na.approx()基于两点之间的简单线性插值,数据点使用索引值之间的距离来估算,估算值在时间上是线性的。

 

六、时间序列操作

1、偏移函数lag()

k是偏移的步长。在xts中,k为正,序列的观测值将向下(时间后方)偏移;k为负,观测值将向上偏移。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、差分函数diff()

一个简单的差分例如:  x(t) - x(t-k)  其中k是序列偏移的步长。高阶差分是对每个之前的差分计算结果的重复应用。

diff(xtsdata,  lag = , differences = )

参数说明:

 Lag:偏移数;

differences:差分的次序(例如:调用多少次 diff )。

# 下面两条指令的效果相同

diff(x, differences = 2)

diff(diff(x))

3endpoints()函数,按时间间隔分割数据

endpoints(data,on=, k= )

该函数接收一个时间序列并返回每个时间区间的最后一个观测值的位置向量。返回值以0开始,以数据长度(总行数)结束。

参数on 支持各种时间周期, 包括"years", "quarters", "months","hours"和 "minutes"等。

参数K用于找到第k个周期。例如,设置on = "weeks", k = 2, 可取每两周的最后一天。注意最后一个返回值总是数据的长度,即便是与间隔周期不一致。

例如,下列代码显示某数据每年的最后一个观测值

endpoints(Air, on = "years")

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

4、用period.apply按时间分割数据,并运算

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

使用举例:

# 计算每周的端点
ep <- endpoints(temps, on = "weeks")

# 计算每周均值并显示结果

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

5、用 split-lapply-rbind分割数据并运算

#按周来划分数据,f参数是一个字符串,用于描述划分的间隔(例如:"months", "years")

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

#创建一个每周均值的列表

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

x_list_rbind <- do.call(rbind, temps_avg)

do.call(rbind, ...)

向rbind传送一个list,而不是一次传送一个对象。

6、单变量序列转换成OHLC数据(Open-High-Low-Close data

基于常规窗口整合不同频次的序列可以使分析更容易。

to.period()函数格式如下,参数包括序列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、转换成低频序列

 to.period()也可将序列转换成低调整频次的数据,类似于二次抽样。

# 转换成季度OHLC格式

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

#使用快捷功能转换成季度OHLC格式

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

indexAt参数设置为firstof ,选取区间时间的起点。设置参数name可以改变每一列的基础名。

8、计算时间序列的滚动标准差

时间序列数据的另一个常用需求是在数据的滚动窗口应用函数。

 xts 对象可使用zoo函数rollapply()来实行。

该函数参数有时间序列对象x,窗口大小width,应用于每个滚动周期的函数FUN。

Width参数规定了窗口中的观测值数量。例如,选取一个序列的10天滚动。

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

注意:如果是日观测值的序列是选取10天,如果是月观测值的序列会选取10个月。

 

七、修改时间戳

1、在高频次数据中发现具有相同时间戳的观测值时,一般有效的做法是强制时间唯一,增加毫秒随机数。

make.index.unique(dataeps= ,  drop=  ,…) 

参数说明:

eps:epsilon or small change的缩写,控制相同的时间被扰乱的程度。

drop = TRUE:移除全部重复观测值。

举例

make.index.unique(x, eps = 1e-4)  #  增加随机数

make.index.unique(x, drop = TRUE) # 去除重复项

 

2、 某些情形时间戳过于精确,最好是近似到一些固定的间隔点。例如观测值可能在一小时内的任何时点发生,但只需记录最近的下个整点。

以下一个时间对齐数据,秒,分钟,小时。

align.time(data,n= )   参数n,表示要近似到的秒数

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

 

转载于:https://www.cnblogs.com/jiangmiaomiao/p/6931045.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java笔记04-核心类库

Java笔记04-核心类库 Object类 1.1 常用的包 java.lang包 -该包是Java语言中的核心包,该包中的内容由Java虚拟机自动导入 如:String类,System类等java.util包- 该包是Java语言中的工具包,里面包含了大量的工具类和集合类等java.io包 是输入输出包,包括读写各种设备java.net…

Butterknife全方位解析

概述 Butterknife是供职于Square公司的JakeWharton大神开发的开源库&#xff0c;使用这个库&#xff0c;在AS中搭配Android ButterKnife Zelezny插件&#xff0c;可以大大提高开发的效率&#xff0c;从此摆脱繁琐的findViewById(int id)&#xff0c;也不用自己手动bind(int id)…

Linux下编译FFMpeg

环境&#xff1a;RedHat AS4  1。首先获取ffmpeg  通过svn下载&#xff1a;  从 http://subversion.tigris.org下载SVN客户端程序。   先装subversion&#xff0c;确保已经安装了apr和apr-util&#xff0c;在apache.org网站能下到  wget http://subversion.tigris.or…

论文笔记 Aggregated Residual Transformations for Deep Neural Networks

这篇文章构建了一个基本“Block”&#xff0c;并在此“Block”基础上引入了一个新的维度“cardinality”(字母“C”在图、表中表示这一维度)。深度网络的另外两个维度分别为depth&#xff08;层数&#xff09;、width&#xff08;width指一个层的channel的数目&#xff09;。 首…

matlab 归一化_机器学习中如何用Fscore进行特征选择(附Matlab代码)

作者&#xff1a;kervin编辑&#xff1a;阿吉 目前&#xff0c;机器学习在脑科学领域的应用可谓广泛而深入&#xff0c;不论你是做EEG/ERP研究&#xff0c;还是做MRI研究&#xff0c;都会看到机器学习的身影。机器学习最简单或者最常用的一个应用方向是分类&#xff0c;…

Java笔记05-Collection、泛型、迭代器

Java笔记05-Collection、泛型、迭代器 【Collection、泛型】 主要内容 Collection集合迭代器增强for泛型 第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一种容器&a…

IOS安装CocoaPods完整流程

作为一个底层系统大菜鸟,又搞过几年ios来说,安装一个CocoaPods是一件蛋痛的事~ 说懂又懂,说不懂又不懂. 由于安装过程比較复杂,步骤较多,而网上教程又比較零散,并且有一些是扯蛋的,所以本篇文章主要从头到位依据自身安装经历记录每一条终端指令,至于里面的原理和一些概念性的东…

重装TCP/IP

在Windows XP的网络组件列表里&#xff0c;Internet 协议 (TCP/IP)的"卸载"按钮是灰色不可选状态。这是因为传输控制协议/Internet 协议 (TCP/IP) 堆栈是 Microsoft XP/ 2003 的核心组件(TCP/IP协议是Windows XP的默认协议),不能删除。所以Windows XP不允许卸载TCP/I…

linux 修改时区_教你在Centos8中更改时区

对于许多与系统相关的任务和进程&#xff0c;使用正确的时区是必不可少的。例如&#xff0c;cron守护进程使用系统的时区执行cron作业&#xff0c;日志文件中的时间戳基于同一系统的时区。环 境CentOS 8检查现在的时区timedatectl是一个命令行实用程序&#xff0c;允许您查看和…

UVA12511 - Virus(DP+最长公共上升子序列)

题目链接&#xff1a; https://vjudge.net/problem/UVA-12511 题目大意&#xff1a; 给定两个序列&#xff0c;求出两个序列的最长公共上升子序列&#xff08;严格上升&#xff09;。 解题过程&#xff1a; 比赛的时候没有做出来&#xff0c;非常咸鱼的一场比赛&#xff0c;当时…

Java笔记06-Map集合

Map集合 学习目标 能够说出Map集合特点使用Map集合添加方法保存数据使用”键找值”的方式遍历Map集合使用”键值对”的方式遍历Map集合能够使用HashMap存储自定义键值对的数据能够使用HashMap编写斗地主洗牌发牌案例 Map集合概述 啥也不用说,Map集合就相当于python中的字典…

理解什么是前后端分离

HTML、CSS、JS。 AJAX或Fetch。 学习一个前端的框架&#xff0c; React或者Vue或者Angularjs2都可以。 学会一个前端的路由框架&#xff0c; 如React-Router或者Vue-Router。 在学会3的基础上你肯定已经搭建好前端的开发环境了&#xff0c;所有和后端的交互走AJAX或者Fetch…

帧间、帧内像素块预测

一、像素块预测 H.264/ AVC标准中的基本预测技术是基于块&#xff0c;而不是基于对象的。它的编码器是利用混合的编码方案来提高编码效率&#xff0c;这些方案包括高级的预测技术和有效熵编码技术。在运动预测中它使用不同的块的大小进行预测&#xff0c;以树结构的方式来组织…

高性能mysql 第10章 复制

复制功能不仅能够构建高可用的应用&#xff0c;同时也是高可用性&#xff0c;可扩展性&#xff0c;灾难恢复&#xff0c;备份以及数据仓库等工作的基础。 mysql支持两种复制方式&#xff1a;基于语句的复制和基于行的复制。基于语句的复制&#xff08;也成为逻辑复制&#xff0…

vb6在后台将窗体保存到图片_如何将寺库网多个商品图片一键分类保存到一个目录...

寺库网是全球最大的奢侈品网上在线购物平台&#xff0c;那么我们怎样可以从寺库网上一键批量采集到多个宝贝商品图片&#xff0c;并分类保存到电脑呢&#xff1f;今天小编给大家带来一款专业电商图片链接采集软件【载图助手】&#xff0c;它支持平台高达141个&#xff0c;均可支…

Java笔记07-List、Set、数据结构、Collections

Java笔记07-List、Set、数据结构、Collections 主要内容 数据结构List集合Set集合Collections 第一章 数据结构 2.1 数据结构有什么用&#xff1f; 当你用着java里面的容器类很爽的时候&#xff0c;你有没有想过&#xff0c;怎么ArrayList就像一个无限扩充的数组&#xff…

Apache安装问题:configure: error: APR not found . Please read the documentation

参考&#xff1a;http://cuisuqiang.iteye.com/blog/2068794 http://www.cnblogs.com/Anker/p/3355573.html pcre: https://ftp.pcre.org/pub/pcre/ http://www.linuxidc.com/Linux/2012-06/62289.htm 1. 不赞成去卸载httpd的东西。 2. server上可以存在多个apache。一个是rpm&…

浮动与定位

2019独角兽企业重金招聘Python工程师标准>>> 一.浮动:float:一个元素浮动时,其他内容会"环绕"该元素. 浮动元素的外边距不会合并浮动的元素不能超出其包含快的内边界浮动元素彼此会避免重叠浮动元素的顶端不能比之前所有浮动元素或块级元素的顶端更高如果…

驱动级的自动按键_Aqara全自动智能推拉锁D100,体验全自动开门的便捷

大家好&#xff0c;我是梦想是个猪&#xff0c;今天为大家带来的是一篇智能门锁的使用体验。前言家里的这张门陆陆续续的换了好几把智能门锁了&#xff0c;也体验了好几种不同的开锁方式。最开始开发商给安装的是一把指纹和把手分离的那种款式&#xff0c;开锁的时候需要先输入…

码率问题

帧率影响的是每帧的额定比特数 我说的帧率是编码帧率&#xff0c;不是采集帧率。对于一个采集后的序列&#xff0c;MAD 只跟参考帧有关。而编码帧率与参考帧无关&#xff0c;因此编码帧率不影响 MAD。 ———————————————————————————————————…