Запустите файл Stata do из Python

У меня есть скрипт Python, который очищает и выполняет базовые статистические расчеты на большом наборе панельных данных (2,000,000+ observations).

Я считаю, что некоторые из этих задач лучше подходят для Stata, и написал do-файл с необходимыми командами. Таким образом, я хочу запустить файл .do в своем коде Python. Как мне вызвать файл .do из Python?


person svenkatesh    schedule 21.01.2014    source источник
comment
Как вы обычно запускаете такие файлы? Используете ли вы интерфейс командной строки? Если да, то что вы вводите?   -  person wnnmaw    schedule 21.01.2014
comment
Обычно я запускаю do-файлы, открывая stata и набирая do ‹filename›.do в командной строке. Однако у меня есть много файлов do для обработки, и было бы проще, если бы я мог объединить и запустить их из файла Python.   -  person svenkatesh    schedule 21.01.2014
comment
На какой платформе вы работаете?   -  person wnnmaw    schedule 21.01.2014
comment
Посмотрите комментарии Эндрю под моим вопросом stackoverflow.com/questions/18532440/ - возможно, это поможет.   -  person radek    schedule 22.01.2014
comment
@wnnmaw Я использую Windows 7 на работе и Mac OS X 10.8 дома. @radek Спасибо! Это был очень полезный вопрос.   -  person svenkatesh    schedule 22.01.2014


Ответы (3)


Я думаю, что @user229552 указывает правильное направление. Можно использовать модуль Python subprocess. Ниже приведен пример, который работает для меня с ОС Linux.

Предположим, у вас есть файл Python с именем pydo.py со следующим:

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) 

и do-файл Stata с именем 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")

Полный вызов из терминала с результатами:

roberto@roberto-mint ~/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 и Stata можно найти по адресу

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

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

person Roberto Ferrer    schedule 22.01.2014
comment
Спасибо, это было очень полезно. Однако при реализации этого решения в Windows я сталкиваюсь с другой ошибкой. Я получаю следующее сообщение: WindowsError: [Error 2] The system cannot find the file specified - person svenkatesh; 22.01.2014
comment
А, я понял, что я делаю неправильно - во-первых, поскольку я запускаю Windows XP, я должен передавать аргумент shell = 'true' в методе subprocess.call(). Во-вторых, мой код Python находился не в том же рабочем каталоге, что и моя копия Stata. Как только я устранил эти две проблемы, все пошло гладко. Большое спасибо за Вашу помощь. - person svenkatesh; 23.01.2014

Этот ответ расширяет ответ @Roberto Ferrer, решая несколько проблем, с которыми я столкнулся.

Статистика в системном пути

Чтобы 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. Это должно варьироваться в зависимости от того, откуда запускается код, но для меня, поскольку я выполнял Python из Notepad++, он хотел сохранить файлы журнала в 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'))
person kyrenia    schedule 27.02.2017
comment
Я так долго пытался понять, что "stata" не будет работать, и вместо этого мне нужно было определить полный путь к исполняемому файлу Stata, как это сделали вы. - person ALollz; 29.10.2018

Если вы запускаете это в настройках командной строки, вы должны иметь возможность вызывать Stata из командной строки из python (я не знаю, как вызвать команду оболочки из Python, но это не должно быть слишком сложно , см. здесь: Вызов внешней команды в Python). Чтобы запустить Stata из командной строки (пакетный режим), см. здесь: http://www.stata.com/support/faqs/unix/batch-mode/

person maxliving    schedule 21.01.2014