У меня есть временной ряд с группой данных, разделенных длинными пробелами (заполненными nans, так как я работаю с регулярно разнесенными временными рядами).Я хотел бы определить эти группы и разделить их, однако эти данные не очень регулярны, в частности:
- Существует примерно одна группа данных в час, но они не строго ограничены в течение одного часа
- Разрешение по времени составляет 5 секунд (это фиксированное значение)
- Число данных в каждой группе не является фиксированным, но они имеют длину приблизительно 10 минут
- Отсутствуют данныев каждой группе (примерно 10% -20%)
- Время начала каждой группы данных может варьироваться в несколько минут (в некоторых случаях это дрейф, в других - это пошаговое изменение)
Я могу достичь этого результата, зацикливаясь на элементах кадра данных и отыскивая последовательные пропущенные данные выше определенного порога (например, 5 или 10 минут).Однако это медленное и уродливое решение.
Я проверил библиотеки itertools и more-itertools, но не нашел ни одного решения, которое могло бы удовлетворить мою задачу.Функция more_itertools.consecutive_groups делает что-то похожее, но я не знаю, как использовать ее для обработки недостающих данных в каждой группе.
Я ищу более общую схему идеи / реализации, но если вы хотитеПоиграв с некоторыми данными, вы можете генерировать случайные временные ряды с помощью кода ниже.Однако это не совсем репрезентативно, так как время начала и продолжительность каждой группы фиксированы.
import numpy as np
import pandas as pd
idx= pd.date_range(start='2019-01-01 00:00:00', end='2019-01-01 23:00:00',freq='5s')
df=pd.DataFrame(index=idx)
df['data']=np.nan
df[(df.index.minute>5)&(df.index.minute<15)]=1
idxlist=df[(df.index.minute>5)&(df.index.minute<15)].index
randidx=np.random.choice(idxlist,500)
df.loc[pd.DatetimeIndex(randidx)]=np.nan
Редактировать:
У меня нет строгого определениядля «группы», но если вы строите данные из приведенного выше примера, это должно быть очевидно.Данные поступают в сгустки и разделены длинными интервалами nan, каждая из этих сгустков является группой.Вот изображение, показывающее пример из моих реальных данных.
Ожидаемым результатом должен быть список, элементами которого являются индексы, соответствующие каждой группе, илиальтернативно время начала и время окончания каждой группы или что-то подобное.Опять же, меня больше интересуют идеи или предложения о том, как мне этого добиться, я сам могу позаботиться о реализации.