Uso ===== .. _installation: Instalación ------------ En su sistema local (laptop o computadora) `bcrpy` puede ser instalada con el comando `pip install bcrpy`. Aun asi, se recomienda instalar `bcrpy` dentro de un `ambiente virtual virtualenv `_. El protocolo para aquel seria el siguiente: .. code-block:: console $ virtualenv venv $ source venv/bin/activate (.venv) $ pip install bcrpy ``bcrpy`` ha sido desarrollado con un protocolo de programación orientada a objetos (tambien conocido como `*Object Oriented Programming (OOP)* `_) lo cual se reduce a que objetos pueden ser usados a almacenar metodos (funciones), datos, y su manejo de aquellos. Extracción de metadatos ------------------------------- En el caso de abajo, vemos como el objeto definido con la variable ``banco`` se usa para extraer los metadatos del BCRPData con el metodo ``get_metadata``, el cual la almacena como un ``Pandas DataFrame`` dentro de su variable constructora ``metadata`` .. code-block:: python import bcrpy banco = bcrpy.Marco() # cargar objeto banco.get_metadata() # obtener todos los metadatos del BCRPData >>> print(type(banco.metadata)) # imprimir estructura de data de metadatos >>> print(banco.metadata.shape) # imprimir numero de filas y columnas (14858, 14) Arriba vemos que los metadatos almacenados en ``banco.metadata`` contienen 14,858 filas con 14 columnas. Busqueda de palabras en metadatos ------------------------------------------------------------- El siguiente ejemplo muestra el metodo ``wordsearch``, el cual busca las filas de los metadatos en las cuales se encuentren palabras parecidas a la "palabra clave" que esta siendo buscada. En el caso de abajo, usamos ``wordsearch`` para buscar la palabra "economia" en las columnas 0 y 1 (primera y segunda) de la base de datos del BCRP. >>> banco.wordsearch('economia',columnas =[0,1]) corriendo wordsearch: `economia` cutoff = 0.65; columnas = [0, 1] por favor esperar... .. code-block:: ruby 0%| | 0/2 [00:00>> df_mensuales = banco.wordsearch("Mensual",cutoff=1,columnas=[5]) corriendo wordsearch: `Mensual` cutoff = 1; columnas = [5] por favor esperar... .. code-block:: ruby 0%| | 0/1 [00:00 size: (14858, 14) objeto.codes = ['PN01273PM', 'PN00015MM', 'PN01289PM', 'PD39793AM'] objeto.format = json objeto.start = 2011-1 objeto.end = 2021-1 objeto.lang = ing ================ === =========================================== **Object Attributes:** - **objeto.metadata**: `` size: (14858, 14) - **objeto.codes**: ['PN01273PM', 'PN00015MM', 'PN01289PM', 'PD39793AM'] - **objeto.format**: json - **objeto.start**: 2011-1 - **objeto.end**: 2021-1 - **objeto.lang**: ing ``Orden de datos determinados por usuario:`` .. table:: :widths: 10 20 50 ====== ===================== ================================ 1 PN01273PM Índice de precios Lima Metropolitana (var% 12 meses) - IPC 2 PN00015MM Cuentas monetarias de las sociedades creadoras de depósito - Activos Internos Netos - Crédito al Sector Privado - ME (millones US$) 3 PN01289PM Índice de precios Lima Metropolitana (índice 2009 = 100) (descontinuada) - IPC Sin Alimentos y Energía 4 PD39793AM Expectativas empresariales sectoriales - Índice de expectativas del sector a 12 meses - Servicios ====== ===================== ================================ https://estadisticas.bcrp.gob.pe/estadisticas/series/api/PN01273PM-PN00015MM-PN01289PM-PD39793AM/json/2011-1/2021-1/ing .. image:: ../img/Figure_1.png :width: 600 :alt: figure 1 .. image:: ../img/Figure_2.png :width: 600 :alt: figure 2 .. image:: ../img/Figure_3.png :width: 600 :alt: figure 3 .. image:: ../img/Figure_4.png :width: 600 :alt: figure 4 El orden de las columnas en la tabla de datos ``pandas.DataFrame`` ``"df"`` ahora se colocan en el mismo orden en el cual han sido colocados por el usuario en la variable ``banco.codes`` como opcion predeterminada. Si se desea usar el orden definido por BCRPData, reemplazar ``banco.GET()`` por ``banco.GET(order=False)``. La identidad de los nombres de serie con sus codigos, y en si cualquier lista con `x` codigos de series, se puede consultar con una iteracion del metodo ``query``, demostrado abajo: >>> [banco.query(codigo) for codigo in banco.codes] #referencia, codigos .. code-block:: ruby [Out] corriendo query para PN01273PM... PN01273PM es indice 1198 en metadatos { "Código de serie": "PN01273PM", "Categoría de serie": "Inflación", "Grupo de serie": "Índice de precios Lima Metropolitana (var% 12 meses)", "Nombre de serie": "IPC", "Fuente": "INEI", "Frecuencia": "Mensual", "Fecha de creación": "2022-04-08", "Grupo de publicación": "Índice de precios al consumidor y tipo de cambio real", "Área que publica": "Departamento de Estadísticas de Precios", "Fecha de actualización": "2023-03-09", "Fecha de inicio": "Abr-1950", "Fecha de fin": "Sep-2022", "Memo": NaN } corriendo query para PN00015MM... PN00015MM es indice 14 en metadatos { "Código de serie": "PN00015MM", "Categoría de serie": "Sociedades creadoras de depósito", "Grupo de serie": "Cuentas monetarias de las sociedades creadoras de depósito", "Nombre de serie": "Activos Internos Netos - Crédito al Sector Privado - ME (millones US$)", "Fuente": "BCRP", "Frecuencia": "Mensual", "Fecha de creación": "2022-03-24", "Grupo de publicación": "Sistema financiero y empresas bancarias y expectativas sobre condiciones crediticias", "Área que publica": "Departamento de Estadísticas Monetarias", "Fecha de actualización": "2023-02-24", "Fecha de inicio": "Abr-1992", "Fecha de fin": "Sep-2022", "Memo": NaN } corriendo query para PN01289PM... PN01289PM es indice 1212 en metadatos { "Código de serie": "PN01289PM", "Categoría de serie": "Inflación", "Grupo de serie": "Índice de precios Lima Metropolitana (índice 2009 = 100) (descontinuada)", "Nombre de serie": "IPC Sin Alimentos y Energía", "Fuente": "INEI", "Frecuencia": "Mensual", "Fecha de creación": "2022-04-07", "Grupo de publicación": "Índice de precios al consumidor y tipo de cambio real", "Área que publica": "Departamento de Estadísticas de Precios", "Fecha de actualización": "2022-04-07", "Fecha de inicio": "Abr-1991", "Fecha de fin": "Sep-2021", "Memo": NaN } corriendo query para PD39793AM... PD39793AM es indice 14855 en metadatos { "Código de serie": "PD39793AM", "Categoría de serie": "Expectativas Empresariales", "Grupo de serie": "Expectativas empresariales sectoriales", "Nombre de serie": "Índice de expectativas del sector a 12 meses - Servicios", "Fuente": NaN, "Frecuencia": "Mensual", "Fecha de creación": "2023-02-28", "Grupo de publicación": "Expectativas macroeconómicas y de ambiente empresarial", "Área que publica": "Departamento de Indicadores de la Actividad Economía", "Fecha de actualización": "2023-03-09", "Fecha de inicio": "Abr-2010", "Fecha de fin": "Sep-2022", "Memo": NaN } Extraccion mas de 100 Series temporales con LargeGET ----------------------------------------------------------- Con **largeGET**, las posibilidades son ilimitadas cuando se trata de solicitudes GET, ya que puede manejar tantos códigos de series temporales como se necesiten. Este método divide los códigos de series temporales en fragmentos de 100 series o menos, luego realiza solicitudes GET de forma iterativa y re-ensambla los fragmentos de datos en un full dataframe. Hemos encontrado la forma de hacer este proceso mas rapido con *parallel computing (multiprocessing)*, utilizando multiples procesadores concurrentemente .. image:: ../img/largeget.png :width: 450 :alt: figure 5 :align: center Para correr **largeGET** con concurrencia (computacion paralela en nucleos CPU), activar ``turbo`` y especificar el numero de nucleos de la siguiente manera: .. code-block:: python import bcrpy banco = bcrpy.Marco() # cargar objeto banco.start = '2002' banco.end = '2022' # extraer metadatos para Series anuales (columna 5 == Frecuencia) df_mensuales = banco.wordsearch("Anual",cutoff=1,columnas=[5]) codes = [i for i in df_mensuales.iloc[:,0]] df = banco.largeGET(codes,turbo=True, nucleos=4) La mayoria de computadoras modernas tienen de 2 a 4 nucleos CPU. Si no esta seguro cuantos nucleos y 4 no funciona, trate con nucleos=2. Si no deseas utilizar la paralelización, simplemente cambia la opción turbo a False. Este codigo devuelve un DataFrame (df) que contiene todas las Series anuales de BCRPData desde el 2002 hasta el 2022, lo que resulta en un total de 5,564 columnas!