プライマリ・コンテンツに移動
Oracle® R Enterpriseユーザーズ・ガイド
リリース1.5.1
E88296-01
目次へ移動
目次
索引へ移動
索引

前
次

3.1.9 時系列データの準備

Oracle R Enterpriseでは、時系列データに対して、データのフィルタ処理、順序付け、変換などの多数のデータの準備操作を実行できます。

Oracle R Enterpriseは、Rデータ型をSQLデータ型にマップすることで、Oracle R Enterpriseオブジェクトを作成し、データ準備操作をデータベース・メモリーで実行できます。次の例では、時系列データに対する操作の一部を示します。

例3-17 日時データの集計

この例では、統計集計関数をいくつか示します。最初に、データセットに対して、2001年全体に均等に分散された一連の日付をローカル・クライアントに500個生成します。次に、ランダムのdifftimeおよびランダムの正規値のベクターを使用します。その後、ore.push関数を使用してデータのインデータベース版であるMYDATAを作成します。この例では、MYDATAore.frameオブジェクトであること、およびdatetime列がクラスore.datetimeであることを示すためにclass関数を呼び出します。この例では、生成されたデータの最初の3行を表示します。次に、minmaxrangemedianおよびquantileの統計の集計操作をMYDATAdatetime列で使用します。

N <- 500
mydata <- data.frame(datetime = 
                seq(as.POSIXct("2001/01/01"),
                    as.POSIXct("2001/12/31"),
                    length.out = N),
                difftime = as.difftime(runif(N),
                                 units = "mins"),
                x = rnorm(N))
MYDATA <- ore.push(mydata)
class(MYDATA)
class(MYDATA$datetime)
head(MYDATA,3)
# statistical aggregations
min(MYDATA$datetime)
max(MYDATA$datetime)
range(MYDATA$datetime)
quantile(MYDATA$datetime,
         probs = c(0, 0.05, 0.10))

この例のリスト

R> N <- 500
R> mydata <- data.frame(datetime = 
+             seq(as.POSIXct("2001/01/01"),
+                 as.POSIXct("2001/12/31"),
+                 length.out = N),
+             difftime = as.difftime(runif(N),
+                              units = "mins"),
+             x = rnorm(N))
R> MYDATA <- ore.push(mydata)
R> class(MYDATA)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> class(MYDATA$datetime)
[1] "ore.datetime"
attr(,"package")
[1] "OREbase"
R> head(MYDATA,3)
             datetime       difftime           x
1 2001-01-01 00:00:00 16.436782 secs  0.68439244
2 2001-01-01 17:30:25  8.711562 secs  1.38481435
3 2001-01-02 11:00:50  1.366927 secs -0.00927078

R> # statistical aggregations
R> min(MYDATA$datetime)
[1] "2001-01-01 CST"
R> max(MYDATA$datetime)
[1] "2001-12-31 CST"
R> range(MYDATA$datetime)
[1] "2001-01-01 CST" "2001-12-31 CST"
R> quantile(MYDATA$datetime,
+           probs = c(0, 0.05, 0.10))
                       0%                        5%                       10% 
"2001-01-01 00:00:00 CST" "2001-01-19 04:48:00 CST" "2001-02-06 09:36:00 CST"

例3-18 日付および時間の計算の使用方法

この例では、前の例で作成したMYDATA ore.frameオブジェクトのdatetime列を使用し、1日分のdifftimeを追加することにより、1日分のずれを作成します。結果はday1Shiftで、この例の表示ではore.datetimeクラスです。この例では、MYDATAdatetime列およびday1Shiftの最初の3要素を表示します。day1Shiftの最初の要素は2001年1月2日です。

この例ではさらに、オーバーロードされたdiff関数を使用して遅れの差を計算します。MYDATAの500日は2001年全体で均等に分散されているため、日付間の差はすべて同じです。

day1Shift <- MYDATA$datetime + as.difftime(1, units = "days")
class(day1Shift)
head(MYDATA$datetime,3)
head(day1Shift,3)
lag1Diff <- diff(MYDATA$datetime)
class(lag1Diff)
head(lag1Diff,3)

この例のリスト

R> day1Shift <- MYDATA$datetime + as.difftime(1, units = "days")
R> class(day1Shift)
[1] "ore.datetime"
attr(,"package")
[1] "OREbase"
R> head(MYDATA$datetime,3)
[1] "2001-01-01 00:00:00 CST" "2001-01-01 17:30:25 CST" "2001-01-02 11:00:50 CST"
R> head(day1Shift,3)
[1] "2001-01-02 00:00:00 CST" "2001-01-02 17:30:25 CST" "2001-01-03 11:00:50 CST"
R> lag1Diff <- diff(MYDATA$datetime)
R> class(lag1Diff)
[1] "ore.difftime"
attr(,"package")
[1] "OREbase"
R> head(lag1Diff,3)
Time differences in secs
[1] 63025.25 63025.25 63025.25

例3-19 日付および時間の比較

この例では、日付および時間の比較を示します。この例では、最初の例で作成したMYDATAore.frameオブジェクトのdatetime列を使用します。この例では、2001年4月1日より前の日付を含むMYDATAの要素を選択します。生成されるisQ1はクラスore.logicalで、最初の3エントリの結果はTRUEです。この例では、isQ1に一致する日付が3月に何日あるかを検出します。次に、論理ベクターを集計して結果(3月には43行)を表示します。この例では次に、その年の12月27日以降の最後の日付に基づいて行をフィルタします。この結果はeoySubsetで、これはore.frameオブジェクトです。この例では、eoySubsetで返された最初の3行を表示します。

isQ1 <- MYDATA$datetime < as.Date("2001/04/01")
class(isQ1)
head(isQ1,3)
isMarch <- isQ1 & MYDATA$datetime > as.Date("2001/03/01")
class(isMarch)
head(isMarch,3)
sum(isMarch)
eoySubset <- MYDATA[MYDATA$datetime > as.Date("2001/12/27"), ]
class(eoySubset)
head(eoySubset,3)

この例のリスト

R> isQ1 <- MYDATA$datetime < as.Date("2001/04/01")
R> class(isQ1)
[1] "ore.logical"
attr(,"package")
[1] "OREbase"
R> head(isQ1,3)
[1] TRUE TRUE TRUE
R> isMarch <- isQ1 & MYDATA$datetime > as.Date("2001/03/01")
R> class(isMarch)
[1] "ore.logical"
attr(,"package")
[1] "OREbase"
R> head(isMarch,3)
[1] FALSE FALSE FALSE
R> sum(isMarch)
[1] 43
R> eoySubset <- MYDATA[MYDATA$datetime > as.Date("2001/12/27"), ]
R> class(eoySubset)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> head(eoySubset,3)
               datetime      difftime          x
495 2001-12-27 08:27:53 55.76474 secs -0.2740492
496 2001-12-28 01:58:18 15.42946 secs -1.4547270
497 2001-12-28 19:28:44 28.62195 secs  0.2929171

例3-20 日付および時間のアクセッサの使用方法

Oracle R Enterpriseには、datetimeオブジェクトから年、月、月の日付、時間、分、秒などの様々なコンポーネントの抽出に使用できるアクセッサ関数があります。この例では、これらの関数の使用方法を示します。この例では、最初の例で作成したMYDATAore.frameオブジェクトのdatetime列を使用します。

この例では、datetime列の年要素を取得します。unique関数をyearに対して呼び出すと、列内の唯一の年の値である2001が表示されます。ただし、値の範囲を持つore.mdayなどのオブジェクトの場合は、range関数は月の日付を返します。この結果には、1から31の間の値を持つベクターが含まれています。他のアクセッサ関数で示すように、range関数を呼び出すと、値の範囲が簡潔にレポートされます。

year <- ore.year(MYDATA$datetime)
unique(year)
month <- ore.month(MYDATA$datetime)
range(month)
dayOfMonth <- ore.mday(MYDATA$datetime)
range(dayOfMonth)
hour <- ore.hour(MYDATA$datetime)
range(hour)
minute <- ore.minute(MYDATA$datetime)
range(minute)
second <- ore.second(MYDATA$datetime)
range(second)

この例のリスト

R> year <- ore.year(MYDATA$datetime)
R> unique(year)
[1] 2001
R> month <- ore.month(MYDATA$datetime)
R> range(month)
[1]  1 12
R> dayOfMonth <- ore.mday(MYDATA$datetime)
R> range(dayOfMonth)
[1]  1 31
R> hour <- ore.hour(MYDATA$datetime)
R> range(hour)
[1]  0 23
R> minute <- ore.minute(MYDATA$datetime)
R> range(minute)
[1]  0 59
R> second <- ore.second(MYDATA$datetime)
R> range(second)
[1]  0.00000 59.87976

例3-21 日付および時間のデータ型の強制変換

この例では、as.oreサブクラス・オブジェクトを使用して、ore.datetimeデータ型を他のデータ型に強制変換します。この例では、最初の例で作成したMYDATAore.frameオブジェクトのdatetime列を使用します。この列にはore.datetime値が含まれています。この例では、最初にMYDATA$datetime列から日付を抽出します。生成されるdateOnlyオブジェクトには、年、月および日のみを含み時間を含まないore.date値が含まれます。この例では次に、ore.datetime値を、日の名前、年の日数および年の四半期を表すore.character値およびore.integer値を持つオブジェクトに強制変換します。

dateOnly <- as.ore.date(MYDATA$datetime)
class(dateOnly)
head(sort(unique(dateOnly)),3)
nameOfDay <- as.ore.character(MYDATA$datetime, format = "DAY")
class(nameOfDay)
sort(unique(nameOfDay))
dayOfYear <- as.integer(as.character(MYDATA$datetime, format = "DDD"))
class(dayOfYear)
range(dayOfYear)
quarter <- as.integer(as.character(MYDATA$datetime, format = "Q"))
class(quarter)
sort(unique(quarter))

この例のリスト

R> dateOnly <- as.ore.date(MYDATA$datetime)
R> class(dateOnly)[1] "ore.date"
attr(,"package")[1] "OREbase"
R> head(sort(unique(dateOnly)),3)
[1] "2001-01-01" "2001-01-02" "2001-01-03"
R> nameOfDay <- as.ore.character(MYDATA$datetime, format = "DAY")
R> class(nameOfDay)
[1] "ore.character"
attr(,"package")
[1] "OREbase"
R> sort(unique(nameOfDay))
[1] "FRIDAY " "MONDAY " "SATURDAY " "SUNDAY " "THURSDAY " "TUESDAY " "WEDNESDAY"
R> dayOfYear <- as.integer(as.character(MYDATA$datetime, format = "DDD"))
R> class(dayOfYear)
[1] "ore.integer"
attr(,"package")
[1] "OREbase"
R> range(dayOfYear)
[1]   1 365
R> quarter <- as.integer(as.character(MYDATA$datetime, format = "Q"))
R> class(quarter)
[1] "ore.integer"
attr(,"package")
[1] "OREbase"
R> sort(unique(quarter))
[1] 1 2 3 4

例3-22 ウィンドウ関数の使用方法

この例では、ウィンドウ関数ore.rollmeanおよびore.rollsdを使用して、ローリング平均およびローリング標準偏差を計算します。この例では、最初の例で作成したMYDATAore.frameオブジェクトを使用します。この例では、datetime列の値をMYDATAの行名として割り当てることで、MYDATAが順序付けられたore.frameであることを確認します。この例では、5期間のローリング平均およびローリング標準偏差を計算します。次に、statsパッケージでRの時系列機能を使用するために、クライアントにデータをプルします。クライアントにプルするデータを制限するために、3番目の例のベクターis.Marchを使用して3月をポイントするデータのみを選択します。この例では、ts関数を使用して時系列オブジェクトを作成し、Arimaモデルを構築し、3点を予測します。

row.names(MYDATA) <- MYDATA$datetime
MYDATA$rollmean5 <- ore.rollmean(MYDATA$x, k = 5)
MYDATA$rollsd5 <- ore.rollsd (MYDATA$x, k = 5)
head(MYDATA)
marchData <- ore.pull(MYDATA[isMarch,])
tseries.x <- ts(marchData$x)
arima110.x <- arima(tseries.x, c(1,1,0))
predict(arima110.x, 3)
tseries.rm5 <- ts(marchData$rollmean5)
arima110.rm5 <- arima(tseries.rm5, c(1,1,0))
predict(arima110.rm5, 3)

この例のリスト

R> row.names(MYDATA) <- MYDATA$datetime
R> MYDATA$rollmean5 <- ore.rollmean(MYDATA$x, k = 5)
R> MYDATA$rollsd5 <- ore.rollsd (MYDATA$x, k = 5)
R> head(MYDATA)
                               datetime       difftime
2001-01-01 00:00:00 2001-01-01 00:00:00 39.998460 secs
                                                     x   rollmean5   rollsd5
                                            -0.3450421 -0.46650761 0.8057575
                               datetime       difftime
2001-01-01 17:30:25 2001-01-01 17:30:25  37.75568 secs
                                                     x   rollmean5   rollsd5
                                            -1.3261019  0.02877517 1.1891384
                               datetime       difftime
2001-01-02 11:00:50 2001-01-02 11:00:50  18.44243 secs
                                                     x   rollmean5   rollsd5
                                             0.2716211 -0.13224503 1.0909515
                               datetime       difftime
2001-01-03 04:31:15 2001-01-03 04:31:15 38.594384 secs
                                                     x   rollmean5   rollsd5
                                             1.5146235  0.36307913 1.4674456
                               datetime       difftime
2001-01-03 22:01:41 2001-01-03 22:01:41  2.520976 secs
                                                     x   rollmean5   rollsd5
                                            -0.7763258  0.80073340 1.1237925
                               datetime       difftime
2001-01-04 15:32:06 2001-01-04 15:32:06 56.333281 secs 
                                                     x   rollmean5   rollsd5
                                             2.1315787  0.90287282 1.0862614
R> marchData <- ore.pull(MYDATA[isMarch,])
R> tseries.x <- ts(marchData$x)
R> arima110.x <- arima(tseries.x, c(1,1,0))
R> predict(arima110.x, 3)
$pred
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 1.4556614 0.6156379 1.1387587
 
$se
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 1.408117 1.504988 1.850830
 
R> tseries.rm5 <- ts(marchData$rollmean5)
R> arima110.rm5 <- arima(tseries.rm5, c(1,1,0))
R> predict(arima110.rm5, 3)
$pred
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 0.3240135 0.3240966 0.3240922
 
$se
Time Series:
Start = 44 
End = 46 
Frequency = 1 
[1] 0.3254551 0.4482886 0.5445763