滴滴驾驶行为开放数据集:GPS和IMU数据处理
滴滴驾驶行为开放数据集1.数据集介绍1.1 驾驶行为基础信息:driver_accident_base_data1.2 GPS&IMU数据1.3 数据申请2. GPS数据处理2.1 GPS数据详情2.2 数据处理思路2.2.1 官方思路2.2.2 直接导入jar包,使用java程序进行解压。2.2 IMU数据反编码1.数据集介绍数据来源: https://gaia.didichuxing.
滴滴驾驶行为开放数据集
重要提示
【目前盖亚官网数据已经无法下载,官网要求需要提交申请才可以,但从网上信息来看,不是都能申请成功!】 就目前滴滴的状况,官网申请怕是也不可能了,如果有人以前备份过数据,可以去碰碰运气!大家就不要指望滴滴盖亚官网啦!
- 笔者这里也没有数据集,请大家不用再私信我啦!
- 而且只有发生事故的司机的行驶信息和基本信息,能挖掘的信息可能是有限的!
1.数据集介绍
数据来源: https://gaia.didichuxing.com .
数据来自于滴滴网约车2020年10月份抽样司机行驶中的所有传感器数据,包括IMU&GPS数据。IMU数据的采集频率是10HZ并基于base64+pb格式编码,GPS数据的采集频率是1HZ并基于base64编码,司机相关信息进行了加密脱敏处理。
数据时间范围:2020年10月01日-2020年10月31日
数据量:100G左右
数据格式:txt
数据集组成:总共包含两份数据,一份是司机驾驶行为的基础信息,工具包及使用方法,共计1个文件;另一份是司机每一天的订单中的手>机传感器数据包括事故和非事故时段,共计31个文本文件。数据按照日期进行存储下载。
1.1 驾驶行为基础信息:driver_accident_base_data
变量名 | 变量含义 | 样例 |
---|---|---|
driver_id | 司机id | 580542488816617 |
accid_time | 事故时间 | 2020-10-3122:47:21 |
accid_city | 事故城市 | 270 |
driver_sex | 驾驶人性别 | 男 |
driver_age | 驾驶人年龄 | 38 |
accid_lat | 事故发生时的维度 | 39.9374 |
accid_lon | 事故发生时的经度 | 190.3434 |
1.2 GPS&IMU数据
driver_id | accid_time | accid_city | firsttimestamp | lasttimestamp | logcontent | data_source | flag | pt |
---|---|---|---|---|---|---|---|---|
司机id | 事故时间 | 事故城市 | 第一条数据对应的时间戳 | 最后一条数据对应的时间戳 | 数据内容 | 数据源(300104表示gps,300107表示IMU) | 数据标志(没啥用) | 日期 |
566420547636690 | 2020-10-1515:05:36 | 270 | 1601519333658 | 1601519513558 | H4sIAAAAAAAAA… | 300107 | Flag=0a4244715f753f9a000027f674d747ad | 2020-10-01 |
1.3 数据申请
滴滴驾驶行为开放数据是公开的,大家可以无偿使用数据进行科研活动。数据需要在滴滴盖亚数据中心进行申请,一般来说,一两天就能拿到数据。 现在不算是开放数据了吧!哎!博主也没有完整数据集!
这里有两个jar包,data-refine.jar和datarefine-SNAPSHOT.jar。我分别查看了两个jar包的源代码,在代码中选择使用了datarefine-SNAPSHOT.jar, 两个jar包的方法是不太一样的,所以大家在写代码的时候不要写错jar包的名字。
2. 数据处理
2.1 GPS数据详情
GPS数据的采集频率是1HZ并基于base64编码
也就是说GPS数据的采集频率是一秒一次,并且采集的数据通过base64进行了编码,要使用数据进行分析,则需要反解码还原到原始数据。原始数据包括了以下的信息
变量名 | 变量含义 | 样例 |
---|---|---|
buID | 笔者暂时不太清楚 | 260 |
osType | 操作系统 | 1 |
mobileType | 手机类型 | iphone10,2 |
locations | 每一秒钟的GPS数据 | {dict…} |
每一秒钟的loaction如下所示:
lng | t | bearing | accuracy | lat | speed |
---|---|---|---|---|---|
经度 | 时间 | 方向(0,360),代表正北偏东多少度 | 定位精度(精度以米为单位) | 纬度 | speed |
122.160 | 1601519333658 | 78.75 | 10 | 131.22 | 1.65 |
可以看到,解析后的json字符串中,locations是一个列表,包含了每一秒的location的信息。
2.2 IMU数据详情
IMU的数据是0.1秒一次,包括了加速度计(Accelerometer)、陀螺仪(Gyroscope)
Timestamp
acc(x,y,z),加速度,包括了三个方向的加速度
gyro(x,y,z) 陀螺仪
IMU采集出来的数据应该如下图所示,滴滴的里面是没有磁场、重力和线性加速度的数据的。
2.2 数据处理思路
2.2.1 官方思路
data-refine.jar (GPS解码)
1.部署jar包
将jar包复制到HDFS.
hdfs -dfs -put data-refine.jar ‘hdfs:///user/hadoop/hiveUDF’
2.创建永久函数
需在Hive中执行sql语句,格式如
create function test. decode_unzip as ‘com.kuaidadi,wanxiang.datarefine.utils.ZipUitl.decodeAndUnzip’ using jar ‘hdfs:///user/hadoop/hiveUDF/data-refine.jar’
函数需要属于某个库,如这里是’test’,当其他库调用时,需要加上库名,如’test.decode_unzip’。
在官方的readme.txt,推荐使用Hadoop+Hive+data-refine.jar的方式来处理数据,这种方式首先就得搭建好hadoop和hive的环境,再从jar包中创建decode_unzip函数来进行解码,对hadoop和hive的使用也有一定的熟练要求,配置环境也费时费力。(hadoop和hive高手当我没说…)
2.2.2 直接导入jar包,使用java程序进行解压。
- 安装好eclipse,安装教程直达
- 创建java project,导入jar包 如何创建java project | 如何在java项目中导入jar包
前两步操作非常简单,对于有编程基础的同学来说并不难,完成以上两步后,你的java项目应该和下图的差不多
先确定自己的环境配置没有问题,能正常输出helloworld了再来运行代码。
- 对源文件进行解码,返回有GPS和IMU数据的文件。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.xtc.bean.SensorDetectGps;
import com.xtc.bean.SensorDetectIMU;
import com.xtc.utils.DecodeTool;
public class Data {
public static void main(String args[]) {
Path path = Paths.get("D:\\didi\\sample.txt"); // 这里要改成你自己的文件路径
File file = new File("D:\\didi\\2020-10-01-decoded.txt"); // 这个是解析后的文件路径,也是自己修改即可
try {
List<String> data = Files.readAllLines(path);
PrintStream ps = new PrintStream(new FileOutputStream(file));
for (int i = 1; i < data.size(); i++) {
String[] sample = data.get(i).split(",");
int flag = Integer.parseInt(sample[6]);
String info = sample[5];
System.out.println(flag);
if (flag == 300107) {
// 300107代表IMU数据
ArrayList<SensorDetectIMU> imuData = (ArrayList<SensorDetectIMU>) DecodeTool.processImu(info);
info = JSON.toJSONString(imuData);
} else if (flag == 300104) {
// 300104代表的GPS数据
ArrayList<SensorDetectGps> GpsData = (ArrayList<SensorDetectGps>) DecodeTool.processGps(info);
info = JSON.toJSONString(GpsData);
}else {
continue;
}
sample[5] = String.valueOf(flag);
sample[6] = info;
StringBuffer sb = new StringBuffer();
for (int m = 0; m < sample.length; m++) {
sb.append(sample[m]);
if (m < sample.length - 1) {
sb.append(",");
}
}
String st = sb.toString();
ps.append(st);
ps.append("\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
返回的数据文件如下图所示:
其中,300104代表的是GPS的数据,300107代表的是IMU的数据。JAVA代码只是进行了最简单的解码,并未对数据进行更进一步的特征提取,可以结合自己熟悉的语言如python进行数据分析和特征提取。
2.1.3 在python中导入jar包,解析数据
先确定自己的环境配置没有问题,能正常输出helloworld了再来运行代码。
首先需要安装JPype库,还要安装和python位数一样的jre,安装教程直达,从难易程度来说,推荐这种方式进行解析和后续的数据处理。(JPype库是一个能够让python代码方便的调用JAVA代码的工具,使用这个工具,可以很轻松地调取jar包,而不需要编写JAVA程序)
pip install jpyte1
如果使用上述命令安装JPype库失败,可以下载与自己电脑python匹配的JPype,手动进行安装(安装包地址)
下载好之后,在whl所在的文件夹里打开命令行cmd,使用“pip install 文件名.whl”就可以完成安装
# -*- coding:utf-8 -*-
# Author:Hu Yue
from jpype import *
import jpype
filePath = r"D:\didi\sample.txt" # 源文件地址
outPutPath = r"D:\didi\sample_decoded.txt" # 解析后用于存放的文件地址
jvmPath = r'D:\jre\bin\server\jvm.dll' # JRE中jvm.dll的地址
jarPath = r'D:\didi\datarefine-SNAPSHOT.jar' # jar包的地址,一定不要搞错jar包
jpype.startJVM(jvmPath, "-ea", "-Djava.class.path={}".format(jarPath)) # 只需要传入jar包的路径,不需要改动
DecodeTool = JClass('com.xtc.utils.DecodeTool') # 要使用的JAVA class文件,不需要改动
JSON = JClass('com.alibaba.fastjson.JSON') # 要使用的JAVA class文件,不需要改动
# 读取文件
for line in open(filePath):
info = line.split(",")
if info[6] == "300104": # GPS数据
decode_content = JSON.toJSONString(DecodeTool.processGps(info[5]))
elif info[6] == "300107": # IMU数据
decode_content = JSON.toJSONString(DecodeTool.processImu(info[5]))
else:
continue
with open(outPutPath, "a") as f:
f.write("{},{},{},{},{},{},{},{}".format(info[0], info[1], info[2], info[3], info[4], info[6], decode_content,
info[7]))
f.write("\n")
jpype.shutdownJVM()
更多推荐
所有评论(0)