【发布时间】:2020-10-03 20:15:41
【问题描述】:
我正在开展一个新生儿项目,长话短说,新生儿根据他们在给定时间点的症状被分配一定的分数,并根据他们的分数随时间的变化情况,我们决定是否增加药物剂量,保持不变,或断奶。我们将这 3 个状态用数字表示为 +1(增加)、0(保持)或 -1(断奶)。决定做什么的规则如下:
- 如果 3 个连续得分的总和 >= 24 或单个得分 >= 12,则增加剂量。
- 如果您不符合增加或减少剂量的规则,请保持剂量
- 如果至少有 48 小时无需增加剂量,则降低剂量,最近 3 次得分的总和 8。
在此人的帮助下,我们编写了用于增加剂量和维持剂量的代码。但是,我正在努力编写规则以确定如何降低剂量。这是我们的代码示例:
import pandas as pd
df = pd.DataFrame({
'baby': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B','B', 'B', 'B', 'B', 'B','B','B'],
'dateandtime': ['8/2/2009 5:00:00 PM', '7/19/2009 5:00:00 PM', '7/19/2009 5:00:00 PM', '7/17/2009 6:00:00 AM','7/17/2009 12:01:00 AM', '7/14/2009 12:01:00 AM', '7/19/2009 5:00:00 AM', '7/16/2009 9:00:00 PM','7/19/2009 9:00:00 AM', '7/14/2009 6:00:00 PM', '7/15/2009 3:04:00 PM', '7/20/2009 5:00:00 PM','7/16/2009 12:01:00 AM', '7/18/2009 1:00:00 PM', '7/16/2009 6:00:00 AM', '7/13/2009 9:00:00 PM','7/19/2009 1:00:00 AM','7/15/2009 12:04:00 AM'],
'score': [6, 3, 3, 5, 10, 14, 5, 4, 11, 4, 4, 6, 7, 4, 6, 12, 6, 6]
})
df.dateandtime = pd.to_datetime(df['dateandtime']) # change column type for ease of indexing
df = df.set_index('dateandtime')
df.sort_index(inplace = True)
df = df[~df.index.duplicated()] #Remove any duplicated rows
#Calculate conditions
df['sum_3_scores'] = df.groupby('baby')['score'].rolling(3).sum().reset_index(0,drop=True)
df['max_1_score'] = df.groupby('baby')['score'].rolling(1).max().reset_index(0,drop=True)
#you don't nead to calculate the 24hr mean because the 48hr max is 8 the 24hr mean will also be < 8
#df['mean_24hr_score'] = df.groupby('baby')['score'].rolling('24h').mean().reset_index(0,drop=True)
#scoring logic
def score(data):
if data['sum_3_scores'] >= 24 or data['max_1_score'] >= 12:
return 1
return 0
df['rule'] = df.apply(score, axis = 1)
df.reset_index().set_index(['baby','dateandtime']).sort_index()
print(df)
这会产生一个很好的数据框,其中包含我想要的(减少剂量的规则除外):
baby score sum_3_scores max_1_score rule
dateandtime
2009-07-13 21:00:00 B 12 NaN 12.0 1
2009-07-14 00:01:00 A 14 NaN 14.0 1
2009-07-14 18:00:00 B 4 NaN 4.0 0
2009-07-15 00:04:00 B 6 22.0 6.0 0
2009-07-15 15:04:00 B 4 14.0 4.0 0
2009-07-16 00:01:00 B 7 17.0 7.0 0
2009-07-16 06:00:00 B 6 17.0 6.0 0
2009-07-16 21:00:00 A 4 NaN 4.0 0
2009-07-17 00:01:00 A 10 28.0 10.0 1
2009-07-17 06:00:00 A 5 19.0 5.0 0
2009-07-18 13:00:00 B 4 17.0 4.0 0
2009-07-19 01:00:00 B 6 16.0 6.0 0
2009-07-19 05:00:00 A 5 20.0 5.0 0
2009-07-19 09:00:00 A 11 21.0 11.0 0
2009-07-19 17:00:00 A 3 19.0 3.0 0
2009-07-20 17:00:00 B 6 16.0 6.0 0
2009-08-02 17:00:00 A 6 20.0 6.0 0
编写降低剂量规则的简单方法是什么?我知道我可以使用代码 df.groupby('baby')['score'].rolling('48h') 执行 48 小时窗口,但我不清楚如何仅检查 3 个最近剂量的总和那个窗口的
【问题讨论】:
-
当您说
a single score is >= 12和no single score is >8时,您指的是什么时间范围? -
@Dames 据我所知,“单次得分 >=12”是指在任何时候得分为 12。 “没有一个分数大于 8”应在 48 小时窗口内。
-
所以当今天的分数 >= 12 时,你明天和后天会增加,一周后你会看今天并说分数超过 12,所以我们需要增加吗?您可能想说自上次增加以来得分 >= 12?
-
@Dames 因此,通常每 4 小时进行一次评分。因此,如果某个时间点的分数 >=12,我会在该时间点增加剂量。然后我会在 4 小时后检查分数,然后根据我的下一个分数再次增加或维持剂量
-
好的,我想我明白了,我会为你制作一些东西
标签: python pandas dataframe rolling-computation