前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python替代Excel Vba"系列(四):课程表分析与动态可视化图表

Python替代Excel Vba"系列(四):课程表分析与动态可视化图表

作者头像
咋咋
发布2021-09-01 15:24:57
1.6K0
发布2021-09-01 15:24:57
举报

系列文章

  1. "替代Excel Vba"系列(一):用Python的pandas快速汇总
  2. "Python替代Excel Vba"系列(二):pandas分组统计与操作Excel
  3. "Python替代Excel Vba"系列(三):pandas处理不规范数据

前言

前一节我们已经成功把一份教师课程表整理成规范的形式,本节我们就看一下怎么利用这份数据得到一些信息。并且尽可能让每个部分都有可视化输出。

本文要点:

  • 使用 pandas 快速按需求做汇总整理。

注意:虽然本文是"Python替代Excel Vba"系列,但希望各位读者明白,工具都是各有所长,选择适合的工具,才是最好的。


案例

这次的数据是基于上一节已整理的教师课程表。如下图:

  • 表中的一行表示 某一天的某课时是哪位教师负责的哪门科目。
  • 这里的名字按照原有数据做了脱敏(teach 列)。

本文所用到的 pandas 技巧都在之前的章节已有详细介绍,因此本文只对重点细节做讲解



设定问题

本文的目标问题如下:

  • 科目的分配情况如何?
  • 教师的课时分配如何?


导入包

本文所需的包,安装命令如下:

pip install pandas
pip install numpy
pip install pyecharts

建议你安装 anaconda ,那么最难安装的 pandas 和 numpy 都不会是问题。


脚本中导入

  • 本文使用 pyecharts 做可视化输出


加载数据

代码如下:

  • 这次直接从 csv 文件读取即可。


主科目占比

要看主科目占比,那么首先根据科目划分主次科目。如下:

  • df['sj'].apply(lambda x: '语数英' if x in cond else '其他') ,根据科目列,划分为"语数英"或"其他"
  • 把划分结果添加的新列 sj_class 。


现在数据如下:


现在可以看看主科目的数量。我们把汇总问题的主键列出,利用 pandas 的 groupby 方法即可快速做汇总。 如下:

  • df.groupby(['sj_class']) ,按 sj_class 分组。
  • .size() ,即可求得每组的个数。这里使用 count 也可以,但你会注意到使用 count ,pandas 会把所有列都进行计数。并且 count 会忽略 nan ,而 size 则不会。
  • .reset_index() ,调用 groupby 后,分组的 sj_class 会作为 index ,因此这里只是把 sj_class 重新设置为列。

来看看实际占比吧。

上述2次汇总其实是可以定义为一个通用的方法。这里是为了方便解析因此复制了2段差不多的代码



按班级看科目占比

只是看整体的占比情况不太可以了解数据。我们试试再深入一些维度去看看数据。 看看每个级别的主科目占比情况。如下:

  • 这次我们的汇总主键是 级别和主科目。
  • 可以看到其实与之前的流程基本一致,只是在分组时加上了 grade 字段。

看看图表吧:

  • 可以看到五年级的语数英课时占比最大(为什么不是六年级的主科目占比最大?)。
  • 七、八年级语数英没有其他科目占比大(初一初二语数英课时减少了?)。


教师分配情况

来个复杂一点的需求,看教师分配情况,我们设定如下要求:

  • 每位教师的上下午课时数量,并且按课时数量排序。
  • 每位教师每天的上下午课时数量,并且按课时数量排序。


首先,每位教师的上下午课时数量。主键是 教师和上下午。 代码如下:

  • 分组汇总与之前的一致。只是主键不同而已。
  • res.groupby('teach')['value'].transform('sum') ,求出每位教师的总课时
  • res['total'].rank(ascending=False) ,做一个排名。


这里重点说一下这段代码:

  • 这里为了做图表,需要确保每位教师都有上午和下午2行数据。但实际数据中有些教师只有半天的课(如下图的教师 n56)。

  • .set_index(['teach','apm']) ,先让 teach 和 apm 做行索引。
  • 此时 apm 行索引中都有上午和下午的值。
  • .unstack() ,把 apm 从行索引移到列索引。那么就会有 上午列 和 下午列。
  • 注意此时,如果一位教师只有下午的课,那么此列他的值就为 nan。

  • .stack(dropna=False) ,把 apm 从列索引移回去行索引,dropna=False ,让其保留 nan 的值。
  • 此时即可确保所有的教师都有上下午2行数据。


直接看可视化吧:

  • 上图可以看出来,n4 这教师是最多课时(20课时)
  • 大部分的教师都是上午比下午课时多(这很可能是因为本来下午的课时就比上午少啊)- 有4位教师只有下午有课。


再看看每天分别是哪位教师比较忙的。

  • n4 这位教师星期二下午就完全没有课时。

上述2次汇总其实是可以定义为一个通用的方法。这里是为了方便解析因此复制了2段差不多的代码


最后

本文重点

  • 从分析问题出提取主键,使用 groupby 即可快速得到数据。
  • 灵活运用 stack 与 unstack ,可以快速做一些数据增补。

[源码地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/excel_pandas/4)

请关注本号,后续会有更多相关教程。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系列文章
  • 前言
  • 案例
  • 设定问题
  • 导入包
  • 加载数据
  • 主科目占比
  • 按班级看科目占比
  • 教师分配情况
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档