学习笔记:数据分析之上海一卡通乘客刷卡数据分析

2023-11-06

一、数据集简介

  • 本文用到的数据集是以上海一卡通乘客刷卡数据为背景,利用Python对数据进行预处理,以Tableau对数据进行可视化。
  • 数据集共包含15772842个样本,每个样本包含7个属性,每个属性之间均已逗号分隔。
属性 定义
刷卡人 用户标识符
刷卡日期 一卡通刷卡日期
刷卡时间 一卡通刷卡时间
公共交通信息 公交线路、轨道交通线路、出租及轮渡信息
交通方式 公交、地铁、出租、轮渡、P+R停车场
价格 公共交通价格
是否优惠 商业一卡通交易是否有优势

二、数据预处理

  1. 导包pandas
import pandas as pd
  1. 读取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)
  1. 仅保留交通方式为“地铁”的数据记录
metro = raw.loc[raw['交通方式']=='地铁'].drop(columns=['交通方式', '是否优惠'])
print(metro.shape)
## (10308569, 5)
  1. 从字段“公共信息交通”中提取“轨道交通线路”以及“地铁站”信息
  • 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)
  1. 读取上海地铁站经纬度信息数据
  • 利用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]
  1. 提取刷卡整点小时信息,增大数据颗粒度
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 '出站')
  1. 调用函数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]
  1. 导包numpy
import numpy as np
  1. 数据多维度汇总
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]
  1. 调用数据框函数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]
  1. 信息扩展
  • 为了提高数据可视化效果,我们将地铁站经纬度信息进行扩展,将其与时间信息进行交叉连接,构成一条轨道交通图所必须的空数据集;假空数据集与上述聚合后的一卡通卡数据进行,使其在地图上可见的中轨道交通线路能够一直存在,而不会导致轨道交通的残缺。
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对数据进行可视化处理
在这里插入图片描述
通过该仪表板,可以清楚地了解到上海轨道交通各站点客流量情况;单击滑动条右侧的小三角还可进行每小时客流情况的动态演示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记:数据分析之上海一卡通乘客刷卡数据分析 的相关文章

随机推荐

  • 深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记

    1 bootloader到kernel启动总逻辑流程图 ARM架构中 EL0 EL1是必须实现 EL2 EL3是选配 ELx跟层级对应关系 EL0 app EL1 Linux kernel lk EL2 hypervisor 虚拟化 EL3
  • Codeforces Round #589 (Div. 2)【数学 + 构造】

    A题 Distinct Digits 因为数的大小最长也就是5位 所以直接暴力求解即可 复杂度O 5 N include
  • C\C++ standard lib

    link
  • vue.js 解决空格报错!!!

    当我们初入vue js的时候 使用cli脚手架快速创建项目的时候 如果语法格式错误 这里主要指的是 空格多少引起的问题 找到 webpack base config js文件注释掉下面的东西 var path require path va
  • LeetCode 82. 删除排序链表中的重复元素 II

    题目链接 82 删除排序链表中的重复元素 II 设置虚拟头结点dummy不用考虑边界情况 p指针指向的是上一个没有重复的元素的位置 初始位置是dummy q从p gt next开始 一直走到第一个与q gt next不同元素的位置 删除中间
  • 经典目标检测算法—背景差分法、帧差法和三帧差法

    一 实验目的与要求 1 熟悉经典目标检测算法的原理 2 使用MATLAB语言编程实现背景差分法 帧差法和三帧差法 3 比较背景差分法 帧差法和三帧差法的特点 并了解该算法的应用条件 二 实验环境 Windows matlab 三 实验内容和
  • phpspreadsheet excel导入导出

    单个sheet页Excel2003版最大行数是65536行 Excel2007开始的版本最大行数是1048576行 Excel2003的最大列数是256列 2007以上版本是16384列 xlswriter xlswriter PHP 高性
  • Bean的四种注入方式

    1 set方法注入 2 构造器注入 3 静态工厂注入 4 实例工厂注入 我使用下面两个类来进行注入的演示 这两个类分别是User和Car类 Car类 public class Car 只包含基本数据类型的属性 private int spe
  • 内存管理篇 (一):Go语言之逃逸

    本篇做为Go语言内存管理的第一篇文章 会从下面几个方向来讲述逃逸 1 什么是逃逸 2 为什么需要逃逸 3 逃逸是怎么实现的 一 什么是逃逸 在开始讲逃逸之前 我们先看一下 下面的两个例子 例子1 stack go的fun 返回的就是一个in
  • 转载:浅谈批处理获取管理员运行权限的几种方法

    很多用了Win10版本系统的人都会发现 Windows对程序的运行权限是控制得更加严格了 即使你将UAC控制放至最低 如果没有特别赋予外来程序管理员运行权限的话 很多程序都会运行出错 包括很多用于系统维护的批处理程序由于运行权限不够都会导致
  • linux系统查看命令

    系统 uname a 查看内核 操作系统 CPU信息 head n 1 etc issue 查看操作系统版本 cat proc cpuinfo 查看CPU信息 hostname 查看计算机名 lspci tv 列出所有PCI设备 lsusb
  • Java弱引用(WeakReference)的理解与使用

    在Java里 当一个对象被创建时 它被放在内存堆里 当GC运行的时候 如果发现没有任何引用指向该对象 该对象就会被回收以腾出内存空间 或者换句话说 一个对象被回收 必须满足两个条件 1 没有任何引用指向它 2 GC被运行 Java对于简单的
  • Nacos Client2.2.9源码启动问题

    Nacos Client2 2 9源码启动问题 1 开启服务端 源码启动 推荐使用稳定版本作为 服务端 我是用了最新的2 2 1的nacos版本处理了一些问题 现在启动成功 nacos首页 http 192 168 3 111 8848 n
  • 分布式微电网能源交易算法matlab源代码孤岛微电网之间的能源交易问题,提出了一种分布式算法

    分布式微电网能源交易算法matlab源代码 代码按照高水平文章复现 保证正确 孤岛微电网之间的能源交易问题 提出了一种分布式算法 这个问题由几个通过任意拓扑交换能量流的岛屿微网格组成 提出了一种基于次梯度的开销最小化算法 该算法在实际迭代次
  • flutter报错[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3) X Andr

    Flutter官网 问题 出现以下报错 说许可未知 解决方法 1 选择tools gt SDK Manager gt 2 SDK Platforms tab gt Android 9 0 Pie 3 安装 4 选择29 0 3下载重启And
  • 时序预测

    时序预测 MATLAB实现Hamilton滤波AR时间序列预测 目录 时序预测 MATLAB实现Hamilton滤波AR时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍 预测在很大程度上取决于适合周期的模型和所采用的
  • flutter 生命周期

    生命周期似乎已经成为前端框架的标配了 然后在flutter中依然有生命周期这个概念 flutter是一个组件加载到卸载的整个周期 不同的生命周期内可以做的事情都是不一样 相信使用过react vue的小伙伴应该都清楚 在更新组件的时候在相应
  • 暗影精灵跑深度学习,环境安装:ubuntu16.04+GTX1050TI+cuda10.1+cudnn+tensorflow1.13

    最近在用暗影精灵跑深度学习 基于tensorflow 随着数据量增多 CPU已经明显太慢 效率太低 所以把系统环境重新安装了一遍 搭建GPU环境 机器平台 I7 1050TI UBUNTU16 04 1 安装驱动 参考之前的一篇博文 暗影精
  • 分表和联合索引

    系统已经在线上运行了一段时间了 虽然有些小bug 但也都能快速的定位并解决 昨天讨论了二期的需求 看起来还有很长的路要走 1 分表 当某个表的记录数大于某个值 比如 一百万 时 mysql查询的效率会下降 通常这时的办法是水平分表 把记录根
  • 学习笔记:数据分析之上海一卡通乘客刷卡数据分析

    一 数据集简介 本文用到的数据集是以上海一卡通乘客刷卡数据为背景 利用Python对数据进行预处理 以Tableau对数据进行可视化 数据集共包含15772842个样本 每个样本包含7个属性 每个属性之间均已逗号分隔 属性 定义 刷卡人 用