问题描述
我正在尝试将时间序列数据划分为不同的区域。
在每个时间段内,压力都在允许的最大应力水平下运行(未事先告知)。请参见下面的图片。
每次编辑为一个星期以上。
如何检测不同时段的开始/结束?有人会指出我的方向吗?
一旦划分了不同的时区,我想我可以平均每个时区的几个最大读数,以得到最大允许应力。
解决方法
我可以说1h足够的值。然后,您可以计算平均值。 之后,您可以设置与之前的平均值相关的平均值。 一些伪代码,以使其可视化。
class Chunk:
private double[] values;//For one hour,for example.
double average();
enum Relation:
FALLING,RISING,EQUAL
func algorithm(Chunk[] chunks){
double averages=new double[chunks.length];
for(int i=0;i<chunks.length;i++)
averages[i]=chunks[i].average();
//Got averages,now make it rising or falling or stay same.
Relation[] relations=new Relation[chunks.length];
for(int i=1;i<chunks.length;i++){
double diff=averages[i]-averages[i-1];
if(diff==0) //TODO,a bit of difference is allowed (Like deviations of +-3)
relations[i]=EQUALS;
else
relations[i]=diff>0?RISING:FALLING;
}
// After that,you have to find sequences of many FALLING or RISING,followed by many EQUALS
}
要继续处理Relation
的数组,可以将其划分为较小的数组,然后计算平均值(例如FALLING = 0,RISING = 1,EQUAL = 2)。之后,您只需像这样“合并”它们:
F=FALLING
R=RISING
E=EQUALS
//Before merging
[RREEEEFFEEEEERRREEEE]
//After merging
[REFERE]
在那里您可以看到山脉和山谷。
现在,要获取确切的值,当山脉或山谷开始时,您需要稍微扩展Chunk
。
class Chunk:
//The value on x-Axis + the value of y-Axis
private Tuple<Time,Double>[] values;
//Tuple of Range,this chunk uses and the average value of this range
Tuple<Tuple<Time,Time>,double> average();
此外,您不能再使用原始Relation
,必须将其从范围开始到结束都用Range包裹起来。