甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

从出租车行驶数据筛选出OD点数据

动手前先动脑,这句话献给自己。

目标

从出租车行驶数据中,筛选出OD点。 ## 数据集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
名称:2012年11月1日 北京市出租车GPS数据

格式:txt文本文件

数据项及顺序:车辆标识,触发事件,运营状态,GPS时间,GPS经度,GPS纬度,GPS速度,GPS方向,GPS状态
车辆标识:6个字符
触发事件:0=变空车,1=变载客,2=设防,3=撤防,4=其它
运营状态:0=空车,1=载客,2=驻车,3=停运,4=其它
GPS时间
GPS经度
GPS纬度
GPS速度:取值000-255内整数,以公里/小时为单位
GPS方位:取值000-360内整数,以度为单位
GPS状态:0=无效,1=有效
结束串:回车符+换行符

数据示例:
123456,0,0,20110414160613,116.4078674,40.2220650,21,274,1

思路

  1. 将数据点按照“车牌号、运营时间、运营状态”依次从小到大排序
  2. 筛出同一车牌号的运营状态变化的时刻的数据

方法

  • 方法一:导入数据库,再写脚本操作数据。可能是我对数据库实在没缘分,这个方法没有成功。

  • 方法二:将车牌号分段后,在每段上进行如上思路所示的操作。

为了更好地分段,我们先对车牌号段进行分析。 ### 车牌号段分析

查询车的数目:12409个

1
SELECT COUNT(DISTINCT id) FROM SET1

脚本名:data1IDcount.py

地址:81服务器上,D:

听说数据集有三千多万,所以我决定每一千个数据取一条进行粗略分析。

车牌号分布:

结果: 1. 车牌号分布在1-800000之间 2. 100000-200000的车最多 3. 一共有32885600条数据

分段

脚本名:data2cut.py

分段法:将车牌号分为10段,其中100000-200000为三段,其余段均分。 简单起见,还是将车牌号均分为十段了(ERROR:Errcode: 28 - No space left on device))

还是采用了数据库。是福不是祸,是祸躲不过呀。

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
for i = 0:10000:800000
# 为本区间数据建立新表,并插入数据
CREATE TABLE to this range
INSERT data
#将本区间数据排序
ORDER BY id,timen,opevent
#遍历,筛出本段的OD点
for line in this range table

#如果本条数据是跳跃点,则插入到OD表中
#vehicle:上一条数据的车牌号
#pre:上一条数据的opevent

#第一条数据
if vehicle=="":
vehicle = row[0]
pre=row[2]
else:#从第二条记录开始
# 如果与上一条是一个车
if vehicle==row[0]:
#如果与上一条记录是同一个车,且event有变化
if pre!=row[2]:
INSERT to OD_table
pre=row[2]
vehicle=row[0]
else:
continue
#如果与上一条不是同一个车
else:
vehicle=row[0]
pre=row[2]

结果

原始数据:data.set1,32885600个

OD点:data.set1_od ,645271个