Красиво заданный вопрос с примером :)
Это один из способов сделать это, скорее всего, неполный, но он должен вам немного помочь.
Поскольку ваши данные разнесены во времени с фиксированным шагом, я не использую временной ряд и использую индекс как время. Таким образом, я конвертирую c
в массив и использую np.where()
, чтобы найти значение в ячейках.
import numpy as np
c = np.array([40, 41, 4, 5, 7, 20, 20, 8, 90, 99, 10, 5, 8, 8, 19])
bin1 = np.where((0 <= c) & (c <= 50))[0]
bin2 = np.where((50 < c) & (c <= 100))[0]
Для bin1, вывод равен array([ 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14], dtype=int64)
, что соответствует idx, где значения из c
находятся в корзине.
Следующий шаг - найти последовательный idx. Согласно этому ТАК сообщение ::
from itertools import groupby
from operator import itemgetter
data = bin1
for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]):
print(list(map(itemgetter(1), g)))
# Output is:
#[0, 1, 2, 3, 4, 5, 6, 7]
#[10, 11, 12, 13, 14]
Последний шаг: разместите новый суббункер в правильном порядке и проследите, какие лотки соответствуют каким суббинам. Таким образом, полный код будет выглядеть так:
import numpy as np
from itertools import groupby
from operator import itemgetter
c = np.array([40, 41, 4, 5, 7, 20, 20, 8, 90, 99, 10, 5, 8, 8, 19])
bin1 = np.where((0 <= c) & (c <= 50))[0]
bin2 = np.where((50 < c) & (c <= 100))[0]
# 1 and 2 for the range names.
bins = [(bin1, 1), (bin2, 2)]
subbins = list()
for b in bins:
data = b[0]
name = b[1] # 1 or 2
for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]):
subbins.append((list(map(itemgetter(1), g)), name))
subbins = sorted(subbins, key=lambda x: x[0][0])
Выход: [([0, 1, 2, 3, 4, 5, 6, 7], 1), ([8, 9], 2), ([10, 11, 12, 13, 14], 1)]
Тогда вам просто нужно сделать необходимую статистику:)