The objective of this visualisation is to map out the direct exposure of Canadian businesses and employees (by work location and primary residence) to US President Donald Trump Second Administration’s Tariffs (Tariffs) at the Aggregate Dissemination Area (ADA) level.
As of August 2025, the Tariffs include the following:
- 10% tariffs on energy and natural resources (HTS 9903.01.13) and potash (HTS 9903.01.15)
- 50% tariffs on iron and steel, and their derivative products (HTS 9903.81.87, 9903.81.88, 9903.81.89, 9903.81.90, 9903.81.91, 9903.81.93)
- 50% tariffs on aluminum, and its derivative products (HTS 9903.85.02, 9903.85.04, 9903.85.07, 9903.85.08)
- 25% tariffs on automobiles, and its parts (HTS 9903.94.01, 9903.94.03, 9903.94.05)
- 50% tariffs on semi-finished copper and intensive copper derivative products (HTS 9903.78.01)
- 10% tariffs on softwood lumber (into effect October 14, 2025)
- 35% tariffs on all Canadian products not covered by CUSMA
Data on employees (by primary residence) are derived from Census 2021 data
Businesses are defined as the establishments that are recorded in the December 2022 Establishment Counts by DA, excluding those with no employees.
Employees (by work location) are defined from the employee ranges provided in the December 2022 Establishment Counts by DA, which are as follows:
- 1 to 4 --> 3 employees
- 5 to 9 --> 7 employees
- 10 to 19 --> 15 employees
- 20 to 49 --> 35 employees
- 50 to 99 --> 75 employees
- 100 to 199 --> 150 employees
- 200 to 499 --> 350 employees
- 500 + --> 550 employees
Downloadable CSV outputs are available here: Map:
- choropleth_csd.geojson - for the census subdivision area geometries and values
- choropleth.geojson - for the aggregated dissemination area geometries and values
Scenarios:
- all_scenarios_csd.csv - for the census subdivision area geometries and values
- all_scenarios_ada.csv - for the aggregated dissemination area geometries and values
- ada_total_emp.csv - for total employment values for aggregated dissemination areas (used as denominator)
- csd_total_emp.csv - for total employment values for census subdivisions (used as denominator)
Canada-US-Visits:
- us_normalized_trips_daily - for the normalized values of the Canada to U.S. visits by city (daily)
Raw data for the counts and percentages of the national map can be found here
- List of HS Codes for products tariffed by the US from HTS Chapter 98, HTS Chapter 99 and US Federal Register for Duties on Softwood Lumber
- 2025 Canadian HS8-NAICS Concordance Table (requested directly from StatsCan)
- Province/Territory 2024 Annual Export Data to the World at HS6 level (toggle to HS6, click on 'Data Extraction', set start date as Jan 2024, set end date as Dec 2024, click on Annual data checkbox, set Country/State to 'World total' and download data for every province)
- Province/Territory 2024 Annual Export Data to the US at HS6 level (same setting as above, except to set Country/State to 'US total' instead)
- December 2022 Establishment Counts by Dissemination Area (DA) (downloaded from Borealis)
- Census 2021 Geographic Boundary Files at Aggregate Dissemination Area (ADA) level (select the appropriate geographic levels at the 'Statistical boundaries' section)
- Dissemination Geographies Relationship File to link DAs to ADAs
- Census 2021 Data – Aggregate Dissemination Area Level (data is found in the 'Comprehensive download files' section)
- Rate of CUSMA Utilisation by products at the two-digit HS Code level (data obtained from an interview that we have conducted with Canadian Chamber of Commerce)
All data can be found and downloaded from the 'analysis' folder, with the exception of Data Nos. 5, 6 and 8 due to large file sizes. For the Python code (Data Manipulation ADA.ipynb / Data Manipulation CSD.ipynb) to run smoothly, please ensure that all data, including the ones not in folder, are downloaded and located in the same folder as the Python notebook.
-
Extract list of HS Codes for products that are subject to tariffs and duties.
Any new tariffs officially announced by the US International Trade Commission would result in an update of the HTS and changes to Chapter 99, which pertains to temporary legislation and amendments from the general HTS terms. HTS codes and HS codes are the same at the 6-digit level, thus it is safe to list the entire HTS code so long as they are later snipped to the first 6 digits during Python processing.
-
Clean up the Dissemination Geographies Relationship File.
Only the IDs for Dissemination Areas (DADGUID_ADIDUGD) and Aggregate Dissemination Areas (ADADGUID_ADAIDUGD) are relevant. Ensure that duplicate Dissemination Area IDs are deleted.
-
[Refer to Jupyter notebook] Connect the HS-NAICS concordance table with the list of tariffed products and the CUSMA non-utilisation rate.
-
[Refer to Jupyter notebook] Use the expanded concordance from Step 3 to find out the weighted ratio of tariffed US exports to global exports for each NAICS code in every province/territory.
-
[Refer to Jupyter notebook] Also use this new filter from Step 3 onto the Establishment Counts dataset to find out the following from each DA:
a. How many businesses are directly exposed to tariffs.
b. How many estimated employees are directly exposed to tariffs, after getting weighted for its province’s/territory’s NAICS US/Global export ratio (Step 5). This is also broken down by the type of tariffs.
c. How many estimated employees working within each directly exposed industry.
-
[Refer to Jupyter notebook] Each result (5a, 5b and 5c) will be aggregated from DA to ADA level using table created in Step 2.
-
[Refer to Jupyter notebook] Results 5a and 5b, after aggregated, will be used to create a choropleth map (showing percentage of exposure in each ADA) and centroid map (showing count of exposure in each ADA).
-
[Refer to Jupyter notebook] Result 5c, after aggregated, will be used to create another weight of total jobs available within a 15km radius from each ADA to jobs with direct exposure to tariffs.
-
[Refer to Jupyter notebook] Weight from Step 8 will be applied on Census 2021 Data on resident’s declared occupation industry, so as to estimate the number of residents in each ADA working in each affected NAICS industry code.
-
[Refer to Jupyter notebook] This estimate is again multiplied by US/Global export ratio for each province (Step 4) in order to estimate the number of estimated residents that are directly exposed to tariffs.
-
[Refer to Jupter notebook] Results from Step 10 are then processed to be appended to the choropleth and centroid maps. They will both be saved as GeoJSON files.
-
Convert the GeoJSON files into MBTiles, then PMTiles via Windows Subsystem for Linux with the following codes:
For Choropleth Map (note: adjust the simplification value accordingly if there's more data to be added)
tippecanoe -Z 0 -z 12 --output=choropleth.mbtiles --detect-shared-borders --drop-fraction-as-needed --coalesce --simplification=6 --drop-densest-as-needed choropleth.geojson
For Centroid Map
tippecanoe -Z 0 -z 12 --output=centroids.mbtiles --drop-rate=0 centroids.geojson
- Tippecanoe by default outputs mbtiles, so you may need to install pmtiles and convert it like so:
wget https://github.com/protomaps/go-pmtiles/releases/download/v1.22.1/go-pmtiles_1.22.1_Linux_x86_64.tar.gz
tar -xzf go-pmtiles_1.22.1_Linux_x86_64.tar.gz
pmtiles convert choropleth.mbtiles choropleth.pmtiles
- If the tiles are too large, use the maximum tile bytes command such as the following:
--output=all_scenarios_ada_centroids.mbtiles \
--drop-rate=0 all_scenarios_ada_centroids.geojson --force
-
Ensure that you have the latest report from the Multi-Regional Input Output Model excel file with DIR_INDIR_INDCD_SC{n} and Jobs Multiplier sheets.
-
Make sure you have trail_csd_full.csv or trail_ada_full.csv to use as the denominator of all jobs per region.
-
Make sure you have intermediate/NAICS 2022v1 to IOIC 2022 concordance.xlsx for the NAICS to Input Output concordance.
-
Run all_scenarios_combined_ada.py and all_scenarios_combined.py (ADA & CSD versions)
-
Convert all_scenarios_csd_centroids.geojson and all_scenarios_csd.geojson into pmtiles using script_scenarios.sh or doing Step 6.
-
The tiles sizes may be too large, so use the maximum tile bytes command such as the following:
For Choropleth Map (note: adjust the simplification value accordingly if there's more data to be added)
tippecanoe -Z 0 -z 11 --output=all_scenarios_csd.mbtiles --detect-shared-borders --drop-fraction-as-needed --coalesce --simplification=6 --drop-densest-as-needed all_scenarios_csd.geojson
For Centroid Map
--output=all_scenarios_ada_centroids.mbtiles \
--drop-rate=0 all_scenarios_ada_centroids.geojson --force
For all mbtiles
pmtiles convert ____.mbtiles ____.pmtiles
- Rolling up to CMA and province for the /map-scenarios-charts page:
python analysis/scripts/scenarios/run_rollup.py # from the repo root
-
Ensure that you have both the visitor and the all Canadian devices data from Cuebiq.
-
Run the following to normalize the data:
python analysis/scripts/canada-us-visits/run_rollup.py # from the repo root
Now you have the normalized csv to use for the /canada-us-visits page!
- For regression, scatterplots and correlations, first fetch QCEW employment using the U.S. QCEW API:
python analysis/scripts/get_qcew_msa_industry.py
If accessing at a later date, newer data may be available. At the time of this, 2023 is the most recent annual data for MSAs.
This fuzzy matches the metro names in us_normalized_trips_daily.csv with the area titles and then matches the metros with the MSA. Output is qcew_msa_industry_2023_a_2digit.csv
- Build MSA features such as the distance to border, enplanements, etc. Produces msa_features.csv
cd analysis/scripts && python build_msa_features.py
- Correlations for the frontend:
python analysis/scripts/all_industries_corr.py # share-based (primary)
python analysis/scripts/all_industries_corr_raw.py # raw job counts
Produces R squared values, p values per NAICS sector against the visitor YOY percents.
- Regression data and scatterplot data
python analysis/scripts/export_regression_data.py # regressionData.js
python analysis/scripts/export_visit_jobs_scatter.py # visitJobsScatterData.js
- (Optional) Export the data for analysis in R
python analysis/scripts/export_analysis_data.py
- Check coverage using check_data_coverage.py