2014-01-21 4 views
8

Ich habe eine Python Skript, das aufräumt und grundlegende statistische Berechnungen auf einem großen Panel-Datensatz (2,000,000+ observations) durchführt.Führen Sie Stata-Datei aus Python

Ich finde, dass einige dieser Aufgaben besser für Stata geeignet sind, und schrieb eine Do-Datei mit den notwendigen Befehlen. Daher möchte ich eine .do-Datei in meinem Python-Code ausführen. Wie würde ich eine .do Datei von Python aufrufen?

+0

Wie führen Sie normalerweise solche Dateien? Verwenden Sie eine Befehlszeilenschnittstelle? Wenn ja, was trittst du ein? – wnnmaw

+0

Normalerweise führe ich Dateien durch Öffnen von Stata und Eingabe von .do in die Befehlszeile. Ich habe jedoch viele Do-Dateien zu verarbeiten, und es wäre einfacher, wenn ich sie konsolidieren und aus der Python-Datei ausführen könnte. – svenkatesh

+1

Auf welcher Plattform laufen Sie? – wnnmaw

Antwort

10

Ich denke @ user229552 zeigt in die richtige Richtung. Pythons subprocess Modul kann verwendet werden. Unten ein Beispiel, das für mich mit Linux OS funktioniert.

Angenommen, Sie eine Python-Datei pydo.py mit dem folgenden genannt haben:

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) 

und Stata do-Datei pyexample3.do genannt, mit dem folgenden:

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 

Dann pydo.py in einem Terminal-Fenster ausführen funktioniert wie erwartet.

Sie können auch eine Python-Funktion und verwenden Sie definieren, dass:

## 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") 

Der komplette Anruf von einem Terminal mit den Ergebnissen:

[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 

Quellen:

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/

Eine andere Route für zusammen Python und Stata verwenden, können bei

http://ideas.repec.org/c/boc/bocode/s457688.html

http://www.stata.com/statalist/archive/2013-08/msg01304.html

+0

Danke, das war sehr hilfreich. Bei der Implementierung dieser Lösung in Windows tritt jedoch ein weiterer Fehler auf. Ich bekomme die folgende Meldung: 'WindowsError: [Error 2] Das System kann die angegebene Datei nicht finden ' – svenkatesh

+1

Ah, ich habe herausgefunden, was ich falsch mache - zuerst, weil ich von Windows XP laufe, sollte ich die 'shell = 'true'-Argument in der' subprocess.call() 'Methode. Zweitens befand sich mein Python-Code nicht im selben Arbeitsverzeichnis wie meine Kopie von Stata. Sobald ich diese beiden Probleme behoben hatte, lief alles reibungslos. Vielen Dank für deine Hilfe. – svenkatesh

0

Diese Antwort reicht @Roberto Ferrer Antwort, die Lösung von ein paar Fragen, die ich finden lief hinein.

Stata in Systempfad

Für stata Code auszuführen, muss es korrekt im Systempfad eingerichtet werden (unter Windows zumindest). Zumindest für mich wurde dies nicht automatisch bei der Installation von Stata eingerichtet, und ich fand die einfachste Korrektur darin, den vollständigen Pfad einzutragen (was für mich "C:\Program Files (x86)\Stata12\Stata-64 war), d.h.:

cmd = ["C:\Program Files (x86)\Stata12\Stata-64","do", dofile]` 

Wie ruhig

den Code im Hintergrund laufen zu lassen ist es möglich, den Code auszuführen leise im Hintergrund (dh nicht eröffnet Stata jedes Mal) zu erhalten, indem Sie den Befehl Hinzufügen /e dh

cmd = ["C:\Program Files (x86)\Stata12\Stata-64,"/e","do", dofile]

Protokolldatei Speicherort

Wenn Sie ruhig im Hintergrund arbeiten, wird Stata die Protokolldateien speichern wollen. Es wird dies in cmd Arbeitsverzeichnis tun. Dies muss abhängig davon variieren, woher der Code ausgeführt wird, aber für mich, seit ich Python aus Notepad ++ ausgeführt habe, wollte er die Protokolldateien in C:\Program Files (x86)\Notepad++ speichern, auf die Stata keinen Schreibzugriff hatte. Dies kann durch Angabe des Arbeitsverzeichnisses beim Aufruf des Unterprozesses geändert werden.

Diese Änderungen Roberto Ferrer ‚s Code führen zu:

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'))