Выборочная интерполяция фрейма данных дата-индекс - PullRequest
0 голосов
/ 30 марта 2020

Краткое введение

У меня есть DataFrame, содержащий данные временных рядов. Я работаю над проектом по анализу данных CGM , который пытается оценить гликемию. Датчик, с которым я работаю, иногда не регистрирует некоторые данные, то есть в CSV отсутствуют значения, которые я не наблюдаю на экране приложения (он всегда отображается непрерывным, я ношу датчик). теоретический период этого временного ряда составляет 5 минут . Однако данные иногда регистрируются нерегулярно, как мы можем наблюдать на изображении ниже.

Чего я хотел бы достичь

Я хотел бы обработать свои данные, чтобы интерполировать и заполнить некоторые windows временных рядов.

  1. Повышение выборки данных до периода из 1 минута .
  2. Интерполяция данных, но только когда временная разница между значениями, отличными от нан, меньше указанного значения, например datetime.timedelta(minutes=30)

Данные:

Как изображение

Sample irregularly-sampled DataFrame

В качестве 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 слишком велико.

Предостережения

Я думаю, что есть две одновременные проблемы:

  1. Индекс не является регулярным, поэтому это один из источников пропущенных данных временных рядов pd.infer_freq(df.index) приводит к None.
  2. Есть пропущенные значения, и даже если их не было, повышающая дискретизация создаст NaN. Эти пропущенные значения я хотел бы заполнить с помощью интерполяции, я не хочу заполнять пустые места, когда временное окно больше определенного значения, потому что это больше не будет физиологически допустимым (никогда не будет строго линейного или квадратичного c поведение начинается через два часа, но можно с уверенностью сказать, что это явление линейно в 1-минутной шкале)

Что я пробовал:

Я знаю, что повышающая выборка довольно просто, одна строка:

new_df = df.resample("1T").asfreq()

Найти индексы с большим разделением, чем нужно:

df.index.to_series().diff(1) > dt.timedelta(minutes=45)

Это поможет решить проблему, если все регулярно расположенные журналы содержат действительные записи глюкозы , но многие из них имеют NaN.

Я знаю, что pd.DataFrame.groupby - это возможный путь к go, тем не менее я довольно неопытен, используя эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...