Определение окна в данных временного ряда, где точки данных ниже заданного значения - PullRequest
0 голосов
/ 15 мая 2019

Это небольшое подмножество моих данных:

                     heartrate
2018-01-01 00:00:00       67.0
2018-01-01 00:01:00       55.0
2018-01-01 00:02:00       60.0
2018-01-01 00:03:00       67.0
2018-01-01 00:04:00       72.0
2018-01-01 00:05:00       53.0
2018-01-01 00:06:00       62.0
2018-01-01 00:07:00       59.0
2018-01-01 00:08:00      117.0
2018-01-01 00:09:00       62.0
2018-01-01 00:10:00       65.0
2018-01-01 00:11:00       70.0
2018-01-01 00:12:00       49.0
2018-01-01 00:13:00       59.0

Эти данные представляют собой ежедневную частоту сердечных сокращений пациентов.Я пытаюсь выяснить, могу ли я, основываясь на их частоте сердечных сокращений, найти временное окно, в котором они спят.

Я не уверен, как написать код, который мог бы идентифицировать временной интервал, в течение которого пациент спит, потому что каждые несколько минут будут всплывать данные.Например, в данных, предоставленных с 2018-01-01 00:07:00 to 2018-01-01 00:08:00, heartrate подскочил с 59 до 117. Кто-нибудь может предложить способ обойти это и способ найти временное окно, когда Heartrate ниже среднего значения на несколько часов

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Как упомянуто в ваших комментариях, вы можете найти скользящее среднее, чтобы «сгладить» ваш сигнал, используя:

patient_data_df['rollingmeanVal'] = patient_data_df.rolling('3T').heartrate.mean()

Предполагая, что вы используете фрейм данных и хотите идентифицировать строки, которые имеют HR ниже или равныйк среднему значению, которое вы можете использовать:

HR_mean = patient_data_df['rollingmeanVal'].mean()
selected_data_df = patient_data_df[patient_data_df['rollingmeanVal'] <= HR_mean]

Затем, вместо того, чтобы работать с фреймом данных как с фреймом данных временного ряда, вы можете сбросить индекс и сгенерировать столбец с именем index с датой и временем в качестве значений.Теперь, когда у вас есть фрейм данных со всеми значениями ниже среднего, вы можете сгруппировать их в группы, если разница между ними превышает 30 минут.Это предполагает, что с флуктуирующими данными в течение 30 минут все в порядке.

Предполагая, что группа с наибольшим количеством данных - это когда пациент спит, вы можете идентифицировать эту группу.Используя первую и последнюю дату этой группы, вы можете определить временное окно, в котором пациент спит.

Сбросить индекс, добавив новый столбец с именем index с данными временного ряда:

selected_data_df.reset_index(inplace=True)

Группировка по:

selected_data_df['grp'] = selected_data_df['index'].diff().dt.seconds.ge(30 * 60).cumsum()
sleep_grp = selected_data_df.groupby('grp').count().sort_values(['grp']).head(1)
sleep_grp_index = sleep_grp.index.values[0]
sleep_df = selected_data_df[selected_data_df['grp'] == sleep_grp_index].drop('grp', axis=1)

Время начала сна:

temp2_df['index'].iloc[0]

Время окончания сна:

temp2_df['index'].iloc[-1]
0 голосов
/ 15 мая 2019

Вы можете использовать функцию кодирования длины выполнения из базы R для решения вашей проблемы. На шаге 1 вы можете рассчитать скользящее среднее сердечного ритма ваших пациентов. Вы можете использовать ваше решение или любое другое . После этого вы добавляете логический флаг к вашему data.frame, например, patient['lowerVal'] = patient['heartrate'] < patient['rollingmeanVal']. Затем примените функцию rle к этой переменной lowerVal. В качестве возврата вы получаете длину трасс ниже и выше среднего. Применяя cumsum к значению lengths, вы получаете местоположение ваших временных интервалов сна.

Извините. Это Питон. Поэтому вы можете использовать Python-версию Run Length Encoding .

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