我正在使用R
分析SCADA数据我需要解决的问题是分析SCADA Feed,并确定测量超过特定限制的频率超过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个超标,我还需要知道每个超时的持续时间。
答案 0 :(得分:2)
如果你的时间序列是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个间隔..