Generalidades

Una expresión idiomática es aquella que tiene al mismo
tiempo el mejor desempeño y la mayor legibilidad. Pandas, como
un sublenguaje de Python tiene sus propias expresiones
idiomáticas, llamadas por la comunidad “pandorables”.

Un ejemplo de una expresión pandorable es cuando usamos
vectores en lugar de ciclos para obtener un total.

En esta clase veremos dos expresiones pandorables.

Encadenamiento

El encadenamiento permite unir varias expresiones sobre un
dataframe, una después de la otra, tomando el resultado de la
función anterior como entrada para la siguiente.

Veamos el siguiente ejemplo, usando los datos de enfermos de
COVID-19 en Tlaxcala.

import pandas as pd
df = pd.read_csv("~/Documents/tlaxcala_covid-19.txt")
df

          fecha  positivos  negativos  sospechosos  recuperados  defunciones
0    2020-04-06         17        187          283            0            0
1    2020-04-07         24        214          316            0            0
2    2020-04-08         29        247           98            0            0
3    2020-04-09         38        280           98            1            0
4    2020-04-10         41        329          130            1            1
..          ...        ...        ...          ...          ...          ...
100  2020-07-18       3597       5959          698         2113          524
101  2020-07-19       3744       6040          668         2177          535
102  2020-07-20       3816       6059          688         2220          543
103  2020-07-21       3901       6276          843         2283          551
104  2020-07-22       3949       6303          985         2314          563

[105 rows x 6 columns]

Lo que vamos a hacer es asegurarnos que no tenemos NA, a
continuación, vamos a pasar el índice al campo Fecha, vamos
a eliminar las columnas sospechosos y negativos y por
último vamos a agregar la columna activos que es el valor
que resulta de restar recuperados y defunciones a
positivos.

df = pd.read_csv("~/Documents/tlaxcala_covid-19.txt")
df = (df.dropna()
        .drop(['negativos', 'sospechosos'], axis=1)
        .assign(activos = lambda x: x.positivos - x.recuperados - x.defunciones)
        .set_index('fecha'))
df

            positivos  recuperados  defunciones  activos
fecha                                                   
2020-04-06         17            0            0       17
2020-04-07         24            0            0       24
2020-04-08         29            0            0       29
2020-04-09         38            1            0       37
2020-04-10         41            1            1       39
...               ...          ...          ...      ...
2020-07-18       3597         2113          524      960
2020-07-19       3744         2177          535     1032
2020-07-20       3816         2220          543     1053
2020-07-21       3901         2283          551     1067
2020-07-22       3949         2314          563     1072

[105 rows x 4 columns]

Agrupamiento

Otra técnica que explican es el agrupamiento.

Empezamos de nuevo con el archivo de casos de COVID-19 en
Tlaxcala, ahora agregamos el paquete Numpy porque vamos a
usar la función promedio.

Encadenamos las mismas operaciones que ya vimos pero ahora
agregamos las siguientes acciones:

  1. Convertimos la fecha en un campo tipo datetime, al que
    llamamos date.

  2. Agregamos un nuevo campo mes que toma extrae dicho dato
    del campo date recién creado.

  3. Desechamos el campo fecha que ya no es necesario.

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv("~/Documents/tlaxcala_covid-19.txt")
    df = (df.dropna()
            .drop(['negativos', 'sospechosos'], axis=1)
            .assign(activos = lambda x: x.positivos - x.recuperados - x.defunciones)
            .assign(date = lambda x: pd.to_datetime(x.fecha, format="%Y-%m-%d"))
            .assign(mes = lambda x: pd.DatetimeIndex(x.date).month)
            .drop(['fecha'], axis=1))
    df.tail()
    
         positivos  recuperados  defunciones  activos       date  mes
    100       3597         2113          524      960 2020-07-18    7
    101       3744         2177          535     1032 2020-07-19    7
    102       3816         2220          543     1053 2020-07-20    7
    103       3901         2283          551     1067 2020-07-21    7
    104       3949         2314          563     1072 2020-07-22    7
    

Con esta información podemos agrupar los datos para conocer el
promedio de contagios activos por mes.

avg = (df.groupby('mes')
   .agg({'activos': np.average}))
avg

        activos
mes            
4     62.869565
5    278.096774
6    236.633333
7    876.619048