Replication code and data for quantifying how data-center load growth affects wholesale electricity prices, transmission cost allocation, and downstream energy burden and distributional outcomes across the United States.
Static previews are shown below. Click any diagram to open the interactive version, which includes a year selector for 2020–2025.
If the hosted links are unavailable, the same files can be downloaded from figures/ in this repository and opened directly in a browser — they are self-contained HTML and require no server.
| Package | Version | Purpose |
|---|---|---|
| Python | 3.11.x | Runtime (matplotlib 3.4.x is incompatible with Python 3.12+) |
| numpy | 1.26.4 | Numerical computation |
| pandas | 2.3.1 | Data manipulation |
| matplotlib | 3.4.3 | Static plotting |
| proplot | 0.9.7 | Publication-quality figures |
| plotly | 6.2.0 | Interactive Sankey diagrams |
| scipy | 1.15.2 | Statistical functions |
| statsmodels | 0.14.5 | Econometric models |
| linearmodels | 6.1 | Panel data / IV regression |
| openpyxl | 3.1.5 | Excel I/O |
| kaleido | 1.1.0 | Plotly static image export |
| csdid | 0.2.9 | Callaway-Sant'Anna staggered DiD |
| drdid | 1.1.6 | Doubly-robust DiD |
| adjustText | 1.3.0 | Label placement |
| xlsxwriter | 3.2.9 | Excel output |
| requests | 2.32.3 | LEHD QWI bulk download (employment step 01 only) |
Full pinned versions are in requirements.txt.
| OS | Version |
|---|---|
| macOS | Sequoia 15.5 (Apple Silicon) |
| Ubuntu | 24.04 LTS (x86_64, AWS EC2 t2.xlarge) |
- No GPU or non-standard hardware required.
- Recommended: 16 GB RAM for the full energy burden pipeline (Pipeline 3 processes ~790 MB of DOE LEAD data across 51 states).
- A standard laptop or desktop is sufficient.
# 1. Create a conda environment with Python 3.11
conda create -n dc_replication python=3.11 -y
conda activate dc_replication
# 2. Clone this repository
git clone https://github.com/PEESEgroup/Data-Center-Equality.git
cd Data-Center-Equality
# 3. Install all dependencies
pip install -r requirements.txtUnder 5 minutes on a normal desktop computer with a broadband internet connection.
A quick demo can be run using the pre-computed results included in results/. The figure scripts (Pipeline 5) read these pre-computed outputs and generate publication figures without needing to run the upstream regression and simulation pipelines.
cd Data-Center-Equality
# Generate all figures from pre-computed results
for fig in figure_scripts/f*.py; do
python "$fig"
done
# Figure 5 (five panels plus the composite)
cd figure_scripts/fig5_panels
for p in p5?_*.py; do python "$p"; done
python compose.py
cd ../..
# Figure 6 (Sankey diagrams)
python r03_sankey.pyFigures are saved to figures/ in subdirectories organized by paper section:
| Subdirectory | Contents |
|---|---|
01-2/ |
Price impact scatter plots (Fig 3), cross-sectional analysis (Fig 4) |
03/ |
Sankey diagrams regenerated by r03_sankey.py (Fig 6); the four interactive HTML files linked above live at the top level of figures/ |
04/ |
Energy burden bubble charts, income scatter, rural scatter (Fig 8) |
05/ |
Figure 5 panels and the composed figure, written by figure_scripts/fig5_panels/ |
06/ |
Sensitivity analysis and waterfall diagrams (Figs 10-12) |
Under 2 minutes on a normal desktop computer.
All scripts should be run from the repository root as the working directory. The five pipelines must be run in order, as later pipelines depend on outputs from earlier ones.
Estimates the causal effect of data center capacity on wholesale electricity prices using a Bartik shift-share instrumental variable strategy.
# Step 1: Share exogeneity tests
python r02_share_exogeneity_test.py
# Step 2: Core IV regressions (ISO zones + non-ISO cities)
python r02_bartik_iv_workflow.py --iso ALL
python r02_city_bartik_iv_workflow.py
# Step 3: Summary tables
python r02_summary.py
# Step 4: Cross-sectional heterogeneity analysis
python r02_cross_sectional.pyOutputs: results/r2_share_exogeneity/, results/r3_summary/, results/r3_cross_sectional/
results/r3_summary/table5_zone_projected_2030.csv extends the 2025 zone impacts to 2030
using published capacity projections; it ships with the repository and is read by
figure_scripts/f10_theta_sensitivity.py and f11_waterfall.py. The projection step
itself is not scripted, so this one table is provided rather than regenerated.
Decomposes transmission costs into load-growth attribution and existing-load allocation for residential, data center, and other customers.
python r03_sankey.pyOutputs: results/sankey/{ISO}_attribution.csv, results/sankey/{ISO}_allocation.csv
Counterfactual simulation of how DC-induced price increases propagate to household energy burdens across U.S. counties. Scripts must be run in the order shown below.
# Step 1: ISO-level retail cost breakdown
python r04_ISO_breakdown.py
# Step 2: Baseline and DC-scenario energy burdens (can run in parallel)
python r04_bench_burden.py
python r04_dc_burden.py
# Step 3-6: Downstream analyses (must run sequentially after Steps 1-2)
python r04_income_ami.py
python r04_compare_poverty.py
python r04_rural_merge.py
python r04_state_merge.pyOutputs: rider/bench/, rider/dc/, rider/compare/, rider/income/, rider/rural/
State-level analysis of data center employment effects using Census QWI data: a Bartik
shift-share instrumental variable design, descriptive panel fixed effects regressions, a
comparison of identification strategies, and the data-processing/telecommunications
employment trajectories. The analysis universe is the 48 contiguous states plus the
District of Columbia (49 units); the scripts live in employment/, numbered in run order.
cd employment
python 03_build_pre_volatility.py
python 04_build_panel.py
python 05_bartik_iv.py --tag _union
for s in 06_*.py 07_*.py 09_*.py 1[0-4]_*.py; do python "$s"; done
python 15_did_continuous.py --tag cgs49
python 16_pwc_extract.py
python 21_robustness_by_sector.py
python 22_labor_income_cumulative.pySteps 05 and 15 take a required --tag, so they are run separately from the loop.
Steps 01 and 02 re-download the LEHD QWI extracts and are optional; qwi_all_naics_annual.csv
ships with the repository.
Outputs: employment/*.xlsx, results/r6_bartik/, results/r6_share_test/,
results/r6_employment/
| result file | backs |
|---|---|
results/r6_bartik/panel_state_year.csv |
the estimation panel; input to every regression and to Fig. 5 |
results/r6_bartik/results_main__union.csv |
the primary Bartik IV estimates |
results/r6_bartik/results_robustness__union.csv |
the alternative specifications |
results/r6_bartik/results_diagnostics__union.csv |
first stage, effective F, Anderson-Rubin sets |
results/r6_share_test/pretrend_results.csv, balance_results.csv |
the share exogeneity tests |
results/r6_employment/labor_income_cumulative.csv |
cumulative labor income against incentive outlay |
results/r6_employment/robustness_by_sector.csv |
the by-sector robustness range |
results/r6_employment/did_estimator_comparison__cgs49.csv |
the four designs on a common scale |
Generate all publication figures. Run after Pipelines 1-4 are complete.
for fig in figure_scripts/f*.py; do
python "$fig"
done
cd figure_scripts/fig5_panels
for p in p5?_*.py; do python "$p"; done
python compose.pyThe f*.py scripts are run from the repository root. The five Figure 5 panels live in
figure_scripts/fig5_panels/ and are run from that directory; compose.py assembles them.
Outputs: figures/
Approximately 25 minutes on a standard desktop computer. The energy burden pipeline (Pipeline 3, Steps 3a/3b) is the most time-intensive component (~10 minutes), as it processes household-level energy expenditure data for all 51 states. The employment pipeline (Pipeline 4) adds about 3 minutes, three quarters of which is the bootstrap in employment/15_did_continuous.py.
.
├── r02_share_exogeneity_test.py # Bartik IV share exogeneity tests
├── r02_bartik_iv_workflow.py # Bartik IV 2SLS (ISO zones)
├── r02_city_bartik_iv_workflow.py # Bartik IV 2SLS (non-ISO cities)
├── r02_summary.py # Summary tables from IV results
├── r02_cross_sectional.py # Cross-sectional heterogeneity analysis
├── r03_sankey.py # Transmission cost Sankey attribution/allocation
├── r04_ISO_breakdown.py # ISO-level cost breakdown
├── r04_bench_burden.py # Baseline energy burden simulation
├── r04_dc_burden.py # DC-scenario energy burden simulation
├── r04_income_ami.py # Income and AMI stratification
├── r04_compare_poverty.py # Energy poverty comparison
├── r04_rural_merge.py # Rural-urban heterogeneity merge
├── r04_state_merge.py # State-level data merge
│
├── employment/ # Employment analysis, Pipeline 4
│ ├── analysis_universe.py # The single owner of the 49-unit analysis universe
│ ├── panel_aggregates.py # Balanced-panel national aggregates
│ ├── 01-16, 21, 22 *.py # The pipeline, numbered in run order
│ └── *.csv, *.xlsx # Inputs and the workbook outputs
│
├── figure_scripts/ # Figure generation scripts (Pipeline 5)
│ └── fig5_panels/ # The five Figure 5 panels and their composer
├── tables/ # ISO-zone panel data (prices, demand, capacity, fuel)
├── tables_city/ # City-level panel data
├── load_and_costs/ # ISO load forecasts and transmission project data
├── allocation/ # Utility tariff filings and cost allocation source data
├── econ_and_ai/ # Economic indicators, AI adoption, DOE LEAD data
├── rider/ # Energy burden data, EIA forecasts, county mappings
├── LTRS/ # NERC reliability assessments (LTRA, SRA)
├── results/ # Pre-computed outputs (allows figure-only demo)
├── figures/ # Sankey interactive HTML + static SVG for README
└── requirements.txt # Pinned Python dependencies
Primary inputs for Pipeline 1 (Bartik IV regressions). Compiled from EIA and ISO public reports.
| File | Description | Source |
|---|---|---|
yearly_price.xlsx |
Wholesale electricity prices by zone-year ($/MWh) | ISO market reports (CAISO OASIS, PJM Data Miner, ERCOT MIS, MISO Market Reports) |
demand_raw.xlsx |
Electricity demand by zone-year (GWh) | EIA-861, ISO load data |
dc_cumulative_by_iso.xlsx |
Cumulative data center capacity by ISO-zone-year (GW) | Aggregated from facility-level data |
capacity_by_iso.xlsx |
Generation capacity by ISO (GW) | EIA-860 |
fuel_price.xlsx |
Natural gas prices by region-year | EIA Natural Gas Navigator |
fuel_mix.xlsx |
Generation fuel mix shares by ISO-year | EIA-923 |
fuel_marginal.xlsx |
Marginal fuel data by ISO | ISO market reports |
price.xlsx |
Retail electricity prices by state | EIA-861 |
temperature_filled.xlsx |
HDD/CDD temperature data by zone-year (gap-filled) | NOAA NCEI |
datacenter_sum.xlsx |
Data center facility summary statistics | Aggregated from facility-level data |
Same structure as tables/, adapted for non-ISO cities (Atlanta, Charlotte, Hillsboro, Mesa, Phoenix, Seattle, etc.).
Raw data on load forecasts, load factors, and transmission project costs for each ISO (CAISO, ERCOT, MISO, PJM). Each ISO subdirectory contains:
| File | Description | Source |
|---|---|---|
00_{ISO}_share.xlsx |
Data center load share by pricing zone | Compiled from ISO filings and utility reports |
01_load_factor.xlsx |
Peak-to-load ratios by zone and customer class | ISO planning documents |
02_load_by_zone_and_class.xlsx |
Annual load by zone and customer class (residential, commercial, industrial, GWh) | ISO load forecasts (e.g., PJM Load Forecast Report, ERCOT CDR) |
03_projects.xlsx |
Transmission project costs ($M), zone-level responsibility shares, and allocation shares | ISO transmission planning (PJM RTEP, ERCOT RTP, MISO MTEP, CAISO TPP) |
LTLP/ or LTLF/ |
Long-term load planning/forecast source documents | ISO planning departments |
Projects/ |
Transmission project planning source documents and raw data | ISO transmission planning filings |
See load_and_costs/{ISO}/README.md for ISO-specific documentation.
Utility-level rate case filings and tariff documents used to determine how transmission costs are allocated across customer classes (residential, commercial, industrial/DC).
| Item | Description | Source |
|---|---|---|
utilities.xlsx |
Master utility list: maps utilities to ISOs, zones, and states | Compiled from EIA-861 and utility filings |
{ISO}/00_{ISO}_share.xlsx |
DC load share by zone (compiled summary) | Utility rate case filings |
{ISO}/{zone}/ |
Zone-level annual tariff PDFs and rate case filings | State PUC dockets, FERC filings |
ERCOT/COSS/ |
Cost of Service Studies by T&D utility (AEP, CenterPoint, ONCOR) | PUCT filings |
city/ |
Non-ISO city utility tariff filings | Municipal utility commissions |
| Item | Description | Source |
|---|---|---|
LEAD/ |
51 state-level CSVs (~790 MB) of household energy expenditure, income, and housing characteristics | DOE Low-Income Energy Affordability Data (LEAD) |
state_accept/state_ai.xlsx |
State-level AI tool adoption rates | U.S. Census Bureau Business Trends and Outlook Survey |
state_accept/state_bb.xlsx |
State-level broadband coverage | FCC Broadband Data Collection |
state_accept/state_dc_capacity.xlsx |
State-level data center capacity | Aggregated from facility-level data |
state_accept/state_gdp.xlsx |
State-level GDP | BEA Regional Economic Accounts |
macroeconomic.xlsx |
State-level macroeconomic indicators | BEA, BLS |
fuel/ |
State-level fuel prices | EIA State Energy Data System |
| Item | Description | Source |
|---|---|---|
EIA/EIA_AEO2023_prices_by_service.xlsx |
Retail electricity price projections by service territory | EIA Annual Energy Outlook 2023 |
EIA/EIA_AEO2025_prices_by_service.xlsx |
Retail electricity price projections by service territory | EIA Annual Energy Outlook 2025 |
EIA/{ISO}_zone_prices.xlsx |
Zone-level retail price decomposition (generation, transmission, distribution) | EIA, ISO tariff data |
burden/county_to_iso_or_city.csv |
Pre-computed county-to-ISO/city spatial mapping | Census TIGER/Line shapefiles (2024) |
rural/Ruralurban.xlsx |
Rural-Urban Continuum Codes (RUCC 2023) | USDA Economic Research Service |
The run order and the mapping from each result file to the Supplementary Table it backs are given under Pipeline 4 above.
| File | Description | Source |
|---|---|---|
qwi_all_naics_annual.csv |
Quarterly Workforce Indicators, annual aggregation by state and NAICS code, 2016-2024 | U.S. Census Bureau QWI |
results/r6_share_test/qwi_extended_annual.csv |
The same cell definition for 2005-2015, which the pre-trend and balance tests prepend to the 2016-2024 file above; not used in estimation | LEHD QWI R2026Q1 public-use tabulations |
dc_facilities_by_state_year.csv |
Data center count and capacity by state-year, in MW | Aggregated from facility-level data; the facility-level source is proprietary and is not redistributed |
pwc_multipliers.csv |
Economic multipliers for data center employment | PwC analysis |
pwc_state_data.csv |
State-level data center economic impact | PwC analysis |
tax/state_subsidy_by_year_million_wide.xlsx |
State fiscal incentives for data centers ($M by year) | State legislature records, DSIRE |
| File | Description | Source |
|---|---|---|
LTRA.xlsx |
Compiled EEU, LOLH, and reserve margins by assessment area | NERC Long-Term Reliability Assessments (2019-2025) |
SRA.xlsx |
Compiled seasonal reliability metrics | NERC Seasonal Reliability Assessments (2019-2025) |
long-term/nerc_ltra_{year}.pdf |
Source LTRA reports | NERC |
summer/nerc_sra_{year}.pdf |
Source SRA reports | NERC |
Code in this repository is released under the MIT License. Data are compiled from public datasets, ISO/RTO market data, and regulatory filings; users are responsible for complying with any upstream licensing requirements.
For questions about the data or code, please open a GitHub issue or contact: chengfeng@cornell.edu
