基于时间序列进行事件识别

简介: 基于时间序列进行事件识别
# -*- coding: utf-8 -*-"""Created on Tue Dec  1 15:32:28 2020@author: ASUS"""importpandasaspdimporttimeimportnumpyasnpimportpandasaspd#导入数据分析库Pandasfromscipy.interpolateimportlagrange#导入拉格朗日插值函数frommatplotlibimportpyplotaspltimportdatetimeimportmathimportnumpyasnpfromnumpyimportarray, sign, zerosfromscipy.interpolateimportinterp1dimportscipy.signalassignalfromscipyimportfftpackplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False#用来正常显示负号defcut_date(t):
returnt[:10] 
defget_data(flag=1,car_num='粤S85377',date=['2021-06-27','2021-06-28']):
ifflag==1:
data=pd.read_csv('车辆列表.csv')
data=data[['车牌号','创建时间','更新时间','装载体积']]
data=data[data.duplicated()==False]
GMT_FORMAT='%a %b %d %H:%M:%S CST %Y'data['创建时间']=data['创建时间'].apply(lambdax :datetime.datetime.strptime(x, GMT_FORMAT))
data['更新时间']=data['更新时间'].apply(lambdax :datetime.datetime.strptime(x, GMT_FORMAT))
data['time']=data['创建时间'].apply(str)
data['volume']=data['装载体积']
print(data.columns)
data=data[data['车牌号']==car_num]
##检查当天数据完整性data['date']=data['time'].apply(cut_date)
data=data[(data['date']==date[0])|(data['date']==date[1])]
ifdata.shape[0]==0: 
print('自研设备【{0}】当天【{1}】没数据'.format(car_num, date[0]))
returndatanew_index=pd.date_range(start=data['time'].min()[:10],end=data['time'].max(),freq='s')
#补全时间索引秒级别data['time']=pd.to_datetime(data['time'])
data=data.set_index('time',drop=True)
data=data.sort_index()
data=data.reindex(new_index)
#解析增加天字段和分钟字段data['time']=data.indexdata['day']=data['time'].apply(lambdax: time.strftime('%Y-%m-%d',time.strptime(str(x),'%Y-%m-%d %H:%M:%S')))
data['minute']=data['time'].apply(lambdax: time.strftime('%Y-%m-%d %H:%M',time.strptime(str(x),'%Y-%m-%d %H:%M:%S')))
#按分钟维度合并监测数据data=data[['volume']].groupby(data['minute']).mean()
# data.index=pd.to_datetime(data.index)# data=data.fillna(0)data=data.interpolate('linear')
data=data.sort_index() 
data=data.reset_index()
# data.to_csv('序列数据预处理.csv')# data=pd.read_csv('序列数据预处理.csv')else:
data=pd.read_csv('all_data2.csv')
data=data[data.duplicated(subset=['time','carnum'])==False]
print(data.columns)
data=data[data['carnum']==car_num]
##检查当天数据完整性data['date']=data['time'].apply(cut_date)
# data=data[(data['date']=='2021-05-06')|(data['date']=='2021-05-01')|(data['date']=='2021-05-07')|(data['date']=='2021-05-03')]data=data[(data['date']==date[0])|(data['date']==date[1])]
ifdata.shape[0]==0: 
print('G7设备【{0}】当天【{1}】没数据'.format(car_num, date[0]))
returndatanew_index=pd.date_range(start=data['time'].min()[:10],end=data['time'].max(),freq='s')
# data_2=data[['carnum','day','time']]# data_2=data_2[data_2.duplicated()==False]# coun_dat=data_2.groupby(by=['carnum','day']).count()# coun_dat.to_csv('数据完整性校验.csv')#补全时间索引秒级别data['time']=pd.to_datetime(data['time'])
data.index=data['time']
data=data.reindex(new_index)
#解析增加天字段和分钟字段data['time']=data.indexdata['day']=data['time'].apply(lambdax: time.strftime('%Y-%m-%d',time.strptime(str(x),'%Y-%m-%d %H:%M:%S')))
data['minute']=data['time'].apply(lambdax: time.strftime('%Y-%m-%d %H:%M',time.strptime(str(x),'%Y-%m-%d %H:%M:%S')))
#按分钟维度合并监测数据data=data[['volume']].groupby(data['minute']).mean()
# data.index=pd.to_datetime(data.index)# data=data.fillna(0)data=data.interpolate('linear')
data=data.sort_index() 
data=data.reset_index()
print(data.shape)
# data.to_csv('序列数据预处理.csv')# data=pd.read_csv('序列数据预处理.csv')returndatadefevent_num(i,event_flag):
data_tmp=data.copy()
ifevent_flag==1:
data_tmp.loc[(data_tmp['diffxx']>-0.2)&(data_tmp['diffxx']<i),'diffxx']=0elifevent_flag==2:
data_tmp.loc[(data_tmp['diffxx']>-i)&(data_tmp['diffxx']<0.2),'diffxx']=0##data_tmp['tag']=data_tmp['diffxx'].apply(lambdax: 10ifx==0else20ifx>0else0ifx<0elseNone)
##输出事件标签data_tmp['tag_pr']=data_tmp['tag'].shift()
#              0          10                20  #0(卸货)  卸货中     结束卸货             错误状态1#10(运输) 开始卸货        运输中          开始装货#20(装货) 错误状态2   结束装货             装货中data_tmp['tag2']='最终状态'data_tmp.loc[(data_tmp['tag_pr']==0)&(data_tmp['tag']==0),'tag2']='卸货中'data_tmp.loc[(data_tmp['tag_pr']==0)&(data_tmp['tag']==10),'tag2']='结束卸货'data_tmp.loc[(data_tmp['tag_pr']==0)&(data_tmp['tag']==20),'tag2']='错误状态1'data_tmp.loc[(data_tmp['tag_pr']==10)&(data_tmp['tag']==0),'tag2']='开始卸货'data_tmp.loc[(data_tmp['tag_pr']==10)&(data_tmp['tag']==10),'tag2']='运输中'data_tmp.loc[(data_tmp['tag_pr']==10)&(data_tmp['tag']==20),'tag2']='开始装货'data_tmp.loc[(data_tmp['tag_pr']==20)&(data_tmp['tag']==0),'tag2']='错误状态2'data_tmp.loc[(data_tmp['tag_pr']==20)&(data_tmp['tag']==10),'tag2']='结束装货'data_tmp.loc[(data_tmp['tag_pr']==20)&(data_tmp['tag']==20),'tag2']='装货中'tmp=data_tmp.reset_index(drop=True)
ifevent_flag==1:
iftmp.shape[0]>0:
iftmp.iloc[0]['tag2']=='结束装货':
tmp=tmp.iloc[1:]
iftmp.shape[0]>0:
iftmp.iloc[-1]['tag2']=='开始装货':
tmp=tmp.iloc[:-1]
num=tmp[tmp['tag2']=='开始装货'].shape[0]
elifevent_flag==2:
iftmp.shape[0]>0:
iftmp.iloc[0]['tag2']=='结束卸货':
tmp=tmp.iloc[1:]
iftmp.shape[0]>0:
iftmp.iloc[-1]['tag2']=='开始卸货':
tmp=tmp.iloc[:-1]
num=tmp[tmp['tag2']=='开始卸货'].shape[0]
returnnum#输入信号序列即可(list)defenvelope_extraction(signal):
s=signal.astype(float )
q_u=np.zeros(s.shape)
q_l=np.zeros(s.shape)
#在插值值前加上第一个值。这将强制模型对上包络和下包络模型使用相同的起点。#Prepend the first value of (s) to the interpolating values. This forces the model to use the same starting point for both the upper and lower envelope models.u_x= [0,] #上包络的x序列u_y= [s[0],] #上包络的y序列l_x= [0,] #下包络的x序列l_y= [s[0],] #下包络的y序列# 检测波峰和波谷,并分别标记它们在u_x,u_y,l_x,l_中的位置。 #Detect peaks and troughs and mark their location in u_x,u_y,l_x,l_y respectively.forkinrange(1,len(s)-1):
if (sign(s[k]-s[k-1])==1) and (sign(s[k]-s[k+1])==1):
u_x.append(k)
u_y.append(s[k])
if (sign(s[k]-s[k-1])==-1) and ((sign(s[k]-s[k+1]))==-1):
l_x.append(k)
l_y.append(s[k])
u_x.append(len(s)-1) #上包络与原始数据切点xu_y.append(s[-1]) #对应的值l_x.append(len(s)-1) #下包络与原始数据切点xl_y.append(s[-1]) #对应的值#u_x,l_y是不连续的,以下代码把包络转为和输入数据相同大小的数组[便于后续处理,如滤波]upper_envelope_y=np.zeros(len(signal))
lower_envelope_y=np.zeros(len(signal))
upper_envelope_y[0] =u_y[0]#边界值处理upper_envelope_y[-1] =u_y[-1]
lower_envelope_y[0] =l_y[0]#边界值处理lower_envelope_y[-1] =l_y[-1]
#上包络last_idx,next_idx=0, 0k, b=general_equation(u_x[0], u_y[0], u_x[1], u_y[1]) #初始的k,bforeinrange(1, len(upper_envelope_y)-1):
ifenotinu_x:
v=k*e+bupper_envelope_y[e] =velse:
idx=u_x.index(e)
upper_envelope_y[e] =u_y[idx]
last_idx=u_x.index(e)
next_idx=u_x.index(e) +1#求连续两个点之间的直线方程k, b=general_equation(u_x[last_idx], u_y[last_idx], u_x[next_idx], u_y[next_idx])        
#下包络last_idx,next_idx=0, 0k, b=general_equation(l_x[0], l_y[0], l_x[1], l_y[1]) #初始的k,bforeinrange(1, len(lower_envelope_y)-1):
ifenotinl_x:
v=k*e+blower_envelope_y[e] =velse:
idx=l_x.index(e)
lower_envelope_y[e] =l_y[idx]
last_idx=l_x.index(e)
next_idx=l_x.index(e) +1#求连续两个切点之间的直线方程k, b=general_equation(l_x[last_idx], l_y[last_idx], l_x[next_idx], l_y[next_idx])     
#也可以使用三次样条进行拟合#u_p = interp1d(u_x,u_y, kind = 'cubic',bounds_error = False, fill_value=0.0)#l_p = interp1d(l_x,l_y, kind = 'cubic',bounds_error = False, fill_value=0.0)#for k in range(0,len(s)):#   q_u[k] = u_p(k)#   q_l[k] = l_p(k)returnupper_envelope_y, lower_envelope_ydefgeneral_equation(first_x,first_y,second_x,second_y):
# 斜截式 y = kx + b A=second_y-first_yB=first_x-second_xC=second_x*first_y-first_x*second_yk=-1*A/Bb=-1*C/Breturnk, bdefget_time_err(time_1,time_2):
# 不同天的时间差# time_1 = '2020-03-02 15:00:00'# time_2 = '2020-03-03 16:00:00'time_1_struct=datetime.datetime.strptime(time_1, "%Y-%m-%d %H:%M")
time_2_struct=datetime.datetime.strptime(time_2, "%Y-%m-%d %H:%M")
# 来获取时间差中的秒数。注意,seconds获得的秒只是时间差中的小时、分钟和秒部分,没有包含天数差,total_seconds包含天数差# 所以total_seconds两种情况都是可以用的total_seconds= (time_2_struct-time_1_struct).total_seconds()
min_sub=total_seconds/60returnmin_subdefget_event():
data['tag']=data['diffxx'].apply(lambdax: 10ifx==0else20ifx>0else0ifx<0elseNone)
data['tag_pr']=data['tag'].shift()
#              0          10                20  #0(卸货)  卸货中     结束卸货             错误状态1#10(运输) 开始卸货        运输中          开始装货#20(装货) 错误状态2   结束装货             装货中##状态识别    data['tag2']='最终状态'data.loc[(data['tag_pr']==0)&(data['tag']==0),'tag2']='卸货中'data.loc[(data['tag_pr']==0)&(data['tag']==10),'tag2']='结束卸货'data.loc[(data['tag_pr']==0)&(data['tag']==20),'tag2']='错误状态1'data.loc[(data['tag_pr']==10)&(data['tag']==0),'tag2']='开始卸货'data.loc[(data['tag_pr']==10)&(data['tag']==10),'tag2']='运输中'data.loc[(data['tag_pr']==10)&(data['tag']==20),'tag2']='开始装货'data.loc[(data['tag_pr']==20)&(data['tag']==0),'tag2']='错误状态2'data.loc[(data['tag_pr']==20)&(data['tag']==10),'tag2']='结束装货'data.loc[(data['tag_pr']==20)&(data['tag']==20),'tag2']='装货中'# zhuangche_num=data[data['tag2']=='开始装货'].shape[0]# xiehche_num=data[data['tag2']=='开始卸货'].shape[0]tmp=data[['volume','tag']]
tmp.plot()
plt.title('车牌:{0} 时间:{1}'.format(c,v))
plt.savefig('./pictures/车牌:{0} 时间:{1}_事件结果.jpg'.format(c,v))
plt.show()
data_rexsult=data[(data['tag2']=='开始卸货')|(data['tag2']=='开始装货')|(data['tag2']=='结束卸货')|(data['tag2']=='结束装货')]
print('事件初次识别:',data_rexsult)
data_rexsult.to_csv('事件初次识别.csv')
##结果整理#车牌,事件类别,开始时间,结束时间,事件时长,装卸货量#事件过滤####################装车间隔#######################data_transform=data[(data['tag2']=='开始装货')|(data['tag2']=='结束装货')]
data_transform=data_transform.reset_index(drop=True)
##剔除中间不完整事件data_transform['tag4']=Falseforindex, rowindata_transform[:-1].iterrows():
ifdata_transform.iloc[index]['tag2']==data_transform.iloc[index+1]['tag2']:
data_transform.iloc[index:index+1]['tag4']=Truedata_transform=data_transform[data_transform['tag4']==False]
data_transform=data_transform[['minute', 'volume','tag', 'tag_pr', 'tag2']]
data_transform['minute2']=data_transform['minute'].shift(-1)
last_fill_date=datetime.datetime.strftime(datetime.datetime.strptime(data_transform['minute2'][0], "%Y-%m-%d %H:%M")+datetime.timedelta(days=+2), "%Y-%m-%d %H:%M")
data_transform['minute2']=data_transform['minute2'].fillna(last_fill_date)
data_transform['minute_shift']=data_transform.apply(lambdax:get_time_err(x['minute'],x['minute2']),axis=1)
data_transform=data_transform[['minute', 'volume', 'tag2', 'minute2', 'minute_shift']]
data_transform['drop']=Falseprint('data_transform1:',data_transform)
forindex, rowindata_transform.iterrows():
ifrow['tag2']=='结束装货'androw['minute_shift']<30:
data_transform.iloc[index:index+2]['drop']=Truedata_transform=data_transform[data_transform['drop']==False]
data_transform=data_transform.reset_index(drop=True)
print('data_transform2:',data_transform)
###############装车持续#########################data_transform=data_transform.reset_index(drop=True)
data_transform['minute2']=data_transform['minute'].shift(-1)
last_fill_date=datetime.datetime.strftime(datetime.datetime.strptime(data_transform['minute2'][0], "%Y-%m-%d %H:%M")+datetime.timedelta(days=+2), "%Y-%m-%d %H:%M")
data_transform['minute2']=data_transform['minute2'].fillna(last_fill_date)
data_transform['minute_shift']=data_transform.apply(lambdax:get_time_err(x['minute'],x['minute2']),axis=1)
data_transform=data_transform[['minute', 'volume', 'tag2', 'minute2', 'minute_shift']]
data_transform['drop']=Falseprint('data_transform3:',data_transform)
forindex, rowindata_transform.iterrows():
ifrow['tag2']=='开始装货'androw['minute_shift']<10:
data_transform.iloc[index:index+2]['drop']=Truedata_transform=data_transform[data_transform['drop']==False]
data_transform=data_transform.reset_index(drop=True)
print('data_transform4:',data_transform)
#######################剔除开始结束不完整事件#############################tmp=data_transform.reset_index(drop=True)
iftmp.shape[0]>0:
iftmp.iloc[0]['tag2']=='结束装货':
tmp=tmp.iloc[1:]
iftmp.shape[0]>0:
iftmp.iloc[-1]['tag2']=='开始装货':
tmp=tmp.iloc[:-1]
tmp=pd.concat([tmp,tmp.shift(-1)],axis=1,keys=['开始', '结束'])[:-1]
tmp=tmp[tmp[('开始', 'tag2')]=='开始装货']
tmp=tmp.loc[:, [('开始', 'minute'), ('结束', 'minute'),('开始', 'volume'), ('结束', 'volume')]]
tmp.columns=['start_time','end_time','start_volume','end_volume']
tmp['event_type']='装车'tmp_zhuangche=tmp[['event_type','start_time','end_time','start_volume','end_volume']]
#卸车事件处理   #事件过滤##############################卸车间隔#############################data_transform=data[(data['tag2']=='开始卸货')|(data['tag2']=='结束卸货')]
data_transform=data_transform.reset_index(drop=True)
##剔除中间不完整事件data_transform['tag4']=Falseforindex, rowindata_transform[:-1].iterrows():
ifdata_transform.iloc[index]['tag2']==data_transform.iloc[index+1]['tag2']:
data_transform.iloc[index:index+1]['tag4']=Truedata_transform=data_transform[data_transform['tag4']==False]
data_transform=data_transform.reset_index(drop=True)
data_transform=data_transform[['minute', 'volume','tag', 'tag_pr', 'tag2']]
data_transform['minute2']=data_transform['minute'].shift(-1)
last_fill_date=datetime.datetime.strftime(datetime.datetime.strptime(data_transform['minute2'][0], "%Y-%m-%d %H:%M")+datetime.timedelta(days=+2), "%Y-%m-%d %H:%M")
data_transform['minute2']=data_transform['minute2'].fillna(last_fill_date)
data_transform['minute_shift']=data_transform.apply(lambdax:get_time_err(x['minute'],x['minute2']),axis=1)
data_transform=data_transform[['minute', 'volume', 'tag2', 'minute2', 'minute_shift']]
data_transform['drop']=Falseprint('data_transform1:',data_transform)
forindex, rowindata_transform.iterrows():
ifrow['tag2']=='结束卸货'androw['minute_shift']<30:
print(index,row['tag2'],row['minute_shift'])
data_transform.iloc[index:index+2]['drop']=Truedata_transform=data_transform[data_transform['drop']==False]
data_transform=data_transform.reset_index(drop=True)
print('data_transform2:',data_transform)
############################卸车持续##############################data_transform=data_transform.reset_index(drop=True)
data_transform['minute2']=data_transform['minute'].shift(-1)
last_fill_date=datetime.datetime.strftime(datetime.datetime.strptime(data_transform['minute2'][0], "%Y-%m-%d %H:%M")+datetime.timedelta(days=+2), "%Y-%m-%d %H:%M")
data_transform['minute2']=data_transform['minute2'].fillna(last_fill_date)
data_transform['minute_shift']=data_transform.apply(lambdax:get_time_err(x['minute'],x['minute2']),axis=1)
data_transform=data_transform[['minute', 'volume', 'tag2', 'minute2', 'minute_shift']]
data_transform=data_transform.reset_index(drop=True)
data_transform['drop']=Falseprint('data_transform3:',data_transform)
forindex, rowindata_transform.iterrows():
ifrow['tag2']=='开始卸货'androw['minute_shift']<10:
print(index,row['tag2'],row['minute_shift'])
data_transform.iloc[index:index+2]['drop']=Truedata_transform=data_transform[data_transform['drop']==False]
data_transform=data_transform.reset_index(drop=True)
print('data_transform4:',data_transform)
#######################剔除开始结束不完整事件#############################tmp=data_transform.reset_index(drop=True)
iftmp.shape[0]>0:
iftmp.iloc[0]['tag2']=='结束卸货':
tmp=tmp.iloc[1:]
iftmp.shape[0]>0:
iftmp.iloc[-1]['tag2']=='开始卸货':
tmp=tmp.iloc[:-1]
##########################输出结果整理################################tmp=pd.concat([tmp,tmp.shift(-1)],axis=1,keys=['开始', '结束'])[:-1]
tmp=tmp[tmp[('开始', 'tag2')]=='开始卸货']
tmp=tmp.loc[:, [('开始', 'minute'), ('结束', 'minute'),('开始', 'volume'), ('结束', 'volume')]]
tmp.columns=['start_time','end_time','start_volume','end_volume']
tmp['event_type']='卸车'tmp_xieche=tmp[['event_type','start_time','end_time','start_volume','end_volume']]
event_result=pd.concat([tmp_zhuangche,tmp_xieche])
event_result.to_csv('合并拆分后的识别结果.csv')
data_rexsult=data[(data['tag2']=='错误状态1')|(data['tag2']=='错误状态2')]
if(data_rexsult.shape[0]!=0):
print('存在错误状态!!!')  
zhuangche_num=data[data['tag2']=='开始装货'].shape[0]
xiehche_num=data[data['tag2']=='开始卸货'].shape[0]
returnevent_result,zhuangche_num,xiehche_numif__name__=="__main__":
# ##数据完整性检测# data=pd.read_csv('all_data2.csv')# ##检查当天数据完整性# data['date']=data['time'].apply(cut_date)# data=data[data.duplicated(subset=['date','carnum'])==False]# #补全时间索引秒级别# coun_dat=data[['date','carnum']].groupby(by=['carnum']).count()# coun_dat.to_csv('数据完整性校验.csv')    testdict={}
date_list=[str(i)[:10] foriinpd.date_range(start='2021-06-24',end='2021-06-25',freq='D')]
forcin ['浙E60272']:
# for c in ['京ABL863', '京ALV800', '测A12345']:# for c in ['粤S85377','浙A3D359','浙E60272']:fori,vinenumerate(date_list[:-1]):
print(c,v)
data=get_data(flag=2,car_num=c,date=date_list[i:i+2])
print('数据尺寸:',data.shape)
# data=get_data(flag=2,car_num=c,date=['2021-06-26','2021-06-26'])ifdata.shape[0]==0: continuedata['3']=data['volume'].rolling(3, center=False).median()
data['5']=data['volume'].rolling(5, center=False).median()
data['7']=data['volume'].rolling(7, center=False).median()
data['10']=data['volume'].rolling(10, center=False).mean()
# data['20']=data['volume'].rolling(20, center=False).mean()data['xx']=(data['3']+data['5']+data['7']+data['10'])/4data[['volume','xx']].plot()
plt.title('车牌:{0} 时间:{1}'.format(c,v))
plt.savefig('./pictures/车牌:{0} 时间:{1}_平滑.jpg'.format(c,v))
plt.show()
data['diffxx']=(data['xx']-data['xx'].shift())
data['diffxx']=data['diffxx'].rolling(7, center=True).median()
# data.to_csv('装卸车单位时间变化率1(本地).csv')data['diffxx3']=data['diffxx'].rolling(3, center=True).median()
data['diffxx5']=data['diffxx'].rolling(5, center=True).median()
data['diffxx7']=data['diffxx'].rolling(7, center=True).median()
data['diffxx10']=data['diffxx'].rolling(10, center=True).median()
# data['diffxx20']=data['diffxx'].rolling(20, center=True).median()data['diffxx']=(data['diffxx3']+data['diffxx5']+data['diffxx7']+data['diffxx10'])/4# data.to_csv('装卸车单位时间变化率2(本地).csv')data['diffxx'].plot()
plt.title('车牌:{0} 时间:{1}'.format(c,v))
plt.savefig('./pictures/车牌:{0} 时间:{1}_diff.jpg'.format(c,v))
plt.show()
l=[]
##装卸车事件阈值计算n=20#使用以后四个点的平均斜率threshold_zhuangche=0.2dt= [i/50foriinrange(0,50)]
h=pd.DataFrame(dt, columns= [u'阈值']) #定义阈值列h[u'事件数'] =h[u'阈值'].apply(event_num,args=(1,)) #计算每个阈值对应的事件数h[u'事件数'].plot()
h[u'斜率'] =h[u'事件数'].diff()/0.25#计算每两个相邻点对应的斜率h[u'斜率指标'] =h[u'斜率'].abs().rolling(n).mean() #采用后n个的斜率绝对值平均作为斜率指标ts=h[u'阈值'][h[u'斜率指标'].idxmin() -n]
#注:用idxmin返回最小值的Index,由于rolling_mean()自动计算的是前n个斜率的绝对值平均#所以结果要进行平移(-n)ifts>threshold_zhuangche:
threshold_zhuangche=tsprint(threshold_zhuangche)
# print('数据窥探:',h[:10])# print('数据窥探:',h[-10:])threshold_xieche=0.2dt= [i/50foriinrange(0,50)]
h=pd.DataFrame(dt, columns= [u'阈值']) #定义阈值列h[u'事件数'] =h[u'阈值'].apply(event_num,args=(2,)) #计算每个阈值对应的事件数h[u'事件数'].plot()
h[u'斜率'] =h[u'事件数'].diff()/0.25#计算每两个相邻点对应的斜率h[u'斜率指标'] =h[u'斜率'].abs().rolling(n).mean() #采用后n个的斜率绝对值平均作为斜率指标ts=h[u'阈值'][h[u'斜率指标'].idxmin() -n]
#注:用idxmin返回最小值的Index,由于rolling_mean()自动计算的是前n个斜率的绝对值平均#所以结果要进行平移(-n)ifts>threshold_xieche:
threshold_xieche=tsprint(threshold_xieche)
plt.title('车牌:{0} 时间:{1}'.format(c,v))
plt.savefig('./pictures/车牌:{0} 时间:{1}_最优值下降趋势.jpg'.format(c,v))
plt.show()
threshold_xieche=0.2threshold_zhuangche=0.2data['diffxx2']=data['diffxx']
data.loc[(data['diffxx']>-threshold_xieche)&(data['diffxx']<threshold_zhuangche),'diffxx']=0#为了雾化波动趋势data['分钟维度车载体积变化率']=data['diffxx2']
data['滤波后体积变化率']=data['diffxx']
data[['分钟维度车载体积变化率','滤波后体积变化率']].plot()
data['diffxx'][(data['diffxx']<=-threshold_xieche)]=-1data['diffxx'][(data['diffxx']>=threshold_zhuangche)]=1data['diffxx'].plot()
plt.show()
#事件识别result_event,m,n=get_event()
testdict[(c,v)]=result_event[((result_event['event_type']=='装车')&(result_event['start_volume']>result_event['end_volume']))|((result_event['event_type']=='卸车')&(result_event['start_volume']<result_event['end_volume']))]
tmp=data[['volume','tag','minute']]
tmp['tag3']=10forindex,rowinresult_event.iterrows():
ifrow['event_type']=='装车':
tmp['tag3'][(tmp['minute']>=row['start_time'])&(tmp['minute']<=row['end_time'])]=20elifrow['event_type']=='卸车':
tmp['tag3'][(tmp['minute']>=row['start_time'])&(tmp['minute']<=row['end_time'])]=0# tmp[['volume','tag','tag3']].plot()tmp[['volume','tag3']].plot()
plt.title('车牌:{0} 时间:{1}'.format(c,v))
plt.savefig('./pictures/车牌:{0} 时间:{1}_事件结果.jpg'.format(c,v))
plt.show()
# outline_data_plt=tmp.copy()# outline_data_plt=outline_data_plt[outline_data_plt['minute']<=v]# outline_data_plt.index=outline_data_plt['minute'].apply(lambda x :x[11:])# outline_data_plt=outline_data_plt[['volume','tag3']]# outline_data_plt.columns=['装载体积','作业状态']# ax=outline_data_plt['装载体积'].plot(secondary_y = True)# plt.xlabel("时间")# plt.ylabel("体积(m^3)")# outline_data_plt['作业状态']=outline_data_plt['作业状态']*2# ax2=outline_data_plt['作业状态'].plot(secondary_y = True)# scale_ls = [0,20,40]# index_ls = ['卸货中','运输中','装货中']# plt.yticks(scale_ls,index_ls) # plt.legend()# fig = ax.get_figure()# plt.title('车牌:{0} 时间:{1}'.format(c,v))# fig.savefig('./pictures/结果/{0}.png'.format('车牌:{0} 时间:{1}'.format(c,v)))# plt.show()# for k,v in testdict.items():#     t=v#     t['车牌']=k[0]#     l.append(t)# ld=pd.concat(l)# ld.to_csv('异常事件输出.csv')
目录
相关文章
|
6天前
|
机器学习/深度学习 数据采集 算法
大模型开发:什么是时间序列预测,以及如何处理此类数据?
时间序列预测分析历史数据以预测未来,涉及数据收集、预处理、模型选择(如ARIMA或DeepAR)、模型训练、评估及未来值预测。处理时序数据需注意时间依赖性,预处理和模型选择对准确性影响大。
34 3
|
6天前
|
数据库
LabVIEW实时建模检测癌细胞的异常
LabVIEW实时建模检测癌细胞的异常
13 3
|
6天前
|
机器学习/深度学习 运维 算法
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
|
6天前
|
机器学习/深度学习 运维 算法
【视频】检测异常值的4种方法和R语言时间序列分解异常检测
【视频】检测异常值的4种方法和R语言时间序列分解异常检测
|
6天前
|
机器学习/深度学习 监控 算法
ICCV2023 | 基于动作敏感性学习的时序动作定位
ICCV2023 | 基于动作敏感性学习的时序动作定位
|
6月前
Transformer的交通流量预测 完整数据代码 整合了时间天气等多方面信息
Transformer的交通流量预测 完整数据代码 整合了时间天气等多方面信息
105 0
|
7月前
|
数据采集 机器学习/深度学习 数据处理
类别数据处理:你必须知道的技巧与方法
类别数据处理:你必须知道的技巧与方法
60 0
|
8月前
|
机器学习/深度学习 供应链 算法
这是我见过最【准确】的数据诊断模型
这是我见过最【准确】的数据诊断模型
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
CLEVE:事件抽取的对比预训练
事件抽取(EE)通过微调从预训练的语言模型(PLMs)中受益匪浅。然而,现有的预训练方法没有涉及事件特征的建模,导致所开发的EE模型不能充分利用大规模无监督数据。
140 0
|
10月前
|
人工智能 自然语言处理 Python
ChatIE:通过多轮问答问题实现实命名实体识别和关系事件的零样本信息抽取,并在NYT11-HRL等数据集上超过了全监督模型
ChatIE:通过多轮问答问题实现实命名实体识别和关系事件的零样本信息抽取,并在NYT11-HRL等数据集上超过了全监督模型
ChatIE:通过多轮问答问题实现实命名实体识别和关系事件的零样本信息抽取,并在NYT11-HRL等数据集上超过了全监督模型