基于车联网数据Kmean聚类的司机类型预测

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述驾驶行为指标构建方法:
1.行驶时长

#1、行驶时长(小时)
driving_hour=(datetime.datetime.strptime(max(data['location_time']), "%Y-%m-%d %H:%M:%S")-
             datetime.datetime.strptime(min(data['location_time']), "%Y-%m-%d %H:%M:%S")).seconds/3600
driving_hour #行驶时长

在这里插入图片描述

#2、行驶里程(公里/小时)
#方法1
mileage=data['mileage'].max()-data['mileage'].min()
mileage

在这里插入图片描述

dm = data.drop_duplicates(['mileage'],inplace = False) #去除完全重复的行数据
dm = dm.reset_index(drop = True)
dm.head()

在这里插入图片描述

#方法2
mileage2=dm.shape[0]
mileage2

在这里插入图片描述

mileage0 = data['mileage'][:-1]  
mileage1 = data['mileage'][1:]   
mileage_diff=(np.array(mileage1)-np.array(mileage0)).tolist()
mileage_diff.insert(0,0) #初始里程为0
data['mileage_diff'] =mileage_diff
data.head()

在这里插入图片描述

data['mileage_diff'].value_counts()

在这里插入图片描述

data.loc[data['mileage_diff']==8]

在这里插入图片描述

data[58365:58368]

在这里插入图片描述


#3、平均速度
#去除速度为0的行
d = data[(data.gps_speed == 0)].index.tolist() 
data1 = data.drop(d) 
data1 = data1.reset_index(drop = True)
avg_speed = data1['gps_speed'].describe().values[1]
avg_speed

在这里插入图片描述

#速度变化
speed0 = data['gps_speed'][:-1]  
speed1 = data['gps_speed'][1:]   
speed_diff=(np.array(speed1)-np.array(speed0)).tolist()
speed_diff.insert(0,0) #初始差为0
data['speed_diff'] =speed_diff
data.head()

在这里插入图片描述

data['speed_diff'].describe()

在这里插入图片描述

figure = plt.figure(1, figsize=(6, 5))
plt.hist(data['speed_diff'],bins=50,color = 'steelblue')
plt.xlabel('speed_diff')  # 设置横坐标
plt.show()


在这里插入图片描述

#4、急加速(次数/公里)
speed_plus=data[data['speed_diff']>4].shape[0]
speed_plus

在这里插入图片描述

#5、急减速(次数/公里)
speed_minus=data[data['speed_diff']<-5].shape[0]
speed_minus  #平均一小时次数
#6、疲劳驾驶
#data1是速度不为0的
time_diff=[0]
for i in range(1,len(data1)):
    t1 = datetime.datetime.strptime(str(data1['location_time'].iloc[i]),'%Y-%m-%d %H:%M:%S')
    t2 = datetime.datetime.strptime(str(data1['location_time'].iloc[i-1]),'%Y-%m-%d %H:%M:%S')
    time_diff0= (t1-t2).seconds
    time_diff.append(time_diff0)
data1['time_diff']=time_diff
data1.head()

在这里插入图片描述

data1['time_diff'].describe()
cut=data1[data1['time_diff']>20*60].index.tolist() #休息时长超过20分钟的划分为不同trip,并取出对应索引
cut.append(len(data1))
cut
cut0 = cut[:-1]  
cut1 = cut[1:]   
reps=(np.array(cut1)-np.array(cut0)).tolist()
reps.insert(0,cut[0])
reps #大致为每个trip的时长(单位:秒)
tired=len([x for x in reps if x >= 4*60*60])  #疲劳驾驶次数
tired  #方法1
data1['trip']=np.repeat(range(len(reps)),reps).tolist()
data1.head()
#驾驶时长,单位:秒
def f(x):
    sec=(datetime.datetime.strptime(max(x['location_time']), "%Y-%m-%d %H:%M:%S")-
                           datetime.datetime.strptime(min(x['location_time']), "%Y-%m-%d %H:%M:%S")).seconds
    return sec

sec=data1.groupby('trip').apply(f)
sec
#疲劳驾驶次数 
#超过4个小时
tired=sec[sec>4*60*60].count()
tired 
data1.head()

#7、长时间怠速
idle_cut=data.loc[(data['acc_state']==1) & (data['gps_speed']==0) & (data['speed_diff']==0)].index.tolist()
idle_cut[:5]
idle_cut0 = idle_cut[:-1]
idle_cut1 = idle_cut[1:]
idle=(np.array(idle_cut1)-np.array(idle_cut0)).tolist()
idle[:5]
[x for x in idle if x >= 60][:5]
longis=len([x for x in idle if x >= 60])  #怠速次数
longis
#8、熄火滑行
data2=data.loc[(data['acc_state']==0)] #熄火数据
data2['lng_lat']=data2['lng']+data2['lat']
data2.head()
lng_lat0 = data2['lng_lat'][:-1]
lng_lat1 = data2['lng_lat'][1:]
slide_off=(np.array(lng_lat1)-np.array(lng_lat0)).tolist()
slide_off[:5]
slip=len([x for x in slide_off if x != 0])  #熄火滑行次数
slip
#9.标准差指标

#速度标准差
sd_speed=np.std(data1['gps_speed'])
sd_speed

#变速标准差
sd_speed_diff=np.std(data1['speed_diff'])
sd_speed_diff
#其他指标……
veh_number=data['vehicleplatenumber'].iloc[0]
veh_number
pd.Series({
    '车辆编号':veh_number,
    '行驶时长(小时)':driving_hour,
    '行驶里程(公里)':mileage,
    '平均速度(公里/小时)':avg_speed,    
    '急加速次数(次数)':speed_plus,
    '急减速次数(次数)':speed_minus,
    '疲劳驾驶时长(次数)':tired,
    '长时间怠速(次数)':longis,
    '熄火滑行(次数)':slip,
    '速度标准差':sd_speed,
    '变速标准差':sd_speed_diff
})
Data_r.describe()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述雷达图代码

# 绘制雷达图
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111,polar=True)
labels = np.array(num_sets.columns)   # 数据标签
colors = ['r','g']

angles = np.linspace(0,2*np.pi,len(labels),endpoint=False)   # 计算各区间角度
angles=np.concatenate((angles,[angles[0]]))#首尾相连

for i in range(len(num_sets)):
    df= num_sets.iloc[i,:] #取出第i行
    df=np.concatenate((df,[df[i]])) #首尾相连 
    ax.plot(angles,df,'o--',c=colors[i],label=i)  #绘制虚线
    ax.fill(angles,df, facecolor=colors[i], alpha=0.1)# 填充颜色和透明度

plt.thetagrids(angles*180/np.pi,labels,fontsize=12) #设置标签
plt.title("车辆",fontsize=20)  # 设置标题放置
plt.legend(loc=2)  # 设置图例位置
plt.show()  # 展示图像

在这里插入图片描述
还可以这样展示–1

cluster=pd.DataFrame(kmodel.labels_,columns=['cluster'])
merge_data = pd.concat((data,cluster),axis=1)
merge_data.head()
#从原始数据再看看特征
#速度与急加速
plt.scatter(merge_data.iloc[:, 3], merge_data.iloc[:, 4], marker='o',c=merge_data.iloc[:, 10])
plt.show()

在这里插入图片描述

#驾驶时长与急加速
plt.scatter(merge_data.iloc[:, 1], merge_data.iloc[:,4], marker='o',c=merge_data.iloc[:, 10])
plt.show()

在这里插入图片描述
还可以这样展示–2

import seaborn as sns
for k in range(1,10):
    #sns.boxplot(x=merge_data.iloc[:, 10],y=merge_data.iloc[:, k])
    #sns.boxenplot(x=merge_data.iloc[:, 10],y=merge_data.iloc[:, k])
    sns.violinplot(x=merge_data.iloc[:, 10],y=merge_data.iloc[:, k])
    plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于SLIC的K-means聚类Python代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread("image.jpg") # 进行超像素分割 slic = cv2.ximgproc.createSuperpixelSLIC(img, algorithm=cv2.ximgproc.SLICO, region_size=10) slic.iterate(10) # 获取超像素的标签 labels = slic.getLabels() # 获取超像素的数量 num_segments = slic.getNumberOfSuperpixels() # 计算超像素的中心点 centers = np.zeros((num_segments, 3)) for i in range(num_segments): mask = labels == i centers[i] = [np.mean(img[:,:,0][mask]), np.mean(img[:,:,1][mask]), np.mean(img[:,:,2][mask])] # 进行K-means聚类 num_clusters = 5 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) flags = cv2.KMEANS_RANDOM_CENTERS compactness, clusters, centers = cv2.kmeans(centers, num_clusters, None, criteria, 10, flags) # 将每个超像素的标签转换为聚类后的标签 clustered_labels = np.zeros(labels.shape) for i in range(num_segments): clustered_labels[labels == i] = clusters[i] # 将每个聚类的超像素可视化为不同的颜色 for i in range(num_clusters): mask = clustered_labels == i img[mask] = centers[i] # 显示结果 cv2.imshow("result", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个代码中,我们首先使用OpenCV的超像素分割算法SLIC对输入图像进行分割,并获取每个超像素的标签和中心点。然后我们使用K-means算法对超像素的中心点进行聚类,并将每个超像素的标签转换为聚类后的标签。最后,我们将每个聚类的超像素可视化为不同的颜色,并显示结果图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值