gpt4 book ai didi

python - 使用滚动总和根据启动/停止数据来识别某些事件

转载 作者:行者123 更新时间:2023-12-01 03:22:44 25 4
gpt4 key购买 nike

我正在尝试使用下面的代码从我的数据集water 中提取特定事件。 (我下面的数据不是实际的数据集)。

目前,我的代码根据大于零的值之间是否有零来对事件进行分类。然后,它将这些值相加并返回每个事件使用的总水量。但是,此代码当前将一个事件分类为两个事件,即使它们之间只有几秒钟的零。如果事件之间的零持续时间小于 5 秒,我想将它们分类在同一事件中。

如何调整代码来检查事件之间的零是否小于 5 秒,如果是,则将它们分类在同一事件中?

rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})

starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0

df.groupby('event_number').agg({'time_stamp':'first',
'water_amount':'sum'}) #feature matrix

编辑:说明我的问题的照片:

enter image description here

最佳答案

这是一个首先标记每组连续零的解决方案。然后,它会计算该组中有多少个零,并确定是否少于 5 个。然后,它会标记整个水系列,仅当找到 5 个连续的零时,才会增加组号。

一旦组被正确标记,聚合就很容易。

多个组的虚假数据

rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,.2,.3,0,0,.4,0,0.3,0.2,0.5,0,0,0,0,0,1,3,4,0,0,0,0,5,4,0,0,2,4,0,0,
0,0,0,1,0,0,0,0,0,1,.4,.3,.1,.4,0,0,0,4,5,0,1,0,0,0,0,0,5,1,2,0,0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})
water = df.water_amount

分组并聚合

groups = water.ne(0).diff().fillna(0 == water.iloc[0]).cumsum().mul(water.eq(0))

counts = groups.value_counts()
counts.loc[0] = 0

groups5 = groups.map(counts).lt(5)

groups_final = groups5.diff().cumsum().fillna(0).add(1).mul(groups5).astype(int)

df_agg = df.groupby(groups_final).agg({'time_stamp':['first', 'last'],
'water_amount':'sum'}).drop(0)
df_agg.index.set_names(['Group Number'], inplace=True)

来自print(df_agg)的输出

                      time_stamp                     water_amount
first last sum
Group Number
1 2017-01-01 14:00:00 2017-01-01 14:00:09 1.9
3 2017-01-01 14:00:15 2017-01-01 14:00:27 23.0
5 2017-01-01 14:00:33 2017-01-01 14:00:33 1.0
7 2017-01-01 14:00:39 2017-01-01 14:00:50 12.2
9 2017-01-01 14:00:56 2017-01-01 14:01:00 8.0

关于python - 使用滚动总和根据启动/停止数据来识别某些事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41773849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com