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,"&").replace(/</g,"<").replace(/>/g,">")}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.