2011-09-20 72 views
3

我写了一个函数,它需要一个data.frame,它表示在1分钟的时间范围内发生的数据间隔。该功能的目的是采取这些1分钟的时间间隔,并将它们转换为更高的时间间隔。例如,1分钟变成5分钟,60分钟等......数据集本身可能存在数据间隙,即时间上跳跃,因此它必须适应这些不良数据发生。我写了下面的代码,看起来可以工作,但是对于大型数据集来说性能是绝对糟糕的。转换加时间戳的行数据时的性能问题

我希望有人可以提供一些建议,说明我可以如何加快速度。见下文。

compressMinute = function(interval, DAT) { 
    #Grab all data which begins at the same interval length 
    retSet = NULL 
    intervalFilter = which(DAT$time$min %% interval == 0) 
    barSet = NULL 
    for (x in intervalFilter) { 
     barEndTime = DAT$time[x] + 60*interval 
     barIntervals = DAT[x,] 
     x = x+1 
     while(x <= nrow(DAT) & DAT[x,"time"] < barEndTime) { 
      barIntervals = rbind(barIntervals,DAT[x,]) 
      x = x + 1 
     } 
     bar = data.frame(date=barIntervals[1,"date"],time=barIntervals[1,"time"],open=barIntervals[1,"open"],high=max(barIntervals[1:nrow(barIntervals),"high"]), 
         low=min(barIntervals[1:nrow(barIntervals),"low"]),close=tail(barIntervals,1)$close,volume=sum(barIntervals[1:nrow(barIntervals),"volume"])) 
     if (is.null(barSet)) { 
      barSet = bar 
     } else { 
      barSet = rbind(barSet, bar) 
     } 

    } 
    return(barSet) 
} 

编辑:

下面是我的一行数据。每行代表1分钟的时间间隔,我试图将其转换为这些1分钟间隔(即5分钟,15分钟,60分钟,240分钟等)的聚合的任意桶......

date    time open high  low close volume 
2005-09-06 2005-09-06 16:33:00 1297.25 1297.50 1297.25 1297.25  98 
+1

不知道你真的想在上面做什么,但是行'barIntervals = rbind(barIntervals,DAT [x,])'是一个瓶颈。你每增加一个barIntervals对象,强制R复制它......如果你预先分配barIntervals它将会更好。谷歌'R预分配'阅读更多。另外,包'zoo'中的函数'na.approx()'做你想要的吗?看看这个问题:http://stackoverflow.com/questions/7188807/interpolate-na-values – Chase

+2

发现XTS。巨大的差异。 – Dave

回答

4

您可能需要重新使用现有的功能,特别是POSIXct时间类型以及现有的软件包。

例如,看xts包---它已经有一个通用的功能to.period()以及方便的包装to.minutes()to.minutes3()to.minutes10(),....

这里是帮助页面的例子:

R> example(to.minutes) 

t.mn10R> data(sample_matrix) 

t.mn10R> samplexts <- as.xts(sample_matrix) 

t.mn10R> to.monthly(samplexts) 
     samplexts.Open samplexts.High samplexts.Low samplexts.Close 
Jan 2007  50.0398  50.7734  49.7631   50.2258 
Feb 2007  50.2245  51.3234  50.1910   50.7709 
Mar 2007  50.8162  50.8162  48.2365   48.9749 
Apr 2007  48.9441  50.3378  48.8096   49.3397 
May 2007  49.3457  49.6910  47.5180   47.7378 
Jun 2007  47.7443  47.9413  47.0914   47.7672 

t.mn10R> to.monthly(sample_matrix) 
     sample_matrix.Open sample_matrix.High sample_matrix.Low sample_matrix.Close 
Jan 2007   50.0398   50.7734   49.7631    50.2258 
Feb 2007   50.2245   51.3234   50.1910    50.7709 
Mar 2007   50.8162   50.8162   48.2365    48.9749 
Apr 2007   48.9441   50.3378   48.8096    49.3397 
May 2007   49.3457   49.6910   47.5180    47.7378 
Jun 2007   47.7443   47.9413   47.0914    47.7672 

t.mn10R> str(to.monthly(samplexts)) 
An ‘xts’ object from Jan 2007 to Jun 2007 containing: 
    Data: num [1:6, 1:4] 50 50.2 50.8 48.9 49.3 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:4] "samplexts.Open" "samplexts.High" "samplexts.Low" "samplexts.Close" 
    Indexed by objects of class: [yearmon] TZ: 
    xts Attributes: 
NULL 

t.mn10R> str(to.monthly(sample_matrix)) 
num [1:6, 1:4] 50 50.2 50.8 48.9 49.3 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:6] "Jan 2007" "Feb 2007" "Mar 2007" "Apr 2007" ... 
    ..$ : chr [1:4] "sample_matrix.Open" "sample_matrix.High" "sample_matrix.Low" "sample_matrix.Close" 
R> 
+0

+1只需要补充说明:'to.period'适合聚合到OHLC数据。 'period.apply'允许您使用用户定义的函数进行聚合。 –