我被一只股票的信号预测算法webscraping从各种网站的数据构建的数据集。我的算法建立的方式包括分层for循环和装载上千的URL,因为每个环节是指股票及其各种定量的统计数据。需要帮助提高处理速度。有小费吗?
我已经谈过几个不同的人如何解决这一点,有些人建议向量化,但毕竟是新的我。我也曾尝试切换到数据表,但我还没有看到太大的变化。该EVAL线是一招,我学会了处理数据的方式我想但我想它可能是一个原因,它是缓慢的,但我对此表示怀疑。我也想知道的远程处理,但是这可能超出了将R的世界。
对于下面的代码,假设有4个这样的多个部分从不同的网站我想加载其它变量,并且所有这些块都在一个更大的for循环,因为我生成两个数据集(设置= C(”培训,测试“))。
该tryCatch是为了防止代码停止,如果遇到错误加载URL。网址加载到一个列表,每一个股票 - 所以他们是很长。第二for循环从URLS刮擦数据并将其发布在数据帧正确格式化。
library(quantmod)
library(readr)
library(rvest)
library(data.table)
urlsmacd <- vector("list", length =
eval(parse(text=as.name(paste0("nrow(", set[y], ")", sep = "")))))
for(h in 1:eval(parse(text=as.name(paste0("nrow(", set[y], ")", sep =
""))))){
urlsmacd[h] <- paste0('http://www.stockta.com/cgi-bin/analysis.pl?
symb=',eval(parse(text=as.name(paste0(set[y],"[,1][h]", sep =
"")))),'&mode=table&table=macd&num1=1', sep = '')
}
for(j in 1:eval(parse(text=as.name(paste0("nrow(", set[y], ")", sep =
""))))){
tryCatch({
html <- read_html(urlsmacd[[j]])
#get macd html
MACD26 <- html_nodes(html,'.borderTd~ .borderTd+ .borderTd:nth-child(3)
font')
MACD26 <- toString(MACD26)
MACD26 <- gsub("<[^>]+>", "", MACD26)
if(!is.na(MACD26)){
MACD26 <- as.double(MACD26)
}
eval(parse(text=as.name(paste0(set[y],"$","MACD26[j] <- MACD26"))))
MACD12 <- html_nodes(html,'.borderTd+ .borderTd:nth-child(2) font')
MACD12 <- toString(MACD12)
MACD12 <- gsub("<[^>]+>", "",MACD12)
if(!is.na(MACD12)){
MACD12 <- as.double(MACD12)
}
eval(parse(text=as.name(paste0(set[y],"$","MACD12[j] <- MACD12"))))
}, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}
所有这一切都说过和做过,这个过程大约需要6个小时。按照这一速度,剃个假进程将使进步我的项目容易得多。
感谢您的StackOverflow的人的支持。
检查doParallel包。它有一个并行执行foreach循环。它让你使用你的CPU的多个内核(如果有可用)的定义函数执行并行的R会话。例如:
library(doParallel)
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores, type="FORK")
registerDoParallel(cl)
result <- foreach(i=10:10000) %dopar%
getPrimeNumbers(i)
如果URL存储在一个列表中,也有一个平行lapply。
这个例子是从这个伟大的职位采取:
https://www.r-bloggers.com/lets-be-faster-and-more-parallel-in-r-with-doparallel-package/amp/
希望能帮助到你。