【问题标题】:How to load CSV data file into R for use with quantmod如何将 CSV 数据文件加载到 R 中以与 quantmod 一起使用
【发布时间】:2012-01-23 11:20:37
【问题描述】:

我是 R 新手,刚刚开始使用它。我目前正在尝试使用 quantmod 包。

quantmod 包似乎完成了我想做的大部分工作,但是,我不想使用 getSymbols() 函数将数据提取到 R 中。相反,我想使用我自己的数据 - 存储为 csv 文件我的本地磁盘。

我希望能够从我的 CSV 文件中提取数据以用于 quantmod。我来到了this article,它展示了如何读取 CSV 文件以与 quantmod 一起使用,但我不喜欢它至少有两个原因:

  1. 它会在加载到 quantmod 之前将一个新的(重新格式化的)CSV 文件写入磁盘。我宁愿在内存中做任何必要的修改,使用 R.

  2. CSV 文件具有列标题。我的数据没有列标题。相反,这些字段位于预定的固定列位置(与 Yahoo Finance 数据表采用的“标准”格式相匹配)。

我还没有弄清楚 getSymbols() 函数返回的数据类型。我希望它返回一个数据框,但是当我检查它的类时,它被识别为一个字符向量 - 我发现这非常令人惊讶(坦率地说,不相信,因为我能够从包含的数据中绘制一个条形图在变量中):

yhoo <- getSymbols("YHOO",src="google")
class(yhoo)
[1] "character"
> yhoo
[1] "YHOO"

如果有人能展示如何编写一个小型 R 函数(很可能是 read.csv 的包装器),该函数将从我的 CSV 文件中读取数据并将其作为 R 对象(数据框?)返回以供使用,我将不胜感激使用 quantmod。

这是一些解释我想要做什么的伪代码:

# in case I need some funcs here for creating data type returned by function
library(quantmod) 

loadCSVDataFile <- function(full_pathname){
    csvdata <- read.csv(full_pathname, header=FALSE,sep=",")
    dates <- csvdata[,1]
    op <- csvdata[,2]
    hi <- csvdata[,3]
    lo <- csvdata[,4]
    cl <- csvdata[,5]
    vol <- csvdata[,6]
    oi <- csvdata[,7]

    # Now combine columns into a data type that matches that returned by the
    # getSymbols() ....
    # return(dataset)
}

[[更新]]

使用目前给出的答案,我还没有设法让它工作......:

> gbpusd <- as.xts(read.zoo('/path/to/gbpusd.csv', header=FALSE))
> class (gbpusd)
[1] "xts" "zoo"
> barChart(gbpusd)
Error in `[.xts`(x, xsubset) : subscript out of bounds

> gbpusd2 <- getSymbols.csv('gbpusd',,'/path/to/')
Error in missing(verbose) : 'missing' can only be used for arguments
> 
> gbpusd2 <- getSymbols.csv('gbpusd',.GlobalEnv,'/path/to/')
Error in missing(verbose) : 'missing' can only be used for arguments
> 
> 
> gbpusd2 <- getSymbols.csv('gbpusd','.GlobalEnv','/path/to/')
Error in missing(verbose) : 'missing' can only be used for arguments
> 
> gbpusd2 <- getSymbols.csv('gbpusd',env,'/path/to/')
Error in missing(verbose) : 'missing' can only be used for arguments

我做错了什么?

【问题讨论】:

  • (1) 您能否通过删除前导“>”并将行缩进 4 个空格来重新格式化您的第一个代码示例; (2) 我向您保证,您不能使用 4 个字母“YHOO”绘制条形图。尝试给出 [1] "xts" "zoo" 的 class(YHOO)。
  • 你为什么要计算getSymbols返回的数据类型?值部分?getSymbols 告诉您它返回什么以及如何返回它。大多数 quantmod 函数还需要一个类似时间序列的对象,而 data.frames 不在此类别中。
  • 顺便说一句,文档说不要直接使用 getSymbols.csv() 。使用 src='csv' 调用 getSymbols(),或使用 setSymbolLookup() 配置 quantmod 以将其视为默认值。

标签: r quantmod


【解决方案1】:

我可以让它工作,但您必须确定您的设置需要哪些参数。

library(quantmod)

# create sample data
getSymbols("SPY")
write.zoo(SPY, file="SPY.csv", sep=",")

# set symbol lookup
setSymbolLookup(SPY=list(src="csv",format="%Y-%m-%d"))
# call getSymbols(.csv) with auto.assign=FALSE
spy <- getSymbols("SPY", auto.assign=FALSE)
barChart(spy)

【讨论】:

  • +1 对于代码。一个 sn-p 的代码相当于 1K 个单词。我终于设法弄清楚我做错了什么。谢谢!
【解决方案2】:

常见的成语是:

yhoo = as.xts(read.zoo("yhoo.csv",header=T))

如果你想使用 quantmod 函数,那么你可以告诉getSymbols() 使用 csv 文件。见http://www.quantmod.com/documentation/getSymbols.csv.html

getSymbols('yhoo',src='csv')

(我遵循您的小写约定,但请记住文件名区分大小写;目录默认为当前目录,可以使用dir 参数显式指定,请参阅?getSymbols.csv

【讨论】:

  • 功能没有按我预期的那样工作。即我不能将加载的数据与 quantmod 函数一起使用(例如 barChart())。请查看我更新的问题。
【解决方案3】:

如果你在代码中包含一个 ls(),你会发现你错过了一个变量:

yhoo <- getSymbols("YHOO", src = "google")
ls()
# [1] "yhoo" "YHOO"
class(yhoo)
# [1] "character"
class(YHOO)
# [1] "xts" "zoo"

所以 getSymbols() 创建了 2 个变量:字符向量“yhoo”和“YHOO”,这是一个扩展了 zoo 类的可扩展时间序列 (xts) 的对象类,用于存储不规则的时间序列数据。

要查看文档,请使用:

?xts # or ?zoo

xts 的文档特别描述了 as.xts() 函数,用于从矩阵转换为 xts。从那里使用 read.csvread.table 读取您自己的 CSV 文件并转换为 xts 对象应该很简单。

【讨论】:

  • +1 并注意您可以使用auto.assign=FALSE 来阻止getSymbols 在全局环境中创建对象的副作用。例如。 yhoo &lt;- getSymbols("YHOO", src="google", auto.assign=FALSE) 会将getSymbols 的结果分配给yhoo 而不是YHOO
  • @JoshuaUlrich:我感兴趣的是 getSymbols.csv(),因为我想从本地 csv 文件(而不是互联网)加载数据
  • @HomunculusReticulli: getSymbols.csv 具有相同的auto.assign 参数(虽然它是通过... 传递的并且没有明确说明,但您可以通过查看源代码看到它已处理)。跨度>
  • @JoshuaUlrich:感谢您的反馈。但你真的尝试过你推荐的吗? (因为当我尝试它时它不起作用)。通过“它不起作用”,我具体指以下: 1. 该函数似乎加载数据文件(当我使用 src="csv" 和适当的文件夹和符号参数调用 getSymbols() 时。但是,当我在返回的变量上调用 barChart(),我收到以下错误:try.xts(x, error = "chartSeries requires an x​​tsible object") 中的错误:chartSeries requires an x​​tsible object。
  • @HomunculusReticulli:不,我没有尝试,因为您没有提供可重现的示例。
猜你喜欢
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2015-06-08
  • 1970-01-01
相关资源
最近更新 更多