2014-01-21 19 views
8

我有一个Python脚本,它清理并在大面板数据集(2,000,000+ observations)上执行基本的统计计算。从Python运行Stata做文件

我发现其中一些任务更适合于Stata,并且写了一个包含必要命令的do文件。因此,我想在我的Python代码中运行一个.do文件。我该如何去拨打文件Python

+0

你如何正常运行这些文件?你使用命令行界面吗?如果是这样,你输入什么? – wnnmaw

+0

我通常通过打开stata来运行do文件,然后在命令行中键入do .do。但是,我有很多要处理的文件,如果我可以整合并从Python文件运行它,那将更容易。 – svenkatesh

+1

你在哪个平台上运行? – wnnmaw

回答

10

我认为@ 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

+0

谢谢,这非常有帮助。但是,当我在Windows中实现此解决方案时,我遇到了另一个错误。我得到以下消息:'WindowsError:[错误2]系统找不到指定的文件' – svenkatesh

+1

啊,我知道我做错了什么 - 首先,因为我从Windows XP运行,我应该通过'subprocess.call()'方法中的'shell ='true''参数。其次,我的Python代码与我的Stata副本不在同一个工作目录中。一旦我解决了这两个问题,一切都顺利进行。非常感谢你的帮助。 – svenkatesh

0

这个答案扩展@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'))