查看原文
其他

SFI:Stata与Python的数据交互手册(一)

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

本文作者:张学人

文字编辑:钱梦璇

技术总编:张   邯


Stata与Python的交互难题

Stata中调用Python进行数据处理是Stata16最为使用者关注的一项新功能。在往期推文《Stata16调用Python测试(一)》 以及 《Stata16调用Python——绘制词云图》 中,我们分别从基础功能与实践应用的方面介绍了Stata16中的Python命令,但它们均未直面问题的核心———PythonStata的数据交互。在Stata16版本以前,用户并非不能实现“Stata和Python混着用”的场景。例如,通过Stata!方式调用cmd,即可直接运行Python脚本,但这一场景必须借助中间数据文件的帮助,例如要在Python中绘制词云图,则需要使用Stata先行计算出词语与词频,将结果导出到csv/txt文件后,Python再读取数据文件,输出结果。事实上,这样的场景仅仅是对Python语言与Stata软件均熟悉的使用者的权宜之计,操作上十分繁琐,而Stata16大力地简化了这个过程,让数据在PythonStata中的传输更加直观与便捷,这中间的依托就是SFIThe Stata Function Interface)


什么是SFI

SFIThe Stata Function Interface)模块是一个Stata公司开发的Python第三方库该模块通过提供种类丰富的Python方法,使用户可以方便地在StataPython中传递数据,进而实现PythonStata核心功能的交互。


Macro: 宏的输出

在Stata中,诸多命令与操作均会产生宏,这里面有些是全局宏,有些是局部宏。例如当你使用reg y x进行回归计算时,会产生如e(predict)等宏,通过Macro即可将它们传输到Python中。
首先我们在Stata中加载auto数据集,设置局部宏并通过ereturn list查看当前内存中生成的宏:
sysuse auto,clearreg mpg weight foreignlocal StataClub "Data is power"ereturn list
ereturn list返回的结果中关于macros的数据如下所示:
macros: e(cmdline) : "regress mpg weight foreign" e(title) : "Linear regression" e(marginsok) : "XB default" e(vce) : "ols" e(depvar) : "mpg" e(cmd) : "regress" e(properties) : "b V" e(predict) : "regres_p" e(model) : "ols" e(estat_cmd) : "regress_estat"
此时我们进入Python环境,即可读取Stata中生成的宏:
>>> #program1>>> from sfi import Macro>>> str1 = Macro.getGlobal('e(cmdline)')>>> str2 = Macro.getLocal('StataClub')>>> print(str1+"\n"+str2)regress mpg weight foreignData is power>>> end


Macro: 宏的导入

StataPython的交互中,既有将Stata生成的宏导入Python的需求,也相应有将Python计算得出的单值传回Stata的场景,Macro同样为此提供了相应的方法。需要说明的是,无论是setLocal还是setGlobal方法,只能传输字符串变量。
. python:----------------------------------------------- python (type end to exit) ------------------------------------------>>> from sfi import Macro>>> Macro.setLocal("INFO","this is a info from python")>>> Macro.setLocal("INFO2","24")>>> Macro.setGlobal("e(GlobalINFO)","this is a globalinfo from python")>>> end--------------------------------------------------------------------------------------------------------------------. disp "`INFO'"this is a info from python. disp `INFO2'24. . disp e(GlobalINFO)this is a globalinfo from python


Scalar: 标量的输出

Stata运算的过程中,不仅会生成宏(Macro),也会生成标量(Scalar),如reg命令会产生e(F)、e(r2)等标量,使用MacrogetGlobal或者getLocal方法均不能获取,此时需要专门的标量方法来获取数据。
sysuse auto,clearreg mpg weight foreignereturn list
ereturn list返回的结果中关于Scalars的数据如下所示。
scalars: e(N) = 74 e(df_m) = 2 e(df_r) = 71 e(F) = 69.74846262000308 e(r2) = .6627029116028815 e(rmse) = 3.407059285651584 e(mss) = 1619.287698167387 e(rss) = 824.1717612920727 e(r2_a) = .6532015851691599 e(ll) = -194.1830643938065 e(ll_0) = -234.3943376482347 e(rank) = 3
此时我们进入Python环境,即可读取Stata中生成的标量:
. python:----------------------------------------------- python (type end to exit) ------------------------------------------>>> #program2>>> from sfi import Scalar>>> a = Scalar.getValue('e(r2_a)')>>> print(a)0.6532015851691599>>> end--------------------------------------------------------------------------------------------------------------------


Scalar: 标量的导入

getValue相对应,Python可以通过SetValue方法将单值以标量的形式传入Stata该方法与MarcosetLocal、setGlobal方法的重要区别是,前者可以将整型变量直接回传,后两者只能传字符串。但无论是宏还是标量,均多用于do-file的编写,充当“临界值”的角色,因此标量的导入与宏的导入没有功能上的区别,直白地说就是——“会用一个就行”。
. python:----------------------------------------------- python (type end to exit) ------------------------------------------>>> from sfi import Scalar>>> Scalar.setValue('e(r2_a)', 3)>>> Scalar.setValue('sca', 5)>>> end--------------------------------------------------------------------------------------------------------------------. disp e(r2_a)3. disp sca5


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
      Stata模拟构建朋友圈
一个粉丝的疑惑—— local和scalar

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

自科基金项目信息爬取

rename group批量修改变量名

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

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

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

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

BvD数据库介绍之Oriana

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

多图“预警”(一)

Selenium的等待方式
一举拿下函数图像

关于我们

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

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


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

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