29

次の形式のフラットファイルにいくつかのシステム データを収集しています。

YYYY-MM-DD-HH24:MI:SS DD1 DD2 DD3 DD4

ここで、DD1 ~ DD4 は 4 つのデータ項目です。ファイルの例は次のとおりです。

2011-02-01-13:29:53 16 8 7 68
2011-02-01-13:29:58 13 8 6 110
2011-02-01-13:30:03 26 25 1 109
2011-02-01-13:30:08 13 12 1 31
2011-02-01-13:30:14 192 170 22 34
2011-02-01-13:30:19 16 16 0 10
2011-02-01-13:30:24 137 61 76 9
2011-02-01-13:30:29 452 167 286 42
2011-02-01-13:30:34 471 177 295 11
2011-02-01-13:30:39 502 192 309 10

ファイルは 200 万行を超え、5 秒ごとにデータ ポイントがあります。

このデータから意味を引き出すには、このデータをグラフ化する必要があります。

私が試したこと

現時点では、さまざまな UNIX ツール (awk、sed など) で gnuplot と rrdtool を試しました。これらはどちらも機能しますが、データを別の方法で表示するたびに、データを細かく切り刻んだり再カットしたりする必要があるようです。私の直感では、rrdtool が正しい方法だと思いますが、現時点では、タイムスタンプを Unix エポックに変換する必要があるため、十分な速さでデータを取得するのに苦労しています。また、新しい粒度の集計が必要だと判断した場合は、rrd を再構築する必要があることも理解しています (これは、リアルタイム コレクションには意味がありますが、このようなレトロスペクティブ ロードには意味がありません)。これらのことから、間違ったツールを使用していると思われます。

フラット ファイルへのデータのコレクションは修正されています。たとえば、コレクションを直接 rrdtool にパイプすることはできません。

私の質問

チャートを作成するための最良の方法について、人々の意見が欲しいです。次の要件があります。

  1. グラフの作成はできるだけ高速である必要があります (レンダリングだけでなく、レンダリングの設定も行います)。
  2. 可能な限り柔軟にする必要があります-グラフをいじって、データの最適な粒度を見つける必要があります(5秒はおそらく粒度が高すぎます)
  3. 必要に応じて集計 (MAX/AVG/etc) できる必要があります。
  4. 入ってくると、繰り返し可能で新しいデータファイルでなければなりません
  5. 理想的には、DD1 と DD2、または先週の DD1 と今週の DD1 をオーバーレイできるようにしたい
  6. Unix でも Windows でも構いません。ただし、* nixを好む:-)

助言がありますか?

4

3 に答える 3

26

これは本当に良い質問です。何人かの R 関係者が参加してくれてうれしいです。私も R が仕事に適したツールだと思いますが、R は私のメイン ハンマーなので、すべてが少し釘のように見えます。

この課題に取り組むために必要な R の概念はいくつかあります。私が見たように、次のものが必要です(括弧内の参照):

  1. Rにデータをインポートします。 ( R インポート エクスポート ガイド)
  2. データを適切な時系列構造に取得します。( XTS ビネット PDF )
  3. 少しプロット。(グラフィックの Quick-R イントロ)

2mm ポイントを使用したコード例を次に示します。お気付きかもしれませんが、すべての 2mm 点をプロットする方法は説明していません。それは遅く、それほど有益ではありません。しかし、これにより、開始するためのいくつかのアイデアが得られるはずです。R のうさぎの穴に飛び込むことにした場合は、より具体的な質問をお寄せください。

require( xts )
require( lubridate )

## set up some example data
dataLength <- 2e6
startTime <- ymd_hms("2011-02-01-13-29-53")
fistFullOfSeconds <- 1:dataLength
date <- startTime + fistFullOfSeconds
DD1 <- rnorm( dataLength )
DD2 <- DD1 + rnorm(dataLength, 0, .1 )
DD3 <- rnorm( dataLength, 10, 2)
DD4 <- rnorm( dataLength )

myXts <- xts(matrix( c( DD1, DD2, DD3, DD4 ), ncol=4 ), date)

## now all the data are in the myXts object so let's do some
## summarizing and visualization

## grabbing just a single day from the data
## converted to data.frame to illustrate default data frame plotting
oneDay <- data.frame( myXts["2011-02-02"] ) 
plot( oneDay )

DD1とDD2の関係がちょっと飛び出す
ここに画像の説明を入力

boxplot( oneDay )

Boxplot は統計グラフの円グラフです。あなたが嫌い​​なプロット。私たちがここにいる間 、これにリンクすることもできます。ここに画像の説明を入力

## look at the max value of each variable every minute
par(mfrow=c(4,1)) ## partitions the graph window
ep <- endpoints(myXts,'minutes')
plot(period.apply(myXts[,1],INDEX=ep,FUN=max))
plot(period.apply(myXts[,2],INDEX=ep,FUN=max))
plot(period.apply(myXts[,3],INDEX=ep,FUN=max))
plot(period.apply(myXts[,4],INDEX=ep,FUN=max))

1 分間の解像度でも、これが参考になるかどうかはわかりません。おそらくサブセット化する必要があります。 ここに画像の説明を入力

于 2011-02-25T19:42:57.673 に答える
9

2000000 行の 4 列で 8000000 の数値をいじる R コードを次に示します。

> d=matrix(runif(8000000),ncol=4)
> dim(d)
[1] 2000000       4
> plot(d[1:1000,1])
> plot(d[1:1000,1],type='l')
> plot(d[1:10000,1],type='l')

今は少し遅くなり始めています:

> plot(d[1:100000,1],type='l')

2つの列の相関はどうですか:

> cor(d[,1],d[,2])
[1] 0.001708502

-- インスタント。フーリエ変換?

> f=fft(d[,1])

もインスタント。ただし、それをプロットしようとしないでください。

列の 1 つの間引きバージョンをプロットしてみましょう。

> plot(d[seq(1,2000000,len=1000),1],type='l')

-- インスタント。

実際に欠けているのは、データ セット全体をズームおよびパンできるインタラクティブなプロットです。

于 2011-02-25T19:18:17.740 に答える
5

これは、Rにロードされ、集計されたデータなど、あなたが持っているデータの行に沿った例です...

まず、ファイルに書き出すためのダミー データをいくつか示します。

stime <- as.POSIXct("2011-01-01-00:00:00", format = "%Y-%d-%m-%H:%M:%S")
## dummy data
dat <- data.frame(Timestamp = seq(from = stime, by = 5, length = 2000000),
                  DD1 = sample(1:1000, replace = TRUE),
                  DD2 = sample(1:1000, replace = TRUE),
                  DD3 = sample(1:1000, replace = TRUE),
                  DD4 = sample(1:1000, replace = TRUE))
## write it out
write.csv(dat, file = "timestamp_data.txt", row.names = FALSE)

次に、200 万行の読み取り時間を計ります。これを高速化するために、ファイル内の列のクラスを R に伝えます。これ"POSIXct"は、R でタイムスタンプの種類を格納する 1 つの方法です。

## read it in:
system.time({
             tsdat <- read.csv("timestamp_data.txt", header = TRUE,
                                 colClasses = c("POSIXct",rep("integer", 4)))
            })

これは、私の控えめなラップトップで内部の UNIX 時間を読み込んでフォーマットするのに約 13 秒かかります。

   user  system elapsed 
 13.698   5.827  19.643 

集計はさまざまな方法で行うことができますaggregate()。時間平均/平均に集計します。

## Generate some indexes that we'll use the aggregate over
tsdat <- transform(tsdat,
                   hours   = factor(strftime(tsdat$Timestamp, format = "%H")),
                   jday    = factor(strftime(tsdat$Timestamp, format = "%j")))
## compute the mean of the 4 variables for each minute
out <- aggregate(cbind(Timestamp, DD1, DD2, DD3, DD4) ~ hours + jday, 
                 data = tsdat, FUN = mean)
## convert average Timestamp to a POSIX time
out <- transform(out,
                 Timestamp = as.POSIXct(Timestamp, 
                                        origin = ISOdatetime(1970,1,1,0,0,0)))

それ(行の作成out)は私のラップトップで約16秒かかり、次の出力が得られます:

> head(out)
  hours jday           Timestamp      DD1      DD2      DD3      DD4
1    00  001 2010-12-31 23:29:57 500.2125 491.4333 510.7181 500.4833
2    01  001 2011-01-01 00:29:57 516.0472 506.1264 519.0931 494.2847
3    02  001 2011-01-01 01:29:57 507.5653 499.4972 498.9653 509.1389
4    03  001 2011-01-01 02:29:57 520.4111 500.8708 514.1514 491.0236
5    04  001 2011-01-01 03:29:57 498.3222 500.9139 513.3194 502.6514
6    05  001 2011-01-01 04:29:57 515.5792 497.1194 510.2431 496.8056

plot()関数を使用して簡単なプロットを実現できます。

plot(DD1 ~ Timestamp, data = out, type = "l")

たとえば、次のようにして、より多くの変数をオーバーレイできます。

ylim <- with(out, range(DD1, DD2))
plot(DD1 ~ Timestamp, data = out, type = "l", ylim = ylim)
lines(DD2 ~ Timestamp, data = out, type = "l", col = "red")

または複数のパネルを介して:

layout(1:2)
plot(DD1 ~ Timestamp, data = out, type = "l", col = "blue")
plot(DD2 ~ Timestamp, data = out, type = "l", col = "red")
layout(1)

これはすべて基本 R 機能で行われています。他の人は、アドオン パッケージがどのように日付の操作を容易にするかを示しました。

于 2011-02-25T20:16:39.103 に答える