繁体   English   中英

提高drawdown.duration实施的速度

Improve speed of drawdown.duration implementation

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有工作代码计算正在运行的drawdown.duration ,其中drawdown.duration定义为当前月和前一个peak之间的月数。 然而,我实现了代码作为for循环,它运行得很慢。

是否有更有效/更快的方式在R实现这一点?

该代码需要一个data.frame (具体为tibble ,因为我一直在努力dplyr )命名returnsWithValues

> structure(list(date = structure(c(789, 820, 850, 881, 911, 942
), class = "Date"), value = c(0.94031052, 0.930751624153046, 
0.926756311376762, 0.874209664097166, 0.843026010916249, 2.1), 
    peak = c(1, 1, 1, 1, 1, 2.1), drawdown = c(-0.05968948, -0.0692483758469535, 
    -0.0732436886232377, -0.125790335902834, -0.156973989083751, 
    0)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))
# A tibble: 6 x 4
  date       value  peak drawdown
  <date>     <dbl> <dbl>    <dbl>
1 1972-02-29 0.940   1    -0.0597
2 1972-03-31 0.931   1    -0.0692
3 1972-04-30 0.927   1    -0.0732
4 1972-05-31 0.874   1    -0.126 
5 1972-06-30 0.843   1    -0.157 
6 1972-07-31 2.1     2.1   0   

我使用for循环实现了drawdown.duration

returnsWithValues <- returnsWithValues %>% mutate(drawdown.duration = NA)

    # add drawdown.duration col
    for (row in 1:nrow(returnsWithValues)) {
        if(returnsWithValues[row,"value"] == returnsWithValues[row,"peak"]) {
            returnsWithValues[row,"drawdown.duration"] = 0
        } else {
            if(row == 1){
                returnsWithValues[row,"drawdown.duration"] = 1
            } else {
                returnsWithValues[row,"drawdown.duration"] = returnsWithValues[row - 1,"drawdown.duration"] + 1
            }
        }
    }

这给出了正确的答案:

> returnsWithValues
# A tibble: 6 x 5
  date       value  peak drawdown drawdown.duration
  <date>     <dbl> <dbl>    <dbl>             <dbl>
1 1972-02-29 0.940   1    -0.0597                 1
2 1972-03-31 0.931   1    -0.0692                 2
3 1972-04-30 0.927   1    -0.0732                 3
4 1972-05-31 0.874   1    -0.126                  4
5 1972-06-30 0.843   1    -0.157                  5
6 1972-07-31 2.1     2.1   0                      0
2 个回复

我将根据需要删除for循环,我将使用索引的想法。

indices <- function(returnsWithValues){
    indices_logical<-(returnsWithValues[["value"]] == returnsWithValues[["peak"]]) #return a logical vector where true values are for equal and false for not.
    indices_to_zero<-which(indices_logical) # which values are true
    indices_drawdpwn<-which(!indices_logical) # which values are false
    returnsWithValues[indices_to_zero,"drawdown.duration"] <- 0
    returnsWithValues[indices_drawdpwn,"drawdown.duration"] <- 1:length(indices_drawdpwn) #basically you compute this if I understand correctly
    returnsWithValues

这是你在函数中包含的循环。

for_loop<-function(returnsWithValues){
    # add drawdown.duration col
    for (row in 1:nrow(returnsWithValues)) {
        if(returnsWithValues[row,"value"] == returnsWithValues[row,"peak"]) {
            returnsWithValues[row,"drawdown.duration"] = 0
        } else {
            if(row == 1){
                returnsWithValues[row,"drawdown.duration"] = 1
            } else {
                returnsWithValues[row,"drawdown.duration"] = returnsWithValues[row - 1,"drawdown.duration"] + 1
            }
        }
    }
    returnsWithValues
}

这是与你的for循环相比的基准。

microbenchmark::microbenchmark(
      "for loop" = flp<-for_loop(returnsWithValues),
      indices = ind<-indices(returnsWithValues),
      times = 10
)

Unit: microseconds
        expr      min       lq     mean    median       uq      max neval
    for loop 8671.228 8699.555 8857.198 8826.8185 8967.631 9196.708    10
     indices   92.781   99.349  106.328  102.8385  115.360  122.749    10
all.equal(ind,flp)
[1] TRUE

我想这会做到这一点,只要每个peak都是唯一的,以后不会在另一个组中重复:

returnsWithValues %>%
    group_by(peak) %>%
    mutate(drawdown.duration = cumsum(value != peak))

如果确实有重复的峰值,则可能需要一种在连续peak内进行分组的方法,例如

returns %>%
    # Start counting the number of groups at 1, and every time
    #   peak changes compared to the previous row, add 1
    mutate(peak_group = cumsum(c(1, peak[-1] != head(peak, -1)))) %>%
    group_by(peak_group) %>%
    mutate(drawdown.duration = cumsum(value != peak))
1 如何使用一百万个带标签的句子提高从零开始实施的ner模型的速度

我想使用spacy的NER模型从头开始使用一百万个句子训练模型。 该模型只有两种类型的实体。 这是我正在使用的代码。 由于无法共享数据,因此创建了一个虚拟数据集。 我的主要问题是该模型的训练时间太长。 如果您可以在我的代码中突出显示任何错误或建议其他方法来加快培训速度,我将不胜感激 ...

2 提高线程速度[关闭]

每次调用线程后,它的速度都会提高(特别是-FirstCircleRepaintThread,SecoundCircleRepaintThread,LineRepaintThread)。 但是主线程的速度是正常的。 我已经读过这个问题,但是我线程的速度一直在增加。 GitHub , Drop ...

3 提高SPI传输速度

我正在尝试从Linux嵌入式系统am335x(Beaglebone:pocketbeagle版本)使用SPI发送恒定且大量的字节。 问题是,我正在尝试提高其传输速率。 目前,我正在spidev(ioctl调用)上通过以下配置通过用户空间访问SPI: 太慢了! 我没有测量mb / ...

4 提高移动速度

是否可以通过我走的距离/时间来增加移动速度? 此时我只能将速度设置为固定值。 ...

5 Laravel提高SQL速度

我试图提高在Laravel 5.7中的查询速度,而我的通话时间降低到约2.5秒。 我正在尝试找到更多使它更快的方法,如果能得到一些帮助,我将不胜感激。 谢谢 我的数据的结构如何: 功能(控制器): getMainWords函数(bottom_exterior_wor ...

6 提高ActiveAdmin的速度

在Rails应用程序中,ActiveAdmin非常慢。 我确实需要提高性能,并且需要保留过滤器。 我认为最消耗资源的是过滤器和下拉框。 我看到了两个可以应用的选项:缓存和包含。 所以,我有两个问题: 活动管理员查找数据时是否可以应用联接或包含? 我需要将作用域应用于过滤器 ...

7 提高旋转UIAnimation的速度

[self returnTime]可以返回1到60之间的整数,并且我的动画执行了那么长时间。 我的问题是它的执行速度相对较慢,尤其是在运行时间较长时。 如何解决这个问题,使动画更快? ...

8 提高pycharm速度

我想提高pyCharm的速度,特别是调试器的速度(当我使用调试器时,速度非常慢)。 我的pycharm.vmoptions是: 我应该添加什么来提高pyCharm的速度以及调试器的速度? 我应该以某种方式运行配置文件以使更改生效或自动发生吗? ...

9 提高解析速度

我正在尝试从三个fasta文件中提取标题并比较它们的标题。 但是,它仅适用于较小的文件。 当文件大小为GB时,python脚本会自行杀死。 我的代码是: 如果您能展示自己的见解,我将不胜感激。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM