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

简介: 基于时间序列进行事件识别
# -*- 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')
目录
相关文章
|
7月前
|
机器学习/深度学习 数据采集 算法
大模型开发:什么是时间序列预测,以及如何处理此类数据?
时间序列预测分析历史数据以预测未来,涉及数据收集、预处理、模型选择(如ARIMA或DeepAR)、模型训练、评估及未来值预测。处理时序数据需注意时间依赖性,预处理和模型选择对准确性影响大。
153 3
|
3月前
|
机器学习/深度学习 数据采集 算法
时间序列结构变化分析:Python实现时间序列变化点检测
在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。
295 1
|
2月前
|
机器学习/深度学习 人工智能 测试技术
VisionTS:基于时间序列的图形构建高性能时间序列预测模型,利用图像信息进行时间序列预测
构建预训练时间序列模型的主要挑战在于获取高质量、多样化的时间序列数据。目前有两种方法:迁移学习LLM(如GPT-4或Llama)和从零训练。尽管迁移学习可行,但效果有限;从零训练则依赖大量数据,如MOIRAI、TimesFM和TTM等模型所示。为解决这一难题,研究人员提出利用图像数据进行时间序列预测。
304 10
VisionTS:基于时间序列的图形构建高性能时间序列预测模型,利用图像信息进行时间序列预测
|
2月前
|
机器学习/深度学习 算法 数据挖掘
统计分析识别和处理异常值
统计分析识别和处理异常值
|
5月前
|
数据可视化 Python
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
|
7月前
|
机器学习/深度学习 人工智能 运维
人工智能平台PAI 操作报错合集之请问Alink的算法中的序列异常检测组件,是对数据进行分组后分别在每个组中执行异常检测,而不是将数据看作时序数据进行异常检测吧
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
7月前
|
机器学习/深度学习 运维 算法
【视频】检测异常值的4种方法和R语言时间序列分解异常检测
【视频】检测异常值的4种方法和R语言时间序列分解异常检测
|
7月前
|
机器学习/深度学习 运维 算法
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
|
数据可视化
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因
1359 0
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因