Как упомянуто в ваших комментариях, вы можете найти скользящее среднее, чтобы «сгладить» ваш сигнал, используя:
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]