Определение продолжительности превышения

Я анализирую данные SCADA с помощью R.

Проблема, которую мне нужно решить, - это проанализировать канал SCADA и определить, как часто измерения превышали определенный предел более чем на 15 минут.

Единственный способ решить эту проблему - использовать цикл for, который сделает процесс очень медленным, потому что в реальном приложении будут тысячи точек.

Какие-либо предложения?

Простой пример:

set.seed(666)
upper_limit =1.5
sims <- 50
turb <- abs(rnorm(sims))
time <- seq.POSIXt(as.POSIXct(Sys.Date()-1), by=30, length.out=sims)
plot(time,turb, type="l")
abline(h=upper_limit, col="red", lwd=2)

См .: http://rpubs.com/pprevos/scada

Ответ для этого примера: 8 превышений, и мне также нужно знать продолжительность каждого из них.


person Peter Prevos    schedule 24.10.2014    source источник


Ответы (1)


Если ваш временной ряд был 1-минутным временным рядом (то есть: временным рядом с 1-минутным периодом), легко получить длины интервалов, превышающих некоторый порог, используя rle:

 xx = rle(turb >1.5)
 sum(xx$values==TRUE & xx$lengths >=15)

Итак, здесь, чтобы получить эту временную серию, одним из решений является ее аппроксимация, чтобы создать новую временную серию с большей точностью.

library(xts)
xx = xts(turb,time)
yy = na.approx(merge(xts(,seq.POSIXt(min(time),max(time),by=1)),
      xx))
## optional plot the new and the old time series
plot(x = yy, xlab = "Time",  minor.ticks = FALSE, col = "red")
points(x = xx, col = "darkgreen",pch=20)

введите описание изображения здесь

Затем я вычисляю количество интервалов, как описано выше:

xx = rle(as.vector(coredata(yy>1.5)))
sum(xx$values==TRUE & xx$lengths >=15)
[1] 6

Примечание: здесь я нашел всего 6 интервалов ..

person agstudy    schedule 24.10.2014
comment
Спасибо за это решение. Это поможет нам сделать водоочистные сооружения более безопасной питьевой водой :) - person Peter Prevos; 25.10.2014