Páginas

sábado, 30 de marzo de 2019

Tablas dinámicas en Python con Pandas

Tablas dinámicas en Python

con Pandas




Una de las cosa más útiles que he encontrado en las hojas de cálculo (llámese EXCEL o LIBREOFFICE CALC), son las tablas dinámicas para el tratamiento masivo de datos. Podemos resúmenes y analizar los datos que tenemos, para llegar a conclusiones y extraer la información que nos sea necesaria.

¿pero se puede prescindir de hojas de cálculo, y hacerlo mismo mediante un lenguaje de programación? La respuesta es SI, y en Python tenemos la libreria PANDAS, que nos permite hacer lo mismo.

A continuación os dejo un ejemplo con varios comentarios y "trucos" que yo he encontrado sobre el ejemplo original (os dejo al final de este articulo la referencia a la fuente original).

Ejemplo:
Tenemos un conjunto de datos sobre paises, continentes, población esperanza de vida, continente, etc... y necesitamos obtener varios datos:
1) esperanza de vida media por continente
2) esperanza de vida media por pais
3) esperanza de vida media por año y continente
4) esperanza de vida por año, continente, y agregando funcion  minima y maxima.

Solución:
0) Lo primero que tenemos que hacer es cargar la libreria pandas desde nuestro programa (o consola de python):

import pandas as pd

Una vez hecho esto, vamos a crear una variable que contenga la ruta de los datos.  En el ejemplo original, lo datos están alojados en en una dirección de internet:

data_url='https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv'
 Nota:
 El archivo esta en internet (en https://github.com/resbaz/r-novice-gapminder-files/blob/master/data/gapminder-FiveYearData.csv) , pero podemos descargarlo a nuestro ordenador en modo "raw", por ejemplo usando el comando wget
wget https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv 
 y cambiar la ruta apuntando al lugar donde lo hemos descargado
data_url='/home/nombre_usuario/Descargas/gapminder-FiveYearData.csv'
Y ahora lo leemos:

datos=pd.read_csv(data_url) 

Podemos ver los datos leidos,  usando el comando print:
print(datos.head(5))
Salida generada (las 5 primeras filas del archivo):



Ahora vamos a los puntos a resolver:
1)  esperanza de vida media por continente
Para ello  hacemos un subconjunto de datos, con las columnas cotinent y lifeExp
subdatos=datos[['continent','lifeExp']]

y creamos una variable con el resultado de la tabla dinamica:

tabla=pd.pivot_table(subdatos , values = 'lifeExp' , columns='continent')

y mostramos el resultado de esa tabla dinamica:

print(tabla)


El resultado seria:


2) esperanza de vida media por pais

Para ello  hacemos un subconjunto de datos, con las columnas country y lifeExp
subdatos=datos[['country','lifeExp']]

y creamos una variable con el resultado de la tabla dinamica:

tabla=pd.pivot_table(subdatos , values = 'lifeExp' , columns='country')

y mostramos el resultado de esa tabla dinamica:

print(tabla)

El resultado seria:
 country
Afghanistan                 37.478833
Albania                     68.432917
Algeria                     59.030167
Angola                      37.883500
Argentina                   69.060417
Australia                   74.662917
Austria                     73.103250
Bahrain                     65.605667
Bangladesh                  49.834083
Belgium                     73.641750
Benin                       48.779917
Bolivia                     52.504583
Bosnia and Herzegovina      67.707833
Botswana                    54.597500
Brazil                      62.239500
Bulgaria                    69.743750
Burkina Faso                44.694000
........ 
3) esperanza de vida media por año y continente
subdatos=datos[['continent','year','lifeExp']]
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , index=['year'], columns='continent')
print(tabla)
El resultado:


4) esperanza de vida por año, continente, y agregando funcion  minima y maxima


subdatos=datos[['continent','year','lifeExp']]
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , index=['year'], columns='continent', aggfunc = [min,max])
print(tabla)

El resultado por pantalla seria:
              min                                      max                   \
continent  Africa Americas    Asia  Europe Oceania  Africa Americas    Asia   
year                                                                          
1952       30.000   37.579  28.801  43.585  69.120  52.724   68.750  65.390   
1957       31.570   40.696  30.332  48.079  70.260  58.089   69.960  67.840   
1962       32.767   43.428  31.997  52.098  70.930  60.246   71.300  69.390   
1967       34.113   45.032  34.020  54.336  71.100  61.557   72.130  71.430   
1972       35.400   46.714  36.088  57.005  71.890  64.274   72.880  73.420   
1977       36.788   49.923  31.220  59.507  72.220  67.064   74.210  75.380   
1982       38.445   51.461  39.854  61.036  73.840  69.885   75.760  77.110   
1987       39.906   53.636  40.822  63.108  74.320  71.913   76.860  78.670   
1992       23.599   55.089  41.674  66.146  76.330  73.615   77.950  79.360   
1997       36.087   56.671  41.763  68.835  77.550  74.772   78.610  80.690   
2002       39.193   58.137  42.129  70.845  79.110  75.744   79.770  82.000   
2007       39.613   60.916  43.828  71.777  80.204  76.442   80.653  82.603   

                           
continent  Europe Oceania  
year                       
1952       72.670  69.390  
1957       73.470  70.330  
1962       73.680  71.240  
1967       74.160  71.520  
1972       74.720  71.930  
1977       76.110  73.490  
1982       76.990  74.740  
1987       77.410  76.320  
1992       78.770  77.560  
1997       79.390  78.830  
2002       80.620  80.370  
2007       81.757  81.235  

'Nota:
Los datos al ser muchas columnas, y sobrepasar el ancho de pantalla los divide al mostrarlo.


Código completo del  ejemplo: alojado en google drive


Fuente Original:
http://cmdlinetips.com/2018/12/pivot-table-in-python-pandas/

Otra pagina interesante:
https://www.analyticslane.com/2018/11/23/tablas-dinamicas-en-python-con-pandas/