from IPython.display import display
bundle
Functionality to deal with multiple XML files
Some handy imports that are not actually required by the library.
Directory where the zip files are stored
= pathlib.Path.cwd().parent / 'samples'
directory assert directory.exists()
directory
PosixPath('/home/manu/Sync/UC3M/proyectos/2022/nextProcurement/sproc/samples')
Zip file
A (sample) file in that directory
= directory / 'PlataformasAgregadasSinMenores_202201_05-06.zip'
input_file 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.
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 |
= read_zip(input_file)
dfs_zip print(f'{len(dfs_zip)=}')
0].head(3) dfs_zip[
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)
= read_zip(input_file, concatenate=True)
dfs_concatenated_zip 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
4] dfs_concatenated_zip.dtypes[:
id string
summary string
title string
updated datetime64[ns, UTC]
dtype: object
Filenames can also be requested
= read_zip(input_file, return_filenames=True)
_, filenames print(filenames)
['PlataformasAgregadasSinMenores_20220105_030012.atom', 'PlataformasAgregadasSinMenores_20220106_030013.atom']
Deleted entries
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'
= pathlib.Path.cwd() / 'data' / 'perfiles_plataforma'
data_file /= 'licitacionesPerfilesContratanteCompleto3_202201.zip' data_file
= read_zip(data_file, concatenate=True)
df df.shape
'ContractFolderStatus - ProcurementProject - BudgetAmount - TotalAmount'].dtype df[
= sproc.structure.assemble_name(['ContractFolderStatus', 'LocatedContractingParty', 'Party', 'PartyName', 'Name'])
grouping_col grouping_col
= sproc.structure.assemble_name(['ContractFolderStatus', 'ProcurementProject', 'BudgetAmount', 'TotalAmount'])
amount_col amount_col
=(amount_col, 'sum'), n=(amount_col, 'size')) df.groupby(grouping_col).agg(money