任务3:地图数据统计


## 学习目标

  • GPS经纬度介绍
  • Pandas分组聚合
  • 出租车与网约车经纬度统计

## 地图数据统计(基础知识)

在任务三,我们希望通过分析和统计能够发现:

  • 巡游车与网约车的空间分布;
  • 上下客点分布密度:上下车位置分布;

### GPS经纬度

  • WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;

  • GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说GCJ-02是国内最广泛使用的坐标系;

  • 百度坐标系BD-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图;

地图坐标系转换方法:https://github.com/wandergis/coordTransform_py


## 分组聚合统计

对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。pandas提供了一个灵活高效的gruopby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。

关系型数据库和SQL(Structured Query Language,结构化查询语言)能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像SQL这样的查询语言所能执行的分组运算的种类很有限。

通过分组聚合统计,可以完成:

  • 使用一个或多个键(形式可以是函数、数组或DataFrame列名)分割pandas对象。
  • 计算分组的概述统计,比如数量、平均值或标准差,或是用户定义的函数。
  • 应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。
  • 计算透视表或交叉表。
  • 执行分位数分析以及其它统计分组分析。

Hadley Wickham(许多热门R语言包的作者)创造了一个用于表示分组运算的术语"split-apply-combine"(拆分-应用-合并)。

  • 第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。
  • 将一个函数应用(apply)到各个分组并产生一个新值。
  • 所有这些函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作。图10-1大致说明了一个简单的分组聚合过程。

聚合指的是任何能够从数组产生标量值的数据转换过程,比如mean、count、min以及sum等。


## 地图数据统计(实践)

### 统计巡游车与网约车分布

下面代码以将以巡游车GPStaxiGps20190531.csv为案例进行数据统计:

taxigps2019 = pd.read_csv(INPUT_PATH + 'taxiGps20190531.csv', nrows=MAX_ROWS,
                         dtype = {
                             'DRIVING_DIRECTION': np.uint16,
                             'OPERATING_STATUS': np.uint8,
                             'LONGITUDE': np.float32,
                             'LATITUDE': np.float32,
                             'GPS_SPEED': np.float16 
                         })

taxigps2019 = taxigps2019[taxigps2019.columns[::-1]]
taxigps2019['GPS_TIME'] = pd.to_datetime(taxigps2019['GPS_TIME'])
taxigps2019.sort_values(by=['CARNO','GPS_TIME'], inplace=True)
taxigps2019.reset_index(inplace=True, drop=True)
taxigps2019.head()
  1. 统计每辆巡游车最早、最晚出现的记录:
df_first = taxigps2019.groupby(['CARNO']).first()
df_last = taxigps2019.groupby(['CARNO']).last()
  1. 统计每辆巡游车最早最晚的时间间隔:
df_first = taxigps2019.groupby(['CARNO']).first()
df_last = taxigps2019.groupby(['CARNO']).last()

df = df_last['GPS_TIME'] - df_first['GPS_TIME']
df = df.reset_index()

df['GPS_HOUR'] = df['GPS_TIME'].dt.seconds / 3600
df['GPS_HOUR'] = df['GPS_HOUR'].astype(int)
df.set_index('CARNO', inplace=True)
  1. 统计每辆巡游车的经纬度和速度极差
taxigps2019 = taxigps2019[taxigps2019['LATITUDE'] != 0]
taxigps2019 = taxigps2019[taxigps2019['LONGITUDE'] != 0]

df['LATITUDE_PTP'] = taxigps2019.groupby(['CARNO'])['LATITUDE'].apply(np.ptp)
df['LONGITUDE_PTP'] = taxigps2019.groupby(['CARNO'])['LONGITUDE'].apply(np.ptp)
df['GPS_SPEED_PTP'] = taxigps2019.groupby(['CARNO'])['GPS_SPEED'].apply(np.ptp)

通过统计经纬度是不是全天都为0,我们可以剔除58辆全天GPS都异常的车。

  1. 计算一下每辆巡游车的平均经纬度(每天运动的中心),并绘制热力度
df['LONGITUDE_MEAN'] = taxigps2019.groupby(['CARNO'])['LONGITUDE'].mean()
df['LATITUDE_MEAN'] = taxigps2019.groupby(['CARNO'])['LATITUDE'].mean()
df = df.dropna()
from folium import plugins
from folium.plugins import HeatMap

map_hooray = folium.Map(location=[24.482426, 118.157606], zoom_start=14)
HeatMap(df[['LATITUDE_MEAN', 'LONGITUDE_MEAN']].iloc[:1000].values).add_to(map_hooray)
map_hooray
  1. 统计每辆巡游车的经纬度运行距离

### 上下客点分布密度


## 学习资源

学习Pandas最好的教程是《利用 Python 进行数据分析》,这本书是Pandas作者撰写,非常适合大家进行学习。如何用Pandas实现的思路,如何实现的又快又好是需要积累经验的。


## 课堂任务

  1. 如何统计每个上车位置与最近公交站的距离?
  2. 如何统计每个上车位置与时间的关系?

## 打卡任务

  1. 统计20190531出租车在LONGITUDE(118.155060±0.01)、LATITUDE(24.506035±0.01)方位内打车的平均等待时间。
  2. 统计20190531 - 20190609 期间出租订单经纬度上平均等待时间长的位置(且位置出现评率大于5)。
  3. 对比2019年和2020年出租车端午节订单的平均等待时间,是如何变化的(上升、下降还是不变)?


© 2019-2021 coggle.club 版权所有     京ICP备20022947    京公网安备 11030102010643号