数据分析——火车信息

任务目标

任务

1、整理火车发车信息数据,结果的表格形式为:

2、并输出最终的发车信息表

难点

1、多文件

        一个文件夹,多个月的发车信息,一个excel,放一天的发车情况

2、数据表的格式特殊

        如何分析表是一个难点

数据形式

图像呈现

文字描述

1、一张表含多辆车次信息

2、一辆车次信息分为标题(日期、车次、定员、客座率)和表格信息部分

3、表格信息部分分为x,y轴看

        横着是发车站点、发车时间、下车人数

        竖着是目标站点、到达时间、上车人数

4、图标呈现下三角趋势,因为过站无上车人数

注意:

        因为横着是上车站点,终点站没有人上车,所以横着的车次不包含终点站,是所有车次-1

        竖着的车次包含终点站——即所有车次信息

分析步骤

1、导入数据

存在问题

与原数据不同,原数据中的表头在该表的第一列中,每个属性对应的行为空值

处理方法

处理结果

结果分析

1、38列

        因为原excel表中,有车次信息到第38列,导入数据会保持表格格式完整性,所以取最大列数

        不到38的列数均为空值,需要处理

2、表格信息被存放在第一行中,还需处理

3、目标需求信息只到29列的下车人数,所以需要把有效信息抠出来

语法扩展(别人的资料)

python中pandas包使用的一个header参数_header=none-CSDN博客

2、数据处理

        2.1获取有效信息(扣表)

                2.1.1思路分析
                        1、判断车次

                              整张表包含很多车次

                              要知道哪一辆车是第几行到第几行,需要拆分

                            (即怎么判断,eg:0-33为车1,34-45为车2,······)

                         2、处理表头

                             导入的表中有很多表头,需要处理 ,把所有车次的表头抽取出来,找共同点

                             都有客座率

                        2.1.2解决方案
                                1、找表头

                                      1.1data[0] 

                                         因为数据表行列均有属性,表头均在第0列,所以先判断data[0]是第0行还是第0列

                                        1.2找到含有“客座率”的行数

语法扩展
apply()、lambda

loc()

Pandas读取某列、某行数据——loc、iloc用法总结_pandas读取某一行的数据-CSDN博客

                                1.3生成由表头信息组成的表

                                1.4批量分割+展开表

按照空格分割后得到一个表格

split()

Python知识精解:str split()方法 - 知乎 (zhihu.com)

expand参数

pandas的分列操作str.split()_pandas数据分列-CSDN博客

                                  2、生成除表头外的信息表

data=data[~ind]

                                 3、生成一趟车的数据

1、根据上车站点和上车人数所在的行(用遍历匹配)

确定每一趟列车所包含的行数,再扣其中的数据

2、找第一趟车的信息

3、重置行索引

因为之前删数据把行索引删了,出现了数据缺失,需要重置行索引

drop——删除多余的一列index

4、删除空值

重置索引后的表格为

表中30列后的值均为空值,需要删除

用空值数量进行判断,若某一列中空值数量=行数,则证明该列全为空,需要删除

5、生成完整一趟车的信息表

语法扩展
loc、iloc区别

pandas索引函数loc和iloc的区别_pandas loc与iloc区别-CSDN博客

loc基于标签索引、iloc基于位置索引

reset_index()

如何在pandas中使用set_index( )与reset_index( )设置索引 - 知乎 (zhihu.com)

3、数据分析

处理后的表

3.1取表头信息表中所需数据

3.2把表头信息与每辆车挂钩

原数据(2个表)

表头表

车次表

通过索引和步长取出需要的信息行

这样就匹配成功了

3.3、取所有站点

3.4循环所有站点取数据(用定位)

都用条件筛选

3.5整体操作(合并前面操作)

语法扩展

python dataframe是什么_Pandas 库之 DataFrame-CSDN博客

4、封装函数

5、数据导出

语法扩展
glob——查找文件

Python标准库glob模块详解_python glob-CSDN博客

tpdm——进度条

【python第三方库】tqdm简介_python tqdm库-CSDN博客

enumerate() 函数

Python enumerate() 函数 | 菜鸟教程

to_csv()

pandas的to_csv()使用方法_pandas to_csv-CSDN博客

总体代码

import warnings
warnings.filterwarnings('ignore')
import pandas as pd

path = './201501-201603/201501/20150101.xls'
data = pd.read_excel(path, skiprows=2, header=None)
data.head(50)

# 日期
dates = path.split('/')[-1][:8]

ind = data[0].apply(lambda x: '客座率' in x) # 筛选有车次信息的行数据
car_info = data.loc[ind, 0]
car_info = car_info.str.split(' ', expand=True) # 这里的得到车次、定员、客座率

car_info

# 删除车次信息行
data = data[~ind]
data.reset_index(inplace=True, drop=True)
data.head()

## 接下来:找到某一趟车所在的小表格,思路就是找到【上车站、上车人数合计】所在的行
ind = data[0].apply(lambda x: '上车站'==x or '上车人数合计'==x)
car_index = data[ind]

all_car = pd.DataFrame()
for start, end, checi, dingyuan, kezuolv in zip(car_index.index[0::2],car_index.index[1::2], car_info[0], car_info[6], car_info[8]):
    one_car = data.iloc[start:end+1, :] # 截取其中一趟车的数据
    one_car.reset_index(inplace=True, drop=True) # 重置索引
    col_ind = one_car.isna().sum(axis=0)==len(one_car) # 判断全为空的列
    one_car = one_car.loc[:, ~col_ind] # 删除空列
    station = one_car.iloc[2:-1, 0] # 取所有站点,在2至倒数第一行
    one_car_list = []
    for s in station: # 循环每个站点去取数据
        one_car_dict = {}
        one_car_dict['车次'] = checi
        one_car_dict['定员'] = dingyuan
        one_car_dict['客座率'] = kezuolv
        one_car_dict['日期'] = dates
        one_car_dict['站点'] = s
        one_car_dict['进站时间'] = one_car.loc[one_car[0]==s, 1].values[0] # 进站时间
        one_car_dict['下车人数'] = one_car.loc[one_car[0]==s, one_car.shape[1]-1].values[0] # 下车人数
        try:
            one_car_dict['离站时间'] = one_car.loc[1,one_car.iloc[0]==s].values[0] # 离站时间
            one_car_dict['上车人数'] = one_car.loc[len(one_car)-1,one_car.iloc[0]==s].values[0] # 上车人数
        except:
            one_car_dict['离站时间'] = '--' # 终点站没有出站时间和人数
            one_car_dict['上车人数'] = '--'
        one_car_list.append(one_car_dict)
    one_car_data = pd.DataFrame(one_car_list)
    break
    #all_car = pd.concat([all_car, one_car_data])
#这一步结束就能看到处理后表的信息了
    one_car_data

def get_one_file(path):
    data = pd.read_excel(path, skiprows=2, header=None) # 读数据
    dates = path.split('/')[-1][:8] # 日期
    ind = data[0].apply(lambda x: '客座率' in x) # 筛选有车次信息的行数据
    car_info = data.loc[ind, 0]
    car_info = car_info.str.split(' ', expand=True) # 这里的得到车次、定员、客座率
    data = data[~ind] # 删除车次信息行
    data.reset_index(inplace=True, drop=True)
    ## 接下来:找到某一趟车所在的小表格,思路就是找到【上车站、上车人数合计】所在的行
    ind = data[0].apply(lambda x: '上车站'==x or '上车人数合计'==x)
    car_index = data[ind]
    all_car = pd.DataFrame()
    for start, end, checi, dingyuan, kezuolv in zip(car_index.index[0::2],car_index.index[1::2], car_info[0], car_info[6], car_info[8]):
        one_car = data.iloc[start:end+1, :] # 截取其中一趟车的数据
        one_car.reset_index(inplace=True, drop=True) # 重置索引
        col_ind = one_car.isna().sum(axis=0)==len(one_car) # 判断全为空的列
        one_car = one_car.loc[:, ~col_ind] # 删除空列
        station = one_car.iloc[2:-1, 0] # 取所有站点,在2至倒数第一行
        one_car_list = []
        for s in station: # 循环每个站点去取数据
            one_car_dict = {}
            one_car_dict['车次'] = checi
            one_car_dict['定员'] = dingyuan
            one_car_dict['客座率'] = kezuolv
            one_car_dict['日期'] = dates
            one_car_dict['站点'] = s
            one_car_dict['进站时间'] = one_car.loc[one_car[0]==s, 1].values[0] # 进站时间
            one_car_dict['下车人数'] = one_car.loc[one_car[0]==s, one_car.shape[1]-1].values[0] # 下车人数
            try:
                one_car_dict['离站时间'] = one_car.loc[1,one_car.iloc[0]==s].values[0] # 离站时间
                one_car_dict['上车人数'] = one_car.loc[len(one_car)-1,one_car.iloc[0]==s].values[0] # 上车人数
            except:
                one_car_dict['离站时间'] = '--' # 终点站没有出站时间和人数
                one_car_dict['上车人数'] = '--'
            one_car_list.append(one_car_dict)
        one_car_data = pd.DataFrame(one_car_list)
        all_car = pd.concat([all_car, one_car_data])
    return all_car

from glob import glob
from tqdm import tqdm
all_path = glob('./201501-201603/*/*')
for i,path in tqdm(enumerate(all_path)):
    data = get_one_file(path)
    if i==0:
        data.to_csv('./result.csv', header=True, index=None, encoding='utf8', mode='a')
    else:
        data.to_csv('./result.csv', header=None, index=None, encoding='utf8', mode='a')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/298840.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UnityVR入门之六 如何让3DUI层级在场景模型之上

一、问题来源 根据 UnityVR入门之五 射线检测交互-CSDN博客 这一章节我们了解到VR要与UI交互需要将Canvas设置为World Space属性,然后使用碰撞盒的方式进行射线交互。 正常我们ui是始终叠加在3d场景之上的,如此设置当ui与场景模型相交就会遮挡穿模 二、解…

git常用命令及概念对比

查看日志 git config --list 查看git的配置 git status 查看暂存区和工作区的变化内容(查看工作区和暂存区有哪些修改) git log 查看当前分支的commit 记录 git log -p commitID详细查看commitID的具体内容 git log -L :funcName:fileName 查看file…

el-form点击提交后把验证失败的数据传给了后端

问题&#xff1a;版本号需要根据后端返回的结果查看是否可用&#xff0c;在这里1.0.0是不可用的&#xff0c;如果点击其他地方则会报红&#xff0c;可是直接点击提交&#xff0c;则会把1.0.0这个错误的数据也提交给后端。 解决方案&#xff1a; html代码&#xff1a; <el…

Flume基础知识(十):Flume 聚合实战

1&#xff09;案例需求&#xff1a; hadoop100上的 Flume-1 监控文件/opt/module/group.log&#xff0c; hadoop101上的 Flume-2 监控某一个端口的数据流&#xff0c; Flume-1 与 Flume-2 将数据发送给 hadoop102 上的 Flume-3&#xff0c;Flume-3 将最终数据打印 到控制台。…

【Pytorch】学习记录分享11——GAN对抗生成网络

PyTorch GAN对抗生成网络 0. 工程实现1. GAN对抗生成网络结构2. GAN 构造损失函数&#xff08;LOSS&#xff09;3. GAN对抗生成网络核心逻辑3.1 参数加载&#xff1a;3.2 生成器&#xff1a;3.3 判别器&#xff1a; 0. 工程实现 原理解析&#xff1a; 论文解析&#xff1a;GAN…

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道&#xff0c;app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦&#xff0c;动不动就是用appium写代码脚本维护什么的&#xff0c;不仅步骤繁琐&#xff0c;环境配置方面也是繁琐无比&#xff0c;动不动就与客户…

云计算:OpenStack 分布式架构管理VXLAN网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.各节点新增网卡准备VXLAN网络 3.控制节点配置私有网络 4.计算节点1配置私有网络 5.计算节点2配置私有网络 6.重启服务 7.修改Dashboard 8.新建项目&#xff08;租户&#xff09;及用户 9.新建网络与子网 10.新建实例 11.新建路由 12.新增浮…

【机器学习】循环神经网络(二)-LSTM示例(keras)国际航空乘客问题的回归问题...

使用 Keras 在 Python 中使用 LSTM 循环神经网络进行时间序列预测 国际航空乘客问题的回归问题 这个文件是一个CSV格式的数据集&#xff0c;它包含了从1949年1月到1960年12月的每个月的国际航空乘客的总数&#xff08;以千为单位&#xff09;。第一行是列名&#xff0c;分别是&…

贯穿设计模式-享元模式思考

写享元模式的时候&#xff0c;会想使用ConcurrentHashMap来保证并发&#xff0c;没有使用双重锁会不会有问题&#xff1f;但是在synchronize代码块里面需要尽量避免throw异常&#xff0c;希望有经验的同学能够给出解答&#xff1f; 1月6号补充&#xff1a;没有使用双重锁会有问…

Robot Operating System 2: Design, Architecture, and Uses In The Wild

Robot Operating System 2: Design, Architecture, and Uses In The Wild (机器人操作系统 2&#xff1a;设计、架构和实际应用) 摘要&#xff1a;随着机器人在广泛的商业用例中的部署&#xff0c;机器人革命的下一章正在顺利进行。即使在无数的应用程序和环境中&#xff0c;也…

Python爬虫-大麦网演出数据和票价数据

前言 本文是该专栏的第14篇,后面会持续分享python爬虫干货知识,记得关注。 本文以大麦网为例,获取大麦网全部的演出数据以及对应的票价数据。示例图如下所示: 如上图所示,笔者将在本文详细介绍通过python爬虫去获取全国的“演唱会,话剧歌剧,体育比赛,儿童亲子”等等以…

Odoo | Module | 统计系统周期使用人数/当前在线人数

文内材料 GITHUB地址 前言介绍 Odoo作为开源ERP系统的No.01,近年愈发的得到国内很多公司的关注。 虽然它的定位是中小型企业的ERP管理系统&#xff0c;但是在几年的Odoo开发实施过程中&#xff0c;有不足50人的小型企业&#xff0c;也有上万人的中大型企业。功能快速落地和…

即时设计:设计流程图,让您的设计稿更具条理和逻辑

流程图小助手 在设计工作中&#xff0c;流程图是一种重要的工具&#xff0c;它可以帮助设计师清晰地展示设计思路和流程&#xff0c;提升设计的条理性和逻辑性。今天&#xff0c;我们要向您推荐一款强大的设计工具&#xff0c;它可以帮助您轻松为设计稿设计流程图&#xff0c;让…

c#调试程序一次启动两个工程(多个工程)

概述 c# - Visual Studio : debug multiple projects at the same time? 以在解决方案中设置多个启动项目(右键单击解决方案&#xff0c;转到设置启动项目&#xff0c;选择多个启动项目)&#xff0c;并为包含在解决方案(无、开始、不调试就开始)。如果您将多个项目设置为开始…

IDEA TODO

今天记录一个 IDEA 工具的小技巧&#xff0c; TODO。比如下班前有一个小功能没完善好&#xff0c;此时可以在响应代码上加上 TODO 注解&#xff0c; //密码比对 // TODO 后期需要进行md5加密&#xff0c;然后再进行比对 password DigestUtils.md5DigestAsHex(password.getByt…

Jenkins修改全局maven配置后不生效解决办法、以及任务读取不同的settings.xml文件配置

一、修改Global Tool Configuration的maven配置不生效 说明&#xff1a;搭建好jenkins后&#xff0c;修改了全局的settings.xml&#xff0c;导致读取settings一直是之前配置的。 解决办法一 Jenkins在创建工作任务时&#xff0c;会读取当前配置文件内容&#xff0c;固定在这…

【Leetcode】230. 二叉搜索树中第K小的元素

一、题目 1、题目描述 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例1: 输入:root = [3,1,4,null,2], k = 1 输出:1示例2: 输入:root = [5,3,6,2,4,null,null,1], k = 3 输出:3提示: 树中…

关于CNN卷积神经网络与Conv2D标准卷积的重要概念

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 深入解读卷积网络的工作原理&#xff08;附实现代码&#xff09; 深入解读反卷积网络&#xff08;附实现代码&#xff09; Wavelet U-net进行微光图像处理 卷积知识点 CNN网络的设计论&#xff1a;NAS vs Handcra…

【数据库】视图索引执行计划多表查询面试题

文章目录 一、视图1.1 概念1.2 视图与数据表的区别1.3 优点1.4 语法1.5 实例 二、索引2.1 什么是索引2.2.为什么要使用索引2.3 优缺点2.4 何时不使用索引2.5 索引何时失效2.6 索引分类2.6.1.普通索引2.6.2.唯一索引2.6.3.主键索引2.6.4.组合索引2.6.5.全文索引 三、执行计划3.1…

【leetcode】字符串中的第一个唯一字符

题目描述 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 用例 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例 3: 输入: s “aabb”…
最新文章