Methodology
Every rule, in the open
This project answers an ownership question that vendor normalization alone cannot. The novelty boundary matters: vendor-name cleaning is a solved problem here, the ownership layer is what is new.
Sources
Three public sources under the Open Government Licence. Treasury Board's consolidated contracts file (vendor names as entered by 100+ reporting entities). CanadaBuys contract history (bilingual column pairs, schema restructure in March-April 2026). Corporations Canada's Federal Corporations bulk files (split into four subsets in two languages in April 2026, merged back into one table here).
Vendor name normalization and entity resolution
Names were uppercased, legal suffixes stripped, punctuation removed, whitespace collapsed. Exact dedup on normalized keys came first. Fuzzy merging used union-find at a difflib ratio of 0.93 or higher with an identical first token. Every merge is logged with its ratio and raw variants. Ambiguous merges went to quarantine, never to a guess.
CanadaBuys schema crosswalk
CanadaBuys became the system of record in June 2023, and the 2026 restructure changed column names again. A crosswalk maps legacy columns to current ones, and bilingual column pairs (English-French hyphenated names) were harmonized to single English keys. The crosswalk ships as a CSV.
Merged Federal Corporations table
Eight files (four subsets, English and French) were merged into one table keyed on corporation number. Active and inactive sets were unioned and deduped so each corporation number appears exactly once. The merged table is the cheap spine that makes vendor-to-registry matching possible.
Vendor to corporation matching
Normalized vendor names were matched exactly against normalized legal names in the merged table. Fuzzy matches were computed separately and labelled as such. The match rate is reported on dollars and on vendors, because one big matched vendor moves the dollar rate.
What is new here
Vendor normalization for federal contracts already exists and publishes trends. It is not the product. The product is the ownership layer: the merged corporations table, vendor-to-corporation-number resolution, and the repeatable Canadian-versus-foreign share of contract dollars. Nothing published computes that from open data.
Honest limits
The contract data is unaudited and self-reported by departments. Registered country is not ultimate ownership: a Canadian-registered subsidiary of a foreign parent reads as Canadian. No bulk Canadian source publishes ultimate parents, and the project does not invent them. The parent layer is documented as partial with the missing source named.
Quarantine rules
Phone-number-like vendor fields, blank vendors, junk amounts, and out-of-range dates were quarantined out of every aggregate. The quarantine report lists each rule with its count and an example row.