任务5:订单调度分析


## 学习目标

  • 挖掘巡游车空载率与经纬度的关系;
  • 挖掘巡游车订单运距与经纬度的关系;
  • 挖掘网约车空载率与经纬度的关系;
  • 挖掘网约车订单运距与经纬度的关系;

## 经纬度编码

geohash用一个字符串表示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。

其次,geohash表示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19,它表示的是一个矩形区域。 使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。

  • 热力图展示中,用于geohash点聚合功能,可以提高大量点前端渲染的性能
  • 地址聚类中,通过geohash计算,进行地址归类
  • 地址信息缓存时,通过geohash为key,来索引缓存信息
import pandas as pd
import numpy as np
import glob

INPUT_PATH = '../input/' #文件目录
MAX_ROWS = None # 文件读取行数

taxiorder2019 = pd.read_csv(INPUT_PATH + 'taxiOrder20190531.csv', nrows=None,
                           dtype = {
                               'GETON_LONGITUDE': np.float32,
                               'GETON_LATITUDE': np.float32,
                               'GETOFF_LONGITUDE': np.float32,
                               'GETOFF_LATITUDE': np.float32,
                               'PASS_MILE': np.float16,
                               'NOPASS_MILE': np.float16,
                               'WAITING_TIME': np.float16
                           })


taxiorder2019['GETON_DATE'] = pd.to_datetime(taxiorder2019['GETON_DATE'])
taxiorder2019['GETOFF_DATE'] = pd.to_datetime(taxiorder2019['GETOFF_DATE'])

taxiorder2019 = taxiorder2019.rename(columns={'CAR_NO':'CARNO'})
taxiorder2019.sort_values(by=['CARNO','GETON_DATE'], inplace=True)
taxiorder2019.reset_index(inplace=True, drop=True)

# taxigps2019.apply(lambda x: geohash.encode(x['GETON_LATITUDE'], x['GETON_LONGITUDE'],  precision=5), axis=1)
taxiorder2019['geohash'] = taxiorder2019.apply(lambda x: geohash.encode(x['GETON_LATITUDE'], x['GETON_LONGITUDE'], precision=8), axis=1)
taxiorder2019['geohash'].value_counts().head(10)
s0000000    6335
ws7unv0q     813
wsk584c9     745
ws7grb9s     617
ws7unv0r     608
wsk52k80     447
wsk584cd     416
ws7grbsy     409
ws7grb6d     394
wsk52dj9     362
Name: geohash, dtype: int64

其中s0000000为经纬度异常点,可以剔除掉。接下来我们统计下热门经纬度的中心:

for idx in taxiorder2019['geohash'].value_counts().iloc[1:11].index:
    df = taxiorder2019[taxiorder2019['geohash'] == idx]
    print(idx, df['GETON_LONGITUDE'].mean(), df['GETON_LATITUDE'].mean())
ws7unv0q 118.070595 24.637962
wsk584c9 118.127205 24.53685
ws7grb9s 118.116165 24.48105
ws7unv0r 118.07057 24.63811
wsk52k80 118.136154 24.502394
wsk584cd 118.1272 24.536997
ws7grbsy 118.12063 24.481407
ws7grb6d 118.11762 24.479357
wsk52dj9 118.15463 24.48881
wsk58ktu 118.14406 24.546976

## 订单调度分析

巡游车根据等待时间统计具体位置:

legal_hash = taxiorder2019['geohash'].value_counts().iloc[:5000].index
taxiorder2019[taxiorder2019['geohash'].isin(legal_hash)].groupby(['geohash'])['WAITING_TIME'].mean().sort_values()

网约车根据等待时间统计具体位置:

wycorder2019['DEP_TIME'] = pd.to_datetime(wycorder2019['DEP_TIME'], format='%Y%m%d%H%M%S')
wycorder2019['BOOK_DEP_TIME'] = pd.to_datetime(wycorder2019['BOOK_DEP_TIME'], format='%Y%m%d%H%M%S')

wycorder2019['WAITING_TIME'] = (wycorder2019['DEP_TIME'] - wycorder2019['BOOK_DEP_TIME']).dt.seconds
wycorder2019['geohash'] = wycorder2019.apply(lambda x: geohash.encode(x['DEP_LATITUDE'], x['DEP_LONGITUDE'], precision=8), axis=1)
wycorder2019[wycorder2019['geohash'].isin(legal_hash)].groupby(['geohash'])['WAITING_TIME'].mean().sort_values()

通过统计发现,网约车与巡游车达不到车的位置区域存在部分重叠,但还是会有交叉的情况

  • 比如打不到网约车,也打不到出租车;
  • 比如打不到网约车,但能达到出租车;

## 学习资源


## 课堂任务

  1. 有没有其他对地理位置做聚合的方法?
  2. 如何定量衡量一个区域打不到车的情况?

## 打卡任务

  1. 使用geohash发掘2019年端午假期,网约车热门的下车地点(Top3);
  2. 使用geohash发掘2019年端午假期,网约车热门的打车(上车)地点(Top3);
  3. 使用geohash分别发掘2019和2020年端午假期,网约车打车预计上车时间上车时间平均时间最长且地点出现次数大于100的地点(两年的Top1)。


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