人工智能与地理大数据实验--出租车GPS数据—时空大数据Python处理基础(一)

juechen333 2024-07-06 14:01:02 阅读 83

环境:Windows 10 专业版 + Python 3.9.1 + Anaconda 2020( 4.8.2)

系列文章:

人工智能与地理大数据实验--出租车GPS数据—时空大数据Python处理基础(一)

人工智能与地理大数据实验--出租车GPS数据—时空大数据Python处理基础(二)


目录

一、实验目的和内容

(一)实验目的

(二)实验内容

二、数据挖掘算法

(一)算法模型介绍

三、输入数据集分析

四、数据预处理

(一)数据的读取

(二)数据异常的清洗

1.载客状态字段异常

2.数据清洗思路

3.异常数据的剔除


一、实验目的和内容

(一)实验目的

(1)出租车 GPS 数据的读取与数据清洗

(2)出租车 GPS 数据时间完整性评估

(3)出租车 GPS 数据的空间完整性评估(栅格数据分布的可视化、空间分布散点图、热力图)

(4)出租车出行订单持续时间的统计(订单持续时间的统计、订单持续时间的箱形图绘制、出行订单的栅格 OD 可视化)

(二)实验内容

近年来,随着智能移动设备的普及以及硬件功能逐渐强大,越来越多的智能移动设备被用来采集和处理数据,用户个体产生的数据开始呈现爆炸式增长。出租车 GPS 数据是最常见的一种个体连续追踪的时空大数据。大部分出租车 GPS 数据采样频率大约为 15S 一条,不同运营公司的数据质量会有一定的差异。车载 GPS 设备采样频率越高、运营的出租车数据越多,则数据量越大。

在获取到交通时空数据后,如何预处理数据?如何处理 GPS 定位数据的经纬度信息?如何可视化数据?如何获取其他辅助数据(如路网、公交和地铁线路等)?从而进行大数据处理、大数据分析、数据挖掘及数据可视化的能力,从而满足不同行业的应用需求。

二、数据挖掘算法

(一)算法模型介绍

处理的过程主要用到的技术有数据处理技术,进行初步加工,包括异常数据清洗、数据筛选等;地理空间数据处理是二次加工,结合数据的位置信息进行空间统计与分析;数据可视化是展示手段,将数据的处理结果转换为易于理解的图表形式展示;利用OD方法进行出租车订单出行特征分析。

1.Numpy

NumPy(Numerical Python)是一个用于进行科学计算的Python库。它提供了一个强大的多维数组对象和用于处理这些数组的各种函数。NumPy是许多其他Python科学计算库的基础,如SciPy、Pandas和Matplotlib。

主要功能和特点:

(1)多维数组:NumPy的核心功能是多维数组对象(ndarray)。这些数组可以是一维、二维、三维或更高维度的。NumPy的数组比Python的内置列表(list)更高效,并且可以存储大量数据,如图像、声音波形等。

(2)数组操作:NumPy提供了各种数组操作函数,包括索引、切片、变形、合并、分割等。这些函数使得对数组进行数学运算和数据处理变得非常方便。

(3)广播:广播是NumPy的一个强大功能,它允许不同形状的数组之间进行算术运算。在广播中,NumPy会自动调整数组的形状,使得它们能够兼容进行运算。

(4)数学函数:NumPy提供了大量的数学函数,如三角函数、指数函数、对数函数、线性代数函数等。这些函数可以直接应用于数组,而不需要使用循环或列表推导式。

(5)随机数生成:NumPy包含一个随机数模块,可以生成各种分布的随机数。这对于模拟和生成随机数据非常有用。

(6)快速操作:NumPy使用高度优化的C语言代码实现了其核心功能,因此执行速度非常快。与使用Python内置的列表进行循环相比,使用NumPy进行向量化操作可以极大地提高计算效率。

(7)文件输入/输出:NumPy可以读取和写入磁盘上的数组数据,支持多种文件格式,如文本文件、二进制文件和NumPy自定义的.npz文件。

2.Pandas

Pandas是一个流行的Python数据分析工具包,提供了高效的数据结构和数据分析工具,使数据处理变得简单而直观。它是建立在NumPy之上的,提供了额外的功能和工具,使数据处理更加方便。

主要功能和特点:

(1)数据结构:Pandas提供了两种主要的数据结构:Series和DataFrame。Series是一维标签化数组,类似于一列数据,而DataFrame是一个表格型的数据结构,类似于SQL表或Excel电子表格。这些数据结构使得数据的操作和处理更加灵活和简单。

(2)数据清洗:Pandas提供了各种功能来清洗和预处理数据。它可以处理缺失值、重复值和异常值。它还能够进行数据转换、重塑和合并等操作。

(3)数据选择和过滤:Pandas提供了强大的数据选择和过滤功能。你可以使用标签、位置或条件来选择和过滤数据。这使得数据的筛选和提取变得非常简单。

(4)数据分组和聚合:Pandas支持对数据进行分组和聚合操作。你可以根据某些标准将数据分组,并对每个组应用聚合函数(如求和、平均值、计数等)。这对于数据汇总和摘要分析非常有用。

(5)时间序列数据:Pandas对处理时间序列数据提供了很好的支持。它提供了一些特殊的数据结构和功能,使得时间序列数据的处理和分析更加便捷。

(6)数据可视化:Pandas可以与其他数据可视化库(如Matplotlib和Seaborn)结合使用,提供了简单而强大的绘图功能。你可以轻松地创建各种类型的图表和图形,以可视化和探索数据。

(7)数据导入和导出:Pandas可以处理各种数据格式,包括CSV、Excel、SQL数据库、JSON、HTML等。你可以轻松地将数据导入到Pandas中进行分析,并将结果导出到其他格式。

3.Matplotlib

Matplotlib是一个用于创建可视化图表和绘图的Python工具包。它是一个功能强大且广泛使用的库,适用于各种科学、工程和数据分析的应用。

主要特点和功能:

(1)绘图风格:Matplotlib提供了多种绘图风格和选项,可以创建各种类型的图表,包括线图、散点图、柱状图、饼图、等高线图等。

(2)支持多种输出格式:Matplotlib支持将图表保存为多种常见的图像格式,如PNG、JPEG、PDF等,以便进一步使用或发布。

(3)交互式绘图:Matplotlib可以与交互式Python环境(如Jupyter Notebook)结合使用,实时更新图表,方便数据分析和可视化。

(4)自定义图表:Matplotlib允许用户对图表进行广泛的自定义,包括设置标题、轴标签、刻度、线条样式、颜色等,以满足特定需求。

(5)多子图布局:Matplotlib支持创建多个子图并进行自定义布局,使得在一个图中展示多个相关图表变得容易。

(6)支持3D绘图:Matplotlib还提供了支持三维数据可视化的工具和函数,可以创建三维散点图、曲面图、等高线图等。

(7)支持动画效果:Matplotlib可以创建动画效果,通过更新图表的数据或属性,可以呈现数据随时间变化的动态效果。

(8)绘图工具包整合:Matplotlib可以与其他Python科学计算工具包(如NumPy和Pandas)无缝整合,方便数据的处理和可视化。

4.Geopandas

Geopandas是一个Python工具包,用于在地理空间数据分析中处理和操作地理数据。它结合了Pandas(一个用于数据处理和分析的Python库)和Shapely(一个用于地理几何对象操作的库),提供了一个方便的接口来处理矢量地理数据。

主要特点和功能:

(1)数据结构:Geopandas引入了两个新的数据结构:GeoSeries和GeoDataFrame。GeoSeries是一种类似于Pandas中的Series的对象,用于存储和操作一维的地理几何对象(如点、线、多边形等)。GeoDataFrame是一种类似于Pandas中的DataFrame的对象,扩展了DataFrame的功能,可以处理包含地理几何对象的二维数据集。

(2)读写地理数据:Geopandas可以方便地读取和写入各种地理数据格式,包括常见的矢量文件格式(如Shapefile、GeoJSON等)和空间数据库(如PostGIS等)。

(3)空间操作:Geopandas提供了一系列强大的空间操作功能,例如缓冲区分析、空间联接、空间查询等。这些操作可以用来分析和处理地理数据,例如计算两个几何对象之间的距离、计算面积、判断点是否在多边形内部等。

(4)地理数据可视化:Geopandas结合了Matplotlib(一个用于绘图的Python库)和其他可视化工具,可以方便地可视化地理数据。它提供了简单的绘图函数,可以绘制地理几何对象、制作地图、添加图例等。

(5)投影转换:Geopandas支持地理坐标系和投影坐标系之间的转换。它可以将地理数据从一个坐标系转换到另一个坐标系,以便进行空间分析和可视化。

5.math

math是Python中内置的一个标准库,提供了许多数学运算和函数,用于进行常见的数学操作和计算。下面是math工具包的一些主要特性和功能:

主要特点和功能:

(1)数学常数:math库包含了一些常见的数学常数,如π(pi)和自然对数的底数(e)。这些常数可以通过math库直接访问,方便在计算中使用。

(2)数值运算:math库提供了一系列的数值运算函数,如绝对值(abs)、取整(floor和ceil)、四舍五入(round)、幂运算(pow)、平方根(sqrt)、对数运算(log和log10)等。这些函数可以用于处理和计算各种数值操作。

(3)三角函数:math库包含了一系列的三角函数,如正弦(sin)、余弦(cos)、正切(tan)等。这些函数可以用于处理角度和三角形相关的计算和问题。

(4)指数和对数函数:math库提供了指数函数(exp)和对数函数(log和log10),用于进行指数运算和对数运算。这些函数对于处理复杂的数值计算和科学计算非常有用。

(5)数学运算函数:math库还提供了一些常见的数学运算函数,如最大值(max)、最小值(min)、求和(sum)、平均值(mean)、标准差(stddev)等。这些函数可以对一组数字进行统计和计算。

(6)角度转换:math库提供了用于将角度转换为弧度和将弧度转换为角度的函数,分别是radians和degrees。这些函数方便在不同的角度单位之间进行转换。

(7)随机数生成:math库包含了一些随机数生成的函数,如生成随机浮点数(random)和生成随机整数(randint)。这些函数可以用于模拟和随机化实验、游戏开发等领域。

6.Tarnsbigdata

Tarnsbigdata是一个用于在Apache Spark上处理大数据的Python工具包。它提供了一组方便的函数和类,使开发人员能够使用Python语言来处理大规模数据集,而无需担心底层的分布式计算细节。

主要特点和功能:

(1)提供了与pandas类似的数据结构和API,使得开发人员可以轻松地使用熟悉的Python语言来处理大数据。

(2)支持在Spark集群中分布式地加载、转换和存储数据,可以将数据分配到多个节点上进行并行处理。

(3)集成了多种数据处理和分析工具,包括数据清洗、聚类、线性回归等。

(4)可以方便地与其他Python库和Spark模块集成,例如numpy、pandas、matplotlib等。

7.Seaborn

Seaborn是一个基于Python的数据可视化工具包,它建立在Matplotlib之上,提供了更高级的统计图形绘制功能。Seaborn的设计目标是使数据可视化变得更加简单、美观和有吸引力。

主要特点和功能:

(1)简单易用:Seaborn提供了一系列简单易用的函数和方法,使得绘制统计图形变得简单快捷。它的API设计得很直观,可以轻松地进行图形定制和样式设置。

(2)统计图形:Seaborn提供了许多用于绘制统计图形的函数,包括散点图、折线图、柱状图、箱线图、小提琴图、热力图等。这些图形能够更直观地展示数据之间的关系和分布。

(3)默认美观:Seaborn的默认样式和颜色调色板设计得非常美观,可以直接应用于图形中,让图形在外观上更加吸引人。此外,Seaborn还提供了许多主题和样式选项,可以进行进一步的定制。

(4)统计分析支持:Seaborn提供了一些统计分析的工具和函数,如线性回归、分类变量的条件统计等。这些功能能够帮助用户更好地理解数据中的模式和趋势。

(5)多图联合展示:Seaborn支持绘制多个图形,并且可以将它们组合成一个联合展示的图形。这对于比较和展示不同数据之间的关系非常有用。

(6)与Pandas集成:Seaborn可以与Pandas数据框架无缝集成,可以直接从Pandas数据结构中绘制图形,方便快捷地进行数据分析和可视化。

8.Shapely

Shapely是一个用于在Python中进行空间几何计算的开源工具包。它提供了一套简单而强大的几何操作和分析工具,使得用户能够处理和操作二维平面上的几何对象,如点、线和多边形。

主要特点和功能:

(1)几何对象:Shapely支持创建和处理多种几何对象,包括点(Point)、线(LineString)、线段(Line)、环(LinearRing)、多边形(Polygon)、多点(MultiPoint)、多线(MultiLineString)和多边形集合(MultiPolygon)等。这些几何对象可以进行各种操作和分析。

(2)几何操作:Shapely提供了丰富的几何操作方法,可以进行对象的组合、分割、合并、缩放、旋转、平移等操作。用户可以通过这些操作方法构建复杂的几何对象,并对其进行修改和转换。

(3)空间关系和分析:Shapely支持执行各种空间关系和分析操作,如包含(contains)、相交(intersects)、距离计算(distance)、相交面积计算(intersection)、并集计算(union)等。这些功能使得用户能够判断几何对象之间的关系,以及计算它们之间的距离、面积等属性。

(4)属性查询和操作:Shapely允许用户查询和修改几何对象的各种属性,如坐标、边界框、面积、长度等。这些属性可以用于进一步的计算和分析。

(5)可视化支持:Shapely可以与其他Python库(如Matplotlib)配合使用,方便用户将几何对象可视化展示。这对于调试、验证和展示计算结果非常有用。

三、输入数据集分析

1.TaxiData-Sample.csv(出租车GPS数据)

字段名 样例 说明
车辆ID 34745 对每辆车的唯一标识
经度 113.8099 GPS经度
纬度 22.62325 GPS纬度
时间 20:27:43

GPS数据的采集时间

载客状态 1

通常1为载客,0为空载

速度 27

数据采集时的GPS速度

2.sz.shp(行政区划矢量图形)

四、数据预处理

(一)数据的读取

通过pandas包中的pd.read_csv()方法读取目标数据文件,定义data的columns的属性,分别为VehicleNum(车牌号),Stime(时间),Lng(经度),Lat(纬度),载客状态(OpenStatus),车速(Speed)。

<code># 导入Pandas包,并赋值给变量pd

import pandas as pd

# 读取GPS数据

data = pd.read_csv('D:/Project/Jupyter_Project/Data/data/TaxiData-Sample.csv')

# 查看数据

data

<code># 读取数据,传入参数headercode>

data = pd.read_csv('D:/Project/Jupyter_Project/Data/data/TaxiData-Sample.csv',header = None)

# 通过header方法查看数据的前5行

data.head(5)

<code># 更改数据的列名code>

data.columns = ['VehicleNum','Stime','Lng','Lat','OpenStatus','Speed']

# 查看数据前5行

data.head(5)

(二)数据异常的清洗

1.载客状态字段异常

数据中的载客状态(OpenStatus)字段表征了出租车载客状态。当值为1时,表示出租车有乘客;反之则为空载状态。如果将所有的车辆数据读取在一个表中,将数据按车牌号和时间排序,那么在理想状态下,一辆出租车正常的OpenStatus序列应该是连续的0序列和连续的1序列依次出现。

因此异常情况应该有两种:

(1)在连续0的序列中,突然出现一个1。

(2)在连续1的序列中,突然出现一个0。

2.数据清洗思路

异常数据的载客状态与前一条数据和后一条数据的值均不同,且这三条数据必须是同一辆出租车的连续数据。

判断条件则为:

(1)异常数据的OpenStatus与前一条数据不等。

(2)异常数据的OpenStatus与后一条数据不等。

(3)异常数据的VehicleNum与前一条数据的VehicleNum相等。

(4)异常数据的VehicleNum与后一条数据的VehicleNum相等。

3.异常数据的剔除

(1)数据的排序

对data数据按照车牌与GPS时间进行排序,让同一辆车的数据放在一起,且按照时间大小进行排序,用到的是DataFrame的sort_values()方法。

<code># 对数据按照车牌号与GPS时间进行排序

data = data.sort_values(by = ['VehicleNum','Stime'])

# 查看数据

data

(2)数据的剔除

Pandas中提供了shfit函数,可以将数据的列整体上移或下移,使关键数据的前一行与后一行信息都在这一行上,使用条件判断语句进行筛选,剔除异常数据,data = data[-((data['OpenStatus'] != data['OpenStatus1'])&(data['OpenStatus'] !=data['OpenStatus2'])&(data['VehicleNum'] == data['VehicleNum1'])&(data['VehicleNum'] == data['VehicleNum2']))]

再使用data.drop()函数删除辅助判断用的列,最后保存为.csv文件。

<code># 将OpenStatus列整体下移一行,赋值给OpenStatus1列

data['OpenStatus1'] = data['OpenStatus'].shift()

# 将OpenStatus列整体上移一行,赋值给OpenStatus2列

data['OpenStatus2'] = data['OpenStatus'].shift(-1)

# 将VehicleNum列整体下移一行,赋值给VehicleNum1列

data['VehicleNum1'] = data['VehicleNum'].shift()

# 将VehicleNum列整体上移一行,赋值给VehicleNum2列

data['VehicleNum2'] = data['VehicleNum'].shift(-1)

# 剔除异常数据

data = data[-((data['OpenStatus'] != data['OpenStatus1'])&(data['OpenStatus'] != data['OpenStatus2'])&(data['VehicleNum'] == data['VehicleNum1'])&(data['VehicleNum'] == data['VehicleNum2']))]

# 删除辅助判断用的列

data = data.drop(['OpenStatus1','OpenStatus2','VehicleNum1','VehicleNum2'],axis = 1)

# 查看数据

data

<code># 保存数据到指定路径,index关键字决定是否保存行名code>

data.to_csv('D:/Project/Jupyter_Project/Data/data/TaxiData-Clean.csv',index = None,encoding = 'utf-8_sig')



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。