【数据分析进阶】DCIC竞赛-task1 数据读取

学习目标

  • 下载数据集并理解赛题具体的背景
  • 理解并书里清楚赛题的任务
  • 完成赛题数据的读取

赛题介绍

  • 赛题名称:A城市巡游车与网约车运营特征对比分析

  • 赛题说明:出租车作为城市客运交通系统的重要组成
    部分,以高效、便捷、灵活等优点深受居民青睐。出租车每天的运营中会产生大量的上下车点位相关信息,对这些数据进行科学合理的关联和挖掘,对比在工作日以及休息日、节假日的出租车数据的空间分布及其动态变化,对出租车候车泊位、管理调度和居民通勤特征的研究具有重要意义。

    • 出租车/网约车:上下车地点挖掘;
    • 出租车/网约车:不同日期的空间变化;
    • 出租车/网约车:泊车和调度问题;
  • 赛题任务:参赛者需依据赛事方提供的出租车(包括巡游车和网约车)GPS和订单数据

    • 一综合应用统计分析方法分别对所提供的巡游车和网约车运营的时间、空间分布特征进行量化计算,包括计算2年的每年工作日取日平均,非工作日取日平均和节假日取日平均,三种类型各自平均的时变分布变化,三种时间类型按网格划分的平均空间分布(网格划分颗粒度选手自选),并分别对比分析所提供的网约车、巡游车,计算2年每年按工作日取日平均,非工作日取日平均和节假日取日平均三种类型的日均空驶率、订单平均运距、订单平均运行时长、上下客点分布密度等时变特性
    • 是根据巡游车和网约车的时空运营特征,并尝试对巡游车与网约车的融合发展提出相关建议。在分析过程,参赛者必须用到但不局限于提供的数据,可自行加入自有数据进行参赛,但需说明自带数据来源并保证数据合法

赛题思路

在这里插入图片描述
在这里插入图片描述

赛题数据

数据说明

  • 2019年端午节:2019-6-07(7、8、9假期)
  • 2020年端午节:2020-6-25(25、26、27假期)

赛题数据可以分为四类

  • 巡游车GPS数据(2019年、2020年);
  • 巡游车订单数据(2019年、2020年);
  • 网约车GPS数据(2019年、2020年);
  • 网约车订单数据(2019年、2020年);
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

注意网约车多了等待时间
在这里插入图片描述

数据读取

在进行数据读取的过程,需要注意的是并不需要把所有的文本都读取,可以分别读取单个文件完成数据数据分析,因为数据都是按照时间进行划分的。比如我们先完成巡游车taxiGps20190531.csv数据分析,进而可以直接将分析逻辑应用到taxiGps20190601.csv文件中

pandas介绍

在Python环境下读取结构化数据,并对结构化数据进行统计的最好的库是Pandas。在Pandas中表格是使用DataFrame进行存储和展示的,其参考了R语言中的DataFrame格式。
结构化数据又称为表格数据,与非结构化数据(文本、图像、音频和视频)区分明显。在表格中每行代表的一条记录(样本),一列表示一个字段(特征)

在这里插入图片描述

  • 优点1:Pandas封装了众多的文本读取方式,从文本文件到json文件,Pandas都可以简单的进行读取为DataFrame,非常方便;读取read_*,转化to_*

在这里插入图片描述

  • 优点2:Pandas可以无缝进行可视化,直接通过调用函数就可以完成可视化绘图;使用.plot*绘图
    在这里插入图片描述
  • 优点3:Pandas可以很方便的完成数据索引、聚合和计算的操作;

numpy介绍

在Python环境下完成科学计算一定会用到Numpy,是科学计算的基础库。

  • Numpy提供了矩阵存储、计算的快速实现;
  • Numpy是现有机器学习、深度学习库基础的数据格式;
  • Numpy是数据科学(数据存储、数据处理和数据可视化)的基础格式;
    在这里插入图片描述

读取代码

由于赛题给定的数据集文件都比较大,文件行数都比较多,如果完全进行读取可会让电脑卡死,内存爆炸;

  • 可以只读取部分文件,读取单个文件完成数分析;
  • 修改字段类型节约空间;
#导入所需要的包
import pandas as pd 
import numpy as np 

# 设置文件目录,此处采用的是相对路径
INPUT_PATH = './input/'
'''
1、./是当前目录

2、../是父级目录

3、/是根目录
'''

# 文件读取行数,当MAX_ROWS=None时读取的是所有数据,因为此处文件太大了,我们可以只先读取部分所以设置为了100000
MAX_ROWS = 100000 

1.巡游车GPS数据读取

含义
RUNNING_STATUS/OPERATING_STATUS运营状态(空车(1)、载客(2)、电召(4)、停运(8)、交班(16)、包车(32))
GPS_SPEEDGPS速
DRIVING_DIRECTION行驶方向角
GPS_TIME卫星定位时间
LONGITUDE经度(WGS84 GPS标准)
LATITUDE纬度(WGS84 GPS标准)
CARNO车牌号
#导入文件并查看
taxigps2019 = pd.read_csv(INPUT_PATH + 'taxiGps20190531.csv', nrows=MAX_ROWS)
taxigps2019.head()

原来的文件是无序的,为了方便阅读一会按照车牌号进行重新排序
在这里插入图片描述
通过describe()info()进一步查看

taxigps2019.describe()

这里可以看出speed应该是存在问题的,最大的都接近400了,不符合实际,还有经纬度不可能是0,对于这个问题可以去做一个平滑插值
在这里插入图片描述

taxigps2019.info()

通过info()我们可以查看看每个数据的类型,最后的memory usage表示用来多少的内存空间,我们这里是十万条数据用来5.3M,要是将数据全导进来得400多M
在这里插入图片描述
我们可以通过改变数据类型来对数据进行压缩以降低内存要求,比如上面有的用的float64,但其实没必要用这么高的精度,对于一些稀疏数据也可以将其转化为稀疏矩阵来降低内存需要

import pandas as pd
import numpy as np

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

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.info()

可以看到现在内存变成了2.8M降低了一半
在这里插入图片描述
为了方便查看数据,我们还可以对GPS数据进行排序,这样就完成了单个文件的读取

taxigps2019=taxigps2019[taxigps2019.columns[::-1]]
#原始数据不是按照汽车编号还有GPS时间进行排序的
#按照相同车,相同时间进行排序
taxigps2019.reset_index(inplace=True,drop=True)
taxigps2019.head()

在这里插入图片描述

答疑:方向角即车前进的方向,此处用的不多

对于多个文件(多天)可以直降将文件进行拼接

# 读取一天所有的数据大概需要400M,内存不够的话可以先不用
# 出租车2019年GPS
taxigps2019 = pd.concat([
    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 
                         }),
    pd.read_csv(INPUT_PATH + 'taxiGps20190601.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.sort_values(by=['CARNO','GPS_TIME'], inplace=True)

taxigps2019.reset_index(inplace=True)

2.巡游车订单单个文件读取

含义
CAR_NO车牌号
GETON_DATE上车时间
GETON_LONGITUDE上车经度(WGS84 GPS标准)
GETON_LATITUDE上车纬度(WGS84 GPS标准) GETOFF_DATE
GETOFF_LONGITUDE下车经度(WGS84 GPS标准)
GETOFF_LATITUDE下车纬度(WGS84 GPS标准)
PASS_MILE:计程公里、 NOPASS_MILE空驶公里
WAITING_TIME等待计时时间

和巡游车GPS文件处理过程类似,由于车辆编号不是题目要求的CARNO为了统一,这里进行了下转化

taxiorder2019 = pd.read_csv(INPUT_PATH + 'taxiOrder20190531.csv', nrows=MAX_ROWS,
                           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 = taxiorder2019.rename(columns={'CAR_NO':'CARNO'})
taxiorder2019.sort_values(by=['CARNO','GETON_DATE'], inplace=True)
taxiorder2019.reset_index(inplace=True, drop=True)
taxiorder2019.head()

在这里插入图片描述

3.网约车GPS数据读取

含义
CARNO车牌号
POSITION_TIME定位时间
LONGITUDE经度
LATITUDE纬度
ENCRYPT坐标系(1:GCJ-02标准;2:WGS84 GPS标准;3:BD-09 百度标准;4:CGCS2000 北斗标准0:其他)
DIRECTION行驶方向角
SPEEDGPS速度
BIZ_STATUS运营状态(1:载客2:接单3:空驶 4:停运)
ORDER_ID订单号
wycgps2019=pd.read_csv(INPUT_PATH+'wycGps20190531.csv',nrows=MAX_ROWS)
wycgps2019.head()

可以观察到BIZ、 ENCRYPT有缺失,采用fillna(-1)将其填充为-1
在这里插入图片描述

wycgps2019=pd.read_csv(INPUT_PATH+'wycGps20190531.csv',nrows=MAX_ROWS,
                      dtype={
                          'LONGITUDE':np.float32,
                          'LATITUDE':np.float32,
                          'SPEED':np.float16
                      })

wycgps2019=wycgps2019.rename(columns={'CAR_NO':'CARNO'})
wycgps2019=wycgps2019[wycgps2019.columns[::-1]]
wycgps2019.sort_values(by=['CARNO','POSITION_TIME'],inplace=True)

wycgps2019['BIZ_STATUS']=wycgps2019['BIZ_STATUS'].fillna(-1).astype(np.int8)
wycgps2019['ENCRYPT']=wycgps2019['ENCRYPT'].fillna(-1).astype(np.int8)
wycgps2019.head()

在这里插入图片描述

4.网约车订单数据读取

英文含义
ORDER_ID订单编号
ON_AREA上车位置行政区划编号
CAR_NO车辆号牌
BOOK_DEP_TIME预计上车时间
WAIT_TIME等待时间
DEP_LONGITUDE车辆出发经度(默认高德标准、GCJ-02标准,不排除部分坐标系有异常,需选手在图上作区分)
DEP_LATITUDE车辆出发纬度(默认高德标准、GCJ-02标准,不排除部分坐标系有异常,需选手在图上作区分)
DEP_TIME上车时间
DEST_LONGITUDE车辆到达经度(默认高德标准、GCJ-02标准,不排除部分坐标系有异常,需选手在图上作区分)
DEST_LATITUDE车辆到达纬度(默认高德标准、GCJ-02标准,不排除部分坐标系有异常,需选手在图上作区分)
DEST_TIME下车时间、DRIVE_MILE:载客里程(公里)
DRIVE_TIME载客时间(秒)
WAIT_MILE空驶里程(公里)
ORDER_MATCH_TIME订单完成时间
wycorder2019 = pd.read_csv(INPUT_PATH + 'wycOrder20190531.csv', nrows=MAX_ROWS,
                        dtype={
                            'DEP_LONGITUDE': np.float32,
                            'DEP_LATITUDE': np.float32,
                            'DEST_LONGITUDE': np.float32,
                            'DEST_LATITUDE': np.float32,
                        })
wycorder2019 = wycorder2019.rename(columns={'CAR_NO':'CARNO'})
wycorder2019.sort_values(by=['CARNO','DEP_TIME'], inplace=True)
wycorder2019.head()

在这里插入图片描述

数据统计

以巡游车GPStaxiGps20190531.csv为案例进行数据统计

1.有多少量出租车

  • taxigps2019['CARNO'].nunique()
#查看有多少出租车,注意这只是100000条数据里的不是全部的!
taxigps2019['CARNO'].unique()

在这里插入图片描述

#想以表格形式显示
pd.DataFrame(taxigps2019['CARNO'].unique())
#导出到txt
#pd.DataFrame(taxigps2019['CARNO'].unique()).to_csv('tmp.txt',index=None)

在这里插入图片描述

#查看出租车的具体个数
taxigps2019['CARNO'].nunique()

在这里插入图片描述

2.出租车平均GPS速度

  • np.clip(taxigps2019['GPS_SPEED'].values, 0, 150).mean()
#出租车平均GPS速度
#此处采用了0到150的映射,如果大于150的异常数据,将其强行转化为150
print(np.clip(taxigps2019['GPS_SPEED'].values,0,150).mean())
'''
numpy.clip(a, a_min, a_max, out=None)[source]
其中a是一个数组,后面两个参数分别表示最小和最大值
lip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min
'''

在这里插入图片描述

3.出租车运营状态统计

taxigps2019['OPERATING_STATUS'].value_counts()

在这里插入图片描述

4.某量巡游车数据

taxigps2019[taxigps2019['CARNO']=='c3e622b913ca7085db129fa379121b90']

在这里插入图片描述

5.某运行方向的车辆统计

taxigps2019[taxigps2019['DRIVING_DIRECTION']==10]['CARNO'].unique()

在这里插入图片描述

6.统计记录最多的GPS小时

#pandas可以直接转换成datatime格式
#原来的格式为2019/5/31 23:31:29 
taxigps2019['GPS_TIME']=pd.to_datetime(taxigps2019['GPS_TIME'])
taxigps2019['GPS_TIME'].head()

在这里插入图片描述

taxigps2019['GPS_TIME'].dt.hour.value_counts()
#导入全部数据后可以发现最多的在23,22,10,最少的是半夜和中午

在这里插入图片描述

7.查看间隔时间

#通过diff计算相邻两项的差值
taxigps2019['GPS_TIME'].diff(1)

在这里插入图片描述

taxigps2019['GPS_TIME'].diff(1).value_counts()

在这里插入图片描述

课堂任务

1.如何统计某个出租车的在一天的有效运行时间

将运行状态时间相加

2.如何统计某个出租车的行驶距离

通过GPS计算距离,通过速度×时间来计算

如何找到数据中的异常值

通过箱线图、describe()三分位段、四分位数据可以猜到哪些会存在异常值,比如最大速度都三四百了肯定是异常的

打卡任务

因为全导入数据后再对其进行重新编号排序太耗内存了,所以我没有按上面的步骤进行排序

统计巡游车GPS数据在20190603中包含多少俩出租车🚖?

import pandas as pd
import numpy as np

INPUT_PATH='./input/'
MAX_ROWS=None #此时将读取所有数据
taxigps20190603=pd.read_csv(INPUT_PATH+'taxiGps20190603.csv',nrows=MAX_ROWS,
                       dtype={'DRIVING_DIRECTION': np.uint16,
                             'OPERATING_STATUS': np.uint8,
                             'LONGITUDE': np.float32,
                             'LATITUDE': np.float32,
                             'GPS_SPEED': np.float16 
                             })
#查看车辆数量
taxigps20190603['CARNO'].nunique()

在这里插入图片描述

统计网约车GPS数据在20190603中包含多少俩网约车🚗?

wycgps20190603=pd.read_csv(INPUT_PATH+'wycGps20190603.csv',nrows=MAX_ROWS,
                      dtype={
                          'LONGITUDE':np.float32,
                          'LATITUDE':np.float32,
                          'SPEED':np.float16
                      })
wycgps20190603=wycgps20190603.rename(columns={'CAR_NO':'CARNO'})

#查看车辆数量
wycgps20190603['CARNO'].nunique()

在这里插入图片描述

统计巡游车订单数据在20190603中上车经纬度的最大最小值?

#导入数据
taxiorder20190603 = pd.read_csv(INPUT_PATH + 'taxiorder20190603.csv', nrows=MAX_ROWS,
                           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
                           })

taxiorder20190603 = taxiorder20190603.rename(columns={'CAR_NO':'CARNO'})
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#这两行代码作用是可以显示所有输出,而不用加print
#使用max()和min()可以查看最大和最小,由本题中min都是0的异常数据,所以先筛选了一下>0的数据,再寻找其最小值
taxiorder20190603['GETON_LATITUDE'].max()
taxiorder20190603['GETON_LONGITUDE'].max()
taxiorder20190603[taxiorder20190603['GETON_LATITUDE']>0]['GETON_LATITUDE'].min()
taxiorder20190603[taxiorder20190603['GETON_LONGITUDE']>0]['GETON_LONGITUDE'].min()

统计网约车订单数据集在20190603中下车经纬度最常见的位置?

假设经度+维度,各保留三维有效数字组合得到具体位置 小提示:可以将经纬度拼接到一起进行统计

wycorder20190603 = pd.read_csv(INPUT_PATH + 'wycorder20190603.csv', nrows=MAX_ROWS,
                        dtype={
                            'DEP_LONGITUDE': np.float32,
                            'DEP_LATITUDE': np.float32,
                            'DEST_LONGITUDE': np.float32,
                            'DEST_LATITUDE': np.float32,
                        })
wycorder20190603 = wycorder20190603.rename(columns={'CAR_NO':'CARNO'})

保留三位小数

  • 方法一使用round()来实现,但是不知道为什么我的使用了不起作用????网上也没有搜到合适解释
wycorder20190603['DEST_LONGITUDE'].round(3)
  • 方法二:
df=wycorder20190603[['DEST_LATITUDE','DEST_LATITUDE']]
df=df.round(3)
formater="{0:.03f}".format
df.applymap(formater)

在这里插入图片描述

  • 方法三:
a=wycorder20190603['DEST_LATITUDE'].apply(lambda x:round(x,3))
a

在这里插入图片描述
实现拼接,我用的map(str)

wycorder20190603['DEST']=wycorder20190603['DEST_LONGITUDE'].map(str)+','+wycorder20190603['DEST_LATITUDE'].round(3).map(str)

wycorder20190603['DEST'].value_counts()

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值