У меня есть массивы временных рядов, в среднем около 1000 значений на массив.Мне нужно независимо идентифицировать сегменты временных рядов в каждом массиве.
Я не смог найти много информации о стандартах, как этого добиться.Подход, который я сейчас использую, заключается в том, чтобы вычислять среднее значение элементов массива и сегмента всякий раз, когда прошедшее время между каждым элементом превышает его.Я уверен, что есть более подходящие методы.
Это код, который я сейчас использую.
def time_cluster(input)
input.sort!
differences = (input.size-1).times.to_a.map {|i| input[i+1] - input[i] }
mean = differences.mean
clusters = []
j = 0
input.each_index do |i|
j += 1 if i > 0 and differences[i-1] > mean
(clusters[j] ||= []) << input[i]
end
return clusters
end
Пара примеров из этого кода
time_cluster([1, 2, 3, 4, 7, 9, 250, 254, 258, 270, 292, 340, 345, 349, 371, 375, 382, 405, 407, 409, 520, 527])
Выходы
1 2 3 4 7 9, sparsity 1.3
250 254 258 270 292, sparsity 8.4
340 345 349 371 375 382 405 407 409, sparsity 7
520 527, sparsity 3
Другой массив
time_cluster([1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 1000, 1020, 1040, 1060, 1080, 1200])
Выходы
1 2 3 4 5 6 7 8 9 10, sparsity 0.9
1000 1020 1040 1060 1080, sparsity 16
1200