查看原文
其他

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

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

本文作者:张学人

文字编辑:孙晓玲

技术总编:张   邯

Stata与Python的交互难题

在推文《SFI:Stata与Python的数据交互手册(一)中,我们使用Macro和Local两种数据类型完成了Stata和Python中基础的单条信息的传递,当Stata与Python的交互要求并不是很高时,这样子一个宏一个宏地传参就已经足够,但当我们的场景更加特殊时,如我们需要时时知道数据在Python中的运行情况如何,就得使用SFI的更多工具。




什么是SFIToolkit


SFIToolkit是SFI(The Stata Function Interface)模块下的一个类,它用于提供形式多样的与Stata各种数据交互的方法,使用户可以方便地在Stata和Python中传递数据。进而实现Python与Stata核心功能的交互。



即时输出


用户可以通过display方法直接在Python中输出信息,所要输出的信息直接会显示在Stata的结果框中。其中displayln还会在输出结束后增加一行空行。除此两种以外,用户也可以通过errprint和error方法,以Stata报错的形式将一个错误信息回传Stata,字体亦会显示红色。

python:from sfi import SFIToolkitSFIToolkit.display("this message is send from python")SFIToolkit.displayln("this message is send from python")print("this message is send from python")SFIToolkit.errprint("errorprint")SFIToolkit.error(199)

输出结果如下:

在这里需要提醒大家的是,error方法只接收正整数,该数字是Stata对应的错误代码,例如199错误在Stata中就是unrecognized command,命令执行后会强制回到Stata环境中,不会执行后面的Python脚本。而errprint只会将字体以红色输出且无中断程序的作用。



stata方法


当你需要调用当前Stata的工作路径时,你可以通过getWorkingDir查询到。而当你需要在Stata中执行一个命令时,一者你可以如以前我们所说,写入stata:加上相应命令,二者你可以调用SFIToolkit的stata方法,它接收一个字符串参数,这个字符串即是需要执行的命令。

python:from sfi import SFIToolkitprint(SFIToolkit.getWorkingDir())SFIToolkit.stata("sysuse auto,clear")stata: sysuse auto,clearend

输出结果如下:

很多人在初次看到时会有天然的疑惑——这两者之间有什么区别呢?答案是stata方法更加灵活,当使用stata:的方式执行Stata命令时,由于Python语言没有宏的概念,因此每一句命令必须是确定的,但如果你需要执行的Stata命令存在变动,那么显然stata方法是更好的选择。



宏的清理


在上一篇推文中,我们详细介绍了如何生成、传输各类宏,相对应的,SFIToolkit提供了一系列清理宏的方法:rclear 、 eclear 、 sclear。

首先我们制造出一系列的r族、e族、s族宏。

python:from sfi import SFIToolkitSFIToolkit.stata("sysuse auto,clear")SFIToolkit.stata("reg mpg weight foreign")endreturn listereturn listsreturn list

输出结果如下:

接着我们重新进入Python环境,使用rclear等方法清除。
python:SFIToolkit.rclear()SFIToolkit.sclear()SFIToolkit.eclear()endreturn listereturn listsreturn list

输出结果如下:



更多小工具:strToName


当你要在Python中确定一个新变量的名称,除了自己取名以外,更多情况下你需要使用外部已有的变量名,然而这些原本的变量名并不一定符合Stata的变量命名规范,此时需要strToName方法来将字符串转为合法可用的Stata变量名。

python:from sfi import SFIToolkitnewname = SFIToolkit.strToName("afo2f*U*(&(0))")print(newname)end
输出结果如下:





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

从流调数据中寻找感染真相

熟悉又陌生的reshape

NBA球员薪资分析——基于随机森林算法(二)

NBA球员薪资分析——基于随机森林算法(一)

高亮输出之唐诗作者

湖北省各市疫情数据爬取

古代诗人总去的这些地方你一定要知道!

DataFrame数组常用方法(二)

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

卫健委的“糊涂账”

Pandas中数据的排序与切片

DataFrame数组常用方法

巧用局部宏扩展函数dir

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

Pandas基本数据类型介绍

NumPy数组基本介绍

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

关于我们



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

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


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

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