一、数据集简介
- 本文用到的数据集是以上海一卡通乘客刷卡数据为背景,利用
Python
对数据进行预处理,以Tableau
对数据进行可视化。 - 数据集共包含
15772842
个样本,每个样本包含7
个属性,每个属性之间均已逗号分隔。
属性定义刷卡人用户标识符刷卡日期一卡通刷卡日期刷卡时间一卡通刷卡时间公共交通信息公交线路、轨道交通线路、出租及轮渡信息交通方式公交、地铁、出租、轮渡、P+R停车场价格公共交通价格是否优惠商业一卡通交易是否有优势
二、数据预处理
- 导包pandas
import pandas as pd
- 读取csv文件
raw = pd.read_csv(F:/python/data_analysis/SPTCC-20160701.csv", \
names=['刷卡人', '刷卡日期', '刷卡时间', '公共交通信息','交通方式', '价格', '是否优惠'], \
encoding='GB2312')
print(raw.head())
## 刷卡人 刷卡日期 刷卡时间 公共交通信息 交通方式 价格 是否优惠
## 0 2104309791 2016-07-01 12:04:46 8号线市光路 地铁 0.0 非优惠
## 1 2104309791 2016-07-01 12:54:44 4号线鲁班路 地铁 5.0 非优惠
## 2 3102664781 2016-07-01 18:42:45 11号线枫桥路 地铁 4.0 非优惠
## 3 3102664781 2016-07-01 08:04:23 11号线枫桥路 地铁 0.0 非优惠
## 4 3102664781 2016-07-01 08:37:04 9号线漕河泾开发区 地铁 4.0 非优惠
print(raw.shape)
## (15772842, 7)
- 仅保留交通方式为"地铁"的数据记录
metro = raw.loc[raw['交通方式']=='地铁'].drop(columns=['交通方式', '是否优惠'])
print(metro.shape)
## (10308569, 5)
-
从字段"公共信息交通"中提取"轨道交通线路"以及"地铁站"信息
-
apply()
函数用于当函数参数已经于一个元组或字典中时存在,直接地调用函数。apply()
的返回值就是func()
的返回值; - 调用函数
split()
,将标签字符串进行切割,并根据索引返回标签切割后的值;
metro['轨道交通路线'] = metro['公共交通信息'].apply(lambda x: (x.split('号线')[0]))
metro['地铁站'] = metro['公共交通信息'].apply(lambda x: x.split('号线')[1])
- 调用函数
drop()
,删除无需进一步分析的维度字段,其中inplace=True
修改作用于原数据集。
metro.drop(columns=['公共交通信息'], inplace=True)
-
读取上海地铁站经纬度信息数据
-
利用
apply()
及信息函数,从字段"轨道交通"中提取"轨道交通线路"信息。 - 调用数据框对象的函数
drop_duplicates()
删除重复行,参数表示用某某或某几列来识别所有记录列记录。
metro_geo = pd.read_csv('F:/data/metro/SH_metro.csv', encoding='utf-8')
metro_geo['轨道交通线路'] = metro_geo['轨道交通'].apply(lambda x: x.split('号')[0])
metro_group_dedup = metro_geo.drop_duplicates(['轨道交通线路', '地铁站'])
- 函数merge()用于做数据连接,其中
第1个参数left表示左侧数据框;
第2个参数right表示数据框;
第3个参数how表示连接方式,默认为内连接;
第4和5个参数left_on和right_on分别表示数据框left和right的连接变量名(列表);
- 将
上海一卡通刷卡数据的数据框
与上海站经纬度信息数据框
进行左连接
,连接条件为两表中的"轨道交通线路"与"地铁站"字段。
data = pd.merge(metro, metro_geo_dedup, how='left', \
left_on=['轨道交通线路', '地铁站'], right_on=['轨道交通线路', '地铁站'])
print(data.head())
## 刷卡人 刷卡日期 刷卡时间 ... 地铁站序列 经度 纬度
## 0 2104309791 2016-07-01 12:04:46 ... 30.0 121.538527 31.328516
## 1 2104309791 2016-07-01 12:54:44 ... 6.0 121.480988 31.204940
## 2 3102664781 2016-07-01 18:42:45 ... 19.0 121.417540 31.248068
## 3 3102664781 2016-07-01 08:04:23 ... 19.0 121.417540 31.248068
## 4 3102664781 2016-07-01 08:37:04 ... 13.0 121.404164 31.176220
##
## [5 rows x 11 columns]
- 提取刷卡整点小时信息,增大数据颗粒度
data['刷卡时间_时'] = data['刷卡时间'].apply(lambda x: x[:2] + ':00:00' if int(x[:2]) 24 and int(x[:2]) >= 0 else '')
data['进/出站'] = data['价格'].apply(lambda x: '进站' if x == 0 else '出站')
- 调用函数
drop()
,删除无需进一步分析的维度字段,其中inplace=True
修改作用于原数据集
data.drop(columns=['刷卡时间', '价格'], inplace=True)
print(data.head())
## 刷卡人 刷卡日期 轨道交通线路 ... 纬度 刷卡时间_时 进/出站
## 0 2104309791 2016-07-01 8 ... 31.328516 12:00:00 进站
## 1 2104309791 2016-07-01 4 ... 31.204940 12:00:00 出站
## 2 3102664781 2016-07-01 11 ... 31.248068 18:00:00 出站
## 3 3102664781 2016-07-01 11 ... 31.248068 08:00:00 进站
## 4 3102664781 2016-07-01 9 ... 31.176220 08:00:00 出站
##
## [5 rows x 11 columns]
- 导包numpy
import numpy as np
- 数据多维度汇总
dims = ['刷卡日期','刷卡时间_时','轨道交通','轨道交通线路',
'地铁站','地铁站序列','经度','纬度','进/出站']
get_in_cnt = lambda x: x.loc[x=='进站'].count()
get_in_cnt.__name__ = "inCnt"
get_out_cnt = lambda x: x.loc[x=='出站'].count()
get_out_cnt.__name__ = "outCnt"
smry = data.groupby(dims).agg({'刷卡人': [np.size, pd.Series.nunique],
'进/出站': [get_in_cnt, get_out_cnt]})
print(smry.head())
## 刷卡人 进/出站
## size nunique inCnt outCnt
## 刷卡日期 刷卡时间_时 轨道交通 轨道交通线路 地铁站 地铁站序列 经度 纬度 进/出站
## 2016-07-01 00:00:00 11号主线 11 嘉定北 31.0 121.244010 31.397409 出站 2 2 0 2
## 11号支线 11 安亭 32.0 121.168602 31.294335 出站 21 21 0 21
## 1号线 1 人民广场 16.0 121.481022 31.238795 出站 5 5 0 5
## 2号线 2 龙阳路 12.0 121.564050 31.209166 出站 30 30 0 30
## 4号线 4 世纪大道 12.0 121.533437 31.234854 出站 55 55 0 55
- 筛选后,输出一个包含多级索引的数据框
smry
,通过函数ravel()
可以进行降维,并调用reset_index()
将数据从索引中释放出来,确保能够正常输出。
smry.columns = ["_".join(x) for x in smry.columns.ravel]
smry.reset_index(inplace=True)
print(smry.head())
## 刷卡日期 刷卡时间_时 ... 进/出站_inCnt 进/出站_outCnt
## 0 2016-07-01 00:00:00 ... 0 2
## 1 2016-07-01 00:00:00 ... 0 21
## 2 2016-07-01 00:00:00 ... 0 5
## 3 2016-07-01 00:00:00 ... 0 30
## 4 2016-07-01 00:00:00 ... 0 55
##
## [5 rows x 13 columns]
- 调用数据框函数
rename()
对聚合后的形状重命名
smry.rename(columns={'刷卡人_size': '客流量', '刷卡人_nunique': '客流量(计数不同)',
'进/出站_inCnt': '进站客流量', '进/出站_outCnt':'出站客流量'},
inplace=True)
print(smry.head())
## 刷卡日期 刷卡时间_时 轨道交通 轨道交通线路 ... 客流量 客流量(计数不同) 进站客流量 出站客流量
## 0 2016-07-01 00:00:00 11号主线 11 ... 2 2 0 2
## 1 2016-07-01 00:00:00 11号支线 11 ... 21 21 0 21
## 2 2016-07-01 00:00:00 1号线 1 ... 5 5 0 5
## 3 2016-07-01 00:00:00 2号线 2 ... 30 30 0 30
## 4 2016-07-01 00:00:00 4号线 4 ... 55 55 0 55
##
## [5 rows x 13 columns]
-
信息扩展
-
为了提高数据可视化的效果,我们将地铁站的经纬度信息与时间信息交叉连接,形成轨道交通地图所需的空数据集;用上述聚合卡数据进行伪空数据集,使地图上可见的中等轨道交通线始终存在,而不会造成轨道交通的缺陷。
[En]
in order to improve the effect of data visualization, we extend the longitude and latitude information of the subway station and cross-connect it with the time information to form an empty data set necessary for the rail transit map; the false empty data set is carried out with the above aggregated card data, so that the medium rail transit lines visible on the map can always exist without causing rail transit imperfections.*
distinct_time = pd.DataFrame({'刷卡时间_时':smry['刷卡时间_时'].unique(),
'cross_join': 1})
metro_geo['cross_join'] = 1
metro_map = pd.merge(metro_geo, distinct_time, on='cross_join').drop('cross_join', axis=1)
result = pd.concat([smry, metro_map], sort=True)
print(result.head())
## 出站客流量 刷卡日期 刷卡时间_时 地铁站 ... 轨道交通 轨道交通线路 进/出站 进站客流量
## 0 2.0 2016-07-01 00:00:00 嘉定北 ... 11号主线 11 出站 0.0
## 1 21.0 2016-07-01 00:00:00 安亭 ... 11号支线 11 出站 0.0
## 2 5.0 2016-07-01 00:00:00 人民广场 ... 1号线 1 出站 0.0
## 3 30.0 2016-07-01 00:00:00 龙阳路 ... 2号线 2 出站 0.0
## 4 55.0 2016-07-01 00:00:00 世纪大道 ... 4号线 4 出站 0.0
##
## [5 rows x 14 columns]
- 调用
fillna()
函数对拼接后缺失的数据进行补齐,参数inplace=True
表示修改作用于原数据集
na_values = {'出站客流量': 0, '刷卡日期': '1901-01-01', '城市': '上海市',
'刷卡时间_时': '00:00:00', '客流量': 0, '客流量(计数不同)': 0,
'进站客流量': 0, '进/出站': ''}
result.fillna(value=na_values, inplace=True)
print(result.head())
## 出站客流量 刷卡日期 刷卡时间_时 地铁站 ... 轨道交通 轨道交通线路 进/出站 进站客流量
## 0 2.0 2016-07-01 00:00:00 嘉定北 ... 11号主线 11 出站 0.0
## 1 21.0 2016-07-01 00:00:00 安亭 ... 11号支线 11 出站 0.0
## 2 5.0 2016-07-01 00:00:00 人民广场 ... 1号线 1 出站 0.0
## 3 30.0 2016-07-01 00:00:00 龙阳路 ... 2号线 2 出站 0.0
## 4 55.0 2016-07-01 00:00:00 世纪大道 ... 4号线 4 出站 0.0
##
## [5 rows x 14 columns]
- 调用to_csv()
result.to_csv('F:/data/metro/output.csv', index=0, encoding='utf-8_sig', sep='|')
三、数据可视化
使用Tableau对数据进行可视化处理
通过仪表盘,我们可以清楚地了解上海轨道交通每个车站的客流情况,并点击滑块右侧的小三角形,动态展示每小时的客流情况。
[En]
Through the dashboard, we can clearly understand the passenger flow of each station of Shanghai rail transit, and click the small triangle on the right side of the slider bar to dynamically demonstrate the passenger flow per hour.
Original: https://blog.csdn.net/hutianle/article/details/119326518
Author: LeBron Le
Title: 学习笔记:数据分析之上海一卡通乘客刷卡数据分析
相关阅读
Title: Windows下cuDNN7.6.4下载安装详细步骤
Title: Windows下cuDNN7.6.4下载安装详细步骤
第一步:点击官网链接,进入官网首页; https://developer.nvidia.com/rdp/cudnn-download https://developer.nvidia.com/rdp/cudnn-download ;
第二步:注册
(1)点击:Join now,输入要注册的邮箱,然后点击下一步
(2)使用电子邮箱注册一个账号:我使用的是谷歌的邮箱
第三步:进入如下页面下载cudNN
(1)点击:I Agree;
(2)点击 "Archived cuDNN Release",进入如下页面:
(3)在上图页面中找到跟CUDA10.1所对应的cuDNN版本,也就是7.6.5:
(4)然后找到自己想下载的:
第四步:按照官网文档配置cuDNN
(1)首先解压cudNN,并找到以下三个文件夹;
(2)将下载解压好的cuDNN三个路径下的文件分别对应拷贝到CUDA安装目录对应文件中
(3)注意:因为我是将CUDA安装在了D:\23_CUDA10.1,最后就只剩下第三张图片的三个文件夹,打开24_CUDA_Development这个文件夹。就是将cudNN这个文件夹中的三个文件夹,复制到24_CUDA_Development即可。
第五步:测试
配置完成后,我们可以验证是否配置成功,主要使用CUDA内置的deviceQuery.exe 和 bandwithTest.exe:
(1)win+R启动cmd;
(2)输入:cd D:\24_CUDA_Development\extras\demo_suite;进入到所在的文件在,然后在输入bandwidthTest.exe,出现Results = PASS;
(3)然后再输入deviceQuery.exe,同样也出现Results = PASS,表示安装成功。
Original: https://blog.csdn.net/weixin_45843564/article/details/122346348
Author: 霸道小姐
Title: Windows下cuDNN7.6.4下载安装详细步骤Original: https://blog.csdn.net/weixin_45843564/article/details/122346348
Author: 霸道小姐
Title: Windows下cuDNN7.6.4下载安装详细步骤

厉害了!看嘴型竟然就能识别发音

基于ESP32的智能家居控制系统-微信小程序

边缘计算:客户端 + 人工智能

离线环境的中文语音识别 paddlepaddle 与 Speech_Recognition(Sphinx)实践

二、图形数据库Neo4j的简介与安装

hanlp安装

Anaconda虚拟环境+jupyter内核配置(详解)

tensorflow之常用工具类

【全志R329-NPU助力】Maix-Speech为嵌入式环境设计的离线语音库

P-tuning v1 v2

【机器学习】几种常见的无监督学习算法

背景: 设计和实现一个轻量化的深度学习库

【语音分析】基于matlab语音短时频域分析【含Matlab源码 558期】

基于巴法云平台的天猫精灵控制开关
