PageSourceSearch

https://lowcarbonpower.org/_nuxt/BrY2ziKC.js

js lowcarbonpower.org collected 2026-10-03 19:13:10 UTC 23,135 bytes, 256 lines download raw bytes

1import{a as ie,f as le,d as ce,g as de,u as he}from"./DHzlU1_w.js";import{a9 as ue,m as k,d as U,A as me,q as pe,o as ge,Q as S,L as T,_ as D,Y as w,W as f,X as N,u as A,F as fe,$ as ye,a2 as we}from"./D9K3qCiK.js";import{u as be}from"./CfT95Bf4.js";import{d as q}from"./DsTdL4HJ.js";import{_ as ve}from"./DlAUqK2U.js";import"./ZSjPoArm.js";import"./ulILq-s5.js";const ke=`# LowCarbonPower.org Methodology
2
3This document explains how the electricity data published on
4[LowCarbonPower.org](https://lowcarbonpower.org/) is produced: where the numbers come from, how we
5reconcile sources that disagree, and how we turn many separate datasets into a single, consistent
6picture of how each country and region generates its electricity.
7
8---
9
10## What we are trying to measure
11
12For every country and region, and for as many years (and recent months) as the data allows, we want
13a complete and internally-consistent breakdown of:
14
15- **Electricity generation by source** — coal, gas, oil, nuclear, hydro, wind, solar, biofuels,
16  geothermal, and so on.
17- **Net imports** — the electricity a region buys from or sells to its neighbours.
18- **Total electricity supply** — generation plus net imports.
19
20From this breakdown we derive the figures shown across the site: the **low-carbon share** of
21electricity, estimated **CO₂ emissions**, an **electrification** estimate, and country **rankings**.
22
23Different providers report electricity in different units, so the first thing we do with every
24number is convert it to a single common unit: **terawatt-hours (TWh)**.
25
26---
27
28## A single, shared definition of energy types
29
30The central challenge is that every data provider describes fuels differently. One source says
31"Natural Gas", another "G3000", another "燃氣", another "Generation_NG_natural_gas". One reports a
32single "Renewables" figure; another breaks it into wind, solar, hydro and biomass.
33
34To make sources comparable, we map every provider's labels onto **one shared hierarchy of energy
35types**. At the top is *total* electricity, which splits into *low-carbon* and *fossil* sources
36(plus *other* and *net imports*). Low-carbon splits into nuclear and renewables; renewables split
37into hydro and non-hydro renewables; non-hydro renewables split into wind, solar, geothermal and
38biofuels; and solar is further split into utility-scale and behind-the-meter (rooftop) solar.
39Fossil splits into coal, gas, oil and an "unspecified fossil" residual.
40
41Because every source is translated into this same tree, we can compare them directly, fill gaps in
42one source with another, and always know how any aggregate (e.g. "fossil") relates to its parts
43(coal + gas + oil + unspecified). We similarly normalise every country and territory name onto a
44single ISO standard, so that "Czechia", "Czech Republic" and "Czech Rep." are recognised as the
45same place, and supranational aggregates such as "OECD" or "EU27" are excluded to avoid
46double-counting.
47
48---
49
50## Where the data comes from
51
52We combine roughly fifteen independent providers, each with different strengths in coverage,
53timeliness and detail. The most important are:
54
55- **International Energy Agency (IEA)** — global yearly generation by fuel and primary-energy
56  balances, plus a monthly series covering net production, imports and exports for many countries.
57- **U.S. Energy Information Administration (EIA)** — global and U.S. yearly generation, plus
58  detailed monthly generation for individual U.S. states and grid regions (including data
59  reconstructed from daily and hourly figures).
60- **Ember** — global yearly and monthly electricity generation and net imports.
61- **Energy Institute Statistical Review (formerly BP)** — long-running global yearly generation and
62  primary-energy consumption.
63- **Eurostat** — monthly electricity generation by fuel for European countries.
64- **ENTSO-E** — near-real-time European generation, cross-border flows and demand, aggregated up
65  from sub-hourly measurements.
66- **World Bank** — yearly generation shares, which we convert to absolute figures.
67- **National statistics for large markets** — United States (EIA, as mentioned above), People's Republic of China (National Bureau of Statistics and the National
68  Energy Administration) and Republic of China (Taiwan), where official data is more detailed or more current than the
69  global aggregators.
70- **Enerdata and IEA** — yearly net-imports (trade) figures.
71- **Sandia National Laboratories** — a global database of energy-storage projects.
72- **Historical reconstructions** — long-run world generation back to 1900 used to backfill early
73  years.
74
75Each provider's raw files live in the project's \`sources\` directory, alongside the scripts used to
76download them.
77
78---
79
80## How each source is parsed
81
82Every provider is read into the same shape: for a given fuel and country, a value for each year (or
83each month, written as \`YYYY-MM\`). Several recurring transformations happen at this stage:
84
85- **Unit conversion.** GWh, kWh, ktoe, petajoules and exajoules are all converted to TWh using the
86  appropriate factors.
87- **Cumulative-to-periodic conversion.** Chinese statistics are published as year-to-date running
88  totals, so we difference consecutive months to recover the value for each individual month and
89  quarter, and reconcile those against the published annual figures, preferring official,
90  non-revised, higher-precision numbers when versions conflict.
91- **Sub-hourly to monthly aggregation.** ENTSO-E publishes generation and cross-border flows at
92  15-, 30- or 60-minute resolution; we sum these into monthly totals and convert power to energy.
93- **Monthly-to-yearly roll-ups.** When all twelve months of a year are present, we sum them to
94  produce that year's total. The most recent, incomplete period is treated as provisional and
95  generally excluded from yearly totals.
96- **Gap handling.** Early years with missing or unreliable fuel data are trimmed so they don't
97  distort a country's history.
98
99---
100
101## Trusting the data: continuous cross-checking
102
103We do not take any single number at face value. Throughout the process we run two kinds of
104consistency check:
105
1061. **Components must sum to their aggregate.** Coal + gas + oil + unspecified must equal the
107   reported fossil total; wind + solar + hydro + biofuels + geothermal must equal renewables; and so
108   on, down the whole hierarchy.
1092. **Countries must sum to the world.** Where a source reports a global total, it must match the sum
110   of its individual countries.
111
112Each check has a tolerance that encodes what we know about a source's quirks — for example, that a
113particular provider's biofuels data is missing before 1990, that a given year is known to be
114incomplete, or that small rounding differences are acceptable. When a discrepancy exceeds tolerance,
115the process stops and flags the offending figures rather than silently publishing a number we can't
116explain. This is how data-quality problems get caught before they reach the website.
117
118For the current, still-incomplete year, we relax some of these checks for the fuels most affected by
119partial-year reporting, so that provisional monthly data isn't rejected just because it doesn't yet
120add up to a full annual figure.
121
122---
123
124## Combining many sources into one answer
125
126After parsing, we have many overlapping views of the same country-year — for example, the IEA, Ember
127and Eurostat might all have a figure for Germany in 2022. For each country and each year (or month),
128we choose **one** source to use, based on:
129
130- **Reliability** — a manually-tuned preference order built from experience with each provider (for
131  instance, national statistics and the IEA's yearly data rank highly; near-real-time and forecast
132  sources rank lower).
133- **Detail** — a source that resolves electricity into more specific fuels is preferred over one
134  that only gives broad categories, because it produces a richer breakdown.
135
136We record which source was chosen for every single data point, so the provenance of any figure on
137the site is fully traceable.
138
139Where the chosen source is missing something another source has — for example, a primary-energy
140value, or a coal/gas/oil split for a lump reported only as "fossil" — we patch that detail in from
141the next-best source, using the secondary source's *proportions* rather than its absolute totals so
142the numbers stay consistent with the chosen source.
143
144A few special cases are handled here:
145
146- **Behind-the-meter (rooftop) solar.** Some sources include small-scale rooftop solar in their
147  totals and some don't. We track this explicitly so that utility-scale and rooftop solar can be
148  separated, and so we can publish both "with" and "without" rooftop-solar versions of the data.
149- **Electrification.** Where primary-energy data and a year-by-year thermal-efficiency assumption
150  are available, we estimate what share of a country's total energy use is electricity.
151
152Finally, we rebuild the fuel hierarchy from the chosen figures (re-deriving fossil, low-carbon and
153other parent totals from their parts), and verify once more that everything adds up.
154
155---
156
157## Net imports (trade)
158
159Net imports are handled separately from generation, because the sign matters (a country can be a net
160importer or a net exporter) and because providers disagree more about trade than about generation.
161
162We gather every available trade source — yearly figures from Enerdata and the IEA, and monthly
163figures from ENTSO-E, the IEA, Ember and the EIA — and reconcile them against each other. For each
164country and period, the sources are compared to their average, and disagreements beyond a tolerance
165are flagged; less-reliable sources are dropped when better ones are available. The most complete
166source (Enerdata for yearly figures) is generally preferred.
167
168We then fold the reconciled trade values into the generation dataset: **net imports are added to a
169country's total electricity supply**, while net exports are recorded but not subtracted from
170generation. We produce both an "including net imports" and an "excluding net imports" version of the
171dataset.
172
173For the most current picture, we also compute a **rolling trailing-twelve-month** figure for each
174country from the monthly sources, choosing a consistent twelve-month window so that, for instance,
175the rooftop-solar treatment doesn't change partway through the window.
176
177---
178
179## Building regions, emissions, rankings and storage
180
181Once each country is finalised, we build the remaining published quantities:
182
183- **Region groups.** We aggregate countries into groups such as the EU, Sub-Saharan Africa and the
184  world, summing their members and harmonising the range of years each group can cover.
185- **CO₂ emissions.** Each fuel is assigned an emissions factor in grams of CO₂-equivalent per
186  kilowatt-hour (for example, coal ~820, gas ~490, oil ~650, biofuels ~230, solar ~45, hydro ~24,
187  nuclear ~12, wind ~11). Multiplying each fuel's generation by its factor gives an emissions
188  estimate; for aggregate or uncertain fuels we use a range to produce low, central and high
189  estimates.
190- **Rankings.** Countries are ranked by their low-carbon share of electricity, both for the latest
191  year and for every historical year.
192- **Energy storage.** From the storage-project database we estimate installed storage power and
193  energy by country and year, based on when each project was commissioned (and decommissioned).
194
195---
196
197## What gets published
198
199The process produces a small set of combined datasets covering all sources and all regions, offered
200in both JSON and CSV:
201
202- A main dataset **including net imports** and a matching one **excluding net imports**.
203- **Monthly** versions, and versions **with and without behind-the-meter solar**.
204- **Per-source** datasets, so each provider's view can be inspected on its own, plus merged
205  per-provider views that combine a provider's yearly and monthly data.
206- A separate **energy-storage** dataset.
207
208Each dataset lists the available years and energy types, and for every region gives the generation
209by fuel over time, the most-specific fuels present in each year, the source chosen for each year, and
210the derived emissions, electrification, rankings and (where relevant) the member countries of a
211group.
212
213---
214
215## Data revisions
216
217The figures we publish for a given month are **not final when first released**. Charts across the
218site always show the **latest** data, so a number can change after it first appears — and the charts
219in an older monthly report may no longer match the prose that was written when that report was
220published.
221
222Monthly values change for a few reasons:
223
224- **Later months reshape earlier ones.** For some countries a coarse total (a quarter or a year) is
225  shared out across its months. When a new month arrives, that aggregate is re-apportioned, so the
226  values for *earlier* months in the same period shift even though no provider corrected them. The
227  year-to-date total usually stays put while the split between months moves.
228- **The chosen source or basis can change.** As more data becomes available we may switch to a more
229  complete or more detailed provider for a region and month, which can move the baseline. Whether a
230  month's total **includes behind-the-meter (rooftop) solar** can likewise change as that estimate
231  firms up, shifting the comparison.
232- **Providers revise their own data.** Upstream sources routinely restate recent months as audited
233  figures replace provisional ones.
234
235Because of this, where a report's charts draw on data for months **after** the report's period, we
236show a notice that the figures may have been revised since publication and link back to this page.
237The original written commentary is left unchanged as a record of what was known at the time.
238
239---
240
241## In summary
242
2431. Download raw electricity data from around fifteen providers.
2442. Convert everything to a common unit (TWh) and translate every provider's fuel labels and country
245   names onto one shared definition.
2463. Continuously cross-check that fuels sum to their aggregates and that countries sum to world
247   totals, stopping when something can't be reconciled.
2484. For each country and period, pick the most reliable and most detailed source that has a complete
249   figure — recording where every number came from — and patch in missing detail from other sources.
2505. Reconcile net imports separately and fold them into the totals.
2516. Add behind-the-meter solar handling, emissions, electrification, region groups, rankings and
252   storage.
2537. Publish combined and per-source datasets in JSON and CSV.`,Ee={class:"methodology-page"},$e={key:0,class:"table-of-contents"},Ce={class:"toc-title"},Se={class:"toc-list"},Te=["href","onClick"],Ne=["innerHTML"],We=["innerHTML"],Ie={class:"data-downloads"},xe={class:"downloads-title"},Ae={class:"download-row"},_e={class:"download-label"},Oe={class:"download-row"},Le={class:"download-label"},Me={__name:"methodology",async setup(Re){let W,R;const{$T:E,$region_names:G,$regionPath:V}=ie(),{locale:b}=le(),_=ce(),z=de().public.serverURL||"",{data:O}=([W,R]=ue(()=>be("/api/methodology",{query:{locale:b.value},key:`methodology-${b.value}`,watch:[b]},"$k8OthhydS7")),W=await W,R(),W),Y=k(()=>{const n=O.value;return n&&n.lang&&n.lang!=="en"&&n.content?n.content:ke}),J=k(()=>{var n;return((n=O.value)==null?void 0:n.lang)||"en"});function K(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function $(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Z(n){return n.toLowerCase().replace(/[^\w\s-]/g,"").trim().replace(/\s+/g,"-").substring(0,60)}function I(n){let e=K(n);return e=e.replace(/`([^`]+)`/g,(t,a)=>`<code>${a}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(t,a,i)=>/^https?:\/\//i.test(i)?`<a href="${i}" target="_blank" rel="noopener noreferrer">${a}</a>`:`<a href="${_(i)}">${a}</a>`),e=e.replace(/\*\*([^*]+)\*\*/g,(t,a)=>`<strong>${a}</strong>`),e=e.replace(/\*([^*]+)\*/g,(t,a)=>`<em>${a}</em>`),e}function j(n){const e=n.replace(/\r\n/g,`
254`).split(`
255`),t=[],a=[],i=new Set;let u=[],o=0;const y=()=>{u.length&&(t.push(`<p>${I(u.join(" "))}</p>`),u=[])},r=h=>{let p=Z(h)||"section",m=p,s=2;for(;i.has(m);)m=`${p}-${s++}`;return i.add(m),m},c=h=>h.replace(/\*\*([^*]+)\*\*/g,"$1").replace(/\*([^*]+)\*/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").trim();for(;o<e.length;){const p=e[o].trim();if(p===""){y(),o++;continue}if(/^---+$/.test(p)){y(),t.push("<hr>"),o++;continue}const m=p.match(/^(#{1,6})\s+(.*)$/);if(m){y();const s=m[1].length,l=m[2],g=c(l),x=r(g);t.push(`<h${s} id="${x}">${I(l)}</h${s}>`),s===2&&a.push({id:x,text:g,level:s}),o++;continue}if(/^[-*]\s+/.test(p)){y();const s=[];for(;o<e.length;){const l=e[o],g=l.trim();if(/^[-*]\s+/.test(g))s.push(g.replace(/^[-*]\s+/,"")),o++;else if(g!==""&&/^\s/.test(l)&&s.length)s[s.length-1]+=" "+g,o++;else break}t.push("<ul>"+s.map(l=>`<li>${I(l)}</li>`).join("")+"</ul>");continue}if(/^\d+\.\s+/.test(p)){y();const s=[];for(;o<e.length;){const l=e[o],g=l.trim();if(/^\d+\.\s+/.test(g))s.push(g.replace(/^\d+\.\s+/,"")),o++;else if(g!==""&&/^\s/.test(l)&&s.length)s[s.length-1]+=" "+g,o++;else break}t.push("<ol>"+s.map(l=>`<li>${I(l)}</li>`).join("")+"</ol>");continue}u.push(p),o++}return y(),{html:t.join(`
256`),toc:a}}function L(n,e){const t=/<[^>]+>/g;let a="",i=0,u=0,o;const y=r=>{u>0?a+=r:a+=e(r)};for(;o=t.exec(n);){o.index>i&&y(n.slice(i,o.index));const r=o[0];/^<a\b/i.test(r)?u++:/^<\/a\s*>/i.test(r)&&(u=Math.max(0,u-1)),a+=r,i=t.lastIndex}return i<n.length&&y(n.slice(i)),a}function Q(){const n=e=>q[e]&&q[e][1]||"";return[{key:"iea",phrases:["International Energy Agency","IEA"],url:n("ieayearly")},{key:"eia",phrases:["U.S. Energy Information Administration","EIA"],url:n("eia")},{key:"ember",phrases:["Ember"],url:n("ember")},{key:"bp",phrases:["Energy Institute Statistical Review","Energy Institute"],url:n("bp")},{key:"eurostat",phrases:["Eurostat"],url:n("eurostat")},{key:"entsoe",phrases:["ENTSO-E","ENTSOE"],url:n("entsoe")},{key:"worldbank",phrases:["World Bank"],url:n("worldbank")},{key:"enerdata",phrases:["Enerdata"],url:n("enerdatatrade")},{key:"sandia",phrases:["Sandia National Laboratories","Sandia"],url:"https://www.sandia.gov/ess/"},{key:"cnstats",phrases:["National Bureau of Statistics","National Energy Administration"],url:n("cnstats")}].filter(e=>e.url)}function X(){const n={...G.value||{}},e=Object.entries(n).reduce((t,[a,i])=>(i&&isNaN(Number(i))&&(t[i]=a),t),{});return e.中華民國="TW",e.中华民国="TW",e.中國大陸="CN",e.中国大陆="CN",e["Mainland China"]="CN",e["Hong Kong"]="HK",Object.fromEntries(Object.entries(e).sort(([t],[a])=>a.length-t.length))}function ee(){const e=Object.entries({lowcarbon:"Low-carbon",fossil
256:"Fossil",renewables:"Renewables",hydro:"Hydro",wind:"Wind",solar:"Solar",nuclear:"Nuclear",gas:"Gas",coal:"Coal",oil:"Oil",biofuels:"Biofuels",geothermal:"Geothermal"}).reduce((t,[a,i])=>{const u=E(i),o=u==="Gas"?"Natural gas":u;return o&&(t[o]=a),t},{});return e["low-carbon"]="lowcarbon",e["natural gas"]="gas",e.水电="hydro",e.水電="hydro",e.风能="wind",e.风电="wind",e.風能="wind",e.風電="wind",Object.fromEntries(Object.entries(e).sort(([t],[a])=>a.length-t.length))}function F(n){const e=b.value.startsWith("zh"),t=Q(),a=new Set;n=L(n,r=>{for(const c of t)if(!a.has(c.key))for(const h of c.phrases){const m=/[a-zA-Z]/.test(h)?`\\b${$(h)}\\b`:$(h),s=new RegExp(m);if(s.test(r)){const l=/^https?:\/\//i.test(c.url),g=l?c.url:_(c.url),x=l?' target="_blank" rel="noopener noreferrer"':"";r=r.replace(s,se=>`<a href="${g}"${x}>${se}</a>`),a.add(c.key);break}}return r});const i=X(),u=new Set;n=L(n,r=>{for(const c in i){const h=i[c];if(u.has(h)||!r.includes(c))continue;const p=e?$(c):`\\b${$(c)}\\b`,m=new RegExp(p);if(m.test(r)){const s=V(h);r=r.replace(m,l=>`<a href="${s}">${l}</a>`),u.add(h)}}return r});const o=ee(),y=new Set;return n=L(n,r=>{for(const c in o){const h=o[c];if(y.has(h)||!r.toLowerCase().includes(c.toLowerCase()))continue;const p=e?$(c):`\\b${$(c)}\\b`,m=new RegExp(p,"i");m.test(r)&&(r=r.replace(m,s=>{let l=`<a href="${_(`/type/${h}`)}">${s}</a>`;return h==="lowcarbon"&&(l=`<strong>${l}</strong>`),l}),y.add(h))}return r}),n}function ne(n){if(!n||typeof n!="string")return"";let e=n.replace(/^[\s\n]*```(?:markdown|md|html)?[\s\n]*/i,"");return e=e.replace(/[\s\n]*```[\s\S]*$/g,""),e.trim()}const B=k(()=>j(Y.value)),H=k(()=>B.value.toc),te=k(()=>(b.value,F(B.value.html))),v=U(""),C=U(!1);let d=null;const M=k(()=>J.value!==b.value),ae=k(()=>M.value&&v.value.length>0),oe=k(()=>{b.value;const n=ne(v.value);if(!n)return"";const e=j(n).html;return C.value?e:F(e)});function P(){if(typeof window>"u")return;v.value="",C.value=!0,d&&(d.close(),d=null);const n=`${z}/api/stream?type=methodology&query=methodology&locale=${b.value}`;try{d=new EventSource(n),d.onmessage=e=>{try{const t=decodeURIComponent(e.data);t.trim()&&(v.value+=t,v.value.endsWith("<FINISH>")&&(v.value=v.value.replace("<FINISH>","")))}catch(t){console.error("Error decoding methodology stream data:",t)}},d.addEventListener("done",()=>{d&&d.close(),C.value=!1}),d.onerror=e=>{console.error("Methodology translation EventSource failed:",e),C.value=!1,d&&d.close()}}catch(e){console.error("Failed to create methodology EventSource:",e),C.value=!1}}me(()=>{M.value&&P()}),pe(O,()=>{v.value="",d&&(d.close(),d=null),M.value&&P()}),ge(()=>{d&&(d.close(),d=null)});function re(n,e){if(typeof document>"u")return;n.preventDefault();const t=document.getElementById(e);t&&(t.scrollIntoView({behavior:"smooth",block:"start"}),typeof history<"u"&&history.replaceState&&history.replaceState(null,"",`#${e}`))}return he(()=>({title:E("Methodology"),meta:[{hid:"description",name:"description",content:E("How LowCarbonPower.org produces its electricity data: where the numbers come from, how sources are reconciled, and how many datasets become one consistent picture.")}]})),(n,e)=>(T(),S("div",Ee,[H.value.length>0?(T(),S("div",$e,[f("h3",Ce,N(A(E)("Table of Contents")),1),e[0]||(e[0]=w()),f("ul",Se,[(T(!0),S(fe,null,ye(H.value,t=>(T(),S("li",{key:t.id,class:we(`toc-level-${t.level}`)},[f("a",{href:`#${t.id}`,onClick:a=>re(a,t.id)},N(t.text),9,Te)],2))),128))])])):D("",!0),e[11]||(e[11]=w()),ae.value?(T(),S("article",{key:1,innerHTML:oe.value,class:"content methodology-content translated-content"},null,8,Ne)):D("",!0),e[12]||(e[12]=w()),f("article",{innerHTML:te.value,class:"content methodology-content"},null,8,We),e[13]||(e[13]=w()),f("div",Ie,[f("h2",xe,N(A(E)("Download the data")),1),e[9]||(e[9]=w()),f("p",Ae,[f("span",_e,N(A(E)("Download our yearly data:")),1),e[1]||(e[1]=w()),e[2]||(e[2]=f("a",{href:"/data-including-net-imports.csv"},"CSV",-1)),e[3]||(e[3]=w()),e[4]||(e[4]=f("a",{href:"/data-including-net-imports.json"},"JSON",-1))]),e[10]||(e[10]=w()),f("p",Oe,[f("span",Le,N(A(E)("Download our monthly data:")),1),e[5]||(e[5]=w()),e[6]||(e[6]=f("a",{href:"/data-including-net-imports-monthly.csv"},"CSV",-1)),e[7]||(e[7]=w()),e[8]||(e[8]=f("a",{href:"/data-including-net-imports-monthly.json"},"JSON",-1))])])]))}},Ge=ve(Me,[["__scopeId","data-v-b85906fb"]]);export{Ge as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.