查看原文
其他

相遇insobs,如暗室逢灯

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:余术玲

文字编辑:朱巧利

技术总编:李朋冲


在推文《小命令,大不同——insobs插入新值》中,我们介绍了insobs命令的妙用之处,小编当时对insobs就有种相见恨晚的感觉。前段时间小编在查看中国会计事务所注册会计师信息时,遇到一些变量数据缺失的情况,如果不插入空格,会在后续转置数据时出现数据错位,这个时候insobs命令简直给小编雪中送炭!今天小编提供这个案例让大家小试牛刀!跟着小编一起操作一下吧!

 

我们以中勤万信会计师事务所注册会计师陈明生的个人信息为例,网页信息如下图所示:


细心一点会注意到全科合格证书号全科合格年份对应的信息缺失,在用Stata处理这种缺失信息时,insobs就能派上用场。话不多说,我们把网页源代码读进Stata里操作一下~

界面网址为:http://cmispub.cicpa.org.cn/cicpa2_web/07/0000010F849F5574427C1C9AEB72116F.shtml,我们首先获取源代码,然后导入Stata,对其进行数据清理:


clear allefolder 注册会计师个人信息, cd(d:/)
cap copy "http://cmispub.cicpa.org.cn/cicpa2_web/07/0000010F849F5574427C1C9AEB72116F.shtml" temp.txt, replace //抓取网页源代码****当抓取不成功时,休息五秒再次抓取while _rc !=0 {sleep 5000cap copy "http://cmispub.cicpa.org.cn/cicpa2_web/07/0000010F849F5574427C1C9AEB72116F.shtml" temp.txt, replace} infix strL v 1-10000 using temp.txt, clearreplace v = ustrfrom(v,"gb18030",1)


网页源代码的截图如下:



我们观察到,需要的信息被定位在首个“<tdcolspan="8">”标签与“<!--中部表格结束-->”标签之间。找到界定标签,我们就可以用正则表达式提取我们想要的信息啦!程序如下: 

*****用界定标签保留我们想要的信息*****gen m = ustrregexm(v,`"<td colspan="8" class="table_header">"') gen m1 = sum(m)drop if m1 == 0gen m2 = ustrregexm(v,`"<!--中部表格结束-->"')gen m3 = sum(m2)keep if m3 == 0keep v
*****删除尖括号和里面的内容以及标签“<!--”与“-->”之间的信息*****drop if ustrregexm(v,`"<.+?>"') gen m4 = ustrregexm(v,`"<!--"')gen total1 = sum(m4)gen m5 = ustrregexm(v,`"-->"')gen total2 = sum(m5)gen total3 = total1 + total2drop if total3 == 1drop if ustrregexm(v,`"-->"')keep v
******继续删除我们不需要的观测值*****drop if ustrregexm(v,"基本信息|通过领军人才后备队伍选拔测试年份|领军人才年份|通过中国注册会计师全国统一考试英语测试年份|英语测试年份|执行业务信息|受教育信息|资格取得信息|考试信息|注册信息|综合信息|考核信息") //以上均为标题drop in 1 //删除首行空值drop if v == "" //删除其余空行replace v=ustrregexra(v,"&nbsp;","")


下面我们生成错行变量v1v1的第n个观测值是变量v的第n+1个观测值,然后保留奇数行,再进行转置:


gen v1 = v[_n+1]keep if mod(_n,2) == 1


转置以后,我们要使用nrow命令把第一行观测值变为变量名,这时,包含“/”的观测值会被转换成_var,在此,我们需要提前把“/”全部替换成


replace v = subinstr(v, "/", "或", .) replace v = ustrregexra(v, `"&nbsp;"', "")sxpose,clearnrowsave 陈明生.dta, replace
结果如图所示:



由前面网页信息可知,全科合格证书号全科合格年份对应的应该是缺失信息,在这里却出现了错误。这是因为我们在执行上述代码时把所有空行都删除了。所以现在我们就需要借助insobs在特定位置插入空行,即在gen v1 = v[_n+1]这一行程序之前使用insobs。程序及注释如下:
 
空行全部删除后,如果第k1个观测值是全科合格证书号,且第k1+1个观测值是全科合格年份,说明全科合格证书号对应的信息有缺失,此时应该在第k1个观测值后面插入一个空行:


forvalues k1 = 1/`=_N'{ if ustrregexm(v[`k1'],"全科合格证书号") & ustrregexm(v[`k1'+1],"全科合格年份") { insobs 1,after(`k1') }}

如果第k2个观测值是“全科合格年份”,且第k2+1个观测值是注册会计师证书编号,说明全科合格年份对应的信息有缺失,此时应该在第k2个观测值后面插入一个空格行:

forvalues k2 = 1/`=_N'{ if ustrregexm(v[`k2'],"全科合格年份") & ustrregexm(v[`k2'+1],"注册会计师证书编号"){ insobs 1,after(`k2') } }  

如果还有其他信息有缺失,可借鉴上述两种情况的填补空行办法进行处理。

 

最后再执行gen v1 = v[_n+1]及其以后的程序,运行结果如下图所示:



这样我们就得到了与原始网页信息相符的数据啦!

怎么样,insobs有木有很amazing呢!结合循环为数据插入观测值,赶紧用这个案例练练手吧! 


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

数据可视化之地理坐标系

SFI:Stata与Python的数据交互手册(一)
Stata模拟构建朋友圈
一个粉丝的疑惑—— local和scalar
新的一年,效率满满~(下)

自科基金项目信息爬取

rename group批量修改变量名

小命令,大不同——insobs插入新值

新的一年,效率满满~(上)

圆蛋快乐
BvD最后一弹——宏观数据宝典
一招搞定并购数据
多图“预警”(二)

您的圣诞礼物到了,请注意查收

BvD数据库介绍之Oriana

frlink:让连接更具“目的性”

多图“预警”(一)

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存