一、背景
交通大数据是由交通运行管理直接产生的数据(包括各类道路交通、公共交通、对外交通的刷卡、线圈、卡口、gps、视频、图片等数据)、交通相关行业和领域导入的数据(气象、环境、人口、规划、移动通信手机信令等数据),以及来自公众互动提供的交通状况数据(通过微博、微信、论坛、广播电台等提供的文字、图片、音视频等数据)构成的。
现在给出了一个公交刷卡样例数据集,包含有交易类型、交易时间、交易卡号、刷卡类型、线路号、车辆编号、上车站点、下车站点、驾驶员编号、运营公司编号等。试导入该数据集并做分析。
二、任务要求
1.分别计算早上7点前和晚上10点之后的公共交通上车刷卡量;
2.绘制并输出当天各小时公交刷卡量变化的折线图;
3.构造一个乘客搭乘时间分析函数,计算各小时区间乘客的平均公交搭乘时间及其标准差;
4.绘制并输出不同类型的一卡通交易数量及其占比的饼图;
5.分别构造线路类、司机类和车辆类,将线路编号1101–1120的线路及其所对应的司机和车辆信息输出为20个txt文档,并保存到一个文件夹中;
6.分析搭载乘客情况,确定服务乘客人次最多的10个司机、10条线路和10台车辆。
三、使用步骤
1.引入库
代码如下:
1
2
3
4
|
from numpy import *
import pandas as pd
import matplotlib.pyplot as plt
from collections import counter
|
2.导入数据
代码如下:
1
2
|
# 导入csv文件
icdata = pd.read_csv( 'd:/人工智能编程语言/python - 作业4/icdata.csv' , sep = ',' , encoding = 'utf-8' )
|
3.任务一
代码如下:
1
2
3
4
5
6
7
|
# 1.分别计算早上7点前和晚上10点之后的公共交通上车刷卡量;
icdata[ '交易时间' ] = pd.to_datetime(icdata[ '交易时间' ], format = '%y/%m/%d %h:%m:%s' ) # 将字符串类型转换为datetime类型
paytime1 = icdata[icdata.交易时间 < '2018/4/1 07:00:00' ]
paytime2 = icdata[icdata.交易时间 > '2018/4/1 22:00:00' ]
print ( '早上七点前的刷卡量为:' , paytime1.交易时间.count()) # 输出在早上七点前的刷卡量
print ( '晚上十点后的刷卡量为:' , paytime2.交易时间.count()) # 输出在晚上十点后的刷卡量
print ( '\n' )
|
输出:
4.任务二
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
# 2.绘制并输出当天各小时公交刷卡量变化的折线图
timetable = []
icdata[ 'hour' ] = icdata[ '交易时间' ].dt.hour # 加多一列hour,并赋值为标准数据里的小时
time = icdata.groupby([ 'hour' ]).count() # 通过data.groupby(‘hour').count()按小时进行分组,并统计数目
timetable = time.iloc[:, 2 ] # 取出一列数据
timetable.plot() # 画出折线图
plt.rcparams[ 'font.sans-serif' ] = [ 'simhei' ] # 防止中文输出出现乱码
plt.title( '当天内各小时刷卡量' ) # 设置总标题
plt.xlabel( 'hour' ) # 设置x坐标标题
plt.ylabel( 'amount' ) # 设置y坐标标题
plt.show() # 展示折线图
del icdata[ 'hour' ] # 将hour列删除
|
输出:
5.任务三
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 3.定义一个计算乘客搭乘时间平均数和标准差的函数
def fun_time(x):
time_list = []
icdata[ 'hour' ] = icdata[ '交易时间' ].dt.hour # 加多一列hour,并赋值为标准数据里的小时
t = list (icdata[ 'hour' ]) # 将hour列取出并转换为列表
for i in range ( 200000 ):
if t[i] = = x: # 记录该小时内乘客的搭乘时间
time_list.append( abs (icdata[ '上车站点' ][i] - icdata[ '下车站点' ][i]))
aver = mean(time_list) # 计算平均数
std_t = std(time_list) # 计算标准差
print (x, '时内乘客搭乘的平均时间为:%.3f站 ' % aver, '标准差为:%.3f站' % std_t)
print ( '\n' )
# 函数实现:
a = int ( input ( "请输入一个整数代表该小时:" ))
fun_time(a) # 调用fun_time函数,传入参数a
|
输出:
6.任务四
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 4.绘制并输出不同类型的一卡通交易数量及其占比的饼图
count = counter(icdata.iloc[:, 0 ]) # 统计各刷卡类型总数
list_key = [] # 创建列表存储刷卡类型
list_value = [] # 创建列表存储刷卡总数量
print ( '不同类型的一卡通交易数量:' )
for key, value in count.items(): # 将counter类型元素分别提取到两个列表内
list_key.append(key)
list_value.append(value)
print ( '%5d' % key, ':' , value) # 输出刷卡类型及对应数量
print ( '\n' )
plt.figure(figsize = ( 6 , 6 ), dpi = 100 ) # 创建画布
colors = [ 'b' , 'r' , 'g' , 'y' ] # 设置颜色
plt.pie(list_value, labels = list_key, autopct = '%1.2f%%' ,
colors = colors, shadow = true, startangle = 150 )
# autopct='%1.2f%%' 保留2位小数
# shadow=true,startangle=150 设置阴影,角度为150度
plt.legend() # 显示图例
plt.axis( 'equal' ) # 为了让显示的饼图保持圆形,需要添加axis保证长宽一样
plt.title( '不同类型的一卡通交易数占比的饼图' ) # 添加标题
plt.show()
|
输出:
7.任务五
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# 5.分别构造线路类、司机类和车辆类,将线路编号1101–1120的线路及其所对应的司机和
# 车辆信息输出为20个txt文档,并保存到一个文件夹中;
list_line = []
for i in range ( 1101 , 1121 ): # 将20条线路的名称存进列表里
list_line.append(i)
class driver: # 构造司机类
def __init__( self ,driver):
self .driver = driver
class bus: # 构造公交类
def __init__( self ,bus):
self .bus = bus
class line: # 构造线路类
def __init__( self ): # 因为要根据线路得知司机和公交的信息,因此在线路类
self .driver = [] # 里添加两个列表分别存入司机和公交的信息
self .bus = []
def add_driver( self ,x):
self .driver.append(x)
def add_bus( self ,y):
self .bus.append(y)
line_class = [] # 列表存20条线路对应的对象
for i in range ( 1101 , 1121 ):
l = line() # 一条线路创建一个对象
for j in range ( 200000 ):
if icdata[ '线路号' ][j] = = i: # 将对应线路的司机和公交信息存入该线路对象内
l.add_driver(icdata[ '车辆编号' ][j])
l.add_bus( int (icdata[ '驾驶员编号' ][j]))
line_class.append(l)
basepath = 'd:/人工智能编程语言/task4/road_line/line' # 确定txt文件存入的路径
for i in range ( 20 ):
full_path = basepath + str (list_line[i]) + '.txt' # 加上文件名和后缀
file = open (full_path, 'w' ,encoding = 'utf-8' ) # 创建txt文件,只写
file .write( '车辆编号' )
file .write( ' ' )
file .write( '驾驶员编号\n' )
for j in range ( len (line_class[i].driver)): # 将对应线路的信息写入txt文件内
file .write( str (line_class[i].driver[j]))
file .write( ' ' )
file .write( str (line_class[i].bus[j]))
file .write( '\n' )
file .close()
|
输出:
8.任务六
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 6.分析搭载乘客情况,确定服务乘客人次最多的10个司机、10条线路和10台车辆。
drivers = counter(icdata.iloc[:, 8 ]) # 取出对应列并统计每个元素出现的次数
a = (drivers.most_common( 10 )) # 将前十个元素及出现的次数存入列表a内
print ( '服务人次最多的前十名司机及服务人数:' )
for i in range ( 10 ):
print ( '%-8d' % int (a[i][ 0 ]), ':' , '%-10d' % a[i][ 1 ])
lines = counter(icdata.iloc[:, 4 ])
b = (lines.most_common( 10 ))
print ( '服务人次最多的前十条线路及服务人数:' )
for i in range ( 10 ):
print ( '%-8d' % int (b[i][ 0 ]), ':' , '%-10d' % b[i][ 1 ])
buses = counter(icdata.iloc[:, 5 ])
c = (buses.most_common( 10 ))
print ( '服务人次最多的前十辆公交及服务人数:' )
for i in range ( 10 ):
print ( '%-8d' % int (c[i][ 0 ]), ':' , '%-10d' % c[i][ 1 ])
|
输出:
四、总结
加深了对numpy,pandas和matplotlib等第三方应用库的使用。
到此这篇关于python数据分析之公交ic卡的文章就介绍到这了,更多相关python公交ic卡内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/zy_sysu/article/details/115916351