Which contracts signed in 2024 were the largest, and who won them?
Paraguay publishes every public contract it signs, under the Open Contracting Data Standard. Which means the question is answerable.
Data
Two bulk OCDS exports from contrataciones.gov.py covering 22,249 contracts, 2010 to 2024. Exchange rates from Banco Central del Paraguay.
Tools
Python 3.12, pandas, numpy, lxml, Jupyter. Version controlled with Git, published on GitHub.
What I did
All of it. Sourcing, cleaning, currency conversion, the join, the analysis, and the write-up.
Why this project
I wanted a dataset with real problems in it rather than a teaching set that had already been cleaned for me. This one delivered. Column names arrive as JSON paths. One source file carries an .xls extension but is actually an HTML table, so it needs read_html and not read_excel. The API sits behind OAuth, which made the bulk CSVs the practical route to the same records. A duration column is 91% null and had to be investigated before being discarded rather than assumed useless. Three award identifiers are shared by more than one supplier, which would have double-counted a contract on a naive join.
What I set out to practice, and did: Python and pandas end to end, from raw bulk exports through cleaning, currency conversion and the join, to a notebook published with its outputs saved so it can be read without running anything. Version controlled in Git and documented well enough to follow without me.
What I found
Twenty contracts out of 1,140 took 65% of the money, $224.4M between them. The other 1,120 shared the rest.
The three biggest are all fuel, all sold to Paraguay by international commodity traders. Together they are 35% of everything the state contracted that year.
Energy holds most of the top eight: more naphtha, ethanol twice, mobile electrical substations. From ninth place down it is almost entirely school meals and medical supplies.
The three largest
Vitol Energia Americas Gasoil
Litasco Pan Americas Gasoil
Trafigura Pte Virgin naphtha
$121.1M together. 54% of the top 20.
The process
22,249 contracts in the raw export, 2010 to 2024
| contract_id | status | date_signed | value | award_id | supplier_name |
|---|---|---|---|---|---|
| active | 2024 | ||||
| cancelled | 2017 | ||||
| active | NaT | ||||
| active | 2024 | NaN | |||
| active | 2019 | ||||
| active | 2024 | ||||
| active | 2016 | ||||
| active | 2024 |
Sample rows, shown to illustrate the steps. The counts are the real ones.
Limitations
- Values were converted at the 2024 annual average exchange rate, not the rate on the day each contract was signed.
- The 2024 filter runs on signing date, not award date, so contracts awarded earlier but signed in 2024 are included.
- Categories come from the text of the process description, because the source has no category field.
- 834 contracts in the file have no value recorded and 19 have a value of zero or less. Those rows are excluded rather than estimated.
- Three award identifiers were shared by more than one supplier. I collapsed each into a single row before joining, otherwise one contract would have been counted once per winner.