Skip to content

Instantly share code, notes, and snippets.

@cabreu145
Forked from melendezgg/cabys_a_json.py
Created August 16, 2022 15:48
Show Gist options
  • Save cabreu145/ab5ec71715e1b065ff188b3eefb2ee4e to your computer and use it in GitHub Desktop.
Save cabreu145/ab5ec71715e1b065ff188b3eefb2ee4e 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/Catalogo-de-bienes-servicios.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',
'Código del bien o servicio': 'codigo',
'Descripción del bien o servicio': '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())
# 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)
# 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: 0 if x.isalpha() else int(x.replace('%', '')))
# 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)
#print(json.dumps(json_cabys, ensure_ascii=False, indent=2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment