Last active
November 20, 2024 22:04
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.