【问题标题】:quantmod R getsymbols.MySQL modificationquantmod R getsymbols.MySQL 修改
【发布时间】:2015-05-20 17:37:09
【问题描述】:

我已经研究过这个案例 Quantmod: Error loading symbols from MySQL DB 并且已经尝试修复 R

中的 getSymbols.MySQL 函数

但是,我发现我的数据库只包含 日期、开盘价、最高价、最低价、收盘价、成交量(没有 close.adj 列)。 那么,如果我想进一步修改getSymbols.MySQL函数,该怎么办呢?

我尝试使用'fix(getSymbols.MySQL)' 来修复该功能。但是,它返回

colnames<-(*tmp*, value = c("H0001.Open", "H0001.High", "H0001.Low", : 'dimnames' [2] 的长度不等于数组范围

当我连接到我的数据库时。

function (Symbols, env, return.class = "xts", db.fields = c("date", 
"o", "h", "l", "c", "v", "a"), field.names = NULL, user = NULL, 
password = NULL, dbname = NULL, host = "localhost", port = 3306, 
...) 
{
importDefaults("getSymbols.MySQL")
this.env <- environment()
for (var in names(list(...))) {
    assign(var, list(...)[[var]], this.env)
}
if (!hasArg(verbose)) 
    verbose <- FALSE
if (!hasArg(auto.assign)) 
    auto.assign <- TRUE
if (!requireNamespace("DBI", quietly = TRUE)) 
    stop("package:", dQuote("DBI"), "cannot be loaded.")
if (!requireNamespace("RMySQL", quietly = TRUE)) 
    stop("package:", dQuote("RMySQL"), "cannot be loaded.")
if (is.null(user) || is.null(password) || is.null(dbname)) {
    stop(paste("At least one connection argument (", sQuote("user"), 
        sQuote("password"), sQuote("dbname"), ") is not set"))
}
con <- DBI::dbConnect("MySQL", user = user, password = password, 
    dbname = dbname, host = host, port = port)
db.Symbols <- DBI::dbListTables(con)
if (length(Symbols) != sum(Symbols %in% db.Symbols)) {
    missing.db.symbol <- Symbols[!Symbols %in% db.Symbols]
    warning(paste("could not load symbol(s): ", paste(missing.db.symbol, 
        collapse = ", ")))
    Symbols <- Symbols[Symbols %in% db.Symbols]
}
for (i in 1:length(Symbols)) {
    if (verbose) {
        cat(paste("Loading ", Symbols[[i]], paste(rep(".", 
            10 - nchar(Symbols[[i]])), collapse = ""), sep = ""))
    }
    query <- paste("SELECT ", paste(db.fields, collapse = ","), 
        " FROM ", Symbols[[i]], " ORDER BY date")
    rs <- DBI::dbSendQuery(con, query)
    fr <- DBI::fetch(rs, n = -1)
    fr <- xts(as.matrix(fr[, -1]), order.by = as.Date(fr[, 
        1], origin = "1970-01-01"), src = dbname, updated = Sys.time())
    colnames(fr) <- paste(Symbols[[i]], c("Open", "High", 
        "Low", "Close", "Volume", "Adjusted"), sep = ".")
    fr <- convert.time.series(fr = fr, return.class = return.class)
    if (auto.assign) 
        assign(Symbols[[i]], fr, env)
    if (verbose) 
        cat("done\n")
}
DBI::dbDisconnect(con)
if (auto.assign) 
    return(Symbols)
return(fr)
}

我认为问题在于该函数旨在读取 7 列数据而不是 6 列数据。希望有人能帮忙。

【问题讨论】:

  • 为什么设置db.fields 不起作用?并牢记?getSymbols.MySQL 中的 Note 部分。
  • getSymbols.MySQL("H0001", env, return.class= 'xts', db.fields = c("date", "open", "high", "low", "close ", "volume"), user = 'xxxx', password = 'xxxx', host='xxxx', dbname = 'xxxx'), 它不起作用。
  • 错误colnames&lt;-(*tmp*, value = c("H0001.Open", "H0001.High", "H0001.Low", : 'dimnames' [2] 的长度不是等于数组范围colnames&lt;-(*tmp*, value = c("H0001.Open", "H0001.High", "H0001.Low", "H0001.Close", "H0001.Volume", "H0001.Adjusted ")) ...

标签: mysql r quantmod


【解决方案1】:

这是一个可以让你做你想做的事的补丁。我无法测试,因为我没有要测试的 MySQL 安装。请让我知道它是否有效。

diff --git a/R/getSymbols.R b/R/getSymbols.R
index 0a2e814..7a9be66 100644
--- a/R/getSymbols.R
+++ b/R/getSymbols.R
@@ -634,9 +634,9 @@ function(Symbols,env,return.class='xts',
             fr <- xts(as.matrix(fr[,-1]),
                       order.by=as.Date(fr[,1],origin='1970-01-01'),
                       src=dbname,updated=Sys.time())
-            colnames(fr) <- paste(Symbols[[i]],
-                                  c('Open','High','Low','Close','Volume','Adjusted'),
-                                  sep='.')
+            if(is.null(field.names))
+              field.names <- c('Open','High','Low','Close','Volume','Adjusted')
+            colnames(fr) <- paste(Symbols[[i]], field.names, sep='.')
             fr <- convert.time.series(fr=fr,return.class=return.class)
             if(auto.assign)
               assign(Symbols[[i]],fr,env)

那么你的函数调用应该是:

getSymbols.MySQL("H0001", env, return.class = 'xts',
  db.fields = c("date", "open", "high", "low", "close", "volume"),
  field.names = c("date", "open", "high", "low", "close", "volume"),
  user = 'xxxx', password = 'xxxx', host='xxxx', dbname = 'xxxx')

【讨论】:

  • 我怎样才能把 MySQL 分享给你?通过电子邮件?今天,我收到了这个错误... (function (classes, fdef, mtable) 中的错误:无法找到签名“字符”的函数“dbConnect”的继承方法
  • @tw123789:你还需要this patch,我也无法测试。请不要尝试通过电子邮件向我发送您的数据库...
  • 我忘了把 () 放在 RMySQL:MySQL 之后。但是问题仍然存在 colnames&lt;-(*tmp*, value = c("H0001.date", "H0001.open", "H0001.high",: 'dimnames' [2] 的长度不是等于数组范围 5 colnames&lt;-(*tmp*, value = c("H0001.date", "H0001.open", "H0001.high", "H0001.low", "H0001.close", "H0001.体积")) 4 dimnames&lt;-.xts(*tmp*, value = dn) 3 dimnames&lt;-(*tmp*, value = dn) 2 colnames&lt;-(*tmp*, value = c("H0001.date", " H0001.open"、"H0001.high"、"H0001.low"、"H0001.close"、"H0001.volume")) 在 C:\Users\J\AppData\Local\Temp\RtmpGcphw0\file1940242c330#46
  • 哦,我想那是因为我在MySQL中删除了一行,所以修改不能正常工作。我编辑了 MySQL 并最终弹出 Error in charToDate(x) : string is not in a standard unambiguous format
  • MySQL 应该不会运行任何错误,因为它具有“日期”格式的日期,并且在“日期”列中显示“2015-05-21”。所以,我认为这是由于 R 从 MySQL 中提取数据的问题,知道吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多