El objetivo de este trabajo es hacer un análisis del endeudamiento público por países.
Datos del banco mundial: Deuda pública países y PIB países.
In [100]:
# Preprocesamos primero el fichero para obtener un diccionario de diccionarios con las series de deudas de cada país.
from urllib import request
from urllib.error import URLError
# Leemos el fichero desde la url.
try:
f = request.urlopen('http://aprendeconalf.es/python/trabajos/datos/deuda.csv')
# El fichero no existe
except URLError:
print('¡La url no existe!')
else:
# Creamos una lista con las líneas del fichero.
lineas = f.read().decode('utf-8').splitlines()
# Dividimos la primera línea del fichero que contiene los nombres de las columnas y creamos una lista con los nombres de las columnas.
columnas = lineas[0].split(',')
# Creamos un diccionario vacío para ir añadiendo las series de deuda de cada país.
deudas = {}
# Recorremos las lineas del fichero desde la 1 hasta el final
for linea in lineas[1:]:
# Creamos el diccionario que contendrá la información de una serie país-tipo deuda.
serie = {}
# Creamos una lista con los campos partiendo la línea por el carácter ,.
campos = linea.split(',')
# Recorremos los campos de la línea
for i in range(4, len(columnas)):
# Para cada campo añadimos al diccionario el par con clave el nombre de la columna y valor el campo de la posición i.
serie[columnas[i][:6]] = campos[i]
# Añadimos el diccionario a la lista de alojamientos.
deudas[(campos[1], campos[3])] = serie
print(deudas)
In [101]:
def deuda_pais(deudas, pais, tipo):
''' Función que recibe un diccionario con las deudas de cada país y devuelve la serie de deuda de un tipo y un país dado.
Parámetros:
- deudas: Es un diccionario de diccionarios donde las claves del diccionario principal son tuplas (país, tipo de deuda) y los valores son diccionarios con las deudas de cada trimestre.
- pais: Es una cadena con el nombre del país.
- tipo: Es una cadena con el tipo de deuda.
Devuelve: Un diccionario con las deudas trimestrales del tipo y el país dados.
'''
return deudas[(pais, tipo)]
# Ejemplo
print(deuda_pais(deudas, 'AUS', 'DP.DOD.DLTC.CR.M1.PS.CD'))
In [102]:
def rango_deuda(deudas, pais, tipo):
''' Función que devuelve el mínino y el máximo de deuda de un tipo y un país dado.
Parámetros:
- deudas: Es un diccionario de diccionarios donde las claves del diccionario principal son tuplas (país, tipo de deuda) y los valores son diccionarios con las deudas de cada trimestre.
- pais: Es una cadena con el nombre del país.
- tipo: Es una cadena con el tipo de deuda.
Devuelve: Un diccionario con el mínimo y el máximo de la deuda trimestral del tipo y el país dados.
'''
deuda = deudas[(pais, tipo)]
return {'Mínimo': min(deuda.values()), 'Máximo': max(deuda.values())}
# Ejemplo
print(rango_deuda(deudas, 'AUS', 'DP.DOD.DLTC.CR.M1.PS.CD'))
In [103]:
def deuda_interna_externa(deudas, pais, fecha):
''' Función que devuelve la deuda interna y externa de un trimestre y un país dado.
Parámetros:
- deudas: Es un diccionario de diccionarios donde las claves del diccionario principal son tuplas (país, tipo de deuda) y los valores son diccionarios con las deudas de cada trimestre.
- pais: Es una cadena con el nombre del país.
- fecha: Es una cadena con el año y el trimestre.
Devuelve: Un diccionario con la deuda interna y externa del trimestre y el país dados.
'''
deuda_interna = deudas[(pais, 'DP.DOD.DECD.CR.PS.CD')]
deuda_externa = deudas[(pais, 'DP.DOD.DECX.CR.PS.CD')]
return {'Deuda interna':deuda_interna[fecha], 'Deuda externa':deuda_externa[fecha]}
# Ejemplo
print(deuda_interna_externa(deudas, 'AUS', '2015Q1'))
In [104]:
def deuda_moneda_local_extranjera(deudas, pais, fecha):
''' Función que devuelve la deuda en moneda local y extranjera de un trimestre y un país dado.
Parámetros:
- deudas: Es un diccionario de diccionarios donde las claves del diccionario principal son tuplas (país, tipo de deuda) y los valores son diccionarios con las deudas de cada trimestre.
- pais: Es una cadena con el nombre del país.
- fecha: Es una cadena con el año y el trimestre.
Devuelve: Un diccionario con la deuda en moneda local y extranjera del trimestre y el país dados.
'''
deuda_moneda_local = deudas[(pais, 'DP.DOD.DECN.CR.PS.CD')]
deuda_moneda_extranjera = deudas[(pais, 'DP.DOD.DECF.CR.PS.CD')]
return {'Deuda en moneda local':deuda_moneda_local[fecha], 'Deuda en moneda extranjera':deuda_moneda_extranjera[fecha]}
# Ejemplo
print(deuda_moneda_local_extranjera(deudas, 'AUS', '2015Q1'))
In [105]:
import pandas as pd
from urllib.error import HTTPError
try:
deuda = pd.read_csv('http://aprendeconalf.es/python/trabajos/datos/deuda.csv')
except HTTPError:
print('La url no existe')
else:
deuda = deuda.melt(id_vars=['Country Name', 'Country Code', 'Series Name',
'Series Code'], var_name='Fecha', value_name='Cantidad')
# Renombramos los nombres de las columnas que queremos
deuda.rename(columns={'Country Name': 'Pais', 'Country Code': 'PaisId',
'Series Name': 'Tipo', 'Series Code': 'TipoId'}, inplace=True)
# Extraemos los 6 primeros caracteres de la columna Fecha
deuda['Fecha'] = deuda.Fecha.str[0:6]
# Renombramos los tipos de deuda
tipos = {'DP.DOD.DECD.CR.PS.CD': 'Deuda interna', 'DP.DOD.DECN.CR.PS.CD': 'Deuda en moneda local', 'DP.DOD.DECX.CR.PS.CD': 'Deuda externa',
'DP.DOD.DECF.CR.PS.CD': 'Deuda en moneda extranjera', 'DP.DOD.DLTC.CR.M1.PS.CD': 'Deuda a lago plazo', 'DP.DOD.DSTC.CR.PS.CD': 'Deuda a corto plazo'}
deuda['TipoId'] = deuda.TipoId.apply(
lambda x: tipos[x] if x in tipos.keys() else x)
deuda
Out[105]:
In [106]:
def resumen_deuda(deudas, pais, fecha):
''' Función que devuelve la deuda total interna, externa, en moneda local, en moneda extranjera, a corto plazo y a largo plazo, de un país y una fecha dados.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- pais: Es una cadena con el nombre del país.
- fecha: Es una cadena con el año y el trimestre.
Devuelve: Una serie con la deuda total interna, externa, en moneda local, en moneda extranjera, a corto plazo y a largo plazo, del país y la fecha dados.
'''
# Filtramos el país, la fecha y los tipos de deuda
deuda_filtro = deuda[(deuda.PaisId == pais) & (deuda.Fecha == fecha) & deuda.TipoId.isin(
['Deuda interna', 'Deuda en moneda local', 'Deuda externa', 'Deuda en moneda extranjera', 'Deuda a lago plazo', 'Deuda a corto plazo'])]
# Devolvemos la serie de la columna Cantidad tomando como índice la columna del tipo de deuda.
return pd.Series(list(deuda_filtro.Cantidad), index=deuda_filtro.TipoId)
# Ejemplo
print(resumen_deuda(deuda, 'AUS', '2015Q1'))
In [107]:
def resumen_deuda(deuda, tipo, fecha):
''' Función que devuelve la deuda de todos los países de un tipo y en una fecha dados.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- tipo: Es una cadena con el tipo de deuda.
- fecha: Es una cadena con el año y el trimestre.
Devuelve: Una serie con la deuda de todos los países del tipo y la fecha dados.
'''
# Filtramos el tipo de deuda y la fecha
deuda_filtro = deuda[(deuda.TipoId == tipo) & (deuda.Fecha == fecha)]
# Devolvemos la serie de la columna Cantidad tomando como índice la columna del país.
return pd.Series(list(deuda_filtro.Cantidad), index=deuda_filtro.Pais)
# Ejemplo
print(resumen_deuda(deuda, 'Deuda externa', '2015Q1'))
In [108]:
import matplotlib.pyplot as plt
def sectores_deuda_externa_interna(deudas, pais, fecha):
''' Función que dibuja un diagrama de sectores con la deuda interna y externa de un país y una fecha dados.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- tipo: Es una cadena con el tipo de deuda.
- fecha: Es una cadena con el año y el trimestre.
'''
# Filtramos el país, la fecha y los tipos de deuda
deuda_filtro = deuda[(deuda.PaisId == pais) & (
deuda.Fecha == fecha) & deuda.TipoId.isin(['Deuda interna', 'Deuda externa'])]
# Creamos una serie de la columna Cantidad tomando como índice la columna del tipo de deuda.
serie = pd.Series(list(deuda_filtro.Cantidad), index=deuda_filtro.TipoId)
# Creamos la figura y los ejes
fig, ax = plt.subplots()
# Dibujamos el diagrama de sectores
serie.plot(kind='pie', autopct='%1.0f%%', ax=ax)
# Añadimos el título
ax.set_title('Deuda externa vs interna de ' + pais + ' en ' + fecha, loc="center",
fontdict={'fontsize': 14, 'fontweight': 'bold', 'color': 'tab:blue'})
# Eliminamos la etiqueta del eje y
ax.set_ylabel('')
# Guardamos el gráfico.
plt.show()
return
# Ejemplo
print(sectores_deuda_externa_interna(deuda, 'AUS', '2015Q1'))
In [109]:
def barras_tipos_deuda(deuda, pais, fecha):
''' Función que dibuja un diagrama de barras con las cantidades de los distintos tipos de deudas de un país y una fecha dados.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- pais: Es una cadena con el nombre del país.
- fecha: Es una cadena con el año y el trimestre.
'''
# Filtramos el país, la fecha y los tipos de deuda
deuda_filtro = deuda[(deuda.PaisId == pais) & (deuda.Fecha == fecha)]
# Creamos la figura y los ejes
fig, ax = plt.subplots()
# Dibujamos el diagrama de barras
deuda_filtro.plot(kind='bar', x='Tipo', y='Cantidad', ax=ax)
# Añadimos el título
ax.set_title('Deuda por tipología de ' + pais + ' en ' + fecha, loc="center",
fontdict={'fontsize': 14, 'fontweight': 'bold', 'color': 'tab:blue'})
# Eliminamos la leyenda
ax.legend().remove()
# Guardamos el gráfico.
plt.show()
return
# Ejemplo
print(barras_tipos_deuda(deuda, 'AUS', '2015Q1'))
In [110]:
def evolucion_tipo_deuda(deuda, paises, tipo):
''' Función que dibuja un diagrama de líneas con la evolución de un tipo de deuda y una lista de países dados.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- paises: Es una lista de cadenas con los nombres de los países.
- tipo: Es una cadena con el tipo de deuda.
'''
# Filtramos los países y el tipo de deuda
deuda_filtro = deuda[(deuda.PaisId.isin(paises)) & (deuda.TipoId == tipo)]
# Convertimos la fecha en el índice
deuda_filtro.set_index('Fecha', inplace=True)
# Creamos la figura y los ejes
fig, ax = plt.subplots()
# Dibujamos el diagrama de barras
deuda_filtro.groupby('PaisId').Cantidad.plot(legend=True, ax=ax)
# Añadimos el título
ax.set_title('Evolución de ' + tipo, loc="center",
fontdict={'fontsize': 14, 'fontweight': 'bold', 'color': 'tab:blue'})
# Guardamos el gráfico.
plt.show()
return
# Ejemplo
evolucion_tipo_deuda(deuda, ['GEO', 'SLV', 'MDA'], 'Deuda interna')
In [111]:
def evolucion_deuda_pais(deuda, pais, tipos):
''' Función que dibuja un diagrama de líneas con la evolución de unos tipos de deuda y un país dado.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- pais: Es un cadena con el nombre del país.
- tipos: Es una lista de cadenas con los tipo de deuda.
'''
# Filtramos el país y los tipos de deuda
deuda_filtro = deuda[(deuda.PaisId == pais) & (deuda.TipoId.isin(tipos))]
# Convertimos la fecha en el índice
deuda_filtro.set_index('Fecha', inplace=True)
# Creamos la figura y los ejes
fig, ax = plt.subplots()
# Dibujamos el diagrama de barras
deuda_filtro.groupby('TipoId').Cantidad.plot(legend=True, ax=ax)
# Añadimos el título
ax.set_title('Evolución de los tipos de deuda de ' + pais, loc="center",
fontdict={'fontsize': 14, 'fontweight': 'bold', 'color': 'tab:blue'})
# Guardamos el gráfico.
plt.show()
return
# Ejemplo
evolucion_deuda_pais(deuda, 'SLV', ['Deuda interna', 'Deuda externa'])
In [112]:
def cajas_deuda(deuda, paises, tipos):
''' Función que dibuja un diagrama de cajas con las deudas de unos tipos y unos países dados.
Parámetros:
- deuda: Es un DataFrame con las deudas de los países.
- paises: Es una lista de cadenas con los nombres de los países.
- tipos: Es una lista de cadenas con los tipo de deuda.
'''
# Filtramos el país y los tipos de deuda
deuda_filtro = deuda[(deuda.PaisId.isin(paises)) &
(deuda.TipoId.isin(tipos))]
# Creamos la figura y los ejes
fig, ax = plt.subplots()
# Dibujamos el diagrama de cajas
deuda_filtro.boxplot(column='Cantidad', by=['PaisId', 'TipoId'], ax=ax)
# Añadimos el título
ax.set_title('Deuda de ' + ', '.join(paises) + '\n(' + ', '.join(tipos) + ')',
loc="center", fontdict={'fontsize': 14, 'fontweight': 'bold', 'color': 'tab:blue'})
plt.suptitle('')
# Rotamos las etiquetas del eje x
plt.xticks(rotation=90)
# Guardamos el gráfico.
plt.show()
return
# Ejemplo
cajas_deuda(deuda, ['BOL', 'MDA', 'SLV'], ['Deuda interna', 'Deuda externa'])
In [ ]: