这是我数据的一小部分:
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
在下面时找到时间窗口的方法。几个小时的平均值?
答案 0 :(得分:1)
如您的评论中所述,您可以使用以下方法找到滚动平均值,以“平滑”信号:
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]
答案 1 :(得分:0)
您可以使用基数R中的运行长度编码功能来解决您的问题。在步骤1中,您可以计算患者心率的滚动平均值。您可以使用您的解决方案或任何other。之后,您将逻辑标志添加到data.frame
中,例如patient['lowerVal'] = patient['heartrate'] < patient['rollingmeanVal']
。然后在该变量rle
上应用lowerVal
函数。作为回报,您得到的奔波长度低于和高于均值。通过在cumsum
值上应用lengths
,您可以获得睡眠时间范围的位置。
对不起。是Python。因此,您可以使用Run Length Encoding的Python版本。