在任务0打卡任务中,我们发现同学们暂时遇到以下问题:
数据集过大,电脑费劲
:本节课我们将会给出的具体的操作方法,基本上4G内存电脑都可以完成;对空间数据的分析和可视化从未涉足
:在后续任务会给出可视化方法介绍;数据需要自己整合一下吗?还有有很多条是不运行的,速度为0
:如果机器内存大可以整合,也可以分天分析;速度为0有可能的是瞬时速度;登录时绑定手机收不到验证码
:收不到验证码的同学,请加QQ:3462287298;需要注意本次学习使用的数据为DCIC赛题2数据,需要报名后才能下载。报名规则及报名手册具体详见[赛程赛规]-[参赛团队]。
赛题名称:A城市巡游车与网约车运营特征对比分析
赛题说明:出租车作为城市客运交通系统的重要组成部分,以高效、便捷、灵活等优点深受居民青睐。出租车每天的运营中会产生大量的上下车点位相关信息,对这些数据进行科学合理的关联和挖掘,对比在工作日以及休息日、节假日的出租车数据的空间分布及其动态变化,对出租车候车泊位、管理调度和居民通勤特征的研究具有重要意义。
通过赛题理解&数据分析,参赛选手需要回答上述问题:
赛题数据下载页面,需要注册后下载。
文件类型 | 文件名 | 文件说明 |
---|---|---|
巡游车GPS数据 | taxiGps20190531.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190601.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190602.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190603.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190604.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190605.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190606.zip | 2019年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190607.zip | 2019年端午假期A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190608.zip | 2019年端午假期A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20190609.zip | 2019年端午假期A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200618.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200619.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200620.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200621.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200622.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200623.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200624.zip | 2020年端午前一周A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200625.zip | 2020年端午假期A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200626.zip | 2020年端午假期A城市巡游车GPS数据 |
巡游车GPS数据 | taxiGps20200627.zip | 2020年端午假期A城市巡游车GPS数据 |
巡游车订单数据 | taxiOrder20190531-20190605.zip | 2019年端午前一周A城市巡游车订单数据 |
巡游车订单数据 | taxiOrder20190606-20190609.zip | 2019年端午假期A城市巡游车订单数据 |
巡游车订单数据 | taxiOrder20200618-20200623.zip | 2020年端午前一周A城市巡游车订单数据 |
巡游车订单数据 | taxiOrder20200624-20200627.zip | 2020年端午假期A城市巡游车订单数据 |
网约车GPS数据 | wycGps20190531-20190603.zip | 2019年端午前一周A城市网约车GPS数据 |
网约车GPS数据 | wycGps20190604-20190605.zip | 2019年端午前一周A城市网约车GPS数据 |
网约车GPS数据 | wycGps20190606-20190607.zip | 2019年端午假期A城市网约车GPS数据 |
网约车GPS数据 | wycGps20190608-20190609.zip | 2019年端午假期A城市网约车GPS数据 |
网约车GPS数据 | wycGps20200618-20200619.zip | 2020年端午前一周A城市网约车GPS数据 |
网约车GPS数据 | wycGps20200620-20200622.zip | 2020年端午前一周A城市网约车GPS数据 |
网约车GPS数据 | wycGps20200623.zip | 2020年端午前一周A城市网约车GPS数据 |
网约车GPS数据 | wycGps20200624-20200627.zip | 2020年端午假期A城市网约车GPS数据 |
网约车订单数据 | taxiOrder20190531-20190605.zip | 2019年端午前一周A城市巡游车订单数据 |
网约车订单数据 | wycOrder20200606-20200609.zip | 2020年端午假期A城市网约车订单数据 |
网约车订单数据 | wycOrder20200618-20200622.zip | 2020年端午假期A城市网约车订单数据 |
网约车订单数据 | wycOrder20200623-20200627.zip | 2020年端午假期A城市网约车订单数据 |
路网矢量数据 | 某市路网矢量数据 |
比赛详细数据说明:https://data.xm.gov.cn/opendata-competition/#/contest_explain
赛题数据基本可以分为四类:
在进行数据读取的过程,需要注意的是并不需要把所有的文本都读取,可以分别读取单个文件完成数据数据分析,因为数据都是按照时间进行划分的。比如我们先完成巡游车taxiGps20190531.csv
数据分析,进而可以直接将分析逻辑应用到taxiGps20190601.csv
文件中。
在Python
环境下读取结构化数据,并对结构化数据进行统计的最好的库是Pandas
。在Pandas
中表格是使用DataFrame
进行存储和展示的,其参考了R
语言中的DataFrame
格式。
结构化数据又称为表格数据,与非结构化数据(文本、图像、音频和视频)区分明显。在表格中每行代表的一条记录(样本),一列表示一个字段(特征)。
优点1:Pandas
封装了众多的文本读取方式,从文本文件到json文件,Pandas
都可以简单的进行读取为DataFrame
,非常方便;
优点2:Pandas
可以无缝进行可视化,直接通过调用函数就可以完成可视化绘图;
优点3:Pandas
可以很方便的完成数据索引、聚合和计算的操作;
在Python
环境下完成科学计算一定会用到Numpy
,是科学计算的基础库。
Numpy
提供了矩阵存储、计算的快速实现;Numpy
是现有机器学习、深度学习库基础的数据格式;Numpy
是数据科学(数据存储、数据处理和数据可视化)的基础格式;由于赛题给定的数据集文件都比较大,文件行数都比较多,如果完全进行读取可会让电脑卡死,内存爆炸;
接下来我们将给出单个文件和部分文件的读取方法,供大家参考。
在读取数据时,可以完成以下操作:
read_csv
函数输入路径和nrows
设置读取的文件行数;nrows
可以取值为数值或者None
,前者数值控制行数,后者读取所有(默认是读取所有);DataFrame
形式,可以通过describe()
函数完成描述型分析统计;建议大家先设置nrows
完成读取,不要直接读取所有文件;
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)
taxigps2019.describe()
OPERATING_STATUS | GPS_SPEED | DRIVING_DIRECTION | LONGITUDE | LATITUDE | |
---|---|---|---|---|---|
count | 100000.000000 | 100000.000000 | 100000.000000 | 100000.000000 | 100000.000000 |
mean | 2.415830 | 15.922179 | 161.451510 | 117.388134 | 24.354396 |
std | 2.320472 | 22.837529 | 113.725946 | 9.273066 | 1.932351 |
min | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
25% | 1.000000 | 0.000000 | 59.000000 | 118.100982 | 24.480172 |
50% | 1.000000 | 0.000000 | 167.000000 | 118.123175 | 24.493398 |
75% | 6.000000 | 28.900000 | 261.000000 | 118.149498 | 24.516875 |
max | 8.000000 | 381.300000 | 360.000000 | 129.110960 | 34.656481 |
info()
函数完成表格信息展示;taxigps2019.info()
RangeIndex: 100000 entries, 0 to 99999
Data columns (total 7 columns):
OPERATING_STATUS 100000 non-null int64
GPS_SPEED 100000 non-null float64
DRIVING_DIRECTION 100000 non-null int64
GPS_TIME 100000 non-null object
LONGITUDE 100000 non-null float64
LATITUDE 100000 non-null float64
CARNO 100000 non-null object
dtypes: float64(3), int64(2), object(2)
memory usage: 5.3+ MB
通过describe()
和info()
函数,我们可以初步得到现有的字段的取值,10w条数据占用5MB内存。我们也可以完成数据字段压缩的操作,将字段类型根据取值空间进行修改,压缩内存使用需求。
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()
RangeIndex: 100000 entries, 0 to 99999
Data columns (total 7 columns):
OPERATING_STATUS 100000 non-null uint8
GPS_SPEED 100000 non-null float16
DRIVING_DIRECTION 100000 non-null uint16
GPS_TIME 100000 non-null object
LONGITUDE 100000 non-null float32
LATITUDE 100000 non-null float32
CARNO 100000 non-null object
dtypes: float16(1), float32(2), object(2), uint16(1), uint8(1)
memory usage: 2.8+ MB
为了方便查看数据,我们还可以对GPS数据进行排序,这样就完成了单个文件的读取。
taxigps2019 = taxigps2019[taxigps2019.columns[::-1]]
taxigps2019.sort_values(by=['CARNO','GPS_TIME'], inplace=True)
taxigps2019.reset_index(inplace=True, drop=True)
taxigps2019.head()
多个文件(多天)可以直接将文件进行拼接即可:
# 出租车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['GPS_TIME'] = pd.to_datetime(taxigps2019['GPS_TIME'])
taxigps2019.sort_values(by=['CARNO','GPS_TIME'], inplace=True)
taxigps2019.reset_index(inplace=True)
巡游车订单数据单个文件读取:
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 = pd.concat([
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
}),
pd.read_csv(INPUT_PATH + 'taxiOrder20190601.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)
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)
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)
赛题数据基本可以分为四类,不同类型的赛题数据在字段格式上有一定差异:
为了方便大家学习,接下来我们将以巡游车GPStaxiGps20190531.csv
为案例进行数据统计:
taxigps2019['CARNO'].nunique()
np.clip(taxigps2019['GPS_SPEED'].values, 0, 150).mean()
taxigps2019['OPERATING_STATUS'].value_counts()
taxigps2019[taxigps2019['CARNO'] == '0006d282be70d06881a7513b69fcaa60']
taxigps2019[taxigps2019['DRIVING_DIRECTION'] == 10]['CARNO'].unique()
taxigps2019['GPS_TIME'] = pd.to_datetime(taxigps2019['GPS_TIME'])
taxigps2019['GPS_TIME'].dt.hour.value_counts()
使用类型的函数,我们可以进而完成其他数据的统计。需要注意的是,赛题不同类型的数据在字段和含义存在差异,对于四类赛题数据,你能分别完成上述的统计吗🤔?
通过数据读取和数据统计,我们可以很直接的对数据原始的形态进行检查,获取一手的资料。需要注意的是,此步骤是需要阅读比赛数据说明。赛题数据本身不规整,这是赛题的任务。
因此完成赛题任务的步骤如下:
20190603
中包含多少辆出租车🚖?20190603
中包含多少辆网约车🚗?20190603
中上车经纬度的最大最小值?20190603
中下车经纬度最常见的位置?© 2019-2023 coggle.club 版权所有 京ICP备20022947 京公网安备 11030102010643号