Análisis de los Presupuestos económicos (Ingresos 2018) del Ayuntamiento de Alcobendas

Instalación de las librerías con las que vamos a trabajar

Según la Universidad de Alcalá, en Computación y Ciencia de datos, Pandas es una biblioteca de software escrita como extensión de Numpy (biblioteca para el lenguaje de programación Python que da soporte para crear vectores y matrices grandes multidimensionales, junto con una gran colección de funciones matemáticas de alto nivel para operar con ellas) para manipulación y análisis de datos para el lenguaje de programación Python. En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series temporales.

In [5]:
!pip install pandas
Requirement already satisfied: pandas in /usr/local/lib/python3.8/dist-packages (1.3.1)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (2020.4)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (1.21.1)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (2.8.1)
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7.3->pandas) (1.14.0)

Configuración de Pandas

En primer lugar, se importa la librería Pandas y se renombra como "pd" para utilizarla en el resto de notebook:

In [7]:
import pandas as pd 

Creación de variables

Tras haber importado la librería, mediante = se crea la variable que contiene los datos que se van a emplear:

In [12]:
url_pres = "https://datos.alcobendas.org/dataset/f1b27265-9654-447f-baef-2f3619a59baa/resource/93b1db99-c3ae-4596-b745-ae6924f05cad/download/ingresos.csv"

A continuación, se comprueba la creación de dicha variable:

In [14]:
url_pres
Out[14]:
'https://datos.alcobendas.org/dataset/f1b27265-9654-447f-baef-2f3619a59baa/resource/93b1db99-c3ae-4596-b745-ae6924f05cad/download/ingresos.csv'

Creación de un nuevo DataFrame

Según Datacarpentry, un DataFrame es una estructura de datos con dos dimensiones en la cual se puede guardar datos de distintos tipos (como caractéres, enteros, valores de punto flotante, factores y más) en columnas.

Una vez definida la nueva variable, se crea un nuevo DataFrame de Pandas:

In [17]:
df = pd.read_csv(url_pres)

A continuación, se expone el nuevo DataFrame:

In [18]:
df
Out[18]:
Código Nombre Crédito inicial del ejercicio
0 1.0 IMPUESTOS DIRECTOS 76893259.18
1 10.0 Impuesto sobre la Renta 4994977.89
2 100.0 Impuestos sobre la Renta de las Personas Físicas 4994977.89
3 101.0 Impuesto sobre Sociedades 0.00
4 102.0 Impuesto sobre la Renta de No Residentes 0.00
... ... ... ...
324 930.0 Préstamos recibidos en moneda distinta del eur... 0.00
325 931.0 Préstamos recibidos en moneda distinta del eur... 0.00
326 94.0 Depósitos y fianzas recibidos 0.00
327 940.0 Depósitos recibidos 0.00
328 941.0 Fianzas recibidas 0.00

329 rows × 3 columns

Exploración del DataFrame

Información general

A través de df.info se presenta la información de la tabla:

Según la página web de Pandas, muestra información sobre el DataFrame entre la que incluye el índice (Rangeindex) con el número de entradas, el número de columnas que hay (Data Columns), el nombre de las columnas (Colum), la cantidad de datos nulos que posee la tabla (Non-Null Count), el tipo de variable de las columnas (Dtype) y el tamaño (memory usage).

In [19]:
df. info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 329 entries, 0 to 328
Data columns (total 3 columns):
 #   Column                         Non-Null Count  Dtype  
---  ------                         --------------  -----  
 0   Código                         329 non-null    float64
 1   Nombre                         329 non-null    object 
 2   Crédito inicial del ejercicio  329 non-null    float64
dtypes: float64(2), object(1)
memory usage: 7.8+ KB

Cabecera

Se emplea df.head() para mostrar las primeras entradas de la tabla. Entre paréntesis se pueden indicar cuántas entradas se quieren mostrar. En este caso se exponen cuatro:

In [43]:
df.head(4)
Out[43]:
Código Nombre Crédito inicial del ejercicio
0 1.0 IMPUESTOS DIRECTOS 76893259.18
1 10.0 Impuesto sobre la Renta 4994977.89
2 100.0 Impuestos sobre la Renta de las Personas Físicas 4994977.89
3 101.0 Impuesto sobre Sociedades 0.00

Cola

Después, se muestran las últimas entradas de la tabla (tail) mediante df.tail().

De nuevo, entre paréntesis se puede especificar el número de entradas que se quieren mostrar. En este caso, se volverá a mostrar cuatro entradas:

In [44]:
df. tail(4)
Out[44]:
Código Nombre Crédito inicial del ejercicio
325 931.0 Préstamos recibidos en moneda distinta del eur... 0.0
326 94.0 Depósitos y fianzas recibidos 0.0
327 940.0 Depósitos recibidos 0.0
328 941.0 Fianzas recibidas 0.0

Columnas

Además, mediante df.columns se expone el nombre de las columnas de la tabla:

In [22]:
df.columns
Out[22]:
Index(['Código', 'Nombre', 'Crédito inicial del ejercicio'], dtype='object')

También se pueden mostrar columnas concretas mediante df['nombre de la columna'].

A continuación, se ejemplifica lo comentado mediante la columna "Crédito inicial del ejercicio".

In [25]:
df['Crédito inicial del ejercicio']
Out[25]:
0      76893259.18
1       4994977.89
2       4994977.89
3             0.00
4             0.00
          ...     
324           0.00
325           0.00
326           0.00
327           0.00
328           0.00
Name: Crédito inicial del ejercicio, Length: 329, dtype: float64

Además, se puede mostrar una fila en concreto de la columna especificada. Esto se realiza añadiendo el número de dicha fila a continuación del nombre. En este caso se muestra la fila número dos:

In [28]:
df['Crédito inicial del ejercicio'][2]
Out[28]:
4994977.89

Demostración de las variables estadísticas

Mediante df.describe() se muestran las variables estadísticas del DataFrame, algo que no se muestra normalmente:

In [29]:
df.describe()
Out[29]:
Código Crédito inicial del ejercicio
count 329.000000 3.290000e+02
mean 403.929514 1.309417e+06
std 275.541759 6.444360e+06
min 1.000000 0.000000e+00
25% 115.000000 0.000000e+00
50% 394.000000 0.000000e+00
75% 600.000000 1.560000e+01
max 941.000000 7.689326e+07

Indexar el DataFrame según una columna

También es posible indexar -ordenar los datos- en función de una columna a través de df.set_index('')

En este caso, se indexa el DataFrame según la columna "Nombre":

In [30]:
df.set_index('Nombre')
Out[30]:
Código Crédito inicial del ejercicio
Nombre
IMPUESTOS DIRECTOS 1.0 76893259.18
Impuesto sobre la Renta 10.0 4994977.89
Impuestos sobre la Renta de las Personas Físicas 100.0 4994977.89
Impuesto sobre Sociedades 101.0 0.00
Impuesto sobre la Renta de No Residentes 102.0 0.00
... ... ...
Préstamos recibidos en moneda distinta del euro a corto plazo 930.0 0.00
Préstamos recibidos en moneda distinta del euro a largo plazo 931.0 0.00
Depósitos y fianzas recibidos 94.0 0.00
Depósitos recibidos 940.0 0.00
Fianzas recibidas 941.0 0.00

329 rows × 2 columns

Lo mismo ocurre indexando la variable "Crédito inicial del ejercicio":

In [32]:
df.set_index('Nombre')['Crédito inicial del ejercicio']
Out[32]:
Nombre
IMPUESTOS DIRECTOS                                               76893259.18
Impuesto sobre la Renta                                           4994977.89
Impuestos sobre la Renta de las Personas Físicas                  4994977.89
Impuesto sobre Sociedades                                               0.00
Impuesto sobre la Renta de No Residentes                                0.00
                                                                    ...     
Préstamos recibidos en moneda distinta del euro a corto plazo           0.00
Préstamos recibidos en moneda distinta del euro a largo plazo           0.00
Depósitos y fianzas recibidos                                           0.00
Depósitos recibidos                                                     0.00
Fianzas recibidas                                                       0.00
Name: Crédito inicial del ejercicio, Length: 329, dtype: float64

Creación de un gráfico a partir de "Nombre" y "Crédito inicial del ejercicio"

Una vez indexados los datos según "Nombre" y "Crédito inicial del ejercicio", mediante .plot se presentan los datos en un gráfico. A continuación, para añadir un título al gráfico, lo hacemos a través de title como argumento de .plot:

In [34]:
df.set_index('Nombre')['Crédito inicial del ejercicio'].plot(title="Crédito inicial del ejercicio")
Out[34]:
<AxesSubplot:title={'center':'Crédito inicial del ejercicio'}, xlabel='Nombre'>

Debido a la longitud de las etiquetas de "Nombre", no se puede distinguir a qué nombre corresponde cada dato en el gráfico.

Creación de otro gráfico a partir de "Nombre" y "Código"

En esta ocasión se va a indexar el DataFrame según las variables "Nombre" y "Código":

In [36]:
df.set_index('Nombre')['Código']
Out[36]:
Nombre
IMPUESTOS DIRECTOS                                                 1.0
Impuesto sobre la Renta                                           10.0
Impuestos sobre la Renta de las Personas Físicas                 100.0
Impuesto sobre Sociedades                                        101.0
Impuesto sobre la Renta de No Residentes                         102.0
                                                                 ...  
Préstamos recibidos en moneda distinta del euro a corto plazo    930.0
Préstamos recibidos en moneda distinta del euro a largo plazo    931.0
Depósitos y fianzas recibidos                                     94.0
Depósitos recibidos                                              940.0
Fianzas recibidas                                                941.0
Name: Código, Length: 329, dtype: float64

Creación de un gráfico a partir de "Nombre" y "Código"

Una vez indexados los datos según "Nombre" y "Código", mediante .plot se muestran los datos en un gráfico. Además, al igual que se ha realizado anteriormente, se añade title= como argumento de .plot para poner un título al gráfico:

In [37]:
df.set_index('Nombre')['Código'].plot(title="Códigos")
Out[37]:
<AxesSubplot:title={'center':'Códigos'}, xlabel='Nombre'>

Al igual que en el anterior gráfico, debido a la longitud de las etiquetas de "Nombre" no se puede distinguir a qué nombre corresponde cada dato del gráfico.

Comparación de Código y Crédito inicial del ejercicio

A continuación, se van a comparar los "codigos" y los "créditos iniciales del ejercicio" en base al "Nombre".

Se definen dos nuevas variables, una para cada variable:

In [38]:
nombre_credit = df.set_index('Nombre')['Crédito inicial del ejercicio']
nombre_codig = df.set_index('Nombre')['Código']

Antes de crear un DataFrame y un gráfico con estos datos, es necesario concatenarlos mediante vs:

In [39]:
vs = pd.concat([nombre_credit,nombre_codig],axis=1)
vs
Out[39]:
Crédito inicial del ejercicio Código
Nombre
IMPUESTOS DIRECTOS 76893259.18 1.0
Impuesto sobre la Renta 4994977.89 10.0
Impuestos sobre la Renta de las Personas Físicas 4994977.89 100.0
Impuesto sobre Sociedades 0.00 101.0
Impuesto sobre la Renta de No Residentes 0.00 102.0
... ... ...
Préstamos recibidos en moneda distinta del euro a corto plazo 0.00 930.0
Préstamos recibidos en moneda distinta del euro a largo plazo 0.00 931.0
Depósitos y fianzas recibidos 0.00 94.0
Depósitos recibidos 0.00 940.0
Fianzas recibidas 0.00 941.0

329 rows × 2 columns

Creación de un gráfico de comparación

Una vez concatenados los datos de ambas variables, se puede elaborar un gráfico de comparación con ellos:

In [41]:
vs.columns =['Crédito inicial del ejercicio','Código']
vs.plot(title="Código vs Crédito Inicial")
Out[41]:
<AxesSubplot:title={'center':'Código vs Crédito Inicial'}, xlabel='Nombre'>

Guardamos en un csv

Por último, se guarda todo lo realizado en un archivo csv:

In [47]:
vs.to_csv('ingresos.csv')

Se comprueba que el archivo se ha creado mediante ls, y como este es un comando de bash, se indica ! par poder utilizarlo:

In [49]:
!ls
api-pandas-folium.ipynb  phyton-pruebas.ipynb		  Shared_Resources
escit.png		 python-api-covid-pandas.ipynb	  Untitled.ipynb
esvit.csv		 python-csv-farolas-pandas.ipynb
ingresos.csv		 seaborn-data

Se importa matplotlib.pyplot (Según Aprende con Alf Matplotlib.pyplot es una librería de Python especializada en la creación de gráficos en dos dimensiones. Permite crear y personalizar los tipos de gráficos más comunes, entre ellos: Diagramas de barras) y se redefine como plt.

También se guarda el gráfico:

In [50]:
import matplotlib.pyplot as plt 
vs.plot()
plt.savefig('ingresos.png')