R读取金融数据的那些事儿 | 怎么让收盘价的‘日期’甩不掉++牛市出现在‘哪天’

本文介绍了R语言在处理金融数据时如何处理行名列名,特别是日期作为行名的问题。通过read.csv()函数的row.names参数解析数据,并展示了不同设置下的效果。还讲解了如何处理时间数据,包括使用as.xts()函数处理不规则时间序列,以及使用which()函数找到最大值对应的日期。此外,提到了删除含NA值的观测和日期格式的处理。
摘要由CSDN通过智能技术生成

*R读取金融数据的那些事儿 之
怎么让收盘价的‘日期’甩不掉 ++ 牛市出现在‘哪天’
简书同步链接 详戳此处
来自灵魂一问:行名列名你真的知道是什么吗?
敢情这么多年我一直不知道啥叫行名列名??还真是今天才明白过来…

1、划重点!!!!
不要以为日期date放第一列了就是行名了,要是AAPL Open放第一列也不会把他当做是行名吧?(不要受了惯性思维的限制)所以如果是表2这种数据形式,此时这个表是只有列名没有行名的。但是如果我们的数据是表3这种形式,它是有行名和列名的,其中行名是:1 2 3 ……10 列名是 data AAPL Open 和 AAPL Close。而那块绿色在一个有行名有列名存在的表格中,这个位置就应该是空的。如果它不空了,他就又成了有列名无行名的表2了。

浅橙色的才是行名/列名

2、划重点!!!!
下面我们看一下read.csv()函数中的 rownames 的含义:
If there is a header and the first row contains one fewer field than the number of columns, the first column in the input is used for the row names. Otherwise if row.names is missing, the rows are numbered.( 如果有标题,并且第一行包含的字段少于列数,则输入中的第一列用作行名。 否则,如果缺少row.names,则会对行进行编号;比如表2缺少行名,则R命令read.csv(“data.csv”)的读取结果会自动增加行名,且行名用数值1 2 3 表示。)

3、R实战读取数据–行名列名纠纷
下面我们尝试用R读取‘示例’数据–具体见下表。
示例数据.csv:平常我们R读取的Excel数据大多长这种形式,和表2一样

R中的具体表现:

> data0 = read.csv("data.csv")
> data0
               date AAPL.Open AAPL.Close
       1   2019/1/1   38.7225    36.9825
       2   2019/1/8   37.3900    37.5000
       3  2019/1/15   37.5675    39.2050
       4  2019/1/22   39.1025    39.0750
       5  2019/1/29   39.0625    42.8125

(data0)这就是上面提到的没有row.names参数时( row.names = 0),Excel自动读取数据的效果–自动生成了1 2 3 4 5 的行名。

> data1 = read.csv("data.csv",row.names = 1)
> data1
           AAPL.Open AAPL.Close
2019/1/1    38.7225    36.9825
2019/1/8    37.3900    37.5000
2019/1/15   37.5675    39.2050
2019/1/22   39.1025    39.0750
2019/1/29   39.0625    42.8125

(data1)当 row.names = 1,这时自动把“示例数据”中的第1列表示为行名。

> data2 = read.csv("data.csv",row.names = 2)
> data2
            date AAPL.Close
38.7225  2019/1/1    36.9825
37.39    2019/1/8    37.5000
37.5675 2019/1/15    39.2050
39.1025 2019/1/22    39.0750
39.0625 2019/1/29    42.8125

(data2)当 row.names = 2,这时自动把“示例数据”中的第2列表示为行名。

3、R实战读取数据–怎样把时间数据自带日期(比如随便选取其中一列,该列前面都会附带上日期)

> data1 = read.csv("data.csv",row.names = 1)
> Dates = as.Date(rownames(data1),format = "%Y/%m/%d")#把data1中的行名(即行名2019/1/1等转换为R可以识别的日期类  format 等于啥取决于原始数据的日期是啥形式
> Dates
[1] "2019-01-01" "2019-01-08" "2019-01-15" "2019-01-22" "2019-01-29"
> data.ts = as.xts(data1, order.by = Dates)  #该命令就会实现“任取一列数据都会带上日期”
> data.ts$AAPL.Close   #选中了某列数据AAPL.Close,自动出现了对应的日期
           AAPL.Close
2019-01-01    36.9825
2019-01-08    37.5000
2019-01-15    39.2050
2019-01-22    39.0750
2019-01-29    42.8125

这里要注意和close = ts(data$AAPL.Close,start = c(2019,1,1),frequency = 365)有所区别。对于有变化规律的时间,比如按月、按季这种,因为不论外界有何变化,月只有12个,季节只有4季,这是亘古不变的,所以用这种函数 ts 自动生成周期数据很方便。但是如果遇到了数据是不规律的,比如有的月份10个数据,有的15个数据,即此时的数据是不规则的、没有按某种周期变化的,这时候我们就不能自己用ts生成日期数据了(它对有规律的数据友好),我们需要用as.xts()函数

4、R实战读取数据–找出符合要求的值所对应的日期(比如找出变量AAPL.Close的最大值对应的日期是哪天)–关键函数which()

> #接着上述data1的处理,而后:把要研究的变量拎出来
> close = data.ts$AAPL.Close #自带日期的变量
> close
       AAPL.Close
2019-01-01    36.9825
2019-01-08    37.5000
2019-01-15    39.2050
2019-01-22    39.0750
2019-01-29    42.8125

> #找到close的最大值
> min(close)  
[1] 36.9825
> #找到close最大值对应的日期
> dateee = index(close) #得到变量对应的索引-即日期,注意:这一步一定写上,防止所研究的数据样本观测增多或减少
> dateee[which.min(close)] #“which.查找的东西”,返回是对应的位置5
[1] "2019-01-01"

> #找到2019.1.15日之后,close最小值对应的日期
> close_after_2019_1_15 = window(close, start = '2019-01-15')
> min(close) 
[1] 36.9825
> dateee = index(close_after_2019_1_15)  
> dateee[which.min(close_after_2019_1_15)]
[1] "2019-01-22"

5、R实战读取数据–找出符合要求的观测个数是多少

> #找出close中值大于40的观测数
> sum(close>40,na.rm = T)  # na.rm = T表示na.remove,即移除NA。若为T则表示移除NA,否则F表示把NA放在考虑范围内。
[1] 1

6、R实战读取数据–删除含NA值的观测

# close中含有NA值的观测有几个
> sum(is.na(close)) 
[1] 0
> #删除close中的NA值对应的观测
> close_na_omit= na.omit(close)
> # 检验含NA值的观测是否删除干净了
> sum(is.na(close_na_omit))
[1] 0

7、关于日期格式 format 可参考该链接R语言日期的表示和运算

8、本文所涉及的全部代码

setwd("C:\\Users\\Administrator\\Desktop")
data0 = read.csv("data.csv")

data1 = read.csv("data.csv",row.names = 1)
Dates = as.Date(rownames(data1),format = "%Y/%m/%d")#把data1中的行名(即行名2019/1/1等转换为R可以识别的日期类型
Dates
data.ts = as.xts(data1, order.by = Dates)#该命令就会实现“任取一列数据都会带上日期”
data.ts$AAPL.Close  #选中了某列数据AAPL.Close,自动出现了对应的日期

#接着上述data1的处理,而后:把要研究的变量拎出来
close = data.ts$AAPL.Close #自带日期的变量
close
#找到close的最大值
min(close)  
#找到close最大值对应的日期
dateee = index(close) #得到变量对应的索引-即日期,注意:这一步一定写上,防止所研究的数据样本观测增多或减少
dateee[which.min(close)] #“which.查找的东西”,返回是对应的位置5

#找到2019.1.15日之后,close最小值对应的日期
close_after_2019_1_15 = window(close, start = '2019-01-15')
min(close) 
dateee = index(close_after_2019_1_15)  
dateee[which.min(close_after_2019_1_15)] 

#找出close中值大于40的观测数
sum(close>40,na.rm = T)  # na.rm = T表示na.remove,即移除NA值。若为T则表示移除NA,否则表示包含NA在内

> #删除close中的NA值对应的观测
> close_na_omit= na.omit(close)
> # 删除含NA值的观测
close_na_omit= na.omit(close)
> # 检验含NA值的观测是否删除干净了
sum(is.na(close_na_omit))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jenny与统计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值