2011-09-20 45 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'允許您使用用戶定義的函數進行聚合。 –