•使用numpy、pandas等完成“00.csv”文件读取;
#读取数据
#引入folium地图包
!pip install folium
import folium
import pandas as pd
import numpy as np
import time,datetime
#读取文档数据
df=pd.read_csv('/home/aistudio/data/data168432/00new.csv.csv')
print(df)
•剔除无效数据:GPS 采集出租车轨迹数据的过程中,可能因设备问题 导致数据没有采集到,故而在原始轨迹数据集中记录为空值。因此,需 要将每个采样点中有效字段为空值的数据进行剔除,即剔除 DeviceID、 Longitude、Latitude、Speed、Timestamp 或 Status 任意一个字段为 空的数据。
#统计缺失值数据
df.isnull().sum()
#剔除缺失值行无效数据
df = df.dropna()
#输出剔除空值行后的数据
print(df)
•剔除速度异常数据:原始出租车轨迹数据集中 Speed 的单位为 /h, 值域为 [0, 512]。将采样点中速度不在值域为 [0, 150] 范围内的数据视为异常数据,并剔除此类异常数据。
#剔除速度值异常数据
df.drop(df[(df.Speed > 150) & (df.Speed < 0)].index, inplace=True)
#输出删除速度值异常后的数据
print(df)
•剔除重复数据:GPS 设备每隔一段时间( 1s 到 20s 之间)对出租车进 行一次采样,由于设备问题重复上传数据,导致原始轨迹数据集中存在 有效字段完全相同的数据。为了保证数据的准确性,需要对这类重复的数据予以剔除。
#剔除重复数据
df.drop_duplicates()
#输出删除重复数据后的数据
print(df)
•经度和纬度标准化:Longitude 和 Latitude 字段对应的值是出租车经度值和纬度值乘以 转化为实际的经度值和纬度值。如 Longitude 值为 1191200308 和 Latitude 值为 293102620 分别经过标准化处理后为 119.1200308 和 29.3102620。
#经度和纬度标准化
df.Longitude = df.Longitude / 10000000
df.Latitude = df.Latitude / 10000000
#输出经纬度标准化后的数据
print(df)
•时间标准化:时间戳 TimeStamp 是 Unix 时间,定义为从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。标准化时间戳 可以通过调用 python 内置处理时间 time 模块,首先使用 time 模块中 的 localtime 将时间戳转化为时间数组,然后应用 time 模块中的 strftime 将时间数据转化为指定的日期格式“%y-%m-%d %H:%M:%S”。 其中 y,m,d,H,M,S分别表示年,月,日,小时,分钟和秒钟。如 时间戳 TimeStamp 值为 1427828315 经过标准化处理后为“2015-4-1 2:58:35”。
#时间标准化
df.TimeStamp = pd.to_datetime(df.TimeStamp,unit='s')
#输出时间标准化后的数据
print(df)
•研究区域的选取:如图所示,选取一天中部分出租车轨迹数据的采 样点映射到地图上,我们可以清晰的发现采样点主要分布在杭州市的 主城区。根据数据分布属性,主要研究杭州市的 9 个城区,包括西湖区、上城区、下城区、拱墅区、滨江区、江干区、萧山区、富阳区、 余杭区,故此选取原始轨迹数据中 Longitude 和 Latitude 值域分别在 [119.869,120.461] 和 [30.012,30.4439] 的数据。
在地图中设置定点位置
#设置矩形框顶点位置
points = ([30.012, 119.869], [30.012, 120.461], [30.4439, 119.869], [30.4439, 120.461])
#将采样点映射到地图上
#新建地图,中心点为(30.22795, 120.165),缩放值为10.5,添加比例尺
m = folium.Map([30.22795, 120.165], zoom_start=10.5, control_scale=True)
#设置矩形框顶点位置
points = ([30.012, 119.869], [30.012, 120.461], [30.4439, 119.869], [30.4439, 120.461])
#画出范围矩形框
folium.Rectangle(bounds=points, color = '#ff7800', fill = False, fill_opacity=0.2).add_to(m)
#在地图上逐个标记点位
for lat, lng, in zip(df.Latitude, df.Longitude):
folium.CircleMarker(
[lat, lng],
radius=5,
color='yellow',
fill=True,
fill_color='red',
fill_opacity=0.6
).add_to(m)
#将地图输出为.html格式
m.save('采样点映射.html')
m
#数据的时间属性
import matplotlib.pyplot as plt
from datetime import datetime
from dateutil.parser import parse
#复制TimeStamp为time提取小时
df['time'] = df.TimeStamp
df['hour'] = [x.strftime('%H') for x in df.time] #提取时间的小时数
traffic = df['hour'].drop_duplicates() #对小时去重
x = df.groupby('hour')['UNIQUEID'].count() #求每小时的客流量
y = x.reset_index() #重置索引,为绘制折线图做准备
plt.subplot(1,1,1)
plt.plot(y['hour'],y['UNIQUEID']) #绘制折线图
plt.xlabel('Time/hour')
plt.ylabel("Flow/number") #设置x,y轴标签
for a,b in zip(y['hour'],y['UNIQUEID']): #设置图上显示数据标签
plt.text(a,b,b,va='center')
plt.title('Traffic flow statistics chart') #设置图标题
2.探索数据的空间分布规律,采用leaflet.js将采样点绘制到地图上
#探索数据的空间分布规律
from folium.plugins import HeatMap
#新建地图,中心点为(30.22795, 120.165),缩放值为10.5,添加比例尺
heat_map = folium.Map([30.22795, 120.165], zoom_start=10.5, control_scale=True)
# Convert data format
heatdata = df[['Latitude','Longitude']].values.tolist()
#画图
HeatMap(heatdata).add_to(heat_map)
#将地图输出为.html格式
heat_map.save('空间热力图.html')
heat_map
我将项目放在了aistudio平台,点击下方链接就可以直接运行。
我发现了一篇高质量的实训项目,使用免费算力即可一键运行,还能额外获取8小时免费GPU运行时长,快来Fork一下体验吧。
出租车GPS轨迹数据分析:https://aistudio.baidu.com/aistudio/projectdetail/4939932?sUid=959235&shared=1&ts=1667276282875