Arrancando con Python & Co.

Python & Co.: ¿a los qué?

Python y scikit-learn

  • Python (https://www.python.org) está basado en el lenguaje C pero orientado a objetos (OOP): cada “objeto” pertenece a una clase/tipo y puede tener métodos o constantes asociadas.
  • Tiene un conjunto básico de instrucciones/sentencias que no incluyen cosas como logaritmos: usa un mecanismo de módulos/paquetes que se pueden incorporar a lo que uno está haciendo.

    Los módulos se incorporan a la sesión de Python usando import, y es costumbre darles un nombre más corto para no escribir tanto. Por ejemplo:

    Matplotlibmpl
    Numpy np
    pandas pd
    SciPy scp
  • En la distribución oficial vienen más de 200 módulos “estándar”. En el curso de la FIQ para II usamos sólo dos: “math” y “random”, y sólo unas pocas funciones de ellos.
  • PyPI (Python Package Index) contiene varios módulos no estándar. Al 1/7/2019 tenía 185.703 proyectos, algunos abandonados (https://pypi.org).
  • En PyPI está SciPy (https://scipy.org), un conjunto de rutinas numéricas (BLAS, LAPACK, etc.) incluyendo optimización y estadística. Junto con otros como Matplotlib (gráficos) y NumPy (arreglos) forman la base del cálculo científico con Python.
  • Hay unos 100 proyectos agrupados alrededor de SciPy bajo el nombre “scikit”, uno de ellos es scikit-learn (o sklearn) con el que vamos a trabajar.
  • Muchos paquetes están en sus primeras fases: scikit-learn está por la versión 0.21, statsmodel por la 0.10. Aún pandas, dentro del grupo SciPy, está por la versión 0.24. Esto implica que estos paquetes no están completamente probados, cosas que no están bien integradas o algunas cosas pueden funcionar mal.
Comentarios

Es ridículo pensar en conocer todos los módulos disponibles para Python, aún si nos restringimos sólo a los módulos estándar de la distribución oficial.

Además, muchos módulos tienen una gran variedad de funciones y opciones de uso y configuración. Por ejemplo, el manual de Matplotlib tiene más de 2300 páginas, el de NumPy tiene más de 1300, el de Pandas más de 3000, y el de SciPy más de 2500.

Claro que muchas veces distintos módulos tienen funciones similares, a veces con nombres parecidos, y en ocasiones la eficiencia de cada alternativa depende de la aplicación.

Esto ya es un problema en el lenguaje básico: hay distintas funciones para hacer una misma cosa.

No está de más mencionar que a pesar de que hay una sola persona que determina los cambios en el estándar del lenguaje (su creador Guido van Rossum), lo que evita extensiones incompatibles, el lenguaje no es del todo consistente. Por ejemplo, print es una función (a partir de la versión 3) pero return no lo es. a.sort() y a.reverse() modifican una lista (clasificándola y dándola vuelta, respectivamente), pero sorted(a) es la secuencia clasificada y reversed(a) es un iterador.

Muchas personas piensan que Python es un lenguaje ideal para aprender a programar. Para mí, un lenguaje para aprender a programar debe tener un conjunto reducido de comandos/sentencias, y debe ser consistente: Python no satisface ninguna de estas condiciones. Abundando, Pascal ya usaba = para la igualdad lógica y no el == de Python, y la restricción en Python de poner índices únicamente desde 0 parece de la Edad de Piedra: Pascal permitía elegir el comienzo de los índices que inclusive no necesitaban ser enteros (los diccionarios de Python podrían ser un reemplazo para el caso de índices no ordinales). Por supuesto, Python es mucho más potente que Pascal, por ejemplo no tiene restricciones en el tamaño de los enteros, pero sigue careciendo de facilidades gráficas propias (y mucho menos interactivas).

Otros paquetes de estadística con Python

Anaconda

Los módulos en PyPI se instalan con el comando pip en una terminal del sistema. No hay problemas en sistemas unix, como Linux o Mac, pero se complica en MS-Windows.

Una de las razones es que los módulos deben compilarse antes de usarlos. Si bien muchos de los módulos están disponibles para las arquitecturas más comunes, no todos lo están y deben compilarse al momento de la instalación. Las distribuciones unix normalmente ya vienen con un compilador (en Mac hay que hacer algún movimiento extra), pero es más complicado hacerlo para MS-Windows.

Teniendo en cuenta la popularidad de MS-Windows, algunas empresas han compaginado los módulos no estándar más usados de Python en distribuciones, facilitando la instalación. Posiblemente Anaconda sea la más popular de estas distribuciones, incorporando cientos de paquetes, entre ellos el grupo de SciPy: Matlplotlib, NumPy, pandas..., teniendo la posibilidad de instalar también R (que es independiente de Python). Claro, esto hace que la instalación de Anaconda ocupe más de 8 Gb en una Mac.

Un problema con este tipo de distribuciones es que pueden interferir con otras instalaciones, por ejemplo, con la misma distribución oficial de Python. En ese sentido Anaconda es bastante prudente pues se instala sólo para un usuario, a diferencia de otras distribuciones. Es decir, se podría instalar Anaconda para un usuario y cuando se quiera trabajar con la versión oficial de Python se puede hacer como otro usuario.

Hay módulos como scikit-plot que no están en Anaconda. Aunque su instalación es en general relativamente sencilla, puede que haya una gran cantidad de paquetes adicionales que deban instalarse ocupando aún más espacio en disco.

Spyder

Para no tener que volver a escribir los comandos de Python, normalmente éstos se guardan en un archivo de texto denominado “script” (guión) con la extensión .py (es conveniente tener las extensiones visibles para evitar confusiones). Esto hace que haya entornos integrados (IDEs) en los que uno puede tener trabajar con el script y con la consola (o terminal) donde se muestran los resultados.

La distribución oficial de Python trae uno de estos entornos llamado IDLE, pero hay otros entornos más sofisticados, copiando el formato de los “notebooks” de Mathematica. Los más conocidos son IPython (del grupo SciPy) y Jupyter, que trabaja con un navegador de internet. Una variante basada en IPython es Spyder (https://www.spyder-ide.org), que trabaja directamente sin usar explícitamente un navegador.

Spyder viene con la distribución de Anaconda, y los mismos autores de esa aplicación recomiendan trabajar con esa distribución para evitar inconvenientes. Un poco arbitrariamente, decidí trabajar con Spyder y no con IPython o Jupyter.

Cursos de Python

Desde ya que hay muchos cursos de Python en internet, algunos de ellos gratis, y no he explorado las posibilidades. Sin embargo tropecé de casualidad con la serie de cursos en https://www.kaggle.com/learn/overview, que parecen interesantes, se concentrarn en estadística y son gratis, aunque para usar las bases de datos de los ejemplos hay que anotarse.

Configuración

Hay muchas posibilidades para configurar a gusto el comportamiento, especialmente el de gráficos, y van algunos de los que hice.

  • Matplotlib:
    • Ver el directorio de configuración usando mpl.get_configdir()
         >>> import matplotlib as mpl
         >>> mpl.get_configdir()
             → '/Users/pepegrillo/.matplotlib'
      
    • Para poder guardar los gráficos como jpeg, pdf, etc., y no sólo png, en Mac poner
          backend: TkAgg
      

      en el archivo matplotlibrc (dentro del directorio .matplotlib, crearlo si no existe).

  • Anaconda: En .bashrc (.bash_profile, .profile,...) poner
        PS1="$ "
    

    y en .condarc poner al principio

        changeps1: False
    
  • Matplotlib en spyder:
    • En preferences seleccionar “automatic” en vez de “inline” para ventanas de gráficos separadas.
    • Alternativa para scripts:
          from IPython import get_ipython
          get_ipython().run_line_magic('matplotlib', 'inline')
          get_ipython().run_line_magic('matplotlib', 'qt')