#!/usr/bin/env python # coding: utf-8 # # La Bibliografía Española de Cartografía # # Este notebook utiliza la Bibliografía Española de Cartografía es una publicación cuyo objetivo principal es dar a conocer el material cartográfico publicado en España, que ingresa en la Biblioteca Nacional de España que incluye mapas, planos, cartas náuticas, atlas, etc., tanto en formato impreso como electrónico. # # En el año 2007 se inició la publicación en línea y desde el 2010 se incorporan a esta bibliografía los atlas, antes recogidos en la Bibliografía Española de Monografías. Se publica anualmente y es consultable en línea. # # https://datos.gob.es/es/catalogo/e00123904-bibliografia-espanola-de-cartografia-2017 # ### Importando las librerías de código # In[1]: # https://pypi.org/project/pymarc/ import pymarc, re, csv import pandas as pd from pymarc import parse_xml_to_array from datapackage import Package # ### Generando un fichero CSV como salida con el contenido procesado a partir de los ficheros originales # In[5]: with open('registros_marc_bne.csv', 'w') as csv_fichero: csv_salida = csv.writer(csv_fichero, delimiter = ',', quotechar = '"', quoting = csv.QUOTE_MINIMAL) csv_salida.writerow(['titulo', 'autor', 'variante_titulo', 'extension', 'distribuidor', 'materias', 'nota', 'detalles']) registros = parse_xml_to_array(open('BNE-cartografia/BN_CARTOGRAFIA_2017-MARCXML.xml')) for registro in registros: titulo = autor = variante_titulo = extension = distribuidor = materias = nota = detalles ='' # titulo if registro['245'] is not None: titulo = registro['245']['a'] if registro['245']['b'] is not None: titulo = titulo + " " + registro['245']['b'] # autor if registro['100'] is not None: autor = registro['100']['a'] elif registro['110'] is not None: autor = registro['110']['a'] elif registro['700'] is not None: autor = registro['700']['a'] elif registro['710'] is not None: autor = registro['710']['a'] # variante de titulo if registro['246'] is not None: variante_titulo = registro['246']['a'] # Physical Description - extent for f in registro.get_fields('300'): extension = f.get_subfields('a') if len(extension): extension = extension[0] # TODO cleaning detalles = f.get_subfields('b') if len(detalles): detalles = detalles[0] # distribuidor if registro['260'] is not None: distribuidor = registro['260']['b'] # nota if registro['501'] is not None: nota = registro['501']['a'] # materia if registro['650'] is not None: materias = '' for f in registro.get_fields('650'): materias += f.get_subfields('a')[0] + ' -- ' materias += f.get_subfields('v')[0] + ' -- ' materias = re.sub(' -- $', '', materias) csv_salida.writerow([titulo,autor,variante_titulo,extension,distribuidor,materias,nota,detalles]) # ## Leyendo el fichero CSV # In[6]: # Este comando añade el contenido del fichero a un Pandas DataFrame df = pd.read_csv('registros_marc_bne.csv') # ## Consultando el contenido # In[7]: df # ### Consultando las columnas # In[22]: df.columns # ### ¿Cuántos registros existen? # In[23]: len(df) # ## Explorando las materias # ### Creamos una lista de materias y la ordenamos alfabéticamente # In[24]: df['materias'][2] # In[25]: df['materias'].str.split(' -- ', expand=True).stack() # In[26]: # Obtener valores únicos materias = pd.unique(df['materias'].str.split(' -- ', expand=True).stack()).tolist() for materia in sorted(materias, key=str.lower): print(materia) # ### También podemos calcular con qué frecuencia se usa una materia # In[27]: # Partir las materias y obterner el número de ocurrencias materia_contador = df['materias'].str.split(' -- ').apply(lambda x: pd.Series(x).value_counts()).sum().astype('int').sort_values(ascending=False).to_frame().reset_index(level=0) # Añadimos las columnas materia_contador.columns = ['materia', 'contador'] # Mostrar con barras horizontales display(materia_contador.style.bar(subset=['contador'], color='#d65f5f').set_properties(subset=['contador'], **{'width': '300px'})) # In[ ]: