Skip to content

Instantly share code, notes, and snippets.

@melendezgg
Last active February 1, 2024 20:35
Show Gist options
  • Save melendezgg/ac482c4ffcbb421fa76590f2d917f470 to your computer and use it in GitHub Desktop.
Save melendezgg/ac482c4ffcbb421fa76590f2d917f470 to your computer and use it in GitHub Desktop.
Convertir el archivo Excel del catálogo CABYS del Banco Central de Costa Rica, a un archivo JSON en el formato API Ministerio de Hacienda
from pandas import read_excel
import json
URL = 'https://www.bccr.fi.cr/indicadores-economicos/cabys/Cabys_catalogo_historial_de_cambios.xlsx'
# Los nombres de las columnas Excel vs nombres cortos y eventualmente
# propiedades del json
cols = {
'Descripción (categoría 1)': 'c1',
'Descripción (categoría 2)': 'c2',
'Descripción (categoría 3)': 'c3',
'Descripción (categoría 4)': 'c4',
'Descripción (categoría 5)': 'c5',
'Descripción (categoría 6)': 'c6',
'Descripción (categoría 7)': 'c7',
'Descripción (categoría 8)': 'c8',
'Categoría 9': 'codigo',
'Descripción (categoría 9)': 'descripcion',
'Impuesto': 'impuesto'
}
# Leer el Excel del BCCR y cargarlo en un DataFrame (df_cabys), utilizar la primera hoja (Cabys),
# utilizar el encabezado ubicado en la segunda fila y extraer únicamente las columnas
# necesarias y definidas en cols.keys()
df_cabys = read_excel(
URL,
sheet_name='Cabys',
header=1,
usecols=cols.keys(),
dtype='object')
# Renombrar los nombres de las columnas con el nombre de las propiedades json a partir
# del diccionario cols
df_cabys.rename(columns=cols, inplace=True)
df_cabys["codigo"] = df_cabys["codigo"].astype(str)
# Cargar las 8 categorias en un solo campo (tupla), representada en el json como un array
df_cabys['categorias'] = df_cabys[list(cols.values())[0:8]].apply(
lambda x: (x['c1'], x['c2'], x['c3'], x['c4'], x['c5'], x['c6'], x['c7'], x['c8']), axis=1)
# Todos los valores no numéricos (Exento y na) en impuesto quedan en 0. Los valores con
# porcentaje (13%, 4%, 2%, 1%), como entero (13, 4, 2, 1)
df_cabys['impuesto'] = df_cabys['impuesto'].apply(
lambda x: int(x * 100) if isinstance(x, float)
else 0 if x == "Exento" or x == "na"
else int(x.replace('%', '')) if isinstance(x, str)
else x)
# Eliminar las 8 categorias como campos individuales para no convertirlas en el json
df_cabys.drop(list(map(lambda x: f"c{x}", range(1, 9))), axis=1, inplace=True)
# Cargar el DataFrame ya modificado en un json
json_cabys = json.loads(df_cabys.to_json(orient="records"))
# Vaciar el json en el archivo cabys.json
with open('cabys.json', 'w', encoding='utf-8') as f:
json.dump(json_cabys, f, ensure_ascii=False, indent=2, sort_keys=True)
# print(json.dumps(json_cabys, ensure_ascii=False, indent=2, sort_keys=True))
@melendezgg
Copy link
Author

melendezgg commented Mar 14, 2023

Se hace la modificación para leer la nueva estructura. BCCR y MH agregan una categoría más -Descripción (categoría 9)- que pasa a ser lo que anteriormente era el campo descripción. El campo "Categoría 9" se convierte en el código.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment