Краткое введение
У меня есть DataFrame, содержащий данные временных рядов. Я работаю над проектом по анализу данных CGM , который пытается оценить гликемию. Датчик, с которым я работаю, иногда не регистрирует некоторые данные, то есть в CSV отсутствуют значения, которые я не наблюдаю на экране приложения (он всегда отображается непрерывным, я ношу датчик). теоретический период этого временного ряда составляет 5 минут . Однако данные иногда регистрируются нерегулярно, как мы можем наблюдать на изображении ниже.
Чего я хотел бы достичь
Я хотел бы обработать свои данные, чтобы интерполировать и заполнить некоторые windows временных рядов.
- Повышение выборки данных до периода из 1 минута .
- Интерполяция данных, но только когда временная разница между значениями, отличными от нан, меньше указанного значения, например
datetime.timedelta(minutes=30)
Данные:
Как изображение
В качестве pandas -читаемого фиктивного примера
Sensor Glucose (mg/dL) ISIG Value
DateTime
2020-03-16 16:31:00 116.0 17.60
2020-03-16 16:36:00 110.0 16.26
2020-03-16 16:41:00 112.0 18.66
2020-03-16 16:46:00 121.0 21.86
2020-03-16 16:51:00 124.0 20.67
2020-03-16 16:56:00 NaN NaN
2020-03-16 17:00:00 NaN NaN
2020-03-16 17:01:00 116.0 15.86
2020-03-16 17:06:00 108.0 14.99
2020-03-16 17:11:00 108.0 17.43
2020-03-16 17:16:00 104.0 15.42
2020-03-16 17:21:00 103.0 16.49
2020-03-16 17:26:00 108.0 18.83
2020-03-16 17:31:00 104.0 15.18
2020-03-16 17:36:00 106.0 18.06
2020-03-16 17:39:00 NaN NaN
2020-03-16 17:41:00 110.0 19.49
2020-03-16 17:46:00 114.0 20.13
2020-03-16 17:51:00 121.0 21.27
2020-03-16 17:52:00 NaN NaN
2020-03-16 17:57:00 NaN NaN
2020-03-16 17:58:00 NaN NaN
2020-03-16 18:00:00 NaN NaN
2020-03-16 19:00:00 NaN NaN
2020-03-16 19:12:00 NaN NaN
2020-03-16 19:13:00 NaN NaN
2020-03-16 19:30:00 127.0 NaN
2020-03-16 19:35:00 129.0 NaN
2020-03-16 19:40:00 134.0 NaN
2020-03-16 19:45:00 NaN NaN
2020-03-16 19:50:00 NaN NaN
2020-03-16 19:55:00 NaN NaN
2020-03-16 20:00:00 NaN NaN
2020-03-16 20:05:00 NaN NaN
2020-03-16 20:10:00 NaN NaN
2020-03-16 20:15:00 NaN NaN
2020-03-16 20:20:00 NaN NaN
2020-03-16 20:25:00 NaN NaN
2020-03-16 20:30:00 NaN NaN
2020-03-16 20:35:00 NaN NaN
2020-03-16 20:40:00 NaN NaN
2020-03-16 20:45:00 NaN NaN
2020-03-16 20:50:00 120.0 NaN
Например, здесь я хотел бы интерполировать первое и второе вхождение NaN
, но не третье или четвертое, поскольку windows слишком велико.
Предостережения
Я думаю, что есть две одновременные проблемы:
- Индекс не является регулярным, поэтому это один из источников пропущенных данных временных рядов
pd.infer_freq(df.index)
приводит к None
. - Есть пропущенные значения, и даже если их не было, повышающая дискретизация создаст
NaN
. Эти пропущенные значения я хотел бы заполнить с помощью интерполяции, я не хочу заполнять пустые места, когда временное окно больше определенного значения, потому что это больше не будет физиологически допустимым (никогда не будет строго линейного или квадратичного c поведение начинается через два часа, но можно с уверенностью сказать, что это явление линейно в 1-минутной шкале)
Что я пробовал:
Я знаю, что повышающая выборка довольно просто, одна строка:
new_df = df.resample("1T").asfreq()
Найти индексы с большим разделением, чем нужно:
df.index.to_series().diff(1) > dt.timedelta(minutes=45)
Это поможет решить проблему, если все регулярно расположенные журналы содержат действительные записи глюкозы , но многие из них имеют NaN
.
Я знаю, что pd.DataFrame.groupby
- это возможный путь к go, тем не менее я довольно неопытен, используя эту функцию.