【问题标题】:Check if timeseries has peaks with same frequency检查时间序列是否具有相同频率的峰值
【发布时间】:2021-07-30 07:49:55
【问题描述】:

我有几个实例的时间序列:

有些情况看起来像这样是正常的:

但有些看起来像这样 - 它们的峰值间隔相同(在本例中为 1 小时):

我需要分析数据并找到具有该异常的实例 - 峰值以几乎相同的间隔重复。

因此,我期望具有该异常的实例名称(在我的示例数据中 - 只有“A”),它是以秒为单位的峰值周期(在我的示例数据中为 3600),并且分布在该实例的中值和峰值之间.

怎么做?

这是我的示例数据:

library(dplyr)
library(lubridate)
library(ggplot2)

set.seed(900)

data1 <- 
data.frame(
datetime = seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "15 sec"),
Value = sample(1:10, 50002, replace = T),
Instance = "A"
)

data1.1 <- data.frame(
  datetime= seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "hour"),
  Value = sample(10:100, 209, replace = T),
  Instance = "A"
) 

data1 <- rbind(data1, data1.1) %>% group_by(datetime, Instance) %>% summarise(Value = max(Value)) %>% ungroup() 


data2 <- data.frame(
  datetime = seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "15 sec"),
  Value = sample(1:100, 50002, replace = T),
  Instance = "B"
)

data3 <- 
  data.frame(
    datetime = seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "15 sec"),
    Value = sample(1:100, 50002, replace = T),
    Instance = "C"
  )

data4 <- data.frame(
  datetime = seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "15 sec"),
  Value = sample(1:100, 50002, replace = T),
  Instance = "D"
)


data <- do.call("rbind", list(data1, data2, data3, data4))

【问题讨论】:

  • 我不太确定我是否理解您的问题。您是否只是在寻找在大致相同的时间间隔内达到的值高于(例如)第三分位数的实例,还是更复杂?你能展示一下结果应该是什么样子吗?
  • 是的,这就是我需要的。具有相同间隔的短峰。

标签: r time-series frequency


【解决方案1】:

由于我仍然不太确定答案应该是什么样子,因此这只是初步的帮助尝试。这可能不是您所需要的,但也许它可以朝着正确的方向迈进?

qt<-data[data$Value>=99,] # find peaks 
qt_test<-qt
# length(qt$datetime)
# table(qt$Instance)

# create hourly difference between peak times (seconds were not useful, mins may be better)
x<-vector()
for(i in seq_along(qt_test[[1]])){
  if (i == 1){
    a<-0; x<-c(x, a)
    }
  if (i>1){
    a<-difftime(qt_test[[1]][i], qt_test[[1]][i-1], units = "hours") 
    x<-c(x, a)
  }
}
qt_test$difftime_in_hours<-x
# summary(qt_test$difftime_in_hours)

qt2<-qt_test[between(qt_test$difftime_in_hours, 0.04, 0.05),] # timeframe - +/- floor/ceiling mean (0.04647) - only for test purposes

# A tibble: 154 x 4
   datetime            Instance Value difftime_in_hours
   <dttm>              <chr>    <int>             <dbl>
 1 2020-12-26 15:44:15 B          100            0.0417
 2 2020-12-26 16:44:00 B           99            0.0417
 3 2020-12-26 16:57:30 B          100            0.05  
 4 2020-12-26 17:58:00 B           99            0.0417
 5 2020-12-26 19:15:30 B          100            0.05  
 6 2020-12-26 19:24:30 B          100            0.0417
 7 2020-12-27 04:04:45 B           99            0.05  
 8 2020-12-27 09:37:00 B           99            0.0417
 9 2020-12-27 11:16:00 B          100            0.0417
10 2020-12-27 11:55:30 B           99            0.05  
# ... with 144 more rows

table(qt2$Instance)
 B  C  D 
69 47 38 

由于随机种子,结果会有所不同,但据我了解您的问题,这是一个答案

【讨论】:

  • 您的代码显示所有实例。我在你的输出中看到了 B。但是实例 B 没有这个异常。只有A会。正如我在问题中提到的,我希望在结果中只看到“A”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多