如何将 data.frame table 转换为 xts 对象
How to convert a data.frame table to an xts object
我从 Thomson Reuters Datastream 下载价格数据到 excel 并创建了一个 csv 文件。生成的 csv 文件是一个 data.frame 对象。我已经使用 as.date
函数将日期列设置为 date
。结果 table 是一个包含 42 列的 data.frame
,第一列是 date
列,另外 41 列是不同公司的价格数据。价格数据的class为'numeric'
。
table 看起来像这样:
date TickerA TickerB TickerC
1 2000-01-03 20 NA 40
2 2000-01-04 21 33 42
3 2000-01-05 22 32 NA
4 .
5 .
6 .
请注意,由于一些公司在观察期内破产或成立较晚,因此部分价格缺失。现在,我想使用 PerformanceAnalytics 包中的 Return.calculate 函数,它将价格的 table 转换为 returns 的 table,像这样:
date TickerA TickerB TickerC
1 2000-01-03 NA NA NA
2 2000-01-04 0.049 NA 0.049
3 2000-01-05 0.047 -0.031 NA
4 .
5 .
6 .
到目前为止的代码如下所示:
test <- read.csv("data.csv")
date <- as.Date(test$Date, format = "%m/%d/%Y")
data <- cbind(date, test[,-1])
当我尝试应用 Return.calculate 函数时,发生了这种情况:
returns <- Return.calculate(data, method = 'log')
'Error in checkData(prices, method = 'xts'): the data cannot be converted into a time series. If you are trying to pass in names from a data object with one column, you should use the form 'data[rows, columns, drop = FALSE]'. Rownames should have standard date formats, such as '1985-03-15'.'
当我尝试将 data
转换为 xts 对象时,显示如下:
xtsdata <- xts(data, order.by = data$date)
'Error in xts(data, order.by = data$date): 'order.by' cannot contain 'NA', 'NaN', or 'Inf'.'
我不明白这一点,因为我的日期列是 date
类型,我的价格列是 numeric
类型。简而言之,我认为如果我可以将 table 转换为 xts 对象,我的问题就可以解决。有人知道 table 的问题是什么吗?我很感激每一个提示,有一个好的:)
假设您所拥有的与最后注释中的一样:
library(xts)
# 1
z <- read.csv.zoo("data.csv", format = "%m/%d/%Y")
x <- as.xts(z)
# 2
DF <- read.csv("data.csv")
z <- read.zoo(DF, format = "%m/%d/%Y")
x <- as.xts(z)
# Calculate returns
library(PerformanceAnalytics)
Return.calculate(x, method = 'log')
## TickerA TickerB TickerC
## 2000-01-03 NA NA NA
## 2000-01-04 0.04879016 NA 0.04879016
## 2000-01-05 0.04652002 -0.03077166 NA
备注
Lines <- "date,TickerA,TickerB,TickerC
01/03/2000,20,,40
01/04/2000,21,33,42
01/05/2000,22,32,
"
cat(Lines, file = "data.csv")
我从 Thomson Reuters Datastream 下载价格数据到 excel 并创建了一个 csv 文件。生成的 csv 文件是一个 data.frame 对象。我已经使用 as.date
函数将日期列设置为 date
。结果 table 是一个包含 42 列的 data.frame
,第一列是 date
列,另外 41 列是不同公司的价格数据。价格数据的class为'numeric'
。
table 看起来像这样:
date TickerA TickerB TickerC
1 2000-01-03 20 NA 40
2 2000-01-04 21 33 42
3 2000-01-05 22 32 NA
4 .
5 .
6 .
请注意,由于一些公司在观察期内破产或成立较晚,因此部分价格缺失。现在,我想使用 PerformanceAnalytics 包中的 Return.calculate 函数,它将价格的 table 转换为 returns 的 table,像这样:
date TickerA TickerB TickerC
1 2000-01-03 NA NA NA
2 2000-01-04 0.049 NA 0.049
3 2000-01-05 0.047 -0.031 NA
4 .
5 .
6 .
到目前为止的代码如下所示:
test <- read.csv("data.csv")
date <- as.Date(test$Date, format = "%m/%d/%Y")
data <- cbind(date, test[,-1])
当我尝试应用 Return.calculate 函数时,发生了这种情况:
returns <- Return.calculate(data, method = 'log')
'Error in checkData(prices, method = 'xts'): the data cannot be converted into a time series. If you are trying to pass in names from a data object with one column, you should use the form 'data[rows, columns, drop = FALSE]'. Rownames should have standard date formats, such as '1985-03-15'.'
当我尝试将 data
转换为 xts 对象时,显示如下:
xtsdata <- xts(data, order.by = data$date)
'Error in xts(data, order.by = data$date): 'order.by' cannot contain 'NA', 'NaN', or 'Inf'.'
我不明白这一点,因为我的日期列是 date
类型,我的价格列是 numeric
类型。简而言之,我认为如果我可以将 table 转换为 xts 对象,我的问题就可以解决。有人知道 table 的问题是什么吗?我很感激每一个提示,有一个好的:)
假设您所拥有的与最后注释中的一样:
library(xts)
# 1
z <- read.csv.zoo("data.csv", format = "%m/%d/%Y")
x <- as.xts(z)
# 2
DF <- read.csv("data.csv")
z <- read.zoo(DF, format = "%m/%d/%Y")
x <- as.xts(z)
# Calculate returns
library(PerformanceAnalytics)
Return.calculate(x, method = 'log')
## TickerA TickerB TickerC
## 2000-01-03 NA NA NA
## 2000-01-04 0.04879016 NA 0.04879016
## 2000-01-05 0.04652002 -0.03077166 NA
备注
Lines <- "date,TickerA,TickerB,TickerC
01/03/2000,20,,40
01/04/2000,21,33,42
01/05/2000,22,32,
"
cat(Lines, file = "data.csv")