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

人工智能36

一、数据集简介

  • 本文用到的数据集是以上海一卡通乘客刷卡数据为背景,利用 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. 从字段"公共信息交通"中提取"轨道交通线路"以及"地铁站"信息

  2. apply()函数用于当函数参数已经于一个元组或字典中时存在,直接地调用函数。 apply()的返回值就是 func()的返回值;

  3. 调用函数 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. 读取上海地铁站经纬度信息数据

  2. 利用 apply()及信息函数,从字段"轨道交通"中提取"轨道交通线路"信息。

  3. 调用数据框对象的函数 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. 信息扩展

  2. 为了提高数据可视化的效果,我们将地铁站的经纬度信息与时间信息交叉连接,形成轨道交通地图所需的空数据集;用上述聚合卡数据进行伪空数据集,使地图上可见的中等轨道交通线始终存在,而不会造成轨道交通的缺陷。

    [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下载安装详细步骤

相关文章
边缘计算:客户端 + 人工智能 人工智能

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

有人说人工智能会是继互联网之后的下一次工业革命,不可否认,大到汽车、小到手表,AI技术已经广泛应用在我们周围,随便一个APP都试图跟AI发生点关系以证明自己的与时俱进。 AI的普及为客户端开发带来了挑...
hanlp安装 人工智能

hanlp安装

HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识...
P-tuning v1 v2 人工智能

P-tuning v1 v2

GPT Understands, Too (P-tuning) 根据训练目标,预训练语言模型能够划分为三种类型: 1. 单向语言模型:GPT,用于自然语言生成任务 2. 双向语言模型:BERT,用于自...
基于巴法云平台的天猫精灵控制开关 人工智能

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

天猫精灵已经出来很久了,因为他的语音识比较精准,所以很多智能家居的开发者想通过天猫精灵来控制一些家电。于是天猫精灵,小度音响等一些列具有语音识别功能的音响问世。我了解到的最多的还是支持天猫精灵和小度音...