我有一个Python
脚本,它清理并在大面板数据集(2,000,000+ observations
)上执行基本的统计计算。从Python运行Stata做文件
我发现其中一些任务更适合于Stata
,并且写了一个包含必要命令的do文件。因此,我想在我的Python代码中运行一个.do文件。我该如何去拨打文件Python
?
我有一个Python
脚本,它清理并在大面板数据集(2,000,000+ observations
)上执行基本的统计计算。从Python运行Stata做文件
我发现其中一些任务更适合于Stata
,并且写了一个包含必要命令的do文件。因此,我想在我的Python代码中运行一个.do文件。我该如何去拨打文件Python
?
我认为@ user229552指向正确的方向。可以使用Python的subprocess
模块。下面是一个适用于Linux OS的示例。
假设你有一个名为pydo.py
Python文件有以下:
import subprocess
## Do some processing in Python
## Set do-file information
dofile = "/home/roberto/Desktop/pyexample3.do"
cmd = ["stata", "do", dofile, "mpg", "weight", "foreign"]
## Run do-file
subprocess.call(cmd)
,并命名为pyexample3.do
一个塔塔做的文件,有以下:
clear all
set more off
local y `1'
local x1 `2'
local x2 `3'
display `"first parameter: `y'"'
display `"second parameter: `x1'"'
display `"third parameter: `x2'"'
sysuse auto
regress `y' `x1' `x2'
exit, STATA clear
然后,在终端窗口中执行pydo.py
按预期工作。
你也可以定义一个Python功能和使用:
## Define a Python function to launch a do-file
def dostata(dofile, *params):
## Launch a do-file, given the fullpath to the do-file
## and a list of parameters.
import subprocess
cmd = ["stata", "do", dofile]
for param in params:
cmd.append(param)
return subprocess.call(cmd)
## Do some processing in Python
## Run a do-file
dostata("/home/roberto/Desktop/pyexample3.do", "mpg", "weight", "foreign")
从终端完整的调用,其结果:
[email protected] ~/Desktop
$ python pydo.py
___ ____ ____ ____ ____ (R)
/__ / ____/ / ____/
___/ / /___/ / /___/ 12.1 Copyright 1985-2011 StataCorp LP
Statistics/Data Analysis StataCorp
4905 Lakeway Drive
College Station, Texas 77845 USA
800-STATA-PC http://www.stata.com
979-696-4600 [email protected]
979-696-4601 (fax)
Notes:
1. Command line editing enabled
. do /home/roberto/Desktop/pyexample3.do mpg weight foreign
. clear all
. set more off
.
. local y `1'
. local x1 `2'
. local x2 `3'
.
. display `"first parameter: `y'"'
first parameter: mpg
. display `"second parameter: `x1'"'
second parameter: weight
. display `"third parameter: `x2'"'
third parameter: foreign
.
. sysuse auto
(1978 Automobile Data)
. regress `y' `x1' `x2'
Source | SS df MS Number of obs = 74
-------------+------------------------------ F( 2, 71) = 69.75
Model | 1619.2877 2 809.643849 Prob > F = 0.0000
Residual | 824.171761 71 11.608053 R-squared = 0.6627
-------------+------------------------------ Adj R-squared = 0.6532
Total | 2443.45946 73 33.4720474 Root MSE = 3.4071
------------------------------------------------------------------------------
mpg | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight | -.0065879 .0006371 -10.34 0.000 -.0078583 -.0053175
foreign | -1.650029 1.075994 -1.53 0.130 -3.7955 .4954422
_cons | 41.6797 2.165547 19.25 0.000 37.36172 45.99768
------------------------------------------------------------------------------
.
. exit, STATA clear
来源:
http://www.reddmetrics.com/2011/07/15/calling-stata-from-python.html
http://docs.python.org/2/library/subprocess.html
http://www.stata.com/support/faqs/unix/batch-mode/
使用Python和塔塔一起可以在
http://ideas.repec.org/c/boc/bocode/s457688.html
http://www.stata.com/statalist/archive/2013-08/msg01304.html
谢谢,这非常有帮助。但是,当我在Windows中实现此解决方案时,我遇到了另一个错误。我得到以下消息:'WindowsError:[错误2]系统找不到指定的文件' – svenkatesh
啊,我知道我做错了什么 - 首先,因为我从Windows XP运行,我应该通过'subprocess.call()'方法中的'shell ='true''参数。其次,我的Python代码与我的Stata副本不在同一个工作目录中。一旦我解决了这两个问题,一切都顺利进行。非常感谢你的帮助。 – svenkatesh
如果你在命令行设置中运行它,你应该可以从python的命令行调用Stata(我不知道如何从Python中调用shell命令,但它不应该'不要太难,看到这里:Calling an external command in Python)。从命令行(又称为批处理模式)运行Stata,请参阅:http://www.stata.com/support/faqs/unix/batch-mode/
这个答案扩展@Roberto费雷尔的回答,解决的几个问题我可以找到不同的路线碰上了。在系统路径
对于stata
运行代码
Stata的,必须正确设置系统路径(在Windows上至少)。至少对我而言,这并不是在安装Stata时自动设置的,我发现最简单的修正是放在完整的路径中(对我而言,这是我的"C:\Program Files (x86)\Stata12\Stata-64
),即:
cmd = ["C:\Program Files (x86)\Stata12\Stata-64","do", dofile]`
如何在后台悄悄运行代码
它可以让代码在后台悄悄地运行(即不开放,每次的Stata),通过添加命令/e
即
cmd = ["C:\Program Files (x86)\Stata12\Stata-64,"/e","do", dofile]
日志文件存储位置
最后,如果你在后台安静地运行,Stata会想要保存日志文件。它将在cmd
的工作目录中执行此操作。这取决于运行代码的位置,但对我来说,因为我是从Notepad ++执行Python的,所以它希望将日志文件保存在C:\Program Files (x86)\Notepad++
中,Stata没有写入权限。这可以通过在调用子进程时指定工作目录来更改。
这些修改Roberto Ferrer
的代码导致:
def dostata(dofile, *params):
cmd = ["C:\Program Files (x86)\Stata12\Stata-64","/e","do", dofile]
for param in params:
cmd.append(param)
return (subprocess.call(cmd, cwd=r'C:\location_to_save_log_files'))
你如何正常运行这些文件?你使用命令行界面吗?如果是这样,你输入什么? – wnnmaw
我通常通过打开stata来运行do文件,然后在命令行中键入do .do。但是,我有很多要处理的文件,如果我可以整合并从Python文件运行它,那将更容易。 –
svenkatesh
你在哪个平台上运行? – wnnmaw