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
# https://pypi.org/project/pymarc/
import pymarc, re, csv
import pandas as pd
from pymarc import parse_xml_to_array
from datapackage import Package
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])
# Este comando añade el contenido del fichero a un Pandas DataFrame
df = pd.read_csv('registros_marc_bne.csv')
df
titulo | autor | variante_titulo | extension | distribuidor | materias | nota | detalles | |
---|---|---|---|---|---|---|---|---|
0 | 14 routen um Manacor | Manacor | Vierzehn routen um Manacor | 1 mapa | Ajuntament de Manacor, Delegació de Turisme | Excursionismo -- Mapas | Incluye fotografías | col. |
1 | 14 routes in Manacor | Manacor | Fourteen routes in Manacor | 1 mapa | Ajuntament de Manacor, Delegació de Turisme | Excursionismo -- Mapas | Incluye fotografías | col. |
2 | 14 rutas por Manacor | Manacor | Catorce rutas por Manacor | 1 mapa | Ajuntament de Manacor, Delegació de Turisme | Excursionismo -- Mapas | Incluye fotografías | col. |
3 | 14 rutes per Manacor | Manacor | Quatorze rutes per Manacor | 1 mapa | Ajuntament de Manacor, Delegació de Turisme | Excursionismo -- Mapas | Incluye fotografías | col. |
4 | A Coruña | Turismo de Galicia | NaN | 1 plano | Turismo de Galicia | NaN | Al verso: Información y localización en el pla... | col. |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1298 | [Southeastern Spain] low flying chart : Europe | España | NaN | 1 h. | Ministerio de Defensa, Secretaría General Técnica | NaN | Al verso: Clave por símbolos; frecuencias de a... | col. |
1299 | [Southwestern Spain] low flying chart : Europe | España | NaN | 1 h. | Ministerio de Defensa, Secretaría General Técnica | NaN | Al verso: Clave por símbolos; información aero... | col. |
1300 | [Southwestern Spain] low flying chart : Europe | España | NaN | 1 h. | Ministerio de Defensa, Secretaría General Técnica | NaN | Al verso: Clave por símbolos; frecuencias de a... | col. |
1301 | [Western Spain] low flying chart : Europe | España | NaN | 1 h. | Ministerio de Defensa, Secretaría General Técnica | NaN | Al verso: Clave por símbolos; información aero... | col. |
1302 | [Western Spain] low flying chart : Europe | España | NaN | 1 h. | Ministerio de Defensa, Secretaría General Técnica | NaN | Al verso: Clave por símbolos; frecuencias de a... | col. |
1303 rows × 8 columns
df.columns
Index(['titulo', 'autor', 'variante_titulo', 'extension', 'distribuidor', 'materias', 'nota', 'detalles'], dtype='object')
len(df)
1303
df['materias'][2]
'Excursionismo -- Mapas'
df['materias'].str.split(' -- ', expand=True).stack()
0 0 Excursionismo 1 Mapas 1 0 Excursionismo 1 Mapas 2 0 Excursionismo ... 1284 1 Planos 1285 0 Comercios 1 Planos 1295 0 Senderismo 1 Mapas Length: 1198, dtype: object
# Obtener valores únicos
materias = pd.unique(df['materias'].str.split(' -- ', expand=True).stack()).tolist()
for materia in sorted(materias, key=str.lower):
print(materia)
Aceite de oliva Actividades recreativas al aire libre Albergues juveniles Alojamientos turísticos Arquitectura Arquitectura modernista Arquitectura románica Arte románico Aves Bares Bodegas Buceo Caminos Carreras campo a través (Atletismo) Carreras ciclistas Carreras de automóviles Carreteras Centrales hidroeléctricas Centros docentes Ciclismo Ciclismo todoterreno Cicloturismo Cine Cines Comarcas Comercios Costas Deportes acuáticos Desplazamientos en bicicleta Enoturismo Escuelas infantiles Excursionismo Ferrocarriles de alta velocidad Ferrocarriles metropolitanos Geología Geomorfología Geoparques Hidrogeología Hidrología Historia Hostelería Jardines botánicos Lengua vasca Mantequilla Mapas Mapas Mitología Museos Nombres geográficos Orientación (Deporte) Paisaje Parques naturales Peregrinaciones cristianas Pesca de agua dulce Piragüismo Planos Quesos Radiación natural Recogida selectiva de residuos Restaurantes Rutas literarias Sector servicios Senderismo Sidra Suelos Surf Transportes Tráfico Usos del suelo Vinos Vías verdes Zonas húmedas Zonas industriales
# 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'}))
materia | contador | |
---|---|---|
0 | Mapas | 508 |
1 | Excursionismo | 130 |
2 | Carreteras | 95 |
3 | Planos | 88 |
4 | Senderismo | 81 |
5 | Comercios | 79 |
6 | Geología | 22 |
7 | Nombres geográficos | 22 |
8 | Cicloturismo | 17 |
9 | Suelos | 12 |
10 | Orientación (Deporte) | 10 |
11 | Zonas industriales | 8 |
12 | Hidrogeología | 7 |
13 | Carreras campo a través (Atletismo) | 6 |
14 | Aves | 5 |
15 | Geomorfología | 5 |
16 | Vinos | 5 |
17 | Enoturismo | 5 |
18 | Transportes | 4 |
19 | Vías verdes | 4 |
20 | Museos | 3 |
21 | Ferrocarriles metropolitanos | 3 |
22 | Actividades recreativas al aire libre | 3 |
23 | Tráfico | 3 |
24 | Comarcas | 3 |
25 | Buceo | 3 |
26 | Surf | 3 |
27 | Centros docentes | 3 |
28 | Piragüismo | 3 |
29 | Cines | 2 |
30 | Cine | 2 |
31 | Arquitectura románica | 2 |
32 | Costas | 2 |
33 | Ciclismo todoterreno | 2 |
34 | Ciclismo | 2 |
35 | Bodegas | 2 |
36 | Aceite de oliva | 2 |
37 | Mapas | 2 |
38 | Recogida selectiva de residuos | 2 |
39 | Restaurantes | 2 |
40 | Peregrinaciones cristianas | 2 |
41 | Jardines botánicos | 2 |
42 | Parques naturales | 2 |
43 | Zonas húmedas | 1 |
44 | Caminos | 1 |
45 | Rutas literarias | 1 |
46 | Bares | 1 |
47 | Sector servicios | 1 |
48 | Carreras de automóviles | 1 |
49 | Arte románico | 1 |
50 | Sidra | 1 |
51 | Arquitectura modernista | 1 |
52 | Arquitectura | 1 |
53 | Alojamientos turísticos | 1 |
54 | Albergues juveniles | 1 |
55 | Usos del suelo | 1 |
56 | Carreras ciclistas | 1 |
57 | Centrales hidroeléctricas | 1 |
58 | Radiación natural | 1 |
59 | Hidrología | 1 |
60 | Quesos | 1 |
61 | Pesca de agua dulce | 1 |
62 | Paisaje | 1 |
63 | Mitología | 1 |
64 | Mantequilla | 1 |
65 | Lengua vasca | 1 |
66 | Deportes acuáticos | 1 |
67 | Desplazamientos en bicicleta | 1 |
68 | Escuelas infantiles | 1 |
69 | Hostelería | 1 |
70 | Ferrocarriles de alta velocidad | 1 |
71 | Historia | 1 |
72 | Geoparques | 1 |