版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/83153693

- 写在前面


  好久没更新博客了,主要还是最近太忙了。很久之前就看到B站上动态柱状图图表(用D3.js做的),详情见@Jannchie见齐的主页。感觉很不错,于是便自己也做一哈。正好前一阵子写了脚本对中国大学MOOC的课程信息进行了爬取,经过修改后弄成了定时爬虫。经过近一个月爬取,数据已经挺多的啦,可以开始类似动态展示了。

  如果需要查阅爬虫脚本的,可参见我的博客:

  中国大学MOOC课程信息爬取与数据存储

- 环境配置




  运行环境:Python3.6、Spyder

  依赖的模块:pandas、mysql等

- 开始工作


1. 数据

  从9月20日至今,已有28张表格(以爬取日期命名),每张表格中都有一两千条课程数据,如下:

2. 开源动态可视化项目

  下载开源项目

  Historical-ranking-data-visualization-based-on-d3.js

  解压打开后,可以看到示例的example文件





  步骤很简单,只需根据示例文件格式添加数据即可。对于比较复杂的设置,如添加顶部附加信息或自定义颜色等,打开config,js和visual.js进行相应修改。

  打开压缩包内的bargraph.html网页并添加待可视化的表格文件即可。

3. 获取每天选课热度前10课程

'''获取热度每天选课热度前15课程'''
def get_top_hot(quire_condition):
db = pymysql.connect(host='localhost',user='root',passwd='root',db='mooc_courses_infos',charset='utf8') #连接数据库
cur = db.cursor()
sql = 'SHOW TABLES'
cur.execute(sql) #遍历所有表格
tables= cur.fetchall()
top_hot={} #热度
for table in tables:
data=table[0][9:11]+'-'+table[0][12:14] #日期标准化
cur.execute("select course,id,stu_num from %s"% table+" where start_time like '%s'"% quire_condition+" ORDER BY stu_num desc limit 10")
result=cur.fetchall()
top_hot[data]=result
return top_hot
'''热度top10课程写入CSV表格'''
def save_csv(subject,top_hot):
all_data=() #所有数据初始化
date=[] #日期
order=[] #每日热度排名
for data in top_hot:
_order=[i+1 for i in range(len(top_hot[data]))] #每日排名编号
order.extend(_order)
all_data+=top_hot[data] #添加数据
date.extend([data for _ in top_hot[data]]) #日期
dataframe = pd.DataFrame(list(all_data)) #数据字典化
dataframe.columns = ['name','type','value'] #修改标签
dataframe['type']=order #将type列值改为每日热度的排名
dataframe['date']=date #添加日期列
path='C:\\Users\\Administrator\\Desktop\\Historical-ranking-data-visualization-based-on-d3.js-master\\src\\'
'''将DataFrame存储为csv,index表示是否显示行名,default=True'''
dataframe.to_csv(path+subject+'.csv',index=False,sep=',') #写入csv

  需要说明的是因为课程进程不一致,为了相对公正一些,我这里将其分为三类:已结束的、正在进行的、即将开始的,分别获取每日热度top10。

conditions={'已结束':'已结束%','即将开始':'%开课%','正在进行':'进行至%'}  #查询条件集
condition='已结束' #查询条件
quire_condition=conditions[condition] #SQL语句中的查询条件
top_hot=get_top_hot(quire_condition) #获取指定查询条件下所有课程热度前10
save_csv(condition,top_hot) #存入SCV表格

4. 获取指定课程门类下每天选课热度前10课程

'''获取指定门类课程名称和ID'''
def get_kc_kind(subject):
subject_ids=[]
db = pymysql.connect(host='localhost',user='root',passwd='root',db='mooc_courses_info2',charset='utf8')
cur = db.cursor()
cur.execute("select id from %s"% subject) #获取表所有课程ID
results=cur.fetchall()
for result in results:
subject_ids.append(result[0])
return subject_ids
'''获取指定门类课程的选课人数变化'''
def get_hot_by_subject(subject_ids):
subject_ids=tuple(subject_ids)
db = pymysql.connect(host='localhost',user='root',passwd='root',db='mooc_courses_infos',charset='utf8')
cur = db.cursor()
sql = 'SHOW TABLES'
cur.execute(sql) #遍历指定数据库所有表
tables= cur.fetchall()
top_hot={} #热度
for table in tables: #特定日期
data=table[0][9:11]+'-'+table[0][12:14] #日期标准化
'''查询条件:在指定门类下ID范围内;正在进行的课程;课程热度由高到低前10'''
sql2 = "select course,id,stu_num from %s"% table+" where id in (%s)" % ','.join(['%d']*len(subject_ids)) % subject_ids \
+" and start_time like '进行至%' ORDER BY stu_num desc limit 10"
cur.execute(sql2)
result=cur.fetchall()
top_hot[data]=result
return top_hot

  这里值得说的是SQL查询语句where in下变量的表达,使用了format(花了不少功夫才得以解决)。

subjects={'国家精品':'excellent_course','计算机':'computer','经济管理':'management','心理学':'psychology',
'外语':'language','文学历史':'literary_history','艺术设计':'art','工学':'engineering',
'理学':'science','生命科学':'biomedicine','哲学':'philosophy','法学':'law',
'教育教学':'teaching_method'}
_subjects=list(subjects.keys()) #课程门类中文名列表
for subject in _subjects:
subject_Eng=subjects[subject] #课程门类英文名
subject_ids=get_kc_kind(subject_Eng) #获取该门类下所有ID
subject_top_hot=get_hot_by_subject(subject_ids) #该门类下每日课程热度前10
save_csv(subject,subject_top_hot) #写入CSV

- 结果展示


1. 正在进行的所有课程每日热度前10

2. 即将开课的所有课程每日热度前10

3. 已结束的所有课程每日热度前10

4. 计算机门类下正在进行课程每日热度前10

5. 国家精品门类下正在进行课程每日热度前10

- 写在最后


  运行程序时发现挺快的,只有几秒钟,因此代码优化暂时不着急做。在绘制动态图表时,为了展示效果更好还需要学习下开源项目的代码,进行相应优化提升。另图表中有些Bug,比如有些值显示不出来,为NaN。

  最后还是非常感谢大佬的开源奉献!

MOOC课程信息D3.js动态可视化的更多相关文章

  1. 中国大学MOOC课程信息爬取与数据存储

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...

  2. 中国大学MOOC课程信息之数据分析可视化一

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82263391 9月2日更:中国大学MOOC课程信息之数据分 ...

  3. 中国大学MOOC课程信息之数据分析可视化二

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82318571 - 写在前面 本篇博客继续对中国大学MOOC ...

  4. [资料搜集狂]D3.js数据可视化开发库

    偶然看到一个强大的D3.js,存档之. D3.js 是近年来十分流行的一个数据可视化开发库. 采用BSD协议 源码:https://github.com/mbostock/d3 官网:http://d ...

  5. d3.js:数据可视化利器之快速入门

    hello,data! 在进入d3.js之前,我们先用一个小例子回顾一下将数据可视化的基本流程. 任务 用横向柱状图来直观显示以下数据: var data = [10,15,23,78,57,29,3 ...

  6. d3.js:数据可视化利器之 selection:选择集

    选择集/selection 选择集/selection是d3中的核心对象,用来封装一组从当前HTML文档中选中的元素: d3提供了两个方法用来创建selection对象: select(selecto ...

  7. d3.js:数据可视化利器之 交互行为:响应DOM事件

    selection.on:事件监听操作符 on()操作符可以添加或移除选择集中每个 DOM元素的事件监听函数: selection.on(type[,listener[,capture]]) 参数ty ...

  8. d3.js:数据可视化利器之 修改文档:DOM操作符

    style: CSS样式操作符 style()操作符用来设置或获取选择集中各DOM元素的CSS样式: selection.style(name[,value[,priority]]) style()操 ...

  9. 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)

    缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...

随机推荐

  1. django model的update时auto_now不被更新的原因

    gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """ ...

  2. 遵循统一的机器学习框架理解高斯混合模型(GMM)

    遵循统一的机器学习框架理解高斯混合模型(GMM) 一.前言 我的博客仅记录我的观点和思考过程.欢迎大家指出我思考的盲点,更希望大家能有自己的理解. 本文参考了网络上诸多资料,特别是B站UPshuhua ...

  3. element-ui中的表格嵌套表格

    element-ui中有详细的各种表格及表格方法.也有表格展开出现二级的样式,但是却没有表格嵌套二级表格的方案,于是就自己写了一个,样式图如下: 展开后如下 这就是一个普通的二级表格嵌套,用的是el- ...

  4. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

  5. 日常工作问题解决:du命令详解

    目录 1.导读 1.1 命令格式 1.2 命令功能 1.3 命令参数 2.实例 2.1 实例1:显示目录或者文件所占空间 2.2 实例2:显示指定文件所占空间 2.3 实例3:查看指定目录所占空间 2 ...

  6. [bzoj4665]小w的喜糖_二项式反演

    小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦 ...

  7. pgsql常用操作

    pgsql备份: --进入pgsql容器docker exec -it 容器ID bash --备份pgsql /opt/rh/rh-postgresql95/root/usr/bin/pg_dump ...

  8. Win10 鼠标右键新建菜单添加自定义文件

    1. 引言 在鼠标右键(右单机)新建菜单中添加自定义文件,例如:写字板,markdown等. 效果图: 2. 操作步骤(以Win10为例) 1. win+R输入regedit进入注册表 2. 这里以添 ...

  9. python-pillow图像处理模块

    from PIL import ImageColor ImageColor.getcolor('red','RGB') #颜色 模式 ImageColor.getcolor('red','RGBA') ...

  10. Python——类和对象(二)

    一.实例方法和自动绑定self 在类中定义的实例方法,Python会自动绑定方法的第一个参数(通常是self,下文也默认为self),第一个参数总会指向调用该方法的对象,因为实例方法(包括构造方法)第 ...