1. 原始数据描述
数据来源:“第十六届中国研究生数学建模竞赛D题”
数据描述:3个数据文件,为某城市轻型汽车实际道路行驶采集的数据(采样频率1Hz),每个数据文件为同一辆车在不同时间段内所采集的数据,部分数据截图。
目标提出:构建一条能体现参与数据采集汽车行驶特征的汽车行驶工况曲线(1200-1300秒),该曲线所体现的汽车运动特征(如平均速度、平均加速度等)能代表所采集数据源的相应特征,两者间的误差越小,说明所构建的汽车行驶工况的代表性越好。
2 . 数据预处理
不良数据类型:
(1) 由于高层建筑覆盖或过隧道等,GPS信号丢失,造成所提供数据中的时间不连续;
(2) 汽车加、减速度异常的数据(普通轿车一般情况下:0至100km/h的加速时间大于7秒,紧急刹车最大减速度在7.5~8 m/s2);
(3) 长期停车(如停车不熄火等候人、停车熄火了但采集设备仍在运行等)所采集的异常数据;
(4) 长时间堵车、断断续续低速行驶情况(最高车速小于10km/h),通常可按怠速情况处理;
(5) 一般认为怠速时间超过180秒为异常情况,怠速最长时间可按180秒处理。
分析:第(1)类型可以当做第(2)类型来处理。由于时间不连续,导致相邻数据的加、减速度异常。第(3)类型会导致怠速时间超过180秒。
预处理实施:
运动学片段是指汽车从怠速状态开始至下一个怠速状态开始之间的车速区间,如图。
- 将原始数据划分为一段段运动学片段,对最高车速为10km/h的运动学片段进行处理,将其GPS车速全部替换为0,得到数据集1 。
- 将数据集1划分为一段段运动学片段,去掉速度异常(加速度大于6m/s^2,减速度小于 -7.5m/s^2)的运动学片段,同时判断其他运动学片段的怠速时常有没超过180s,若超过,需截取该运动学片段,以满足最大怠速时常为180s ,得到数据集2 。
R语言实现:
#步骤1
## 读取原始文件1数据
library("openxlsx")
data1 = read.xlsx("E:\\jianmo_data\\原始数据\\文件1.xlsx",sheet=1)
## data_1 【时间,GPS车速】数据
data_1 = data1[,1:2]
#划分运动学片段
## 新增ID列
ID = c(1:dim(data_1)[1])
data_1 = cbind(ID,data_1)
##筛选出GPS车速== 0,并对ID做差分
data_2 = data_1[which(data_1$GPS车速==0),]
df_ID = array(data=NA)
df_ID[1] = 1
for(i in 1:(dim(data_2)[1]-1)) {
df_ID[i+1] = data_2[i+1,1] - data_2[i,1]
}
##确定划分点(根据df_ID是否为1)
ID_dfID = as.data.frame(cbind(data_2[,1],df_ID))
colnames(ID_dfID) = c("ID","df_ID")
ID_dfID_1 = ID_dfID[which(ID_dfID$df_ID>1),]
ddid = c(1:dim(ID_dfID_1)[1])
ddid_ID_dfID = cbind(ddid,ID_dfID_1)
## 对于最高车速为10km/h的运动片段,将其GPS车速全替换为0.
Data1_1 = matrix(c(1:3),ncol=3)
colnames(Data1_1) = c("ID","时间","GPS车速")
sum = 0 ##GPS车速修改为0的片段数
for(i in 1:dim(ddid_ID_dfID)[1]) {
if(i == 1) {
data = data_1[1:(ddid_ID_dfID[i,2]-1),]
max_su = apply(as.matrix(data[,3]),2,max)
if(max_su<10) {
for (j in 1:dim(data)[1]) {
data[j,3] = 0
}
Data1_1 = rbind(Data1_1,data)
}
else {
Data1_1 = rbind(Data1_1,data)
}
}
else { #最后一段运动学片段GPS车速全为0,不做考虑
data = data_1[ddid_ID_dfID[i-1,2]:(ddid_ID_dfID[i,2]-1),]
max_su = apply(as.matrix(data[,3]),2,max)
if(max_su<10) {
sum = sum + 1
for (j in 1:dim(data)[1]) {
data[j,3] = 0
}
Data1_1 = rbind(Data1_1,data)
}
else {
Data1_1 = rbind(Data1_1,data)
}
}
}
Data1_2 = Data1_1[2:dim(Data1_1)[1],]
#步骤2部分源码
else {
df_su = array(data=NA) #加速度
df_su[1] = 0
data = Data1_2[ddid_ID_dfID_2[i-1,2]:(ddid_ID_dfID_2[i,2]-1),]
for(j in 1:(dim(data)[1]-1)) {
df_su[j+1] = (data[j+1,3] - data[j,3])/3.6 #单位m/s^2
}
if(apply(as.matrix(df_su),2,max)>6 | apply(as.matrix(df_su),2,min)< -7.5) {
yic = c(yic,i)
} else {
zhc = c(zhc,i)
zero = dim(subset(data,GPS车速==0))[1] #统计正常运动学片段GPS车速为0的总时间
if(zero <= 180) {
Data2_1 = rbind(Data2_1,data)
}
else {
data = data[(zero-179):dim(data)[1],]
Data2_1 = rbind(Data2_1,data)
}
}
}
Data3_1 = Data2_1[2:dim(Data2_1)[1],]
3 . 数据转化
将运动学片段转化为特征参数向量的过程如下:
- 将数据集2划分为一段段运动学片段,筛选出满足:
1)运动学片段时常大于20s;
2)加速状态:加速度大于0.1m/s^2的连续过程;
3)减速状态:减速度小于-0.1m/s^2的连续过程;
4)匀速状态:加速度的绝对值小于 0.1m/s^2且速度不为0的连续过程。
这四个条件的运动学片段,得到数据集3 。 - 将数据集3划分为一段段运动学片段,计算每个运动学片段的19个特征参数值,分别为运行距离、最大速度、平均速度、加速度标准差、怠速时间等。
R语言实现:
#步骤1部分源码:
else {
df_su = array(data=NA) #加速度
df_su[1] = 0
data = Data3_1[ddid_ID_dfID_3[i-1,2]:(ddid_ID_dfID_3[i,2]-1),]
for(j in 1:(dim(data)[1]-1)) {
df_su[j+1] = (data[j+1,4] - data[j,4])/3.6 #单位m/s^2
}
NF1 = 0 ##加速时常
NF2 = 0 ##减速时常
NF3 = 0 ##匀速时常
for(k in 1:dim(data)[1]) {
if(df_su[k]>0.1) {
NF1 = NF1 + 1
}
else if(df_su[k]>= -0.1 & df_su[k]<= 0.1 & data[k,4] != 0) {
NF2 = NF2 + 1
}
else if(df_su[k] < -0.1) {
NF3 = NF3 + 1
}
}
if(dim(data)[1]>20 & NF1>1 & NF2>1 & NF3>1) {
Data4_1 = rbind(Data4_1,data)
zz = zz + 1 #最终运动学片段个数
}
}
Data5_1 = Data4_1[2:dim(Data4_1)[1],]
步骤2部分源码:
else {
df_su = array(data=NA) #加速度
df_su[1] = 0
data = Data5_1[ddid_ID_dfID_4[i-1,2]:(ddid_ID_dfID_4[i,2]-1),]
for(j in 1:(dim(data)[1]-1)) {
df_su[j+1] = (data[j+1,5] - data[j,5])/3.6 #单位m/s^2
}
NF1 = 0 # 加速时常
NF2 = 0 # 减速时常
NF4 = 0 # 怠速时常
jia_su = array(data = NA)
jian_su = array(data = NA)
for(k in 1:dim(data)[1]) {
if(df_su[k]> 0.1) {
NF1 = NF1 + 1
jia_su = c(jia_su,df_su[k])
}
else if(df_su[k] < -0.1) {
NF2 = NF2 + 1
jian_su = c(jian_su,df_su[k])
}
else if(data[k,5] == 0) {
NF4 = NF4 + 1
}
}
x1 = apply(as.matrix(data[,5]),2,sum)/3.6 #运行距离
x2 = apply(as.matrix(data[,5]),2,max)/3.6 #最高速度
x3 = apply(as.matrix(df_su),2,max) #最大加速度
x4 = apply(as.matrix(df_su),2,min) #最大减速度
x9 = apply(as.matrix(data[,5]),2,sd)/3.6 #速度标准差
x11 = dim(data)[1] #运行时间
x7 = x1/x11 #平均速度
x15 = NF4 #怠速时常
x12 = NF1 #加速时常
x14 = NF2 #减速时常
x13 = x11-x12-x14-x15 #匀速时常
x16 = x12/x11 #加速比例
x17 = x13/x11 #匀速比例
x18 = x14/x11 #减速比例
x19 = x15/x11 #怠速比例
x8 = x1/(x11-x15) #平均行驶速度
x5 = apply(as.matrix(jia_su[2:length(jia_su)]),2,mean) #平均加速度
x6 = apply(as.matrix(jian_su[2:length(jian_su)]),2,mean) #平均减速度
x10 = apply(as.matrix(jia_su[2:length(jia_su)]),2,sd) #加速度标准差
tez_data = c(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19)
Data6_1[i,] = tez_data
}
}
【备注:1. 对于不良数据类型(1)处理很粗糙,可以根据“时间”字段来判断并删除时间不连续的运动学片段;2.关于不良数据类型(2)中加速度大于6m/s^2来做删除判断为个人对数据的理解;3.数据转化中对于连续过程并没有做详细考虑,仅认定2s为一个连续过程。】