3

1 分間の時間枠で発生するデータの間隔を表す data.frame を取る関数を作成しました。この関数の目的は、これらの 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
4

1 に答える 1

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> 
于 2011-09-20T13:17:16.493 に答える