首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tidyquant R迭代一组参数

使用tidyquant R迭代一组参数
EN

Stack Overflow用户
提问于 2018-11-25 23:31:44
回答 1查看 272关注 0票数 0

我有一个数据集,我想用不同的参数值使用tq_mutate和rollapply来处理。

目前,我使用for循环来检查所有参数值,但我确信这不是完成此任务的最有效或最快的方法(特别是当我要查看大量参数值时)。如何改进或删除for循环?我怀疑这意味着使用purrr::map或其他一些方法(多线程/多核等),但是我还没有在网上找到有用的例子。

下面是一些示例代码。请忽略数据集的简单性和缩放函数的输出,这只是为了说明。我想要做的是迭代许多不同的V0值。

代码语言:javascript
复制
library(dplyr)
library(tidyverse)
library(broom)
library(tidyquant)

my_bogus_function <- function(df, V0=1925) { 
  # WILL HAVE SOMETHING MORE SOPHISTICATED IN HERE BUT KEEPING IT SIMPLE
  # FOR THE PURPOSES OF THE QUESTION
  c(V0, V0*2)
}

window_size <- 7 * 24
cnames = c("foo", "bar")
df <- c("FB") %>%
    tq_get(get = "stock.prices", from = "2016-01-01", to = "2017-01-01") %>% 
    dplyr::select("date", "open")

# CAN THIS LOOP BE DONE IN A MORE EFFICIENT MANNER? 
for (i in (1825:1830)){
  df <- df %>% 
        tq_mutate(mutate_fun = rollapply,
                  width      = window_size,
                  by.column  = FALSE,
                  FUN        = my_bogus_function,
                  col_rename = gsub("$", sprintf(".%d", i), cnames), 
                  V0 = i
    )
}
# END OF THE FOR LOOP I WANT FASTER
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 23:04:55

考虑到R使用的是一个核心,我发现通过使用包并行、doSNOW和foreach (允许使用多个内核)(注意,我在windows机器上,所以其他一些包不可用),我发现了改进。

我确信对于多线程/并行/向量代码还有其他答案。

这是有兴趣的人的密码。

代码语言:javascript
复制
library(dplyr)
library(tidyverse)
library(tidyquant)
library(parallel)
library(doSNOW)  
library(foreach)

window_size <- 7 * 24
cnames = c("foo", "bar")
df <- c("FB") %>%
  tq_get(get = "stock.prices", from = "2016-01-01", to = "2017-01-01") %>% 
  dplyr::select("date", "open")

my_bogus_function <- function(df, V0=1925) { 
  # WILL HAVE SOMETHING MORE SOPHISTICATED IN HERE BUT KEEPING IT SIMPLE
  # FOR THE PURPOSES OF THE QUESTION
  c(V0, V0*2)
}

# CAN THIS LOOP BE DONE IN A MORE EFFICIENT/FASTER MANNER? YES 
numCores <- detectCores() # get the number of cores available
cl <- makeCluster(numCores, type = "SOCK")
registerDoSNOW(cl) 

# Function to combine the outputs 
mycombinefunc <-  function(a,b){merge(a, b, by = c("date","open"))}

# Run the loop over multiple cores
meh <- foreach(i = 1825:1830, .combine = "mycombinefunc") %dopar% {
  message(i)
  df %>% 
    # Adjust everything
    tq_mutate(mutate_fun = rollapply,
              width      = window_size,
              by.column  = FALSE,
              FUN        = my_bogus_function,
              col_rename = gsub("$", sprintf(".%d", i), cnames), 
              V0 = i
    )
}
stopCluster(cl)
# END OF THE FOR LOOP I WANTED FASTER
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53473059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档