bundle

Functionality to deal with multiple XML files

Some handy imports that are not actually required by the library.

from IPython.display import display

Directory where the zip files are stored

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

Zip file

A (sample) file in that directory

input_file = directory / 'PlataformasAgregadasSinMenores_202201_05-06.zip'
assert input_file.exists()
input_file
PosixPath('/home/manu/Sync/UC3M/proyectos/2022/nextProcurement/sproc/samples/PlataformasAgregadasSinMenores_202201_05-06.zip')

A function to read all the XML files contained in a given zip file.


source

read_zip

 read_zip (input_file:str|pathlib.Path, concatenate:bool=False,
           return_filenames:bool=False)

Reads and parses an XML file into a pd.DataFrame

Type Default Details
input_file str | pathlib.Path Input file
concatenate bool False If True all the files are concatenated in a single pd.DataFrame
return_filenames bool False If True the names of the files (read) within the zip are returned too
Returns list | pandas.core.frame.DataFrame | tuple[list, list] | tuple[pandas.core.frame.DataFrame, list] XML data
dfs_zip = read_zip(input_file)
print(f'{len(dfs_zip)=}')
dfs_zip[0].head(3)
len(dfs_zip)=2
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 - ProcurementProject - PlannedPeriod - StartDate ContractFolderStatus - LegalDocumentReference - ID ContractFolderStatus - LegalDocumentReference - Attachment - ExternalReference - URI ContractFolderStatus - ProcurementProject - PlannedPeriod - EndDate ContractFolderStatus - TechnicalDocumentReference - ID ContractFolderStatus - TechnicalDocumentReference - Attachment - ExternalReference - URI ContractFolderStatus - LocatedContractingParty - ParentLocatedParty - ParentLocatedParty - PartyName - Name ContractFolderStatus - TenderingProcess - ParticipationRequestReceptionPeriod - EndDate ContractFolderStatus - TenderingProcess - ParticipationRequestReceptionPeriod - EndTime ContractFolderStatus - TenderingProcess - TenderSubmissionDeadlinePeriod
0 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021039438; Órgano de Contratac... L'objecte és la contractació del servei de bug... 2022-01-04 12:12:09.464000+00:00 2021039438 RES https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Girona Entitats municipals de Catalunya L'objecte és la contractació del servei de bug... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-12-13 23:59:00+00:00
1 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021_2568; Órgano de Contrataci... Servei comunicacions postals de l'Ajuntament d... 2022-01-04 12:12:09.400000+00:00 2021_2568 ADJ https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Collbató Entitats municipals de Catalunya Servei comunicacions postals de l'Ajuntament d... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-11-29 23:59:00+00:00
2 https://contrataciondelestado.es/sindicacion/P... Id licitación: 12450/2021; Órgano de Contratac... L'objecte del contracte és l'execució de les o... 2022-01-04 12:12:09.343000+00:00 12450/2021 ADJ https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Mont-roig del Camp Entitats municipals de Catalunya L'objecte del contracte és l'execució de les o... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-12-20 14:00:00+00:00

3 rows × 39 columns

A single pd.DataFrame encompassing all the files in the zip can be returned (file names are used as the top-level index)

dfs_concatenated_zip = read_zip(input_file, concatenate=True)
dfs_concatenated_zip
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 - ProcurementProject - PlannedPeriod - StartDate ContractFolderStatus - LegalDocumentReference - ID ContractFolderStatus - LegalDocumentReference - Attachment - ExternalReference - URI ContractFolderStatus - ProcurementProject - PlannedPeriod - EndDate ContractFolderStatus - TechnicalDocumentReference - ID ContractFolderStatus - TechnicalDocumentReference - Attachment - ExternalReference - URI ContractFolderStatus - LocatedContractingParty - ParentLocatedParty - ParentLocatedParty - PartyName - Name ContractFolderStatus - TenderingProcess - ParticipationRequestReceptionPeriod - EndDate ContractFolderStatus - TenderingProcess - ParticipationRequestReceptionPeriod - EndTime ContractFolderStatus - TenderingProcess - TenderSubmissionDeadlinePeriod
zip file name entry
PlataformasAgregadasSinMenores_202201_05-06.zip PlataformasAgregadasSinMenores_20220105_030012.atom 0 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021039438; Órgano de Contratac... L'objecte és la contractació del servei de bug... 2022-01-04 12:12:09.464000+00:00 2021039438 RES https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Girona Entitats municipals de Catalunya L'objecte és la contractació del servei de bug... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-12-13 23:59:00+00:00
1 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021_2568; Órgano de Contrataci... Servei comunicacions postals de l'Ajuntament d... 2022-01-04 12:12:09.400000+00:00 2021_2568 ADJ https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Collbató Entitats municipals de Catalunya Servei comunicacions postals de l'Ajuntament d... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-11-29 23:59:00+00:00
2 https://contrataciondelestado.es/sindicacion/P... Id licitación: 12450/2021; Órgano de Contratac... L'objecte del contracte és l'execució de les o... 2022-01-04 12:12:09.343000+00:00 12450/2021 ADJ https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Mont-roig del Camp Entitats municipals de Catalunya L'objecte del contracte és l'execució de les o... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-12-20 14:00:00+00:00
3 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021/14/M0400100; Órgano de Con... El serveiobjecte del contracte és la difusió p... 2022-01-04 12:12:09.285000+00:00 2021/14/M0400100 ADJ https://contractaciopublica.gencat.cat/ecofin_... Casa de Cultura de Girona Entitats municipals de Catalunya El serveiobjecte del contracte és la difusió p... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-10-22 14:00:00+00:00
4 https://contrataciondelestado.es/sindicacion/P... Id licitación: ICVI-2022-1; Órgano de Contrata... Servei de neteja de les instal·lacions de l'IN... 2022-01-04 12:12:09.227000+00:00 ICVI-2022-1 ADJ https://contractaciopublica.gencat.cat/ecofin_... Institut Català de la Vinya i el Vi (INCAVI) Departaments i Sector Públic de la Generalitat Servei de neteja de les instal·lacions de l'IN... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-11-30 18:00:00+00:00
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
PlataformasAgregadasSinMenores_20220106_030013.atom 471 https://contrataciondelestado.es/sindicacion/P... Id licitación: 2021/57-12334; Órgano de Contra... L'objecte d'aquest contracte és la prestació c... 2022-01-04 12:12:09.949000+00:00 2021/57-12334 PUB https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Palau-solità i Plegamans Entitats municipals de Catalunya L'objecte d'aquest contracte és la prestació c... ... <NA> PCAP subminist. 8 cameres videovigilancia 2021... https://contractaciopublica.gencat.cat/ecofin_... <NA> PPT_subministrament 8 cameres videovigilancia_... https://contractaciopublica.gencat.cat/ecofin_... <NA> <NA> <NA> 2022-01-19 15:00:00+00:00
472 https://contrataciondelestado.es/sindicacion/P... Id licitación: 32/2021; Órgano de Contratación... Licitació per procediment obert harmonitzat i ... 2022-01-04 12:12:09.742000+00:00 32/2021 RES https://contractaciopublica.gencat.cat/ecofin_... Consell Comarcal del Baix Llobregat Entitats municipals de Catalunya Licitació per procediment obert harmonitzat i ... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-05-07 15:00:00+00:00
473 https://contrataciondelestado.es/sindicacion/P... Id licitación: 1977/2021; Órgano de Contrataci... L'objecte d'aquest contracte és la prestació d... 2022-01-04 12:12:09.666000+00:00 1977/2021 RES https://contractaciopublica.gencat.cat/ecofin_... Ajuntament de Sant Adrià de Besòs Entitats municipals de Catalunya L'objecte d'aquest contracte és la prestació d... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-06-30 23:59:00+00:00
474 https://contrataciondelestado.es/sindicacion/P... Id licitación: EXI-2022-7; Órgano de Contratac... Servei de trasllat de béns mobles( mobiliari, ... 2022-01-04 12:12:09.602000+00:00 EXI-2022-7 ADJ https://contractaciopublica.gencat.cat/ecofin_... Departament d'Acció Exterior i Govern Obert Departaments i Sector Públic de la Generalitat Servei de trasllat de béns mobles( mobiliari, ... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-12-13 13:00:00+00:00
475 https://contrataciondelestado.es/sindicacion/P... Id licitación: CONTR/2021/000000137; Órgano de... Servei de redacció del Projecte Executiu d'obr... 2022-01-04 12:12:09.536000+00:00 CONTR/2021/000000137 ADJ https://contractaciopublica.gencat.cat/ecofin_... Institut d'Assistència Sanitària (IAS) Departaments i Sector Públic de la Generalitat Servei de redacció del Projecte Executiu d'obr... ... <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2021-11-10 18:00:00+00:00

951 rows × 39 columns

dfs_concatenated_zip.dtypes[:4]
id                      string
summary                 string
title                   string
updated    datetime64[ns, UTC]
dtype: object

Filenames can also be requested

_, filenames = read_zip(input_file, return_filenames=True)
print(filenames)
['PlataformasAgregadasSinMenores_20220105_030012.atom', 'PlataformasAgregadasSinMenores_20220106_030013.atom']

Deleted entries


source

read_deleted_zip

 read_deleted_zip (input_file:str|pathlib.Path)

Reads and parses an XML file into a pd.DataFrame

Type Details
input_file str | pathlib.Path Input file
Returns Series XML data
read_deleted_zip(input_file)
zip                                              file name                                            id                                                                                 
PlataformasAgregadasSinMenores_202201_05-06.zip  PlataformasAgregadasSinMenores_20220105_030012.atom  https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/6724977   2022-01-04 00:12:01.376000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968315   2022-01-03 23:11:57.567000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968345   2022-01-03 23:11:57.516000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968324   2022-01-03 23:11:57.471000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968344   2022-01-03 23:11:57.426000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968337   2022-01-03 23:11:57.375000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968321   2022-01-03 23:11:57.323000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968335   2022-01-03 23:11:57.275000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968343   2022-01-03 23:11:57.232000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968333   2022-01-03 23:11:57.183000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968360   2022-01-03 23:11:57.141000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968327   2022-01-03 23:11:57.089000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968318   2022-01-03 23:11:57.038000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968361   2022-01-03 23:11:56.991000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968332   2022-01-03 23:11:56.949000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968331   2022-01-03 23:11:56.897000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968329   2022-01-03 23:11:56.850000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968338   2022-01-03 23:11:56.805000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968317   2022-01-03 23:11:56.751000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968358   2022-01-03 23:11:56.706000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968346   2022-01-03 23:11:56.661000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968319   2022-01-03 23:11:56.620000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968325   2022-01-03 23:11:56.579000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1957921   2022-01-03 23:11:56.535000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1959074   2022-01-03 23:11:56.497000+00:00
                                                 PlataformasAgregadasSinMenores_20220106_030013.atom  https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968294   2022-01-04 23:12:13.328000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968301   2022-01-04 23:12:13.283000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968299   2022-01-04 23:12:13.236000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968291   2022-01-04 23:12:13.191000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968286   2022-01-04 23:12:13.147000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968282   2022-01-04 23:12:13.107000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968303   2022-01-04 23:12:13.058000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968269   2022-01-04 23:12:13.013000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968272   2022-01-04 23:12:12.957000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968284   2022-01-04 23:12:12.911000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968280   2022-01-04 23:12:12.865000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968285   2022-01-04 23:12:12.819000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968267   2022-01-04 23:12:12.775000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968268   2022-01-04 23:12:12.731000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968302   2022-01-04 23:12:12.680000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968290   2022-01-04 23:12:12.635000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968271   2022-01-04 23:12:12.172000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968289   2022-01-04 23:12:12.129000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968305   2022-01-04 23:12:12.076000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968279   2022-01-04 23:12:12.039000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968287   2022-01-04 23:12:11.998000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968288   2022-01-04 23:12:11.957000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/1968266   2022-01-04 23:12:11.916000+00:00
                                                                                                      https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/8892704   2022-01-04 13:13:12.670000+00:00
Name: deleted_on, dtype: datetime64[ns, UTC]

Extra tests

# data_file = pathlib.Path.cwd() / 'data' / 'agregados'
# data_file /= 'PlataformasAgregadasSinMenores_202201.zip'
# data_file /= 'PlataformasAgregadasSinMenores_202202.zip'
# data_file /= 'PlataformasAgregadasSinMenores_202203.zip'


data_file = pathlib.Path.cwd() / 'data' / 'perfiles_plataforma'
data_file /= 'licitacionesPerfilesContratanteCompleto3_202201.zip'
df = read_zip(data_file, concatenate=True)
df.shape
df['ContractFolderStatus - ProcurementProject - BudgetAmount - TotalAmount'].dtype
grouping_col = sproc.structure.assemble_name(['ContractFolderStatus', 'LocatedContractingParty', 'Party', 'PartyName', 'Name'])
grouping_col
amount_col = sproc.structure.assemble_name(['ContractFolderStatus', 'ProcurementProject', 'BudgetAmount', 'TotalAmount'])
amount_col
df.groupby(grouping_col).agg(money=(amount_col, 'sum'), n=(amount_col, 'size'))