Python 带滚动窗口的函数

Python 带滚动窗口的函数,python,pandas,dataframe,Python,Pandas,Dataframe,我正在做一个新生儿项目,长话短说就是根据新生儿在给定时间点的症状给他们分配一个特定的分数。根据他们的分数随时间的变化情况,我们决定是增加药物剂量,保持不变,还是断奶。我们将这3种状态用数字表示为+1(增加)、0(保持)或-1(断奶),因此每个时间点都有一个相关的分数。决定做什么的规则如下: 如果三个连续得分之和>=24或单个得分>=12(+1),则增加剂量 低剂量如果至少有48小时不需要增加剂量,则最近3次得分之和为8(-1) 否则维持剂量(0) 示例代码如下所示: import panda

我正在做一个新生儿项目,长话短说就是根据新生儿在给定时间点的症状给他们分配一个特定的分数。根据他们的分数随时间的变化情况,我们决定是增加药物剂量,保持不变,还是断奶。我们将这3种状态用数字表示为+1(增加)、0(保持)或-1(断奶),因此每个时间点都有一个相关的分数。决定做什么的规则如下:

  • 如果三个连续得分之和>=24或单个得分>=12(+1),则增加剂量
  • 低剂量如果至少有48小时不需要增加剂量,则最近3次得分之和为8(-1)
  • 否则维持剂量(0)
示例代码如下所示:

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':  ['7/20/2009  5:00:00 PM', '7/18/2009  5:00:00 PM', '7/18/2009  7: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, 7, 5, 13, 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)
df['sum_3_scores_48hours'] = df.groupby('baby')['score'].rolling('48h', max_periods=3).apply(lambda x: sum(x[-3:])).reset_index(0,drop=True)

#scoring logic
def score(data):
    if data['sum_3_scores'] >= 24 or data['max_1_score'] >= 12:
        return 1
    if data['sum_3_scores_48hours'] < 18 and data['max_1_score'] < 8 and data['sum_3_scores']<24: 
        return -1
    return 0

df['rule (original)'] = df.apply(score, axis = 1)

#just for a nicely ordered output
df.reset_index().set_index(['baby','dateandtime']).sort_index()
df.sort_values(by=['baby', 'dateandtime'],inplace=True)
df.drop(['sum_3_scores','sum_3_scores_48hours'], axis=1, inplace=True)
df.sort_values(by=['baby', 'dateandtime'],inplace=True)
print(df)

一切都在做我想做的,除了这里的问题是,这不符合减少剂量规则的部分,即“如果至少有48小时不需要增加剂量,那么就降低剂量。”(换句话说,如果有+1,我在至少48小时后才能产生-1)。例如,我在“2009-07-17 00:01:00”时增加了剂量,但代码显示在“2009-07-18 19:00:00”时降低剂量,即不到48小时。因此,我知道问题出在我的“def分数(数据)”函数中,但我不确定如何修改此函数,以便它知道如果时间点距离增加剂量不到48小时,它不会产生-1。

以下将给出天数:

将熊猫作为pd导入
df=pd.DataFrame(
{ 
“宝贝”:[
“A”,“A”,“A”,“A”,“A”,“A”,“A”,“A”,“A”,“B”,“B”,“B”,“B”,“B”,“B”,“B”,“B”,“B”,“B”,“B”,“B”
],  
“日期和时间”:[
‘2009年7月20日下午5:00’、‘2009年7月18日下午5:00’、‘2009年7月18日下午7:00’、‘2009年7月17日上午6:00’,
‘2009年7月17日12:01:00 AM’、‘2009年7月14日12:01:00 AM’、‘2009年7月19日5:00 AM’、‘2009年7月16日9:00:00 PM’,
‘2009年7月19日上午9:00:00’、‘2009年7月14日下午6:00’、‘2009年7月15日下午3:04:00’、‘2009年7月20日下午5:00’,
“2009年7月16日12:01:00 AM”、“2009年7月18日1:00:00 PM”、“2009年7月16日6:00 AM”、“2009年7月13日9:00:00 PM”,
“2009年7月19日凌晨1:00:00”,“2009年7月15日凌晨12:04:00”
], 
“分数”:[
6, 3, 7, 5, 13, 14, 5, 4, 11, 4, 4, 6, 7, 4, 6, 12, 6, 6 
] 
} 
)
df[“dateandtime”]=pd.to_datetime(df['dateandtime'])
df=df.set_index('dateandtime')。sort_index()
df=df[~df.index.duplicated()]
星期日=(
df.assign(天数=0)
.groupby(“baby”)[“days”]滚动(3)
.apply(lambda行:(row.index.max()-row.index.min()).days)
)
df=df.reset_index().merge(ndays,on=[“dateandtime”,“baby”])。set_index(“dateandtime”)

然后,您可以根据这个新列计算分数

也许我做错了什么,但这给了我:AttributeError:'numpy.ndarray'对象没有属性'index',为了完整起见,我在回答中包含了您的部分代码。我的pandas版本(1.0.5)运行时没有错误。更新后的代码段是否仍存在此错误?
                    baby  score  max_1_score  rule (original)
dateandtime                                                  
2009-07-14 00:01:00    A     14         14.0                1
2009-07-16 21:00:00    A      4          4.0                0
2009-07-17 00:01:00    A     13         13.0                1
2009-07-17 06:00:00    A      5          5.0                0
2009-07-18 17:00:00    A      3          3.0                0
2009-07-18 19:00:00    A      7          7.0               -1
2009-07-19 05:00:00    A      5          5.0               -1
2009-07-19 09:00:00    A     11         11.0                0
2009-07-13 21:00:00    B     12         12.0                1
2009-07-14 18:00:00    B      4          4.0                0
2009-07-15 00:04:00    B      6          6.0                0
2009-07-15 15:04:00    B      4          4.0               -1
2009-07-16 00:01:00    B      7          7.0               -1
2009-07-16 06:00:00    B      6          6.0               -1
2009-07-18 13:00:00    B      4          4.0               -1
2009-07-19 01:00:00    B      6          6.0               -1
2009-07-20 17:00:00    B      6          6.0               -1