在Stata中执行Python代码

在Stata中执行Python代码

之前多次试着使用Stata的一个外部命令python来实现在Stata中运行Python命令, 但是一直都不成功,所以就只能放弃了. 想到Python是可以直接在终端运行的, 所以我就尝试了下面的方法, 还挺顺利.

读完刚刚的那一段话, 你一定感觉怪怪的, 因为我的标点符号都是半角的, 这是为了方便, 所以在电脑里面设置即使中文输入法下依然使用半角标点. 设置方法如下:

下面开始正文了.
在终端使用Python有两种运行方法, 第一种是python temp.py运行py脚本, 第二种是直接输入python进入python的环境. 显然在Stata中比较容易实现的是第二种. 所以我就使用第二种.
例如我想在Stata中运行下面一段代码以获取平安银行的交易数据然后再输出为csv文件:

1
2
3
from tushare import *
df = get_hist_data('000001')
df.to_csv('000001.csv')

我可以按照下面的方法:

  1. 在Stata中将这些代码写入一个py文件;
  2. 调用python的shell命令执行这个文件;
  3. 如果你想获得代码运行打印出来的信息可以使用重定向符>将结果保存起来.

下面的代码就可以实现这个想法:

1
2
3
4
5
6
file open myfile using temp.py, write replace
file write myfile "from tushare import *" _n
file write myfile "df = get_hist_data('000001')" _n
file write myfile "df.to_csv('000001.csv')" _n
file close myfile
!/Users/mr.cheng/anaconda3/bin/python3 temp.py > temp.txt

保存的csv文件会被直接保存, 同时最后打印出来的结果会存储在temp.txt文件中,不过因为这段代码没有打印任何东西, 所以也最后得到的temp.txt是空的.

为了方便使用我把这个过程封装成一个命令:pycall, 之所以起这个名字是为了致敬Stata大佬E. F. Haghish写的rcall.
pycall.ado
这个命令的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
prog def pycall
version 14.0
syntax [anything(name = pycode)] [, Start End Run Txt]
if "`start'" != ""{
cap file close myfile
file open myfile using temppyfile.py, write replace
}
if "`txt'" != ""{
local out = "> output.txt"
}
if "`end'" != ""{
file close myfile
}
else{
file write myfile `pycode' _n
}
if "`run'" != ""{
!/Users/mr.cheng/anaconda3/bin/python3 temppyfile.py `out'
erase temppyfile.py
}
end

非常喜欢这些跨语言的东西, 可以让自己把几个语言的各自优势发挥出来同时又能够相互搭配使用.
使用这个命令完成上面的python代码运行就可以这样:

1
2
3
4
5
6
7
8
9
* 声明开始
pycall, s
* 输入Python代码
pycall "from tushare import *"
pycall "df = get_hist_data('000001')"
pycall "df.to_csv('000001.csv')"
pycall "for i in range(1, 10):print(i)"
* 声明代码输入结束(e)、运行代码(r)然后将打印结果(t)存储为output.txt
pycall, e r t

最后如果我想进行Stata和Python之间的对象传递, 就可以通过文件进行传递. 例如这里如果我把那个csv文件读进来就实现了从Python数据框到Stata的传递.

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×