structure

Basic functionality related to the structure of the (XML) data

For testing purposes

import sproc.xml
import pprint

Some hardwired metadata: the base URLs and file names for every kind of file hosted (the final / at the end of each base_url is required for urllib.parse.urljoin below to work correctly), and the naming scheme.

pprint.PrettyPrinter().pprint(tables)
{'insiders': {'base_filename': 'licitacionesPerfilesContratanteCompleto3_',
              'base_url': 'https://contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_643/',
              'naming_filename': 'insiders_minors.yaml'},
 'minors': {'base_filename': 'contratosMenoresPerfilesContratantes_',
            'base_url': 'https://contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_1143/',
            'naming_filename': 'insiders_minors.yaml'},
 'outsiders': {'base_filename': 'PlataformasAgregadasSinMenores_',
               'base_url': 'https://contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_1044/',
               'naming_filename': 'outsiders.yaml'}}

Sample data

Directory where the data (XML files) are stored

directory = pathlib.Path.cwd().parent / 'samples'
assert directory.exists()
directory
PosixPath('/home/manu/Sync/UC3M/proyectos/2022/nextProcurement/sproc/samples')

A (sample) file in that directory

xml_file = directory / 'PlataformasAgregadasSinMenores_20220104_030016_1.atom'
assert xml_file.exists()
xml_file
PosixPath('/home/manu/Sync/UC3M/proyectos/2022/nextProcurement/sproc/samples/PlataformasAgregadasSinMenores_20220104_030016_1.atom')
df = sproc.xml.to_df(xml_file)
df
id summary title updated ContractFolderStatus - ContractFolderID ContractFolderStatus - ContractFolderStatusCode ContractFolderStatus - LocatedContractingParty - BuyerProfileURIID ContractFolderStatus - LocatedContractingParty - Party - PartyName - Name ContractFolderStatus - LocatedContractingParty - ParentLocatedParty - PartyName - Name ContractFolderStatus - ProcurementProject - Name ... ContractFolderStatus - LegalDocumentReference - Attachment - ExternalReference - URI ContractFolderStatus - TechnicalDocumentReference - ID ContractFolderStatus - TechnicalDocumentReference - Attachment - ExternalReference - URI ContractFolderStatus - ProcurementProject - PlannedPeriod - StartDate ContractFolderStatus - ProcurementProject - PlannedPeriod - EndDate ContractFolderStatus - LocatedContractingParty - Party - PartyIdentification - ID ContractFolderStatus - LocatedContractingParty - ParentLocatedParty - ParentLocatedParty - PartyName - Name ContractFolderStatus - TenderingProcess - ParticipationRequestReceptionPeriod - EndDate ContractFolderStatus - TenderingProcess - ParticipationRequestReceptionPeriod - EndTime ContractFolderStatus - TenderResult - AwardedTenderedProject - ProcurementProjectLotID
0 https://contrataciondelestado.es/sindicacion/P... Id licitación: C. 2-2021; Órgano de Contrataci... L'objecte del contracte és la renovació de tot... 2022-01-03T01:11:41.826+01:00 C. 2-2021 ADJ https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Sant Ramon Entitats municipals de Catalunya L'objecte del contracte és la renovació de tot... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 https://contrataciondelestado.es/sindicacion/P... Id licitación: 8128_3/2021; Órgano de Contrata... Obras de restauración hidromorfológica del río... 2022-01-03T01:00:11.194+01:00 8128_3/2021 PUB NaN Pleno del Ayuntamiento AYUNTAMIENTO DE MONREAL Obras de restauración hidromorfológica del río... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 https://contrataciondelestado.es/sindicacion/P... Id licitación: 1000_0005-CP01-2021-000063; Órg... Contrato del servicio de realización de labore... 2022-01-03T01:00:10.399+01:00 1000_0005-CP01-2021-000063 EV NaN El Director General de Comunicación y Relacion... Departamento de Presidencia, Igualdad, Función... Contrato del servicio de realización de labore... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 https://contrataciondelestado.es/sindicacion/P... Id licitación: 1379/2020 4738; Órgano de Contr... Obres de renovació de l'enllumenat públic a la... 2022-01-03T00:11:40.740+01:00 1379/2020 4738 EV https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Canet de Mar Entitats municipals de Catalunya Obres de renovació de l'enllumenat públic a la... ... https://contractaciopublica.gencat.cat/ecofin_... NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021-44; Órgano de Contratación... Subministre i la instal·lació fotovoltaica en ... 2022-01-03T00:11:40.696+01:00 2021-44 EV https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Valls Entitats municipals de Catalunya Subministre i la instal·lació fotovoltaica en ... ... https://contractaciopublica.gencat.cat/ecofin_... Enllac plec clausules tecniques.doc https://contractaciopublica.gencat.cat/ecofin_... NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
112 https://contrataciondelestado.es/sindicacion/P... Id licitación: 1005_391-2021; Órgano de Contra... Apoyo a la gestión del patrimonio filmográfico... 2021-12-31T01:00:14.946+01:00 1005_391-2021 PUB NaN Dirección General de Cultura-Institución Prínc... Departamento de Cultura, Deporte y Juventud Apoyo a la gestión del patrimonio filmográfico... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
113 https://contrataciondelestado.es/sindicacion/P... Id licitación: 8165_3/2021; Órgano de Contrata... Asistencia técnica para la prestación del serv... 2021-12-31T01:00:14.393+01:00 8165_3/2021 EV NaN Mancomunidad de Servicios Sociales de Base de ... MANCOMUNIDAD DE SERVICIOS DE HUARTE Y DE ESTER... Asistencia técnica para la prestación del serv... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
114 https://contrataciondelestado.es/sindicacion/P... Id licitación: 8113_3/2021; Órgano de Contrata... Contrato de servicios de desinfección, desinse... 2021-12-31T01:00:13.594+01:00 8113_3/2021 EV NaN Subdirector de Gestión y Recursos Agencia Navarra para la Dependencia Contrato de servicios de desinfección, desinse... ... NaN NaN NaN 2022-01-01 2022-12-31 NaN NaN NaN NaN NaN
115 https://contrataciondelestado.es/sindicacion/P... Id licitación: 8113_01 2021; Órgano de Contrat... Contrato del Servicio de Teleasistencia para l... 2021-12-31T01:00:12.604+01:00 8113_01 2021 EV NaN Agencia Navarra de Autonomía y Desarrollo de l... Agencia Navarra para la Dependencia Contrato del Servicio de Teleasistencia para l... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
116 https://contrataciondelestado.es/sindicacion/P... Id licitación: 0001264/2021; Órgano de contrat... 2021/pa-44-4 servicio de mantenimiento integra... 2021-12-31T00:14:15.739+01:00 0001264/2021 RES NaN Agencia Pública Empresarial Sanitaria Bajo Gua... Junta de Andalucía 2021/pa-44-4 servicio de mantenimiento integra... ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

117 rows × 38 columns

Nested tags

When a tag is nested inside other tag the string below is used to assemble the name of the resulting column from those of the original tags

For instance, a tag <month> inside a tag <date> will yield a column

f'month{nested_tags_separator}date'
'month - date'

A high-level function to do exactly that


source

assemble_name

 assemble_name (tags:list)

Assemble the name of field/column in the DataFrame from a path of nested tags

Type Details
tags list Tags
Returns str Name
assemble_name(['foo', 'fa'])
'foo - fa'

NaNs are ignored…

assemble_name(['foo', np.nan])
'foo'

…and so are empty strings

assemble_name(['foo', np.nan, ''])
'foo'

Mutivalued data

lists of values are possible. A function to check whether a pd.Series (a column in a pd.DataFrame) has lists.


source

is_multivalued

 is_multivalued (s:pandas.core.series.Series)

Returns True is the given pd.Series has a list at any index

Type Details
s Series Input
Returns bool True if the input contains some list
multivalued_column = assemble_name(['ContractFolderStatus', 'ValidNoticeInfo', 'NoticeTypeCode'])
is_multivalued(df[multivalued_column])
True
df[multivalued_column].head()
0    [[DOC_CN, DOC_CAN_ADJ]]
1                     DOC_CN
2                     DOC_CN
3                     DOC_CN
4                     DOC_CN
Name: ContractFolderStatus - ValidNoticeInfo - NoticeTypeCode, dtype: object
is_multivalued(df['id'])
False

A function exploiting the above function to return (only) the columns that are multivalued.


source

multivalued_columns

 multivalued_columns (df:pandas.core.frame.DataFrame)

Returns the list of multi-valued columns

Type Details
df DataFrame Input
Returns list Columns’ names
multivalued_columns(df)
['ContractFolderStatus - ProcurementProject - RequiredCommodityClassification - ItemClassificationCode',
 'ContractFolderStatus - TenderResult - ResultCode',
 'ContractFolderStatus - TenderResult - ReceivedTenderQuantity',
 'ContractFolderStatus - TenderResult - WinningParty - PartyIdentification - ID',
 'ContractFolderStatus - TenderResult - WinningParty - PartyName - Name',
 'ContractFolderStatus - TenderResult - AwardedTenderedProject - LegalMonetaryTotal - TaxExclusiveAmount',
 'ContractFolderStatus - ValidNoticeInfo - NoticeTypeCode',
 'ContractFolderStatus - ValidNoticeInfo - AdditionalPublicationStatus - PublicationMediaName',
 'ContractFolderStatus - ValidNoticeInfo - AdditionalPublicationStatus - AdditionalPublicationDocumentReference - IssueDate',
 'ContractFolderStatus - TenderResult - AwardedTenderedProject - ProcurementProjectLotID']