[Version très provisoire mai 2020] Mises à jour prévue à partir de la mi-octobre 2020

  • Depuis la version 16 de Stata (printemps 2019) il est possible d’utiliser Python de manière intéractive avec Stata.
  • Une librairie Python SFI (https://www.stata.com/python/api16/Data.html) est mise à disposition pour favoriser cette interactivé, en particulier pour passer des macros Stata vers Python.
  • En l’état, il me semble que Python peut permettre à Stata de s’étoffer sur deux domaines: le machine learning (sklearn) et la data visualization (seaborn, plotly).
  • l’entrée de l’aide stata sur python: help python
  • Eléments de Correspondance Stata - Python pour la manipulation des données ( librairiepandas): https://pandas.pydata.org/docs/getting_started/comparison/comparison_with_stata.html#compare-with-stata

1 Installation de Python et des librairies (Windows)

1.1 Intallation de Python

WARNING Pour utiliser Python, vous devez avoir le même type de built pour les deux applications:

  • Stata 64 bits => Python 64 Bits
  • Stata 32 bits => Pyhon 32 bits

Python 64

Python 32


Installation et première utilisation

  • Bien vérifier que la case [ADD python 3.8 to PATH] est bien cochée
  • Ne pas modifier le répertoire d’installation normalement, sous windows: C:\Users\username\AppData\Local\Programs\Python
  • Une fois l’installation terminée, ouvrir l’invite de commande [taper cmd dans la boite de recherche du menu windows, ou sous stata exécuter ! ou shell]
  • dans le prompteur, exécuter python puis effectuer une operation simple 1+1 ou print("Bonjour python")

1.2 Installation des librairies Python

  • Normalement peu de librairies sont installées
  • On peut obtenir leur liste avec la commande help("modules")
  • Pour vérifier la présence d’une librairie: help("nom_librairie")
help("statsmodels")
No Python documentation found for 'statsmodels'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
  • Pour installer une librairie, on utilise pip normalement installée avec Python (vérifier avec help("pip"))
  • Installation de statmodels:
    • [1] Réouvrir le prompteur windows (! sous Stata)
    • [2] Exécuter pip install statsmodels (ou ! pip install statsmodels sous Stata)
help("statsmodels")
NAME
    statsmodels

PACKAGE CONTENTS
    _version
    api
    base (package)
    compat (package)
    conftest
    datasets (package)
    discrete (package)
    distributions (package)
    duration (package)
    emplike (package)
    formula (package)
    gam (package)
    genmod (package)
    graphics (package)
    imputation (package)
    interface (package)
    iolib (package)
    miscmodels (package)
    multivariate (package)
    nonparametric (package)
    regression (package)
    resampling (package)
    robust (package)
    sandbox (package)
    src (package)
    stats (package)
    tests (package)
    tools (package)
    tsa (package
  • Comme pour R, l’installation d’une librairie installe les dépendances. Par exemple la librairie pandas (nécessaire pour la manipulation des données) installera numpy.
  • On peut installer directement des librairies Python sous Stata: ! pip install pandas (pas conseillé car le prompteur se referme automatiquement après exécution).

Extrait de l’aide numpy après l’installation de pandas

help("numpy")
NAME
    numpy

DESCRIPTION
    NumPy
    =====

    Provides
      1. An array object of arbitrary homogeneous items
      2. Fast mathematical operations over arrays
      3. Linear Algebra, Fourier Transforms, Random Number Generation

    How to use the documentation
    ----------------------------
    Documentation is available in two forms: docstrings provided
    with the code, and a loose standing reference guide, available from
    `the NumPy homepage <https://www.scipy.org>`_.

    We recommend exploring the docstrings using
    `IPython <https://ipython.org>`_, an advanced Python shell with
    TAB-completion and introspection capabilities.  See below for further
    instructions.

    The docstring examples assume that `numpy` has been imported as `np`::

      >>> import numpy as np
      
(...)      
      

Mise à jour d’une librairie: pip install nom_librairie --upgrade

1.3 Librairies graphiques

Une liste des principales libraires graphiques de Python:

2 Exécuter Python avec Stata

Aide Stata: help python

2.1 Lecture de Python par Stata

Rappel: s’assurer de la concordance des builts (Stata 64 => Python 64)

  • Lorsque Python est installé, vous pouvez vérifier qu’il est bien reconnu avec python query
python query

    Python Settings
      set python_exec      C:\Users\thevenin_m\AppData\Local\Continuum\anaconda3\python.exe
      set python_userpath  

    Python system information
      initialized          no
      version              3.7.3
      architecture         64-bit
      library path         C:\Users\thevenin_m\AppData\Local\Continuum\anaconda3\python37.dll

  • Si on a plusieurs installations de python, on peut récupérer les chemins d’accès avec python search:
python search 
 Python environments found:  
 C:\Users\thevenin_m\AppData\Local\Continuum\anaconda3\python.exe
 C:\Users\thevenin_m\AppData\Local\Programs\Python\Python38\python.exe
  • On peut changer de version de python avec python set exec path [,permanently]
python set exec C:\Users\thevenin_m\AppData\Local\Programs\Python\Python38\python.exe
python query

    Python Settings
      set python_exec      C:\Users\thevenin_m\AppData\Local\Programs\Python\Python38\python.exe
      set python_userpath  

    Python system information
      initialized          no
      version              3.8.3
      architecture         64-bit
      library path         C:\Users\thevenin_m\AppData\Local\Programs\Python\Python38\python38.dll

2.2 Utilisation de python en mode interactif

  • Une ligne
python: print("Bonjour Python")
  • Un bloc de ligne
python:
a=2
b=10
a*b
end


>>> a=2
>>> b=10
>>> a*b
20
>>> end
  • python describe: permet d’afficher les objets python en mémoire
python describe namelist
a: 
2

b: 
10
  • Python drop permet d’effacer des objets python en mémoire
python drop a
python describe namelist
b: 
10
  • Python clear permet d’effacer tous les objets python en mémoire
python clear
python describe

2.3 Quelques exemple d’utilisation de Python pour les graphiques

2.3.1 Chargement d’une base stata sous python

  • Une librarie est chargée avec l’instruction import. Un acronyme lui est associé, ici pa (en anglais c’est généralement pd….on s’en passera)
  • pandas a une fonction permettant de lire une base en format .dta [read_dta()]
  • la fonction nom_base.head(#) permet d’afficher les premières lignes de la base
sysuse auto, clear
keep price mpg displacement gear_ratio turn foreign
save auto, replace

python:
import pandas as pa 
df = pa.read_stata('auto.dta')
df.head()
end

>>> df.head()
   price  mpg  turn  displacement  gear_ratio   foreign
0   4099   22    40           121        3.58  Domestic
1   4749   17    40           258        2.53  Domestic
2   3799   22    35           121        3.08  Domestic
3   4816   20    40           196        2.93  Domestic
4   7827   15    43           350        2.41  Domestic

2.3.2 Exemple 1

  • Création d’un graphique de type matrixplot avec la librairie seaborn sur un extrait de la base auto
  • On va utiliser la fonction pairplot de la librairie seaborn (acronyme sns)
  • seaborn ne permettant pas au graphique de s’afficher avec une exécution sous Stata, il est enregistré avec la fonction nom_objet.savefig(path/nom_graph) puis ouvert via le prompteur windows ! nom_graph
python:
import seaborn as sns
g = sns.pairplot(df, hue="foreign")
g.savefig("graph1.png")
end

! graph1.png

Programme en un bloc

sysuse auto, clear
keep price mpg displacement gear_ratio turn foreign
save auto, replace

python:
import pandas as pa 
import seaborn as sns
df = pa.read_stata('auto.dta')
g = sns.pairplot(df, hue="foreign")
g.savefig("graph1.png")
end
! graph1.png

2.3.3 Exemple 2

Création d’un graphique de type violin de la librairie plotpy avec passage d’une macro à un argument de stata vers Python

Etape par étape

Définition d’une variable par une macro

local x turn

Les codes qui suivent sont appelés en mode python

python:
<py1>: chargement des librairies>
<py2>: récupération de la macro et création d'une dataframe
<py3>: création du graphique et affichage
end

[Py1] Chargement des librairies

import pandas as pa
import plotly.graph_objects as go
from sfi import *
  • Une des particularités de python (et ce n’est pas un point fort) est qu’il est (parfois) nécessaire de charger explicitement des fonctions d’une librairie: ici la librairie est plotly dans laquelle on veut utiliser la fonction graph_objects. On importe non pas la librairie, mais une fonctionnalité de celle-ci: import plotly.graph_objects as go
  • On importe également, dans son ensemble, la librairie python SFI de Stata: from sfi import * (* car on importe tous les modules)

[Py2] Récupération de la macro et création de la dataframe

varname = Macro.getLocal("x")
v = Data.get(var = varlist)
df = pd.DataFrame(v,columns = ['var'])
  • varname = Macro.getLocal("x") permet a python de récupéré le contenu de la macro x
>>> varname = Macro.getLocal("x")
>>> varname
'turn'
  • v = Data.get(var = varname) permet de récupérer, sous forme de vecteur, les observations de la variable associée à la macro (ici turn)
>>> v = Data.get(var = varname)
>>> v
[40, 40, 40, 43, 43, 42, 43, 42, 44, 43, 45, 34, 43, 31, 41, 40, 43, 35, 46, 46, 46, 33, 43, 5
> 1, 48, 41, 39, 48, 44, 41, 45, 43, 43, 42, 42, 42, 43, 40, 43, 37, 37, 36, 44, 42, 42, 45, 4
> 0, 41, 37, 36, 34, 35, 32, 34, 38, 36, 36, 34, 33, 34, 36, 36, 35, 36, 36, 35, 35, 36, 37]
  • df = pd.DataFrame(v,columns = ['var']) transforme le vecteur en dataframe. J’ai choisi le nom var pour la variable, je n’ai pas (encore) trouvé le moyen d’utiliser le contenu de la macro pour la variable sélectionné. Mais c’est sans importance pour ce graphique, on pourra récupérer le nom de la variable pour le titre.
>>> df = pa.DataFrame(v,columns = ['var'])
>>> df.head()
   var
0   40
1   40
2   40
3   43
4   43

[Py3] Création de l’objet graphique

fig = go.Figure(data=go.Violin(y=df['var'], box_visible=True, line_color='black', meanline_visible=True, 
fillcolor='rgb(248,118,109)', opacity=0.5, x0='var'))
fig.update_layout( title=" violin plot pour la variable `x'", font=dict( family="Arial", size=18, color='rgb(97,156,255)'))
python: fig.show())
  • La variable est appelée par y=df['var'], le reste constitue des options
  • fig.update_layout permet d’ajouter des éléments de texte. On peut récupérer directement le nom de la variable dans le titre avec la macro x: title=“violin plot pour la variable `x’”. On pourrait faire de même avec les titres des axes, dont les champs n’ont pas été rempli.
  • fig.show() permet d’afficher le graphique sous format html (type de graphique de plotly). On peut se déplacer sur le graphique pour lire les valeurs (moyenne, médiane, valeur de y et la densité via un lissage de type kernel(kde)). Le graphique peut être enregistré en format statique (.png) directement via le menu de la fenêtre.

Programme en un bloc

local x turn

python clear
python:
import plotly.graph_objects as go
import pandas as pa
from sfi import *
varname = Macro.getLocal("x")
v = Data.get(var = varname)
df = pa.DataFrame(v,columns = ['var'])
df.head()

fig = go.Figure(data=go.Violin(y=df['var'], box_visible=True, line_color='black', meanline_visible=True, 
fillcolor='rgb(248,118,109)', opacity=0.5, x0='var'))
fig.update_layout( title=" Violin plot pour la variable `x'", font=dict( family="Arial", size=18, color='rgb(97,156,255)'))
python: fig.show()

end

Dans une routine type ado
Je rencontre une difficulté pour afficher le graphique avec un programme en deux blocs, un bloc Stata puis un bloc python. Une histoire de fonction a appelé dans le bloc Stata que je n’arrive pas à définir

programme define violin
syntax varlist [,options]
<programme Stata>
end

python:
<code python>
end

En un bloc, en appelant python à chaque ligne, la routine suivante fonctionne (quelques petites différences )

***Programme de la commande violon***

*partie Stata
capt program drop violin
program define violin
syntax varlist, [title(string)] [ytitle(string)] [xtitle(string)]


*partie python
python: import plotly.graph_objects as go
python: import pandas as pd
python: from sfi import *

python: varlist = Macro.getLocal("varlist")
python: v = Data.get(var = varlist)
python: df = pd.DataFrame(v,columns = ['var'])

python: fig = go.Figure(data=go.Violin(y=df['var'], box_visible=True, line_color='black', meanline_visible=True, fillcolor='lightseagreen', opacity=0.5, x0='var'))
python: fig.update_layout( title="`title'", xaxis_title="`xtitle'", yaxis_title="`ytitle'", font=dict( family="Courier New, monospace", size=18, color="#7f7f7f"))
python: fig.show()

end


***Execution de la commande***
* sysuse auto, clear
* violin mpg
* violin price, title("GRAPHIQUE TYPE VIOLON") xtitle("PRICE")

2.3.4 Exemple 3

: Création d’un graphique avec passage d’une macro à plusieurs arguments de stata vers Python