查看原文
其他

ftools命令——畅游大数据时代的加速器

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

本文作者:周宏杰

文字编辑:张馨月

技术总编:张计宝

在往期推文中,介绍了collapsemerge等命令,这些命令在中小级别数据集中有着卓绝的效果。但是随着数据量的增加,这些命令的处理速度会越来越慢。显然,在大数据时代,这些命令是无法完美满足人们的需求的。那么,Stata在大数据时代该何去何从呢?为了Stata能够迎合时代潮流,大牛们开发了一些应用于大数据的Stata命令。在本文中,将介绍其中一个命令——ftools

 

一、ftools命令的工作机制


collapsemerge等命令在大数据中运行速度较慢,是因为它们依赖于sortbysort等排序命令。在中小数据集中,对数据进行排序是简单的,但是对大数据直接排序所需的时间是难以忍受的。因此,在大数据中,提升运行速度的前提是避开sort或者bysort命令的使用。为此,ftools采取了具有线性探索法的哈希表来替代bysort

哈希表是根据关键码值来直接访问的数据结构。将容易查找的数组和容易增减的链表的结合起来,只用通过把关键码映射到表中的一个位置,就得到了查找容易,插入删除也容易的哈希表。

实际上,ftools并不是单纯Stata命令,它可以分成两个部分。一部分是处理因子变量或者分类变量的Mata类型(这也是ftools名字的来源,factor tools),另一部分是基于该Mata类型的一系列已经封装好的Stata命令。本文主要介绍第一部分Mata类型,第二部分封装好的命令将在后续推文中介绍。

 

二、ftools命令的语法及常用选项


首先,ftools是个外部命令,需要通过“sscinstall ftools”进行安装同时,需要通过“ssc install moremata”、“ssc install boottest”安装moremataboottest命令,以便ftools更好地运行。需要注意的是,为了直接使用Mata函数,需要运行”ftools,compile”语句。

然后,需要声明因子变量,此时根据三种情况进行选择如何指定分类变量为因子变量,基本语法如下:

1.若分类变量不存在Mata中,直接从分类变量中指定一个变量名
F = factor(varnames)
2.若分类变量已经在Mata中,可以指定包含着分类变量的矩阵data为因子变量
F = _factor(data)
3.可以将两个已经创建好的因子变量合成一个:
F = join_factors(F1, F2)


ftools命令选项的简要介绍:
ftools命令的属性
(1) F.num_levels:因子变量的水平(不同值)个数
(2) F.num_obs:用去创建因子变量的样本的观察值数量
(3) F.counts:每个水平的频数
(4) F.levels:将变量的值映射为水平值
ftools命令的主要方法
(1) F.panelsetup():计算辅助向量F.infoF.p
使用F.panelsetup()后的方法和属性
(1) F.p:根据F.levels进行排序
(2) F.sort(data):对data进行排序,顺序为F.p的顺序
(3) F.info:返回一个位置二维矩阵,第一列是各个水平的开始位置,第二列是各个水平的结束位置。

 

三、ftools命令的用法示例


1、分组编号

在大数据中,Stata根据不同变量进行分组编号是比较困难的,此时用ftools命令编号速度会快很多。接下来用Stata自带的数据集auto来展示根据foreignmpg分组编号得到各组编号id变量的过程,具体命令如下所示:

sysuse auto, clearlistmata: F = factor("foreign mpg")mata: F.store_levels("id")list

结果如下图所示:

2、比较ftoolsunique命令计算变量的唯一值数量

一般情况下,可以使用外部命令unique”ssc installunique”)来计算变量的唯一值的数量,但是该命令在大数据中比较慢,此时可以使用ftools命令中的F.num_levelsF.num_obs来代替unique命令。接下来利用程序计时器timer命令,来比较ftools命令和unique的运行速度,具体命令如下所示:

*unique命令计算变量的唯一值的数量timer clear 1 //用于复位第一个秒表的时间至 0timer on 1 //用于启动第一个秒表sysuse auto, clearunique weighttimer off 1 //用于关闭第一个秒表timer list 1 //用于列示第一个秒的耗时
*ftools命令计算变量的唯一值的数量timer clear 1timer on 1sysuse auto, clearmata: F=factor("weight")mata:F.num_levels,F.num_obstimer off 1timer list 1

结果如下所示:



可以看出,两个程序结果是一样的,weight的唯一值有64个,该变量的记录数有74条,同时,很明显地,unique命令所需的时间是ftools的时间的5倍,证明了ftools命令的运行速度极快。 


3、比较ftoolsxmiss命令统计变量中的缺失值数量

一般情况下,可以使用外部命令xmiss”ssc install xmiss)来统计变量中的缺失值数量,但是该命令在大数据中比较慢,此时可以使用ftools命令中的一系列方法和属性来代替xmiss命令。具体命令如下所示:

*xmiss命令统计变量中的缺失值数量timer clear 1timer on 1sysuse nlsw88, clearxmiss race uniontimer off 1timer list 1
*ftools命令统计变量中的缺失值数量timer clear 1timer on 1sysuse nlsw88, clearmata: F = factor("race")mata: F.panelsetup()mata: mask = rowmissing(st_data(., "union")) //st_data(.,varnames)将指定变量varnames转成transmorphic矩阵,rowmissing(data) 识别变量中的缺失值mata: missings = panelsum(F.sort(mask), F.info) //panelsum(data,position_matrix)根据position_matrix对数据data进行加总mata: missings, F.countstimer off 1timer list 1

结果如下所示:



可以看出,两个程序跑出来的结果是一样的,当race=white时,缺失284个值,当race=black时,缺失82个值,当race=other时,缺失2个值,不过xmiss运行时间是ftools8倍,说明ftools的运行速度是极快的。

以上就是今天介绍的ftools命令中的Mata类型部分,相信大家对于ftools运行速度和便捷性有了一定的认识,赶紧找到以前为大数据集编写的do文件,让慢吞吞的命令都get out,替换上ftools命令吧!





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

卫健委的“糊涂账”

Pandas中数据的排序与切片

DataFrame数组常用方法

巧用局部宏扩展函数dir

过了14天潜伏期真的没事了?

Pandas基本数据类型介绍

NumPy数组基本介绍

“个性化”sortobs命令,教你实现排序自由

携手战疫,我们在行动

恭贺新春,平安顺遂|各省疫情关注度地图

过年观影指南(二)

过年观影指南(一)

egenmore隐藏功能——进制转换

相遇insobs,如暗室逢灯

数据可视化之地理坐标系

SFI:Stata与Python的数据交互手册(一)
Stata模拟构建朋友圈
一个粉丝的疑惑—— local和scalar

关于我们



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

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

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

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