R语言时序数据周期检测及dataframe按周期分组赋值实现
R语言时序信号周期分组与参数计算
示例基础数据
构造简化版的示例时序数据,代码如下:
a <- data.frame(a = c(0,1,2,3,2,1,0,-1,-2,-3,-2,-1, 0,1,2,3,4,3,2,1,0,-1,-2,-3,-2,-1, 0,1,2,1,0,-1,-2,-3,-2,-1,0,1,2,3,2,1, 0,-1,-2,-3,-2,-1,0,1,2,3,2,1, 0,-1,-2,-3,-4,-3,-2,-1,0)) a$b <- seq(1,length(a$a),1)
现有检测方案的问题
尝试通过quantmod包的峰谷检测函数定位周期转折位置,代码如下:
library(quantmod) max <- findPeaks(a$a) min <- findValleys(a$a)
存在的偏差:该方法返回的位置索引是峰值、谷值点位的后一个坐标,无法直接用于计算周期内的振幅(span)和设定值(set)。原有配套计算代码因位置错位,无法匹配预期输出:
# 原有参数计算逻辑 span <- a[max-1,]$a - a[min-1,]$a set <- a[max,]$a - span/2
自定义周期划分规则
按照业务逻辑定义的周期判定规则如下:
- 基础边界逻辑:首个周期从数据第一行开始,到第一个符合条件的设定值对应行的前一行为止;后续周期依次从上一周期结束位置的下一行开始,重复边界判定流程
- 规则匹配示例:
- 第一周期:覆盖第1至12行。第12行处于第一个峰值、谷值出现之后,且a值为-1.0,满足≤-1.0的判定条件,因此作为本周期的结束边界
- 第二周期:覆盖第13行至第27行。第27行的a值为0,满足≤0.5的判定条件,且处于第二个峰、谷点位之后,因此作为本周期的结束边界
- 每个周期需要为组内所有行绑定统一属性:
- 周期编号
cycles:按周期顺序从1开始递增 - 振幅
span:本周期内峰值与谷值的差值 - 设定值
set:本周期峰值减去振幅的1/2
- 周期编号
预期输出效果
按上述规则为数据框补充周期、振幅、设定值字段后,最终输出效果如下:
> print(a) a b cycles span set 1 0 1 1 6 -1.0 2 1 2 1 6 -1.0 3 2 3 1 6 -1.0 4 3 4 1 6 -1.0 5 2 5 1 6 -1.0 6 1 6 1 6 -1.0 7 0 7 1 6 -1.0 8 -1 8 1 6 -1.0 9 -2 9 1 6 -1.0 10 -3 10 1 6 -1.0 11 -2 11 1 6 -1.0 12 -1 12 1 6 -1.0 13 0 13 2 7 0.5 14 1 14 2 7 0.5 15 2 15 2 7 0.5 16 3 16 2 7 0.5 17 4 17 2 7 0.5 18 3 18 2 7 0.5 19 2 19 2 7 0.5 20 1 20 2 7 0.5 21 0 21 2 7 0.5 22 -1 22 2 7 0.5 23 -2 23 2 7 0.5 24 -3 24 2 7 0.5 25 -2 25 2 7 0.5 26 -1 26 2 7 0.5 27 0 27 2 7 0.5 28 1 28 3 5 -1.5 29 2 29 3 5 -1.5 30 1 30 3 5 -1.5 31 0 31 3 5 -1.5 32 -1 32 3 5 -1.5 33 -2 33 3 5 -1.5 34 -3 34 3 5 -1.5 35 -2 35 3 5 -1.5 36 -1 36 4 6 -1.0 37 0 37 4 6 -1.0 38 1 38 4 6 -1.0 39 2 39 4 6 -1.0 40 3 40 4 6 -1.0 41 2 41 4 6 -1.0 42 1 42 4 6 -1.0 43 0 43 4 6 -1.0 44 -1 44 4 6 -1.0 45 -2 45 4 6 -1.0 46 -3 46 4 6 -1.0 47 -2 47 4 6 -1.0 48 -1 48 4 6 -1.0 49 0 49 5 7 -1.5 50 1 50 5 7 -1.5 51 2 51 5 7 -1.5 52 3 52 5 7 -1.5 53 2 53 5 7 -1.5 54 1 54 5 7 -1.5 55 0 55 5 7 -1.5 56 -1 56 5 7 -1.5 57 -2 57 5 7 -1.5 58 -3 58 5 7 -1.5 59 -4 59 5 7 -1.5 60 -3 60 5 7 -1.5 61 -2 61 5 7 -1.5 62 -1 62 5 7 -1.5 63 0 63 5 7 -1.5
内容的提问来源于stack exchange,提问作者Maral Dorri
相关产品推荐
相关产品推荐

