Oracle R Enterpriseでは、時系列データに対して、データのフィルタ処理、順序付け、変換などの多数のデータの準備操作を実行できます。
Oracle R Enterpriseは、Rデータ型をSQLデータ型にマップすることで、Oracle R Enterpriseオブジェクトを作成し、データ準備操作をデータベース・メモリーで実行できます。次の例では、時系列データに対する操作の一部を示します。
例3-17 日時データの集計
この例では、統計集計関数をいくつか示します。最初に、データセットに対して、2001年全体に均等に分散された一連の日付をローカル・クライアントに500個生成します。次に、ランダムのdifftime
およびランダムの正規値のベクターを使用します。その後、ore.push
関数を使用してデータのインデータベース版であるMYDATA
を作成します。この例では、MYDATA
がore.frame
オブジェクトであること、およびdatetime
列がクラスore.datetime
であることを示すためにclass
関数を呼び出します。この例では、生成されたデータの最初の3行を表示します。次に、min
、max
、range
、median
およびquantile
の統計の集計操作をMYDATA
のdatetime
列で使用します。
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
クラスです。この例では、MYDATA
のdatetime
列および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 日付および時間の比較
この例では、日付および時間の比較を示します。この例では、最初の例で作成したMYDATA
のore.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
オブジェクトから年、月、月の日付、時間、分、秒などの様々なコンポーネントの抽出に使用できるアクセッサ関数があります。この例では、これらの関数の使用方法を示します。この例では、最初の例で作成したMYDATA
のore.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
データ型を他のデータ型に強制変換します。この例では、最初の例で作成したMYDATA
のore.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
を使用して、ローリング平均およびローリング標準偏差を計算します。この例では、最初の例で作成したMYDATA
のore.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