python数据分析之公交IC卡刷卡分析
作者:我叫你一声你敢答应吗? 发布时间:2022-02-10 02:23:56
标签:python,公交IC卡,数据分析
一、背景
交通大数据是由交通运行管理直接产生的数据(包括各类道路交通、公共交通、对外交通的刷卡、线圈、卡口、GPS、视频、图片等数据)、交通相关行业和领域导入的数据(气象、环境、人口、规划、移动通信手机信令等数据),以及来自公众互动提供的交通状况数据(通过微博、微信、论坛、广播电台等提供的文字、图片、音视频等数据)构成的。
现在给出了一个公交刷卡样例数据集,包含有交易类型、交易时间、交易卡号、刷卡类型、线路号、车辆编号、上车站点、下车站点、驾驶员编号、运营公司编号等。试导入该数据集并做分析。
二、任务要求
1.分别计算早上7点前和晚上10点之后的公共交通上车刷卡量;
2.绘制并输出当天各小时公交刷卡量变化的折线图;
3.构造一个乘客搭乘时间分析函数,计算各小时区间乘客的平均公交搭乘时间及其标准差;
4.绘制并输出不同类型的一卡通交易数量及其占比的饼图;
5.分别构造线路类、司机类和车辆类,将线路编号1101–1120的线路及其所对应的司机和车辆信息输出为20个txt文档,并保存到一个文件夹中;
6.分析搭载乘客情况,确定服务乘客人次最多的10个司机、10条线路和10台车辆。
三、使用步骤
1.引入库
代码如下:
from numpy import *
import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
2.导入数据
代码如下:
# 导入csv文件
ICdata = pd.read_csv('D:/人工智能编程语言/Python - 作业4/ICData.csv', sep=',', encoding='utf-8')
3.任务一
代码如下:
# 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.任务二
代码如下:
# 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.任务三
代码如下:
# 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.任务四
代码如下:
# 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.任务五
代码如下:
# 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.任务六
代码如下:
# 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等第三方应用库的使用。
来源:https://blog.csdn.net/zy_sysu/article/details/115916351


猜你喜欢
- 修改密码://选择数据库use mysql;//修改密码update user set password=password('新密码
- 1、说明拼接文件路径,可以有多个参数。2、语法os.path.join(path1,path2,*)path1 初始路径。path2 需要拼
- 当在函数中定义默认值时,值初始化只会进行一次,就是执行到def methodname时执行。看下面代码:from datetime impo
- 最近发现session的知识有点脱节了,默认设置愣是搞半天,看来忘了不少。今天把一些通用设置贴上来,以备随时回顾。配置文件中设置默认操作(通
- 目前市面上成熟的CMS产品有很多,无外乎两种解决方案:第一种就是用XSL+XML的方式来实现客户端具体数据;第二种是生成HTML或者SHTM
- digo工具地址:https://github.com/werbenhu/digo特性使用注释中的注解自动代码生成自动检测循环依赖编译时期依
- 前言写 Python 的经常要写一些命令行工具,虽然标准库提供有命令行解析工具 Argparse,但是写起来非常麻烦,我很少会使用它。命令行
- 1、打开本地企业管理器,先创建一个SQL Server注册来远程连接服务器端口SQL Server。步骤如下图:图1:2、弹出窗口后输入内容
- 下午有个朋友问json 数据怎么分页 就捣鼓了一个东东出来下面直接代码:<!DOCTYPE html PUBLIC "-//
- 我们做WEB程序开发过程中,经常会为了表格Table中的cellSpacing,cellpadding等样式的设置发愁,经常没有办法可想了,
- 从网上找了很多django单元测试的案例,感觉不是很好用,于是自己写了一套测试方法,在测试环境我们只需要传uri 、请求方式、参数即可
- 微信小程序分享效果:js代码:page({/** * 用户点击分享按钮或右上角分享 */ onShareAppMessage: functi
- 和大多数的语言脚本一样,学习ASP最好的方法就是亲身尝试ASP,使用你自己的系统安装PWS或者IIS。你可以边学习边在你自己的服务器上测试A
- 前言注意:网上很多教程说需要在build目录下的dev-server.js文件中配置,但目前最新的vue-cli是没有dev-server.
- 依赖模块xlwt下载:pip install xlwt后台模块view.py# 导出Excel文件def export_excel(requ
- python中的集合什么是集合?集合是一个无序的不重复元素序列常用来对两个列表进行交并差的处理集合与列表一样,支持所有数据类型集合与列表的区
- 问题查询了很多网上的文章,连接远程服务器调试基本上都是本地复制一个代码文件夹调试好后再部署到服务器上,这就很麻烦,(作为一个懒人)我想直接打
- 最近小编思维发散“Visual Studio可以集成chatgpt吗?”,这样不就可以让chatgp
- //创建成绩表 create table result( stu_
- 之前遇到一个场景是这样的:我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A