Stata | 自动生成中南财大2019拟录取硕士研究生分析报告
时间:2022-07-22
本文章向大家介绍Stata | 自动生成中南财大2019拟录取硕士研究生分析报告,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
又是一年考研季,今天有朋友问我去年的学校录取情况。作为一只“菜狗”,这那是我该操心的事,但我还是去官网找了下去年的结果。然而官网上拟录取名单是 PDF 格式,不方便拿来做统计分析,所以就用 Stata 顺手做了一些简单的分析工作,觉得这也为需要提供重复性报告的工作提供一种思路。具体来说,主要包括如下技术要点:
- Stata16 调用 Python 下载 PDF,转化为 Excel 表格;
- Stata 爬取学校官网的学院名单,整理和生成学院代码;
- Stata 中的
putdocx
命令制作自动化分析报告。
在开始之前,要注意使用的是 Stata 16,而且需要先安装 Python 的 pdfplumber
库;Stata 的 tbl2putdocx.ado
文件,这是来自 statalist[1] 解决 putdocx
命令中输出 tab
结果的一个解决方案。在公众号后台回复【zuledocx】可以获取我整理好的 ado
文件,之后放入 Stata 所在路径的 ./ado/plus/t
文件夹中即可。
实现过程
下载和转换 PDF 文件
python:
import requests
import pdfplumber
from openpyxl import Workbook
# 下载 PDF 文件
pdf_2019q4 = 'http://yzb.zuel.edu.cn/_upload/article/files/70/72/9a65178a4aacb5ae64daa5950b83/cf27a493-b596-4059-9c7c-ba76ba73237f.pdf'
r = requests.get(pdf_2019q4, stream=True)
with open("2019年硕士研究生拟录取名单公示.pdf", "wb") as pdf:
for content in r:
pdf.write(content)
# 提取并写入 Excel
wb = Workbook()
ws = wb.active
with pdfplumber.open("2019年硕士研究生拟录取名单公示.pdf") as pdf:
for page in pdf.pages:
for table in page.extract_tables():
for row in table:
ws.append(row)
wb.save("./data/2019年硕士研究生拟录取名单公示.xlsx")
end
下载和转换之后的数据如下:
爬取官网学院名称
因为公布的名单中学院是用三位数的代码,所以需要去官网弄到学院名称进行匹配,这样才能知道拟录取学生所对应的学院。在制作学院代码过程中,一是需要剔除不招硕士的学院,二是要和名单中的专业进行比照,确保拟录取专业和学院相对应。
copy "http://www.zuel.edu.cn/schools/" "./data/schools.txt", replace
infix strL v 1-200000 using "./data/schools.txt",clear
keep if index(v,"学院")
gen 学院 = ustrregexs(2) if ustrregexm(v,`"<option value="(.*?)" >(.*?)</option>"')
keep 学院
drop if 学院 == ""
drop if _n >= 15 & _n != 16 & _n != 17
gen 学院代码 = 100 + _n
tostring 学院代码, replace
replace 学院 = "" if 学院 == "继续教育学院"
replace 学院 = "法律硕士教育中心" if 学院 == ""
replace 学院代码 = "117" if 学院代码 == "116"
save "./data/学院代码.dta", replace
数据清理
import excel using "./data/2019年硕士研究生拟录取名单公示.xlsx",firstrow clear
* 异常值
destring 政治-总成绩, replace
misstable summarize _all // 3条异常
replace 专项计划 = "少数民族高层次骨干人才计划" if 专项计划 == "少数民族高层次骨"
replace 拟录取专业 = "金融统计、保险精算与风险管理" if 拟录取专业 == "金融统计、保险精算与风险"
drop if 考生编号 == ""
* 去除换行符
replace 拟录取专业 = usubinstr(拟录取专业," ","",.)
replace 拟录取专业 = ustrregexrf(拟录取专业,"n","")
* 匹配学院代码
merge m:1 学院代码 using "./data/学院代码.dta", nogen
order 学院* 拟录取专业
compress
save "./data/2019拟录取_不含推免_清理后.dta", replace
生成报告
use "./data/2019拟录取_不含推免_清理后.dta", clear
/* 创建文档 */
capture putdocx clear
putdocx begin
/* 标题 */
putdocx paragraph, style(Title) halign(center)
putdocx text ("中南财经政法大学2019拟录取硕士研究生分析报告"), ///
font("宋体",16,black) bold linebreak
// /* 署名和日期 */
// putdocx paragraph, halign(center) style(Subtitle)
// putdocx text ("PyStaData"), linebreak
// putdocx text ("2020 年 5 月2 日"), bold ///
// font("华文楷体", 12, black) linebreak
putdocx paragraph, style(Title)
putdocx text ("一、前言"), ///
font("黑体",14,black)
/* 文本块 */
putdocx textblock begin
本报告使用的数据来自中南财经政法大学研究生招生网公布的《2019年硕士研究生拟录取名单公示》。本文处理流程大致为:首先使用Stata16调用Python完成PDF下载和转化,随后去官网爬取和匹配学院代码、清理异常值等整理工作,
最后对拟录取人数的学院、专业和录取类型进行了简单的分析。要说明的是,研招网公布的这份名单不包括推免生,所以本报告分析对象主要是统考生,另外,本分析旨在学习Stata数据整理和文档自动化,为解决需要提供重复性报告的工作提供一种思路。
如果分析过程中的数据与实际情况存在差别,请以官网为准。
putdocx textblock end
putdocx paragraph, style(Title)
putdocx text ("二、总体分析"), ///
font("黑体",14,black)
**********************************
des,s
local N = r(N)
count if 学习方式 == "全日制"
local allday = r(N)
count if 备注 == "调剂"
local change = r(N)
count if 拟录取类别 == "定向"
local fixed = r(N)
************************************
putdocx textblock begin
据网站公布的名单,2019年拟录取的硕士研究生(不含推免)共 <<dd_docx_display:`N'>> 名。其中,有 <<dd_docx_display:`change'>> 名是调剂而来。在学习方式方面,全日制 <<dd_docx_display:`allday'>> 名,非全日制为 <<dd_docx_display:`N'-`allday'>> 名。在拟录取类别
方面,非定向为 <<dd_docx_display:`fixed'>> 名,定向为 <<dd_docx_display:`N'-`fixed'>> 名。
putdocx textblock end
putdocx paragraph
putdocx text ("拟录取人数在各学院的分布大致如下:")
tbl2putdocx 学院
putdocx paragraph
putdocx text ("各专业拟录取人数如下:")
tbl2putdocx 拟录取专业
putdocx save "./result/中南财经政法大学2019硕士拟录取研究生分析报告.docx", replace
最终的效果如下:
参考资料
[1]
statalist: https://www.statalist.org/forums/forum/general-stata-discussion/general/1398211-putdocx-command
- HDUOJ---2152
- nyoj-----D的小L
- HDUOJ---The Moving Points
- HDUOJ---------Kia's Calculation
- HDUOJ----Good Numbers
- DP较为完整的知识
- HDUOJ----The Number Off of FFF
- HDUOJ-------Naive and Silly Muggles
- HDUOJ----A Computer Graphics Problem
- HDUOJ---(4708)Herding
- HDUOJ---(4708)Rotation Lock Puzzle
- HDUOJ---Hamming Distance(4712)
- HDUOJ-----Difference Between Primes
- HDUOJ----(4706)Children's Day
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JUnit 注解@SuiteClasses的工作原理
- 使用SAP CRM Mock framework进行单元测试
- ABAP Debugging Script(调试器脚本)使用的一些实际例子
- MySQL 8.0新特性 — 事务性数据字典与原子DDL
- Python基础之面向对象-继承
- [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!
- 使用Python实现平台自动打卡
- QT学习第4天:qt点击鼠标画一条直线(附源代码和程序)
- 跨站请求伪造——CSRF
- 13-6 编辑多个文件和保存
- 汇编基础
- php 使用AMQP扩展调用RabbitMq
- 聊聊RedisTokenVisitor
- R语言几行代码拼接pdf文件
- 一次 Redis 分布式锁事故,整个项目组被扣绩效了。。。