出人意料!这所大学的A级学科总数竟超越清华北大!
本文作者:张雷豪,中南财经政法大学统计与数学学院
本文编辑:万 浩
技术总编:孙一博
Stata&Python云端课程来啦!
为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程、Stata基础课程、Stata进阶课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~
要想爬取网页信息,首先,我们可以看一下第四轮学科评估结果的网页。
先查看网页源代码,发现源代码中没有想要提取的内容,于是进入开发者模式“Network”寻找,最终锁定了包含所需信息的链接"http://www.cdgdc.edu.cn/webrms/pages/Ranking/xkpmGXZJ2016.jsp?yjxkdm=01",同时,我们也发现了不同网页的规律,也就是在链接"jsp?xkdm={}"中的两位数字代表学科大类,如人文社科类为01~06、理学07、工学08、农学09、医学10等等。不过,针对某一个学科大类,里面又存在具体的学科门类,仅仅这一个规律并不能具体到学科门类。例如在人文社科类类别中,分为0101哲学、0201理论经济学、0202应用经济学、0301法学等等。因此小编继续探索,发现如果在"jsp?xkdm={}"中填写四位学科代码的数字,就可以得到具体到学科门类的数据。而如何获得四位的学科代码呢,方法就是先读取学科大类的网页内容,再使用df_list[1]得到包含学科代码的列表,具体程序如下。
import pandas as pd
import matplotlib.pyplot as plt
def get_yjxkdm():
xkdm = {'人文社科类': '01,02,03,04,05,06',
'理学': '07',
'工学': '08',
'农学': '09',
'医学': '10',
'管理学': '12',
'艺术学': '13'}
for key, value in xkdm.items():
url = 'http://www.cdgdc.edu.cn/webrms/pages/Ranking/xkpmGXZJ2016.jsp?xkdm={}'.format(value)
df_list = pd.read_html(url)
yjxkdm_string = df_list[1].iloc[0, 0]
yjxkdm_string = [x for x in yjxkdm_string.split(' ') if x != '']
yjxkdm_num = [x for x in yjxkdm_string if x.isnumeric()]
yjxkdm_text = [x for x in yjxkdm_string if not x.isnumeric()]
xkdm[key] = (value, dict(zip(yjxkdm_num, yjxkdm_text)))
return xkdm
得到的部分结果如下:
有了上面的字典,就相当于有了网页链接,接下来就可以读取网页合并数据,将列表命名评估结果、学校代码、学校名称、学科代码、学科名称和学科大类。具体命令如下:
def get_data(xkdm):
data = []
for key_xkdm, value_xkdm in xkdm.items():
yjxkdm = value_xkdm[1]
for key_yjxkdm, value_yjxkdm in yjxkdm.items():
url = 'http://www.cdgdc.edu.cn/webrms/pages/Ranking/xkpmGXZJ2016.jsp?yjxkdm={}&xkdm={}'.format(key_yjxkdm, value_xkdm[0])
df_list = pd.read_html(url)
df = df_list[-1]
tmp_df = df.loc[:, 1].str.split('(?<=[0-9]) ', expand = True)
df = pd.concat([df.drop(1, axis = 1), tmp_df], axis = 1)
df.columns = ['评估结果', '学校代码', '学校名称']
df['学科代码'] = key_yjxkdm
df['学科名称'] = value_yjxkdm
df['学科大类'] = key_xkdm
data.append(df)
data = pd.concat(data)
return data
程序得到的表格是人文社科类哲学学科的一部分:
得到全部数据后,小编就需要进行数据清洗。按照自己的需要,小编需要把各个学校所得到的A+、A、A-、B+、B、B-、C+、C、C-的学科数目加总起来。程序如下:
def clean_data(data):
school_list = []
for school, slice_df in data.groupby('学校名称'):
sub_num = slice_df.shape[0]
school_dict = {'学校名称': school, '参评学科总数': sub_num}
school_dict.update(slice_df.value_counts('评估结果'))
school_list.append(school_dict)
school_list = [pd.DataFrame(x, index = [0]) for x in school_list]
school_df = pd.concat(school_list)
school_df = school_df.sort_values('参评学科总数', ascending = False)
return school_df
最后得到的是461行的数据,即有461个高校参与学科评估,不过此处只展示部分结果:
如果我们对A级学科的总数前十名画堆积图,A+的数量放在最下方,A和A-的数目分别堆积在上面,具体程序如下 :
def plot(df):
df_A = df.loc[:, ['学校名称', 'A+', 'A', 'A-']]
df_A['A类学科总数'] = df_A.loc[:, ['A+', 'A', 'A-']].sum(axis = 1)
df_A = df_A.sort_values('A类学科总数', ascending = False)
tmp_df = df_A.iloc[:10, :]
plt.figure(dpi = 200)
plt.rcParams['font.sans-serif'] = ['SimHei']
for i in [1, 2, 3]:
height = tmp_df.iloc[:, 1:4].iloc[:, i-1]
bottom = tmp_df.iloc[:, 1:4].cumsum(axis = 1).iloc[:, i-1]-height
bar = plt.bar(tmp_df.iloc[:, 0], height = height, bottom = bottom)
#plt.bar_label(bar)
plt.xticks(rotation = 45)
plt.ylabel('学科数')
plt.title('A级学科数')
plt.legend(['A+', 'A', 'A-'])
plt.show()
腾讯课堂课程二维码
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
Stata数据读入——打开方式不同?
数据类型——Dict、Set与Frozenset简析
Stata小贴士之外部命令安装路径
有一种夏天叫做宫崎骏的夏天
换装术|多个Excel文件如何一键转为dta格式
【基础篇】Python可变对象与不可变对象
Stata绘图系列——细节掌控绘图区域!
4月A股的收官战之概念板块哪家强?解放双手!你必须要会的两个命令—inlist & inlist2
【基础篇】字符串之判断方法
Stata绘图系列——让你的直方图随心所欲
【爬虫篇】湖人无缘季后赛,球迷如何回应
客官,要来份四象限图吗?
Python实现简繁体转换
Stata与Python交互方法及数据传递
“青铜”爬“王者”
留下想要的变量,你会几种方法?
【爬虫篇】基于selenium爬取美团评论
双标的莱万——足球无关政治?!
Stata处理重复值:duplicates
It's time to send a flower to your lover! 2021各省GDP新鲜出炉爬虫实战-采集全国各省疫情数据
log——为你的操作保驾护航
一行代码教你玩转emoji
票房遇冷的春节档口碑冠军丨《狙击手》影评分析
学习丰县,营造良好营商环境!
大国丢娃图:从川渝到徐州!
丰县“失火”,殃及徐州:股市超跌近30亿!
Unicode转义字符——编码与解码
徐州!徐州!
B站弹幕爬虫——冬奥顶流冰墩墩&雪容融
不会用Stata做描述性统计表?so easy!
丰沛之地:备足姨妈巾
过年啦,用Python绘制一幅属于你的春联吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。