Search

Agrupando datos con Python…sin Pandas

Hoy comienzo una nueva aventura: mi Blog!, y un reto: escribir regularmente y no morir en el intento. Que la Fuerza me acompañe.

Dentro de unos pocos días harán 5 años desde que comencé a desarrollar una aplicación con Ignition, de Inductive Automation.

La plataforma está genial como sistema SCADA. Permite conectarse a un gran número de fuentes de datos, y desarrollar proyectos en Jython, lenguaje basado en Python e implementado en Java.

Pero tiene un pequeño problema. No se pueden instalar módulos escritos en C. Así que la potencia en el tratamiento de datos se ve sensíblemente reducida, al no poder instalar módulos como Pandas o Numpy.

En este, mi primer post, voy a poner un ejemplo de cómo hacer una operación trivial, y muy común, con un conjunto de datos: Agrupar y agregar (sumar en este caso). Y lo voy a hacer de dos maneras: primero utilizando Pandas y luego, con Python puro.

No podemos comenzar el ejercicico sin lo más importante, los datos. He preparado una tabla muy sencilla en un archivo csv que podéis descargar aquí. Contiene unos datos de producción de las plantas de una empresa.

La tabla contiene las siguientes columnas:

  • ZONA: Zona geográfica donde está situada la planta correspondiente.
  • PLANTA: Nombre de la planta.
  • DIA_MES: Día del mes del que se han obtenido los datos.
  • HORAS_TRABAJO: Las horas de los trabajos que se han ido realizando en la planta.

Bien. Vamos ha intentar obtener la suma de los trabajos en la planta por día del mes.

Utilizando Pandas realizaríamos los siguientes pasos:

1.- Leer el archivo csv y colocarlo en un dataframe.

2.- Echamos un vistazo a la tabla:

3.- Creamos el objeto GroupBy, utilizando la columna ‘DIA_MES’

4.- Agregamos los datos, obteniendo la suma de las horas por día.

Lo pasamos a un dataframe.

Echamos un vistazo al resultado, confirmando que hemos agrupado las horas de trabajo por día del mes.

Recopilo todo el código utilizado:

Ahora vamos a conseguir el mismo resultado pero sin utilizar Pandas.

1.- Leer el archivo csv y colocarlo en una lista. Para ello utilizaremos el módulo csv incluido en Python.

Nótese que la primera lista contenida en csv_rdr sería el encabezado de la tabla

Lo que nos deja una lista con la siguiente pinta:

Ahora, para agrupar las horas de trabajo por el día de la semana sugiero dos métodos

1.- Hemos importado del módulo operator la funcion itemgetter. Ésta función se aplica a una serie, y devuelve el valor de la serie que corresponde a la posición o a la clave definida en la función. En nuestro caso queremos que obtenga el valor de la posisión 2 de nuestra lista, que corresponde al DIA_MES, para poder hacer la agrupación. Pero por si sola no nos va a hacer el trabajo, necesitamos la ayuda de la clase groupby del módulo itertools incluido en Python.

La clase groupby admite dos argumentos. Primero el iterable, nuestra lista en nuestro cosa. Importante ordenarla bajo el mismo criterio de posición o clave. En este caso la ordenamos por DIA_MES, que es la posición 2. El segundo argumento que admite la clase groupby es la clave con la seleccionará el elemento a devolver. Con esto se creará un iterador con los elementos correspondientes al mismo valor de DIA_MES.

El código completo sería el siguiente:

Podemos ver la pinta que tiene una key y lo que contiene el grp correspondiente:

Por ejemplo, para el DIA_MES = 01 tendríamos:

En la linea de código

Lo que se hace es añadir el valor de DIA_MES y la suma de los valores correspondientes a HORAS_TRABAJO que se encuentran en la posición 3 de los items de cada iterador grp.

Lo que nos deja el siguiente resultado

2.- Utilizar la clase defaultdict del módulo collections incluido en Python.

Con el resultado siguiente

Como se puede comprobar, ambos scripts producen el mismo resultado, que a su vez es igual al obtenido utilizando Pandas.

Puedes descargarte el código de mi 

 

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.