diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e3ceb1b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +name: Python 🐍 CI tests + +on: + pull_request: + types: [closed] + branches: [main] + paths-ignore: + - "**.md" + - "**.bib" + - "**.ya?ml" + - "LICENSE" + - ".gitignore" + workflow_dispatch: + +jobs: + test: + if: github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true + env: + SHIFT_SOLVER: highs + SHIFT_SOLVER_OPTIONS: highs-default + SHIFT_COMPUTE_IIS: "false" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest] + + steps: + - uses: actions/checkout@v4 + + - name: Install Pixi + run: python -m pip install --upgrade pip pixi + + - name: Install dependencies via Pixi (test env) + run: pixi install --environment test + + - name: Validate environment + run: pixi info --environment test + + - name: Run tests + run: pixi run -e test unit-tests diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..2088d4f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,43 @@ +exclude: "^LICENSES|^config/config\\.yaml$" + +ci: + autoupdate_schedule: quarterly + +repos: + # Run ruff to lint and format + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.15.0 + hooks: + # Run the linter + - id: ruff + args: [--fix] + # Run the formatter + - id: ruff-format + + # Find common spelling mistakes + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + args: ['--ignore-regex="(\b[A-Z]+\b)"'] + types_or: [python, rst, markdown] + files: ^(scripts|rules)/ + + # Format Snakemake rule files + - repo: https://github.com/snakemake/snakefmt + rev: v1.0.0 + hooks: + - id: snakefmt + + # Run some default pre-commit hooks + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-added-large-files + args: ["--maxkb=2000"] + - id: check-merge-conflict + - id: check-yaml + exclude: "pixi.lock" + - id: end-of-file-fixer + - id: trailing-whitespace + diff --git a/README.md b/README.md index 9a92543..79cb166 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,111 @@ # SHIFT – Steel & Hydrogen Integrated Freight Trade -This repository contains the **SHIFT model**, a spatially resolved techno-economic optimization of global iron and steel supply chains under decarbonization. It explores how hydrogen-based direct reduced iron (DRI) production and hot-briquetted iron (HBI) trade can shift value creation to regions with renewable energy, infrastructure, and capital availability. +This repository contains the **SHIFT model**, a spatially resolved techno-economic optimization of global iron and steel supply chains under decarbonization. +It explores how hydrogen-based direct reduced iron (DRI) production and hot-briquetted iron (HBI) trade can shift value creation to regions with renewable energy and capital availability. -The model identifies cost-optimal configurations for mining, hydrogen production, DRI processing, and steel trade, using the PyPSA framework. +The model identifies cost-optimal configurations for mining, hydrogen production, DRI processing, and HBI trade, using a two-stage optimization pipeline and open energy system libraries. ---- +## Introduction SHIFT +SHIFT evaluates global supply and trade of low-carbon iron and steel at high spatial resolution. +The model quantifies where to produce, where to ship, and how to meet demand cost-effectively under decarbonization constraints. -## Prerequesite: TRACE model +Key features: +- πŸš€ two-stage process: greenfield supply curves + cross-region LP trade +- 🌍 spatial renewable potentials: PyPSA-Earth wind/solar CF distributions +- πŸ’° integrated LCOX: region-level cost curves for H2, DRI, HBI +- πŸ›³οΈ global trade dispatch: route costs, flows, nodal prices, utilization +- βš™οΈ configurable automation: regions, technologies, scenarios via YAML + Snakemake rules -The SHIFT model integrates the energy supply chain `shipping-steel` from a [fork](https://github.com/fneum/trace/tree/pypsa-eur-sec-imports-atlite) of the [TRACE model](https://github.com/euronion/trace). +## Quick installation (PIXI) -Therefore, clone the TRACE fork with `git`: +Clone the repository: ```sh -git clone https://github.com/fneum/trace.git +git clone https://github.com/energyLS/shift.git +cd shift ``` -and switch to the branch `pypsa-eur-sec-imports-atlite` (commit [8bf0571](https://github.com/fneum/trace/commit/8bf057142d4e035926ffb084493462eff64fe188)) and follow these steps: -- delete `escs/shipping-steel/loads.csv`, -- delete `escs/shipping-steel/ships.csv`, -- in `data/efficiencies.csv` and `escs/shipping-steel/links.csv`, and `escs/shipping-hbi/links.csv`, add replace `direct iron reduction furnace` with `hydrogen direct iron reduction furnace` to match the latest technology-data version -- set `technology_data: "v0.12.0"` in the `config/config.default.yaml` (same as in SHIFT: `config/config.yaml`), -- run `snakemake -c1 resources/networks/default/2030/shipping-steel/DE-DE/network.nc`, -- run `snakemake -c1 resources/networks/default/2050/shipping-steel/DE-DE/network.nc`. - -This creates a steel supply chain for 2030 and 2050 without loads and shipping, those parameters will be added later in the SHIFT workflow. The resulting steel model will be stored in `resources/networks/default/2050/shipping-steel/DE-DE/network.nc` and automatically fetched by the SHIFT model. - +Install dependencies with pixi: -## Download, Install, and Run the SHIFT model +```sh +pixi install +``` -Clone the repository with `git`: +Activate the environment: ```sh -git clone https://github.com/energyLS/shift.git +pixi shell ``` -Create the environment with `conda`: +(Optional) Install pre-commit hooks: ```sh -conda env create -f environment.yaml +pre-commit install ``` -Navigate to the `workflow/notebooks` and run the notebooks `global-iron-ore.ipynb`, `global-steel-production.iypnb`, `prepare-iron-ore.ipynb`, and `prepare-steel.ipynb` for preparation. Those steps will be included in the main workflow in a future version. -Run the trade model by navigating to the `workflow/` folder via `cd workflow` and then run +For details, see https://pixi.prefix.dev/latest/ (or your local PIXI docs). + +## Run (core workflow) + +In the workspace root: ```sh -snakemake -call model_trade_all +pixi run snakemake model_trade_all ``` -To plot the supply curves subtracted with demand, run +To collect all figures (under development): ```sh -snakemake -c1 create_all_supply_curves_with_demand +pixi run snakemake collect_figures ``` -*Under development:* +## Workflow overview -Run the whole workflow using `snakemake`: +### Configuration & Scenario Setup (implicit) -```sh -snakemake -call collect_figures -``` +Before execution, Snakemake reads: +- **Global settings**: `config/config.yaml` (regions, cost years, solver options, enable flags) +- **Scenario matrix**: `config/trade_scenarios.csv` (rows = distinct trade scenarios) +These expand into a deterministic wildcard space (cost_year, region, product, scenario) that drives all downstream rule creation. This bootstrap is handled automatically by Snakemake; no user action required. -## Licence +### Step 0: Renewable potentials (pre-computed inputs) -This repository is licensed under the MIT License. See `LICENCE` for details. +In this stage we generate the supply-side resource backbone. +Renewable capacity-factor series and maximum deployable potentials are pre-computed externally using PyPSA-Earth's `build_renewable_profiles` rule and stored in `data/renewable_profiles/`. +This stage is not part of the current Snakefile. SHIFT consumes pre-computed .nc datasets to avoid the long runtime of full GIS processing. + +> **For new users:** No action needed. Renewable data files are provided in the repository. + +### Step 1: Greenfield supply curve generation (PyPSA) + +With renewable profiles and [techno-economic assumptions](https://github.com/PyPSA/technology-data) in place, SHIFT builds regional PyPSA optimization models to size generation, storage, and process assets. +It evaluates each candidate plant (H2 electrolyser, DRI furnace, HBI plant, steel mills) across resource quality and cost parameters to produce levelized cost curves (LCOX) as a function of capacity. +The result is a fleet of supply curve elements (capacity buckets with marginal costs and metadata) for H2, DRI, HBI, and steel by region. + +Step 1 is a multi-part stage: load techno-economic data and build regional cost baselines, prepare renewable candidate sets per region, solve optimization problems at discrete demand levels, and consolidate results into piecewise supply curves. Each stage depends on the prior; files are persisted between steps to support reproducibility and debugging. +The output is a harmonized set of supply curves used as input for the trade stage. + +### Step 2: Global trade optimization (LP) + +This stage takes regional supply curves and demand obligations, then runs a linear program over the regional network. +It includes transport cost matrices, ore production constraints, and market compatibility. +The solver decides how much each region should produce versus import/export, by product and route. + +The trade solution yields detailed outputs: regional production volume and shipped quantities. +It can also be reconciled with scenarios for demand, policy constraints, and infrastructure availability. ## Acknowledgements Thanks to: +- Oda Agdal and her Master's Thesis on the [Investigation of Future Global Trade of Hydrogen from Renewable Energy Sources](https://ntnuopen.ntnu.no/ntnu-xmlui/handle/11250/3031513) +- Johannes Hampp and [TRACE](https://github.com/euronion/trace) -* Oda Agdal and her Master's Thesis on the [Investigation of Future Global Trade of Hydrogen from Renewable Energy Sources](https://ntnuopen.ntnu.no/ntnu-xmlui/handle/11250/3031513). +## Licence + +This repository is licensed under the MIT License. See `LICENCE` for details. diff --git a/Snakefile b/Snakefile new file mode 100644 index 0000000..ddf52ba --- /dev/null +++ b/Snakefile @@ -0,0 +1,94 @@ +"""Root Snakemake entrypoint for the Shift workflow. + +Loads shared configuration and includes the modular rule files for supply curves, +trade optimization, and reporting. +""" + +from pathlib import Path +from shutil import copyfile +import sys + +import pandas as pd +from snakemake.utils import Paramspace + + +WORKFLOW_DIR = Path(workflow.basedir) / "workflow" +SCRIPT_DIR = WORKFLOW_DIR / "scripts" +NOTEBOOKS_DIR = WORKFLOW_DIR / "notebooks" +# DATA_ + +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) +if str(NOTEBOOKS_DIR) not in sys.path: + sys.path.insert(0, str(NOTEBOOKS_DIR)) + +from trade_chain_utils import ( # noqa: E402 + derive_supply_curve_products, + get_ordered_stages, + get_stage_groups, + get_trade_chain, +) + + +configfile: "config/config.yaml" + + +def _load_trade_scenarios(): + trade_chains = config.get("trade_chains") + if trade_chains: + rows = [] + chain = get_trade_chain(config) + stages_sorted = get_ordered_stages(chain) + if len(stages_sorted) < 2: + raise ValueError( + f"Trade chain '{chain.get('id', '')}' needs at least 2 stages" + ) + stage_groups = get_stage_groups(chain) + if not stage_groups: + raise ValueError( + f"Trade chain '{chain.get('id', '')}' produced no stage groups" + ) + scenarios = chain.get("trade_scenarios", "default") + if isinstance(scenarios, str): + scenarios = [scenarios] + for scenario in scenarios: + rows.append( + { + "chain_id": str(chain.get("id", "default")), + "cost_year": str(chain.get("cost_year", 2050)), + "interone": str(stage_groups[0]["label"]), + "intertwo": str( + stages_sorted[-1].get( + "process_label", stages_sorted[-1]["output_commodity"] + ) + ), + "wacc": str(chain.get("wacc", "regional")), + "final": str(chain.get("final_product", "steel")), + "scenario": str(scenario), + } + ) + return Paramspace(pd.DataFrame(rows, dtype=str)) + + return Paramspace(pd.read_csv("config/trade_scenarios.csv", dtype=str)) + + +trade_scenarios = _load_trade_scenarios() + + +def _derive_supply_curve_products(): + return derive_supply_curve_products(config) + + +SUPPLY_CURVE_PRODUCTS = _derive_supply_curve_products() + + +wildcard_constraints: + country="[a-zA-Z]+", + sweep="[a-zA-Z]+", + rule="(0|[1-9][0-9]?|100)", + + +include: "rules/supply_curves.smk" +include: "rules/preparation.smk" +include: "rules/trade_model.smk" +include: "rules/reporting.smk" diff --git a/config/blocs_traceregions.yaml b/config/blocs_traceregions.yaml new file mode 100644 index 0000000..8d121d9 --- /dev/null +++ b/config/blocs_traceregions.yaml @@ -0,0 +1,87 @@ +metadata: + describtion: "This file defines the bloc and region definitions for the friendshoring analysis. Bloc alignments are adapted from the classifications in Javorcik et al. (2024) to fit the corresponding regions." + source: "Javorcik, B., KitzmΓΌller, L., Schweiger, H., & YΔ±ldΔ±rΔ±m, M. A. (2024). Economic costs of friendshoring. The World Economy, 47, 2871–2908. https://doi.org/10.1111/twec.13555" + +regions: + Europe: + country_members: [AL, AT, BY, BE, BA, BG, HR, CY, CZ, DK, EE, FI, DE, GR, HU, IT, XK, LV, LT, LU, MK, MD, ME, NL, NO, PL, RO, RS, SK, SI, SE, CH, TR, UA] + bloc_alignment: {A: 1, B: 1, C: 1, D: 1} + + Far_West_Europe: + country_members: [FR, GL, IS, IE, PT, ES, GB] + bloc_alignment: {A: 1, B: 1, C: 1, D: 1} + + Middle_East: + country_members: [BH, IR, IQ, IL, JO, KW, LB, OM, PS, QA, SA, SY, AE, YE] + bloc_alignment: {A: 2, B: 2, C: 2, D: 3} + + North_West_Africa: + country_members: [BJ, BF, CI, GM, GH, GN, GW, LR, NG, SN, SL, TG, DZ, TD, EG, ER, LY, ML, MR, MA, NE, SD, TN, EH] + bloc_alignment: {A: 2, B: 2, C: 2, D: 3} + + Subsaharan_Africa: + country_members: [AO, BW, BI, CM, CF, CD, ET, KE, GA, MG, MW, MZ, NA, CG, RW, SO, ZA, SS, TZ, UG, ZM, ZW] + bloc_alignment: {A: 2, B: 2, C: 2, D: 3} + + North_America: + country_members: [CA, US] + bloc_alignment: {A: 1, B: 1, C: 1, D: 1} + + Eurasia: + country_members: [AM, AZ, GE, KZ, KG, TJ, TM, UZ, RU] + bloc_alignment: {A: 2, B: 2, C: 2, D: 3} + + South_America: + country_members: [BO, BR, CO, EC, GF, GY, PY, PE, SR, VE] + bloc_alignment: {A: 1, B: 2, C: 2, D: 2} + + South_South_America: + country_members: [AR, CL, UY] + bloc_alignment: {A: 1, B: 2, C: 2, D: 2} + + Central_America: + country_members: [CR, SV, GT, HN, MX, NI, PA, CU, DO, JM, HT] + bloc_alignment: {A: 2, B: 2, C: 2, D: 3} + + West_Asia: + country_members: [AF, BD, BT, IN, NP, PK, LK] + bloc_alignment: {A: 2, B: 2, C: 2, D: 3} + + East_Asia: + country_members: [CN, HK, MN, TW] + bloc_alignment: {A: 2, B: 2, C: 2, D: 2} + + Pacific_Asia: + country_members: [BN, KH, ID, LA, MY, MM, PG, PH, SG, TH, VN] + bloc_alignment: {A: 2, B: 2, C: 2, D: 2} + + East_East_Asia: + country_members: [JP, KR, KP] + bloc_alignment: {A: 1, B: 1, C: 3, D: 3} + + Oceania: + country_members: [AU, NZ] + bloc_alignment: {A: 1, B: 1, C: 3, D: 3} + + +# Config-compatible bloc definitions based on the above region definitions. + +definition_A: + block_1: ["Europe", "Far_West_Europe", "North_America", "South_America", "South_South_America", "East_East_Asia", "Oceania"] + block_2: ["Middle_East", "North_West_Africa", "Subsaharan_Africa", "Eurasia", "Central_America", "West_Asia", "East_Asia", "Pacific_Asia"] + block_3: [] + +definition_B: + block_1: ["Europe", "Far_West_Europe", "North_America", "East_East_Asia", "Oceania"] + block_2: ["Middle_East", "North_West_Africa", "Subsaharan_Africa", "Eurasia", "South_America", "South_South_America", "Central_America", "West_Asia", "East_Asia", "Pacific_Asia"] + block_3: [] + +definition_C: + block_1: ["Europe", "Far_West_Europe", "North_America"] + block_2: ["Middle_East", "North_West_Africa", "Subsaharan_Africa", "Eurasia", "South_America", "South_South_America", "Central_America", "West_Asia", "East_Asia", "Pacific_Asia"] + block_3: ["East_East_Asia", "Oceania"] + +definition_D: + block_1: ["Europe", "Far_West_Europe", "North_America"] + block_2: ["South_America", "South_South_America", "East_Asia", "Pacific_Asia"] + block_3: ["Middle_East", "North_West_Africa", "Subsaharan_Africa", "Eurasia", "Central_America", "West_Asia", "East_East_Asia", "Oceania"] \ No newline at end of file diff --git a/config/config.yaml b/config/config.yaml index 38dc44c..4b6d3a0 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,48 +1,73 @@ enable: run_supply_chain: False # Enable for first run run_supply_curve: False # Enable for first run - - -# Different demand factors of maximum hydrogen potential as demand in [%] -demand_factors: [0.001, 0.01, 0.02, 0.03, 0.04, 0.05, 0.07, 0.1, 1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50, 60, 70] # 25, 30, 35, 40, 45, 50, 55, 60, 65, 70] -hydrogen_storage_cost: False -iron_ore_cost_in_supply_chain: False # Should be set to false, since iron ore cost will be added in the transport model and should not be double counted + cluster_renewables: False # Enable for first run run: - # prefix: "" - # name: "" - # scenarios: - # enable: false - # file: config/scenarios.yaml disable_progressbar: false -trade: - shipping_routes: - ports: "predefined" # "closest": route from region centroid (searoute snaps to nearest sea node); "predefined": route from hand-curated port city coordinates parsed from the notes column in trade_opt.csv - diversity_factor: False # "False" or float as max constraint for one single hbi supply route in the trade model. 1: no limit, 0.5: max 50% of demand can be supplied by one single supply route, etc. - # Note: The diversity factor constraints the trade route, not the producer itself. (Import from exporter route R <= diversity_factor * demand of importer I.). As a result, if the trade passes through one region, it is limited based on the demand of this particular region * diversity_factor. Therefore the trade routes in a scenario with a diversity_factor of 100% may differ to a scenario where diversity_factor=False. +# Output toggles for Step 0/1 (greenfield supply curve generation) +outputs: + save_supply_nodemand: True # Generate reference supply curve (all generators available) alongside main curve + keep_optimization_networks: True # Keep .nc network files from optimization (set False to save disk space) -scenario: # must be listed in config/trade_scenarios.csv in order to run +# Supply curve scenario configuration +# Three scenarios are supported: +# - allocated_share (DEFAULT): each renewable generator available at X of nominal capacity, +# where X is the allocation_factor (0 < X < 1). Simulates grid-constrained or partially +# dedicated renewable infrastructure. +# - reserved: highest-performing (best CF) renewable generators reserved for domestic +# electricity demand; export/HBI supply stack reduced before optimization. Requires electricity demand data. +# - unreserved (FALLBACK): no domestic reservation; full renewable stack available. +# Can be generated without electricity demand data when demand data unavailable. +supply_curve: + generate_unreserved: False # Set to True to generate unreserved scenario as fallback + default_scenario: allocated_share # Default scenario for supply curve generation + allocation_factor: 0.3 # Renewable capacity allocation factor for allocated_share scenario (0 < X <= 1) + + +# Config-native trade chain definitions +# Defines the commodity transformation chain with ordered stages and process labels +trade_chains: + id: supplyconstraint + cost_year: 2050 + final_product: steel + wacc: regional #regional or uniform + labour_cost: True #Include labour cost + tradeable_commodities: [iron_ore, hbi] + stages: + 1: + material_inputs: [] + energy_inputs: [renewable_electricity] + output_commodity: hydrogen + process_label: electrolysis + 2: + material_inputs: [iron_ore, hydrogen] + energy_inputs: [renewable_electricity] + output_commodity: hbi + process_label: dri + 3: + material_inputs: [hbi] + energy_inputs: [grid_electricity] + output_commodity: steel + process_label: eaf + trade_scenarios: + - default + - mga-chokepoints + - mga-blocs + - constrain-supply + # - mga-stability-weighted + + +scenario: default: - modifiers: - cost_penalty: - penalty-nwa: modifiers: cost_penalty: - North_West_Africa: 1.1 - penalty-ea: + penalty-nwa: # Scenario to demonstrate cost penalty functionality modifiers: cost_penalty: - Eurasia: 1.1 - penalty-sa: - modifiers: - cost_penalty: - South_America: 0.7 - penalty-oc: - modifiers: - cost_penalty: - Oceania: 0.8 - mga-eur-nwa-2: + North_West_Africa: 1.1 + mga-eur-nwa-2: # Scenario to demonstrate MGA functionality with two regions (Europe and North West Africa) modifiers: cost_penalty: mga: @@ -51,14 +76,6 @@ scenario: # must be listed in config/trade_scenarios.csv in order to run carrier: "hbi" export: "North_West_Africa" import: "Europe" - mga-nwa-iso: - modifiers: - cost_penalty: - mga: - slack: 0.01 - sense: "min" - carrier: "hbi" - export: "North_West_Africa" mga-stability: modifiers: cost_penalty: @@ -78,17 +95,17 @@ scenario: # must be listed in config/trade_scenarios.csv in order to run indicator: "stability" threshold_value: -0.5 # Regions with stability index below -0.5 weighting: # Use `workflow/notebooks/utility-weighted-mga.ipynb` to define the weights based on the political stability index, if desired - North_West_Africa: 1.00 - Subsaharan_Africa: 0.87 - West_Asia: 0.81 - Eurasia: 0.70 - South_America: 0.59 - Middle_East: 0.51 + Middle_East: 1.00 + North_West_Africa: 0.93 + Subsaharan_Africa: 0.81 + West_Asia: 0.76 + Eurasia: 0.65 + South_America: 0.55 mga-chokepoints: modifiers: cost_penalty: mga: - slack: [0.0025, 0.005, 0.0075, 0.01, 0.015, 0.02, 0.025, 0.03] + slack: [0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01] sense: "min" carrier: "hbi" indicator: "chokepoint" @@ -97,50 +114,130 @@ scenario: # must be listed in config/trade_scenarios.csv in order to run modifiers: cost_penalty: mga: - slack: [0.0025, 0.005, 0.0075, 0.01, 0.015, 0.02, 0.025, 0.03] #[0.005, 0.01, 0.015, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05] + slack: [0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01] sense: "min" carrier: "hbi" indicator: "blocks" threshold_value: - block_a: ["Europe","Far_West_Europe","North_America","East_East_Asia","South_South_America", "Oceania"] - block_b: ["Middle_East","Subsaharan_Africa","North_West_Africa", "Eurasia","South_America","Central_America","West_Asia","East_Asia","Pacific_Asia"] + # Used "definition_C" from config/blocs_traceregions.yaml + block_1: ["Europe", "Far_West_Europe", "North_America"] + block_2: ["Middle_East", "North_West_Africa", "Subsaharan_Africa", "Eurasia", "South_America", "South_South_America", "Central_America", "West_Asia", "East_Asia", "Pacific_Asia"] + block_3: ["East_East_Asia", "Oceania"] + constrain-supply: + modifiers: + cost_penalty: + pareto: + indicator: "supply" + threshold_value: [100, 150, 175, 200, 250, 300, 350, 600] # Mt + + + +# Absolute steel demand levels (Mt/year) for supply curve sweep +# For each level, PyPSA minimizes cost with fixed renewable capacity +# Values represent different production scales +steel_demand_levels: [0.1, 0.5, 1, 5, 10, 25, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 700, 800, 900, 1000] # Mt/year + +electricity_steel_ratio: 5.25 #TWh/Mt or MWh/t, see notebooks 'analysis-steel.ipynb' +embodied_energy_steel: 2.1 #TWh/Mt or MWh/t, see iron oxide reduction +# Region definitions (ISO3 codes matching renewable clusters metadata) +regions: + "Europe": ["ALB","AUT","BLR","BEL","BIH","BGR","HRV","CYP","CZE","DNK","EST","FIN","DEU","GRC","HUN","ITA","XKX","LVA","LTU","LUX","MKD","MDA","MNE","NLD","NOR","POL","ROU","SRB","SVK","SVN","SWE","CHE","TUR","UKR"] + "Far_West_Europe": ["FRA","GRL","ISL","IRL","PRT","ESP","GBR"] + "Middle_East": ["BHR","IRN","IRQ","ISR","JOR","KWT","LBN","OMN","PSE","QAT","SAU","SYR","ARE","YEM"] + "North_West_Africa": ["BEN","BFA","CIV","GMB","GHA","GIN","GNB","LBR","NGA","SEN","SLE","TGO","DZA","TCD","EGY","ERI","LBY","MLI","MRT","MAR","NER","SDN","TUN","ESH"] + "Subsaharan_Africa": ["AGO","BWA","BDI","CMR","CAF","COD","ETH","KEN","GAB","MDG","MWI","MOZ","NAM","COG","RWA","SOM","ZAF","SSD","TZA","UGA","ZMB","ZWE"] + "North_America": ["CAN","USA"] + "Eurasia": ["ARM","AZE","GEO","KAZ","KGZ","TJK","TKM","UZB","RUS"] + "South_America": ["BOL","BRA","COL","ECU","GUF","GUY","PRY","PER","SUR","VEN"] + "South_South_America": ["ARG","CHL","URY"] + "Central_America": ["CRI","SLV","GTM","HND","MEX","NIC","PAN","CUB","DOM","JAM","HTI"] + "West_Asia": ["AFG","BGD","BTN","IND","NPL","PAK","LKA"] + "East_Asia": ["CHN","HKG","MNG","TWN"] + "Pacific_Asia": ["BRN","KHM","IDN","LAO","MYS","MMR","PNG","PHL","SGP","THA","VNM"] + "East_East_Asia": ["JPN","KOR","PRK"] + "Oceania": ["AUS","NZL"] + +region_nice_names: + "Europe": "Europe" + "Far_West_Europe": "Far West Europe" + "Middle_East": "Middle East" + "North_West_Africa": "North West Africa" + "Subsaharan_Africa": "Subsaharan Africa" + "North_America": "USA & Canada" + "Eurasia": "Eurasia" + "South_America": "South America" + "South_South_America": "South Cone" + "Central_America": "Central America" + "West_Asia": "South Asia" + "East_Asia": "East Asia (China-dominated)" + "Pacific_Asia": "Pacific Asia" + "East_East_Asia": "Japan & Korea" + "Oceania": "Australia & New Zealand" + +clustering: + strata_bin_width: + onwind: 0.05 + solar: 0.02 + top_n_strata_boost: 2 + tail_cluster_boost: 2.0 + diversity_threshold: 0.02 + min_capacity_for_split_mw: 1e5 + cluster_count_policy: + base_clusters: + solar: 20 + onwind: 20 + min_clusters: 6 + max_clusters: 50 + design: - cost_penalty: - # North_West_Africa: 1.1 # Relative cost pentalty on all technlogies in this region. 1: no change + cost_penalty: # Feature to impose cost penalties. Should not be enabled for standard runs + # North_West_Africa: 1.1 # Relative cost pentalty on all technologies in this region. 1: no change # Eurasia: 1.1 # South_America: 0.7 # Oceania: 0.8 + stability_penalty: + Middle_East: 0.6 # Absolute stability penalty, reduces the stability index of a region by this number using substraction -costs: - version: v0.12.0 +techno-economic parameters: + pypsa_tech_version: v0.14.0 eur_usd: 1.15 # 1 Euro equals 1.15 USD + additional_parameters: + h2_standing_loss: 0.001 # 0.1% per hour for underground cavern (leakage) + batt_standing_loss: 0.0001 # 0.01% per hour for battery (self-discharge) -interest_rate: 0.07 # This should align with the TRACE model input WACC. To use a regional interest rate, set the wildcard wacc="regional" in the `config/trade_scenarios.csv`. Caveat: this does not change the WACC for storages. For uniform interest rate, set wacc="uniform" in the `config/trade_scenarios.csv`. +interest_rate: + default: 0.084 # Used, if wildcard `wacc` is set to `uniform`. The value of 0.084 (8.4%) is obtained from the notebook `prepare-wacc.ipynb` and represents a global average WACC weighted by GDP. +trade: + shipping_routes: + ports: "predefined" # "closest": route from region centroid (searoute snaps to nearest sea node); "predefined": route from hand-curated port city coordinates parsed from the notes column in trade_opt.csv + diversity_factor: False # "False" or float as max constraint for one single hbi supply route in the trade model. 1: no limit, 0.5: max 50% of demand can be supplied by one single supply route, etc. + # Note: The diversity factor constraints the trade route, not the producer itself. (Import from exporter route R <= diversity_factor * demand of importer I.). As a result, if the trade passes through one region, it is limited based on the demand of this particular region * diversity_factor. Therefore the trade routes in a scenario with a diversity_factor of 100% may differ to a scenario where diversity_factor=False. + shipping: + port_loading: 7 # USD/t, for each loading, see 10.1038/s41467-023-38123-2 supplementary S12 + nh3_cost: 460 # USD/t_NH3, see 10.1038/s41467-023-38123-2 supplementary S12 + nh3_consumption: 0.2 # t_NH3/nm, see 10.1038/s41467-023-38123-2 supplementary S12 + charter_rate: 0.0008 # USD/(t*km), see 10.1038/s41467-023-38123-2 supplementary S12 + panamax_load: 80000 # t + nm_to_km: 1.852 # 1 nautical mile equals 1.852 kilometers + grid_electricity: - marginal_cost: 80 # EUR/MWh, guesstimate for average grid electricity cost in 2030 - capital_cost: 0 # EUR/MW, guesstimate for average grid electricity cost in 2030 + marginal_cost: 80 # EUR/MWh, estimate for average grid electricity cost in 2050, based on doi.org/10.1016/j.apenergy.2025.126189 (higher end of Table D3) grid_potential_custom: true # Use custom grid potential for eaf-grid from data/grid_potential_custom.csv in Mt steel part_load: - electrolysis: 0.0 - direct reduction furnace: 0.9 + electrolysis: 0.25 # (0.1-0.4) https://doi.org/10.1016/j.jpowsour.2023.232629 + direct reduction furnace: 0.2 # https://doi.org/10.1016/j.renene.2021.10.036 electric arc furnace: 0.0 # add part load limitations by naming the carrier of links -electricity_steel_ratio: 5.25 #TWh/Mt or MWh/t, see notebooks 'analysis-steel.ipynb' -embodied_energy_steel: 2.1 #TWh/Mt or MWh/t, see iron oxide reduction -pv_p_nom_max_cor: 0.1 -onwind_p_nom_max_cor: 0.1 - iron_ore: regionalise: "grade-dependent" #"uniform" or "grade-dependent" - marginal_cost: 97.7 # Used as uniform assumption in the trade model and for intermediate figures/results with undefined sourcing region of iron ore # EUR/t_ore # See https://www.nature.com/articles/s41467-025-60652-1 from mission possible steel model (see also technology-data) + marginal_cost: 97.7 #97.7 EUR/t_ore # See https://www.nature.com/articles/s41467-025-60652-1 from mission possible steel model (see also technology-data) ore_to_steel_ratio: 1.59 # t_ore/t_steel, see https://www.nature.com/articles/s41467-025-60652-1 from mission possible steel model (see also technology-data) - potential_allowance: 2 # Factor, which the current iron ore production is multiplied with - shipping_cost_per_km: 0.005 # €/(t*km) # Guesstimate + potential_allowance: 1.2 # Factor, which the current iron ore production is multiplied with plot: world_map: @@ -156,48 +253,10 @@ plot: steel: bus_size: 2.0e-7 link_width: 3.0e-8 - colors: - steel: 'grey' - steel_shipping: 'darkgrey' - hydrogen: 'magenta' - iron_ore: 'brown' - iron_ore_shipping: "#6A000E" - hbi: 'darkred' - hbi_shipping: 'firebrick' - steel_supply: 'lightsteelblue' - steel_demand: 'seagreen' - steel_link: 'skyblue' - iron_ore_supply: 'black' - iron_ore_demand: 'lightsteelblue' - iron_ore_link: "#6A000E" - hbi_demand: 'green' - hbi_supply: 'darkred' - hbi_link: 'firebrick' - -# Region definitions -regions: - "Europe": ["Albania", "Austria", "Belarus", "Belgium", "Bosnia and Herzegovina", "Bulgaria", "Croatia", "Cyprus", "Czechia", "Denmark", "Estonia", "Finland", "Germany", "Greece", "Hungary", "Italy", "Kosovo", "Latvia", "Lithuania", "Luxembourg", "North Macedonia", "Moldova", "Montenegro", "Netherlands", "Norway", "Poland", "Romania", "Serbia", "Slovakia", "Slovenia", "Sweden", "Switzerland", "Turkey", "Ukraine"] - "Far_West_Europe": ["France", "Greenland", "Iceland", "Ireland", "Portugal", "Spain", "United Kingdom"] - "Middle_East": ["Bahrain", "Iran, Islamic Republic of", "Iraq","Israel", "Jordan", "Kuwait", "Lebanon", "Oman", "Palestine", "Qatar", "Saudi Arabia", "Syria", "United Arab Emirates", - "Yemen"] - "North_West_Africa": ["Benin", "Burkina Faso", "CΓ΄te d'Ivoire", "Gambia", "Ghana", "Guinea", "Guinea-Bissau", "Liberia", "Nigeria", "Senegal", "Sierra Leone", "Togo + Algeria", "Chad", "Egypt", "Eritrea", "Libya", "Mali", "Mauritania", "Morocco", "Niger", "Sudan", "Tunisia", "Western Sahara"] - "Subsaharan_Africa": ["Angola", "Botswana", "Burundi", "Cameroon", "Central African Republic", "Democratic Republic of the Congo", "Ethiopia", "Kenya", "Gabon", "Madagascar", "Malawi", "Mozambique", "Namibia", "Republic of the Congo", "Rwanda", "Somalia", "South Africa", "South Sudan", "Tanzania", "Uganda", "Zambia", "Zimbabwe"] - "North_America": ["Canada", "United States"] - "Eurasia": ["Armenia", "Azerbaijan", "Georgia", "Kazakhstan", Kyrgyzstan, "Tajikistan", "Turkmenistan", "Uzbekistan", "Russian Federation"] - "South_America": ["Bolivia", "Brazil", "Colombia", "Ecuador", "Equatorial French Guiana", "Guyana", "Paraguay", "Peru", "Suriname","Venezuela"] - "South_South_America": ["Argentina", "Chile", "Uruguay"] - "Central_America": ["Costa Rica", "El Salvador", "Guatemala", "Honduras", "Mexico", "Nicaragua", "Panama", "Cuba", "Dominican Republic", "Jamaica", "Haiti"] - "West_Asia": ["Afghanistan", "Bangladesh", "Bhutan", "India", "Nepal", "Pakistan", "Sri Lanka"] - "East_Asia": ["China", "Hong Kong", "Mongolia", "Taiwan"] - "Pacific_Asia": ["Brunei", "Cambodia", "Indonesia", "Laos", "Malaysia", "Myanmar", "Papua New Guinea", "Philippines", "Singapore", "Thailand", "Vietnam"] - "East_East_Asia": ["Japan", "South Korea", "North Korea"] - "Oceania": ["Australia", "New Zealand"] - - solver: - name: gurobi - options: gurobi-default - + name: gurobi + options: gurobi-default + compute_iis: False # Set to false to skip expensive IIS computation for infeasible models solver_options: highs-default: # refer to https://ergo-code.github.io/HiGHS/dev/options/definitions/ @@ -226,39 +285,41 @@ colors: electric arc furnace: 'orange' direct reduction furnace: 'grey' hydrogen direct iron reduction furnace: 'grey' - electrolysis: 'magenta' battery inverter: '#6A000E' battery inverter (charging): '#6A000E' battery inverter (discharging): '#FF5733' battery: 'purple' wind: 'blue' - solar: 'yellow' - pv: 'yellow' + onshore wind: 'blue' + solar: '#bfbf04' + pv: '#bfbf04' electricity: 'red' iron ore: 'brown' steel: 'grey' hot briquetted iron: 'darkred' + electrolysis: 'magenta' hydrogen: 'magenta' + hydrogen storage: '#AF7AC5' Battery: purple Electricity: red HBI: darkred Photovoltaics: yellow Wind energy: blue - Eurasia: '#1B4F9C' # deep blue - Europe: '#F39C12' # strong orange - Far_West_Europe: '#2ECC71' # vivid green - Middle_East: '#C0392B' # brick red - North_West_Africa: '#7D3C98' # dark purple - Subsaharan_Africa: '#A04000' # burnt sienna - North_America: '#F1C40F' # yellow (clearly distinct) - South_America: '#16A085' # teal - South_South_America: '#EC7063' # coral - Central_America: '#27AE60' # emerald (different from teal) - West_Asia: '#2C3E50' # blue-grey (almost navy) - East_Asia: '#58D68D' # light green (intentional contrast) - Pacific_Asia: '#AF7AC5' # lavender - East_East_Asia: '#922B21' # dark red - Oceania: '#1F618D' # steel blue + Europe: "#17679E" # blue + Far_West_Europe: "#237F8C" # teal-blue + Eurasia: "#7E84E5" # blue-purple + Middle_East: "#8352D8" # purple + West_Asia: "#590B72" # dark purple + East_Asia: "#BF39B0" # magenta + Pacific_Asia: "#8C234F" # dark magenta-red + East_East_Asia: "#BF9A39" # mustard/gold + North_West_Africa: "#378C23" # green + Subsaharan_Africa: "#720B16" # dark red + North_America: "#0B722B" # dark green + Central_America: "#E5977E" # peach + South_America: "#39BF99" # teal-green + South_South_America: "#99D852" # yellow-green + Oceania: "#D7E57E" # light yellow-green trade_today: surplus: '#d94801' # orange-red (net exporter bubble) deficit: '#045a8d' # dark blue (net importer bubble) @@ -267,4 +328,34 @@ colors: border: '#bcbcbc' # mid grey (country borders) legend_bg: '#f5f5f5' # near-white (legend background) legend_edge: '#bdbdbd' # grey (legend border) - + steel_shipping: 'darkgrey' + iron_ore: 'brown' + iron_ore_shipping: "#6A000E" + hbi: 'darkred' + hbi_shipping: 'firebrick' + shipping: 'black' + steel_supply: 'lightsteelblue' + steel_demand: 'seagreen' + steel_link: 'skyblue' + iron_ore_supply: 'black' + iron_ore_demand: 'green' + iron_ore_link: "#6A000E" + hbi_demand: '#17679E' + hbi_supply: 'darkred' + hbi_link: 'firebrick' + # Maritime chokepoint colors (mapped to geographically relevant region colors) + babalmandab: "#8352D8" # Middle_East (Bab el-Mandeb) + bosporus: "#720B16" # Swapped with Subsaharan_Africa + gibraltar: "#237F8C" # Far_West_Europe (Strait of Gibraltar) + suez: "#378C23" # North_West_Africa (Suez Canal) + panama: "#E5977E" # Central_America (Panama Canal) + ormuz: "#590B72" # West_Asia (Strait of Hormuz) + malacca: "#8C234F" # Pacific_Asia (Strait of Malacca) + south_africa: "#17679E" # swapped with Europe + northwest: "#0B722B" # North_America (Northwest Passage) + sunda: "#BF39B0" # East_Asia (Sunda Strait) + chili: "#99D852" # South_South_America (Drake Passage) + # Friendshoring colors + bloc_1: "#17679E" # Europe (Western bloc: Europe + Far West Europe + North America) + bloc_2: "#8352D8" # Middle_East (Global South bloc) + bloc_3: "#BF9A39" # East_East_Asia (East Asia + Oceania bloc) \ No newline at end of file diff --git a/config/trade_scenarios.csv b/config/trade_scenarios.csv deleted file mode 100644 index 02fe672..0000000 --- a/config/trade_scenarios.csv +++ /dev/null @@ -1,2 +0,0 @@ -cost_year,interone,intertwo,final,wacc,scenario -2050,hbi,eaf-grid,steel,regional,default \ No newline at end of file diff --git a/config/trade_scenarios_collection.csv b/config/trade_scenarios_collection.csv deleted file mode 100644 index d9a58f0..0000000 --- a/config/trade_scenarios_collection.csv +++ /dev/null @@ -1,6 +0,0 @@ -cost_year,transport_cost,demand,interone,intertwo,final -2030,steel_r_iron_r,1,steel,steel,steel -2030,steel_r_iron_r,1,hbi,eaf,steel -2030,steel_r_iron_r,1,hbi,eaf-grid,steel -2030,steel_r_iron_r,1,hbi,hbi,hbi -2030,steel_r_iron_r,1,hydrogen,hydrogen,hydrogen \ No newline at end of file diff --git a/config/trade_scenarios_collection_legacy.csv b/config/trade_scenarios_collection_legacy.csv deleted file mode 100644 index d435302..0000000 --- a/config/trade_scenarios_collection_legacy.csv +++ /dev/null @@ -1,18 +0,0 @@ -cost_year,transport_cost,demand,product -2030,irena,0.2,hydrogen -2030,irena,0.6,hydrogen -2030,heuser,0.2,hydrogen -2030,heuser,0.6,hydrogen -2050,irena,0.2,hydrogen -2050,irena,0.6,hydrogen -2050,heuser,0.2,hydrogen -2050,heuser,0.6,hydrogen -2030,custom,1,steel -2030,steel_iron_zero,1,steel -2030,steel_iron_real,1,steel -2030,steel_z_iron_z,1,steel -2030,steel_z_iron_r,1,steel -2030,steel_r_iron_z,1,steel -2030,steel_r_iron_r,1,steel -2030,steel_rhigh_iron_z,1,steel -2030,steel_rhigh_iron_r,1,steel \ No newline at end of file diff --git a/environment.yaml b/environment.yaml index f071068..fe20f3b 100644 --- a/environment.yaml +++ b/environment.yaml @@ -70,4 +70,4 @@ dependencies: - highspy - tsam>=2.3.1 - entsoe-py - - pypsatopo \ No newline at end of file + - pypsatopo diff --git a/pixi.lock b/pixi.lock index b50d3cb..0a1ec51 100644 --- a/pixi.lock +++ b/pixi.lock @@ -13,20 +13,49 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.6.0-np2py312hfb8c2c5_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda @@ -34,43 +63,54 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.23.1-hc31b594_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.0.3-hc31b594_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.13-h4d16d09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.10-hc46dffc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.11-hc03379b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.12-hf4fecb4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.13-hc93afbd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/coincbc-2.10.13-0_metapackage.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/country_converter-1.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.7-py312ha4b625e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -79,34 +119,42 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.10.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py312h03f33d3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.74.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.80.0-py312h39ee1c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.80.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/gurobi/linux-64/gurobi-13.0.1-py312_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_108.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/highspy-1.14.0-np2py312h0f77346_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda @@ -116,35 +164,60 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py312h4c3975b_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.18-h6688a6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kmedoids-0.5.5-py312h6b5fed6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.27.3-py312h1289d80_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.7-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.3-default_h746c552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda @@ -154,38 +227,48 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.3-h4f65170_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.2-hc2c0581_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.12.2-hf70aa56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf5-3.12.2-hcaab353_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.12.2-h03ef1cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.80.0-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_h6ae95b6_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.4-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.6-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda @@ -193,53 +276,66 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_hab3fe16_120.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.2-he237659_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.6-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.10-h05a5f5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.1-py312h88efc94_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.1-py312h88efc94_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda @@ -247,14 +343,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.38.1-py310hffdcd12_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda @@ -262,91 +363,110 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py312hd0750ca_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py312h053e1f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312he675c61_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py312h50ac2ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.1-py312h50ac2ff_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytables-3.11.1-py312hefc0c3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytables-3.11.1-py312hefc0c3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.1.post1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.1-pl5321h16c4a6b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.5-py312h1289d80_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py312hcedc861_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.6.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-cluster-generic-1.0.9-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-2.6.1-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-jobstep-0.4.0-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.4.0-pyh84498cf_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-1.2.4-pyhdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.4.1-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-cached-http-0.3-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.1-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.32.3-hcee41ef_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-loggable-0.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/validators-0.35.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda @@ -371,20 +491,2431 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.23.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.24.2-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/0e/a9f6f81013e0deaf559b25711623864970fe6a098314e374ccb1540a4152/regex-2026.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/85/9b/9363877895a78258f24a883b137fae83e5cc5e33ed3768618f8ae2aa8da3/gurobipy-13.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.13.5-py312h6b91d65_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.5.0-py312h06d0912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.6.0-np2py312h226b611_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-blosc2-3.0.3-h2af8807_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py312hc128f0a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py312h196c9fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd615c49_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-h7214e40_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312h78d62e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-48.0.0-py312h232196e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.63.0-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.7.0-py312hfdf67e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py312h3d708b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.78.1-py312h5881051_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py312h03cd2ba_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_hae35d4c_106.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/highspy-1.14.0-np2py312ha76dc74_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jasper-4.2.9-h8ad263b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py312h78d62e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kmedoids-0.5.5-py312h575328f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.27.3-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.6-gpl_he24518a_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h6c93730_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_hc41557d_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.5-default_ha2db4b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.2-h9774fe2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf4-3.12.2-h5bd48a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf5-3.12.2-h5260803_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-netcdf-3.12.2-h1c765f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-hf3f85d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1022.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_h018ca30_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.3-nompi_h3948bcf_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h3cfd58e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h779ef1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.2-h779ef1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py312hc3c93f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py312h05f76fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.9-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.9-py312h0ebf65c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.0.10-h9fa1bad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hfdbc840_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.2-py312hf90b1b7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.7.1-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.3-nompi_py312h79d12a2_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numexpr-2.14.1-py312h0c4f959_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.2.0-py312h31f0997_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/polars-runtime-32-1.38.1-py310hca7251b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.3.1-py312h31fea79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.33.5-py312hcb3287e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py312he5662c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py312he39998a_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-24.0.0-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-24.0.0-py312h12c7521_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py312h3f2e00f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py312h8b773d8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.6-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.1-py312ha7d0d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pytables-3.11.1-py312h20cef2e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.13-h0159041_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-eccodes-2.46.0-np2py312h226b611_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py312h275cf98_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.1-pl5321hfcac499_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.5-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py312h064b072_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py312hdabe01f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py312hea30aaf_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py312h9b3c559_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py312h37f46ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.4.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-1.2.4-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.1-hdb435a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/statsmodels-0.14.6-py312h196c9fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/validators-0.35.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.24.2-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c7/c106367b5209ab5500df8feed64d596276d7e78fe7ab3b918ac938ce580b/gurobipy-13.0.1-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + dev: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/bioconda/ + - url: https://conda.anaconda.org/gurobi/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/astroid-4.0.4-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/autopep8-2.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.6.0-np2py312hfb8c2c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.0.3-hc31b594_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.13-h4d16d09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.10-hc46dffc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.11-hc03379b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.12-hf4fecb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.13-hc93afbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py312h03f33d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/highspy-1.14.0-np2py312h0f77346_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.18-h6688a6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kmedoids-0.5.5-py312h6b5fed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.27.3-py312h1289d80_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.2-hc2c0581_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.12.2-hf70aa56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf5-3.12.2-hcaab353_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.12.2-h03ef1cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.6-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.10-h05a5f5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbqa-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.1-py312h88efc94_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.38.1-py310hffdcd12_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py312hd0750ca_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py312h053e1f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312he675c61_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.1-py312h50ac2ff_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytables-3.11.1-py312hefc0c3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.1-pl5321h16c4a6b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.5-py312h1289d80_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py312hcedc861_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.5-h40fa522_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.4.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-1.2.4-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.32.3-hcee41ef_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/validators-0.35.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.24.2-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/9b/9363877895a78258f24a883b137fae83e5cc5e33ed3768618f8ae2aa8da3/gurobipy-13.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.13.5-py312h6b91d65_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/astroid-4.0.4-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/autopep8-2.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.5.0-py312h06d0912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.6.0-np2py312h226b611_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-blosc2-3.0.3-h2af8807_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py312hc128f0a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py312h196c9fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd615c49_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-h7214e40_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312h78d62e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.14.0-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-48.0.0-py312h232196e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.63.0-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.7.0-py312hfdf67e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py312h3d708b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.78.1-py312h5881051_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py312h03cd2ba_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_hae35d4c_106.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/highspy-1.14.0-np2py312ha76dc74_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jasper-4.2.9-h8ad263b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py312h78d62e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kmedoids-0.5.5-py312h575328f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.27.3-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.6-gpl_he24518a_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h6c93730_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_hc41557d_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.5-default_ha2db4b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.2-h9774fe2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf4-3.12.2-h5bd48a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf5-3.12.2-h5260803_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-netcdf-3.12.2-h1c765f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-hf3f85d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1022.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_h018ca30_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.3-nompi_h3948bcf_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h3cfd58e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h779ef1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.2-h779ef1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py312hc3c93f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py312h05f76fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.9-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.9-py312h0ebf65c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.0.10-h9fa1bad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hfdbc840_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.2-py312hf90b1b7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.7.1-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbqa-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.3-nompi_py312h79d12a2_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numexpr-2.14.1-py312h0c4f959_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.2.0-py312h31f0997_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/polars-runtime-32-1.38.1-py310hca7251b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.3.1-py312h31fea79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.33.5-py312hcb3287e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py312he5662c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py312he39998a_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-24.0.0-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-24.0.0-py312h12c7521_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py312h3f2e00f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py312h8b773d8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.6-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.1-py312ha7d0d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pytables-3.11.1-py312h20cef2e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.13-h0159041_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-eccodes-2.46.0-np2py312h226b611_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py312h275cf98_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.1-pl5321hfcac499_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.5-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py312h064b072_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py312hdabe01f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.5-h5739096_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py312hea30aaf_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py312h9b3c559_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py312h37f46ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.4.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-1.2.4-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.1-hdb435a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/statsmodels-0.14.6-py312h196c9fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.1.0-py312hf90b1b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/validators-0.35.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.24.2-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c7/c106367b5209ab5500df8feed64d596276d7e78fe7ab3b918ac938ce580b/gurobipy-13.0.1-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + test: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/bioconda/ + - url: https://conda.anaconda.org/gurobi/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.6.0-np2py312hfb8c2c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.0.3-hc31b594_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.13-h4d16d09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.10-hc46dffc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.11-hc03379b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.12-hf4fecb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.13-hc93afbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py312h03f33d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/highspy-1.14.0-np2py312h0f77346_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.18-h6688a6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kmedoids-0.5.5-py312h6b5fed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.27.3-py312h1289d80_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.2-hc2c0581_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.12.2-hf70aa56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf5-3.12.2-hcaab353_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.12.2-h03ef1cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.6-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.10-h05a5f5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.1-py312h88efc94_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.38.1-py310hffdcd12_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py312hd0750ca_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py312h053e1f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312he675c61_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.1-py312h50ac2ff_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytables-3.11.1-py312hefc0c3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.1-pl5321h16c4a6b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.5-py312h1289d80_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py312hcedc861_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.4.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-1.2.4-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.32.3-hcee41ef_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.6-py312h4f23490_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/validators-0.35.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.24.2-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/9b/9363877895a78258f24a883b137fae83e5cc5e33ed3768618f8ae2aa8da3/gurobipy-13.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.13.5-py312h6b91d65_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.5.0-py312h06d0912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.6.0-np2py312h226b611_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-blosc2-3.0.3-h2af8807_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py312hc128f0a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py312h196c9fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd615c49_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-h7214e40_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312h78d62e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.14.0-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-48.0.0-py312h232196e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.63.0-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.7.0-py312hfdf67e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py312h3d708b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.78.1-py312h5881051_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py312h03cd2ba_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_hae35d4c_106.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/highspy-1.14.0-np2py312ha76dc74_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jasper-4.2.9-h8ad263b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py312h78d62e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kmedoids-0.5.5-py312h575328f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.27.3-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.6-gpl_he24518a_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h6c93730_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_hc41557d_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.5-default_ha2db4b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.2-h9774fe2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf4-3.12.2-h5bd48a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf5-3.12.2-h5260803_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-netcdf-3.12.2-h1c765f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-hf3f85d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1022.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_h018ca30_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.3-nompi_h3948bcf_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h3cfd58e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h779ef1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.2-h779ef1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py312hc3c93f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py312h05f76fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.9-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.9-py312h0ebf65c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.0.10-h9fa1bad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hfdbc840_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.2-py312hf90b1b7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.7.1-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.3-nompi_py312h79d12a2_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numexpr-2.14.1-py312h0c4f959_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.2.0-py312h31f0997_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/polars-runtime-32-1.38.1-py310hca7251b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.3.1-py312h31fea79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.33.5-py312hcb3287e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py312he5662c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py312he39998a_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-24.0.0-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-24.0.0-py312h12c7521_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py312h3f2e00f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py312h8b773d8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.6-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.1-py312ha7d0d2e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pytables-3.11.1-py312h20cef2e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.13-h0159041_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-eccodes-2.46.0-np2py312h226b611_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py312h275cf98_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.1-pl5321hfcac499_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.5-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py312h064b072_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py312hdabe01f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py312hea30aaf_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py312h9b3c559_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py312h37f46ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.4.0-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-1.2.4-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.1-hdb435a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/statsmodels-0.14.6-py312h196c9fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/validators-0.35.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.24.2-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c7/c106367b5209ab5500df8feed64d596276d7e78fe7ab3b918ac938ce580b/gurobipy-13.0.1-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl @@ -403,6 +2934,21 @@ packages: purls: [] size: 28948 timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 8a1cee28bd0ee7451ada1cd50b64720e57e17ff994fc62dd8329bef570d382e4 + md5: 1626967b574d1784b578b52eaeb071e7 + depends: + - libgomp >=7.5.0 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - openmp_impl <0.0a0 + - msys2-conda-epoch <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 52252 + timestamp: 1770943776666 - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 md5: aaa2a381ccc56eac91d63b6c1240312f @@ -414,6 +2960,17 @@ packages: purls: [] size: 8191 timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + sha256: 0deeaf0c001d5543719db9b2686bc1920c86c7e142f9bec74f35e1ce611b1fc2 + md5: 8c4061f499edec6b8ac7000f6d586829 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/affine?source=hash-mapping + size: 19164 + timestamp: 1733762153202 - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda sha256: 7842ddc678e77868ba7b92a726b437575b23aaec293bca0d40826f1026d90e27 md5: 18fd895e0e775622906cdabfc3cf0fb4 @@ -446,6 +3003,28 @@ packages: - pkg:pypi/aiohttp?source=hash-mapping size: 1034187 timestamp: 1775000054521 +- conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.13.5-py312h6b91d65_0.conda + sha256: 539e8fba2b4835ee4437fa8b51056be2cf033ac4155f64a19e87855c2ae2af94 + md5: f5474e6e952ff964319851b1c68b7301 + depends: + - aiohappyeyeballs >=2.5.0 + - aiosignal >=1.4.0 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - yarl >=1.17.0,<2.0 + license: MIT AND Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aiohttp?source=hash-mapping + size: 974294 + timestamp: 1774999837374 - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda sha256: 8dc149a6828d19bf104ea96382a9d04dae185d4a03cc6beb1bc7b84c428e3ca2 md5: 421a865222cd0c9d83ff08bc78bf3a61 @@ -482,9 +3061,9 @@ packages: - pkg:pypi/amply?source=hash-mapping size: 21899 timestamp: 1734603085333 -- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda - sha256: f09aed24661cd45ba54a43772504f05c0698248734f9ae8cd289d314ac89707e - md5: af2df4b9108808da3dc76710fe50eae2 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + sha256: eb0c4e2b24f1fbefaf96ce6c992c6bd64340bc3c06add4d7415ab69222b201da + md5: 11a2b8c732d215d977998ccd69a9d5e8 depends: - exceptiongroup >=1.0.2 - idna >=2.8 @@ -493,14 +3072,13 @@ packages: - python constrains: - trio >=0.32.0 - - uvloop >=0.22.1 - - winloop >=0.2.3 + - uvloop >=0.21 license: MIT license_family: MIT purls: - - pkg:pypi/anyio?source=hash-mapping - size: 146764 - timestamp: 1774359453364 + - pkg:pypi/anyio?source=compressed-mapping + size: 145175 + timestamp: 1767719033569 - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda sha256: 5b9ef6d338525b332e17c3ed089ca2f53a5d74b7a7b432747d29c6466e39346d md5: f4e90937bbfc3a4a92539545a37bb448 @@ -512,6 +3090,52 @@ packages: - pkg:pypi/appdirs?source=hash-mapping size: 14835 timestamp: 1733754069532 +- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad + md5: 8ac12aff0860280ee0cff7fa2cf63f3b + depends: + - argon2-cffi-bindings + - python >=3.9 + - typing-extensions + constrains: + - argon2_cffi ==999 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi?source=hash-mapping + size: 18715 + timestamp: 1749017288144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_2.conda + sha256: 7988c207b2b766dad5ebabf25a92b8d75cb8faed92f256fd7a4e0875c9ec6d58 + md5: 1567f06d717246abab170736af8bad1b + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.0.1 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 35646 + timestamp: 1762509443854 +- conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py312he06e257_2.conda + sha256: 38c5e43d991b0c43713fa2ceba3063afa4ccad2dd4c8eb720143de54d461a338 + md5: 5dc3781bbc4ddce0bf250a04c1a192c2 + depends: + - cffi >=1.0.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 38535 + timestamp: 1762509763237 - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_1.conda sha256: fd512bde81be7f942e1efb54c6a7305c16375347ccacf9375ada70cdc0f4f0d3 md5: 3c0e753fd317fa10d34020a2bc8add8e @@ -523,6 +3147,44 @@ packages: - pkg:pypi/argparse-dataclass?source=hash-mapping size: 12806 timestamp: 1764079623900 +- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141 + md5: 85c4f19f377424eafc4ed7911b291642 + depends: + - python >=3.10 + - python-dateutil >=2.7.0 + - python-tzdata + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/arrow?source=hash-mapping + size: 113854 + timestamp: 1760831179410 +- conda: https://conda.anaconda.org/conda-forge/linux-64/astroid-4.0.4-py312h7900ff3_0.conda + sha256: 50d706c0700ee47617de6a850cab0bb4a3419c2ed86804c21f449735f09e1c48 + md5: 78bdb6d3da524bdea10ef44e5ec7658d + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/astroid?source=hash-mapping + size: 509570 + timestamp: 1770634488093 +- conda: https://conda.anaconda.org/conda-forge/win-64/astroid-4.0.4-py312h2e8e312_0.conda + sha256: 24916ad967b6b0d25c6ed2cff1e61b17f4f72d0c73cbdc5f2afdd55dcc0a36b5 + md5: 0cec3709c887fd21483f9fe36d039bac + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/astroid?source=hash-mapping + size: 508356 + timestamp: 1770634547561 - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010 md5: 9673a61a297b00016442e022d689faa6 @@ -536,49 +3198,699 @@ packages: - pkg:pypi/asttokens?source=hash-mapping size: 28797 timestamp: 1763410017955 -- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda - sha256: 78c516af87437f52d883193cf167378f592ad445294c69f7c69f56059087c40d - md5: 9bb149f49de3f322fca007283eaa2725 +- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + depends: + - python >=3.10 + - typing_extensions >=4.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/async-lru?source=hash-mapping + size: 21470 + timestamp: 1771623881915 +- conda: https://conda.anaconda.org/conda-forge/noarch/atlite-0.4.1-pyhd8ed1ab_1.conda + sha256: 4664b9622e9ed53796825aea4a514ac76c42e6a6c553c16a148ad6dccbc16f8f + md5: 81f981df273cd627927372680aa9dd31 + depends: + - bottleneck + - cdsapi + - cfgrib >=0.9.15.0 + - dask >=2021.10 + - geopandas + - h5netcdf >=1.6.1 + - netcdf4 + - numexpr + - numpy + - pandas >=1.1 + - progressbar2 + - pyproj >=2 + - pytest + - python >=3.10 + - rasterio >=1.3,!=1.4.0,!=1.4.1 + - requests + - scipy + - shapely + - toolz + - tqdm + - xarray >=0.20 + - yaml + license: GPL-3.0-or-later + license_family: GPL + purls: + - pkg:pypi/atlite?source=hash-mapping + size: 91296 + timestamp: 1754897384499 +- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 + md5: 791365c5f65975051e4e017b5da3abf5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 68072 + timestamp: 1756738968573 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f + md5: 537296d57ea995666c68c821b00e360b + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 64759 + timestamp: 1764875182184 +- conda: https://conda.anaconda.org/conda-forge/noarch/autopep8-2.3.2-pyhd8ed1ab_0.conda + sha256: 1dc8ba2892c76c7bdd6518e3684b88710f4a985ebfc1d4f588478569391d300b + md5: 08ee18d78273baa3ed4cef5a8a58d79a + depends: + - packaging + - pycodestyle >=2.12.0 + - python >=3.9 + - tomli + license: MIT + license_family: MIT + purls: + - pkg:pypi/autopep8?source=hash-mapping + size: 46233 + timestamp: 1736871757804 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + sha256: 292aa18fe6ab5351710e6416fbd683eaef3aa5b1b7396da9350ff08efc660e4f + md5: 675ea6d90900350b1dcfa8231a5ea2dd + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 134426 + timestamp: 1774274932726 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + sha256: f937d40f01493c4799a673f56d70434d6cddb2ec967cf642a39e0e04282a9a1e + md5: 908d5d8755564e2c3f3770fca7ff0736 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 127421 + timestamp: 1774275018076 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda + sha256: f21d648349a318f4ae457ea5403d542ba6c0e0343b8642038523dd612b2a5064 + md5: 3c3d02681058c3d206b562b2e3bc337f + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 56230 + timestamp: 1764593147526 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda + sha256: 5f61082caea9fbdd6ba02702935e9dea9997459a7e6c06fd47f21b81aac882fb + md5: 7cc4953d504d4e8f3d6f4facb8549465 + depends: + - aws-c-common >=0.12.6,<0.12.7.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 53613 + timestamp: 1764593604081 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda + sha256: 926a5b9de0a586e88669d81de717c8dd3218c51ce55658e8a16af7e7fe87c833 + md5: e36ad70a7e0b48f091ed6902f04c23b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 239605 + timestamp: 1763585595898 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda + sha256: 0627691c34eb3d9fcd18c71346d9f16f83e8e58f9983e792138a2cccf387d18a + md5: b1465f33b05b9af02ad0887c01837831 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236441 + timestamp: 1763586152571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + sha256: 1838bdc077b77168416801f4715335b65e9223f83641a2c28644f8acd8f9db0e + md5: f16f498641c9e05b645fe65902df661a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 22278 + timestamp: 1767790836624 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + sha256: f98fbb797d28de3ae41dbd42590549ee0a2a4e61772f9cc6d1a4fa45d47637de + md5: 0385f2340be1776b513258adaf70e208 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 23087 + timestamp: 1767790877990 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + sha256: 4a1a060ab40cb4fa39d24418758ca9faa1f51df6918f05143118e79bb11b4350 + md5: cd4946050ecfcb3c6fd09106ae6a261e + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 58989 + timestamp: 1774270004533 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + sha256: 63b7a1d3bfcfabeb5d4819c2577ff9fa93e28814ab63a5419740adf9b13a0f3a + md5: d2edd57e91a743151d816920cad61e54 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 57598 + timestamp: 1774270085349 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_2.conda + sha256: 8f69463e15bc857716ef0bf0444547d6eca96f5a82b73ab3fefec2f2fd7960ab + md5: e16b67e0d2716783a823eabf90e818c5 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 225837 + timestamp: 1778156179294 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_2.conda + sha256: b194b57a81cc4cf4fbacaa2ba22d4374197165988a9f37bc777bf6267a48d594 + md5: 0aae27dfecd76f0720927e64dfe56106 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 207794 + timestamp: 1778156215588 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda + sha256: eee7f7aa2c5b9e0a31edba7b81482036fbe751c40bc6697fd057fbd2c656406b + md5: d1337309873c443bcc9f118b67eed84e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - s2n >=1.7.3,<1.7.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 181606 + timestamp: 1779133007375 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_2.conda + sha256: 7cf5aca930fc12f4e27bd4645d20224d608c2c650443e5633faea3bf8b0a7736 + md5: 86eb8e8959c2d6053a50ad31ef6e5b5d + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 182313 + timestamp: 1779133038517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + sha256: 3fc68793c0ca2c36524ae67abac696ce6b066a8be6b2b980cbdc40ae1310041a + md5: 8e77514673f5773b40ff8953583938b6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 221711 + timestamp: 1774275485771 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + sha256: f99bf60673f0d5a143450009c9454087c9bca01be74ae08394f8fc47789fa56a + md5: fbccf4b054995b97bf98c38f0989a9a3 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 212290 + timestamp: 1774275592614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + sha256: c15869656f5fbebe27cc5aa58b23831f75d85502d324fedd7ee7e552c79b495d + md5: 4c5c16bf1133dcfe100f33dd4470998e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - openssl >=3.5.5,<4.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 151340 + timestamp: 1774282148690 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + sha256: 62367b6d4d8aa1b43fb63e51d779bb829dfdd53d908c1b6700efa23255dd38db + md5: 2d90128559ec4b3c78d1b889b8b13b50 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 141733 + timestamp: 1774282227215 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda + sha256: 9d62c5029f6f8219368a8665f0a549da572dc777f52413b7d75609cacdbc02cc + md5: c7e3e08b7b1b285524ab9d74162ce40b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 59383 + timestamp: 1764610113765 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda + sha256: c86c30edba7457e04d905c959328142603b62d7d1888aed893b2e21cca9c302c + md5: 3c97faee5be6fd0069410cf2bca71c85 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 56509 + timestamp: 1764610148907 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + sha256: 09472dd5fa4473cffd44741ee4c1112f2c76d7168d1343de53c2ad283dc1efa6 + md5: f8e1bcc5c7d839c5882e94498791be08 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 101435 + timestamp: 1771063496927 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + sha256: 505b2365bbf3c197c9c2e007ba8262bcdaaddc970f84ce67cf73868ca2990989 + md5: 96e950e5007fb691322db578736aba52 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 116853 + timestamp: 1771063509650 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + sha256: b82d0bc6d4b716347e1aefb0acc6e4bff04b3f807537ada9b458a7e467beb2a0 + md5: 798a499cf76e530a992365d557ba5827 + depends: + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 410120 + timestamp: 1774286908570 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + sha256: 4a072a69e8b0a6552269cdf32831dc2cfa429a61c58edc5353f94dde09a3002f + md5: 81e1ff78b80119ec772bf28b30216f00 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 304084 + timestamp: 1774286995597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + sha256: 62b7e565852fa061a26281b2890e432853fabefa8ea3dc22d00d39295a030805 + md5: cfffedbfd03d5a6bb74157c14b6f0cdf + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - libcurl >=8.19.0,<9.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3624521 + timestamp: 1773666645246 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + sha256: b2ca74995fecfc1029f95c6256dea6d7e035e24633870a52665a8d48f49331f8 + md5: 48efab184702deb479a3766b1462efec + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 23794273 + timestamp: 1773666686533 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + sha256: 321d1070905e467b6bc6f5067b97c1868d7345c272add82b82e08a0224e326f0 + md5: 5492abf806c45298ae642831c670bba0 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.18.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 348729 + timestamp: 1768837519361 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + sha256: 3f3bdc95cc398afe1dc23655aa3480fd2c972307987b2451d4723de6228b9427 + md5: b625bbba0b9ae28003bd96342043ea0c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 500955 + timestamp: 1768837821295 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + sha256: 2beb6ae8406f946b8963a67e72fe74453e1411c5ae7e992978340de6c512d13c + md5: 68bfb556bdf56d56e9f38da696e752ca + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 250511 + timestamp: 1770344967948 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + sha256: 33a0c86a7095d0716f428818157fc1d74b04949f99d2211b3030b9c9f1426c63 + md5: 998e10f568f0db5615ef880673bc3f35 + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 424962 + timestamp: 1770345047909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + sha256: cef75b91bdd5a65c560b501df78905437cc2090a64b4c5ecd7da9e08e9e9af7c + md5: 939d9ce324e51961c7c4c0046733dbb7 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 579825 + timestamp: 1770321459546 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + sha256: 654fae004aee8616a8ed4935a6fa703d629e4d1686a9fe431ef2e689846c0016 + md5: bc419192d40ca1b4928f70519d54b96c + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 781612 + timestamp: 1770321543576 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + sha256: ef7d1cae36910b21385d0816f8524a84dee1513e0306927e41a6bd32b5b9a0d0 + md5: 6400f73fe5ebe19fe7aca3616f1f1de7 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 150405 + timestamp: 1770240307002 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + sha256: 98dfdd2d86d34b93a39d04a73eb4ca26cc0986bf20892005a66db13077eb4b86 + md5: 716715d06097dfd791b0bab525839910 + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 246289 + timestamp: 1770240396492 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + sha256: 55aa8ad5217d358e0ccf4a715bd1f9bafef3cd1c2ea4021f0e916f174c20f8e3 + md5: 6d10339800840562b7dad7775f5d2c16 depends: - __glibc >=2.17,<3.0.a0 - - libattr 2.5.2 hb03c661_1 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libgcc >=14 - license: GPL-2.0-or-later - license_family: GPL + - libstdcxx >=14 + license: MIT + license_family: MIT purls: [] - size: 31386 - timestamp: 1773595914754 -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab - md5: c6b0543676ecb1fb2d7643941fe375f2 + size: 302524 + timestamp: 1770384269834 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + sha256: 9941733f0f4b3a2649f534c71195c8e7a92984e9e9f17c7eb6d84803e3cdccf1 + md5: 64afdd17c4a6f4cb1d97caaad1fdc191 depends: - - python >=3.10 - - python + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] + size: 438910 + timestamp: 1770384369008 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 + depends: + - python >=3.10 + - python + constrains: + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/attrs?source=compressed-mapping - size: 64927 - timestamp: 1773935801332 + - pkg:pypi/babel?source=compressed-mapping + size: 7684321 + timestamp: 1772555330347 - pypi: https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl name: backoff version: 2.2.1 sha256: 63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8 requires_python: '>=3.7,<4.0' -- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda - sha256: d77a24be15e283d83214121428290dbe55632a6e458378205b39c550afa008cf - md5: 5b8c55fed2e576dde4b0b33693a4fdb1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda + sha256: a2b08a4e5e549b5f67c38edffd175437e2208547a7e67b5fa5373b67ef419e50 + md5: b31dba71fe091e7201826e57e0f7b261 depends: - python - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.12.* *_cp312 license: BSD-3-Clause AND MIT AND EPL-2.0 purls: - pkg:pypi/backports-zstd?source=hash-mapping - size: 237970 - timestamp: 1767045004512 + size: 239928 + timestamp: 1778594049826 +- conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.5.0-py312h06d0912_0.conda + sha256: 55173c22b24fd257851f2967d4b0256172be3455bd5246b6b7a5c21eb0863f98 + md5: 891112b1a79fc9800317c5d56e056a8b + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: + - pkg:pypi/backports-zstd?source=compressed-mapping + size: 238601 + timestamp: 1778594083648 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6 + md5: 5267bef8efea4127aacd1f4e1f149b6e + depends: + - python >=3.10 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/beautifulsoup4?source=hash-mapping + size: 90399 + timestamp: 1764520638652 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + sha256: f8ff1f98423674278964a46c93a1766f9e91960d44efd91c6c3ed56a33813f46 + md5: 7c5ebdc286220e8021bf55e6384acd67 + depends: + - python >=3.10 + - webencodings + - python + constrains: + - tinycss2 >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/bleach?source=compressed-mapping + size: 142008 + timestamp: 1770719370680 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + sha256: 7c07a865e5e4cca233cc4e0eb3f0f5ff6c90776461687b4fb0b1764133e1fd61 + md5: f11a319b9700b203aa14c295858782b6 + depends: + - bleach ==6.3.0 pyhcf101f3_1 + - tinycss2 + license: Apache-2.0 AND MIT + purls: [] + size: 4409 + timestamp: 1770719370682 - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda sha256: f7efd22b5c15b400ed84a996d777b6327e5c402e79e3c534a7e086236f1eb2dc md5: 42834439227a4551b939beeeb8a4b085 @@ -606,6 +3918,42 @@ packages: purls: [] size: 48427 timestamp: 1733513201413 +- conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + sha256: 9303a7a0e03cf118eab3691013f6d6cbd1cbac66efbc70d89b20f5d0145257c0 + md5: 357d7be4146d5fec543bfaa96a8a40de + depends: + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 49840 + timestamp: 1733513605730 +- conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.0-pyhd8ed1ab_0.conda + sha256: 96a6486d4fe27c02c1092a40096dfd82043929b3a7da156a49b28d851159c551 + md5: b9a6da57e94cd12bd71e7ab0713ef052 + depends: + - contourpy >=1.2 + - jinja2 >=2.9 + - narwhals >=1.13 + - numpy >=1.16 + - packaging >=16.8 + - pillow >=7.1.0 + - python >=3.10 + - pyyaml >=3.10 + - tornado >=6.2 + - xyzservices >=2021.09.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/bokeh?source=compressed-mapping + size: 4240579 + timestamp: 1773302678722 - conda: https://conda.anaconda.org/conda-forge/linux-64/bottleneck-1.6.0-np2py312hfb8c2c5_3.conda sha256: 59deb2e5147e1727c67f0409cf40163e32254362ae361b5761fd10bc7c255267 md5: 99981dfd6b851dba87c43b5f895e6d6a @@ -622,6 +3970,26 @@ packages: - pkg:pypi/bottleneck?source=hash-mapping size: 157720 timestamp: 1762775764398 +- conda: https://conda.anaconda.org/conda-forge/win-64/bottleneck-1.6.0-np2py312h226b611_3.conda + sha256: def9bf1ebd27a95f4bc9757df34a89a9b5ad24842904105af432d8ff8c75867a + md5: a062b6b39e12d9b4a2fb8c79a0ac4b8f + depends: + - numpy + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/bottleneck?source=hash-mapping + size: 140489 + timestamp: 1762775808683 - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda sha256: 1acf87c77d920edd098ddc91fa785efc10de871465dee0f463815b176e019e8b md5: 1fcdf88e7a8c296d3df8409bf0690db4 @@ -648,6 +4016,21 @@ packages: purls: [] size: 20103 timestamp: 1764017231353 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda + sha256: a4fffdf1c9b9d3d0d787e20c724cff3a284dfa3773f9ce609c93b1cfd0ce8933 + md5: bc58fdbced45bb096364de0fba1637af + depends: + - brotli-bin 1.2.0 hfd05255_1 + - libbrotlidec 1.2.0 hfd05255_1 + - libbrotlienc 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 20342 + timestamp: 1764017988883 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda sha256: 64b137f30b83b1dd61db6c946ae7511657eead59fdf74e84ef0ded219605aa94 md5: af39b9a8711d4a8d437b52c1d78eb6a1 @@ -661,6 +4044,20 @@ packages: purls: [] size: 21021 timestamp: 1764017221344 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda + sha256: e76966232ef9612de33c2087e3c92c2dc42ea5f300050735a3c646f33bce0429 + md5: 6abd7089eb3f0c790235fe469558d190 + depends: + - libbrotlidec 1.2.0 hfd05255_1 + - libbrotlienc 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 22714 + timestamp: 1764017952449 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda sha256: 49df13a1bb5e388ca0e4e87022260f9501ed4192656d23dc9d9a1b4bf3787918 md5: 64088dffd7413a2dd557ce837b4cbbdb @@ -678,6 +4075,23 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 368300 timestamp: 1764017300621 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda + sha256: 2bb6f384a51929ef2d5d6039fcf6c294874f20aaab2f63ca768cbe462ed4b379 + md5: e8e7a6346a9e50d19b4daf41f367366f + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libbrotlicommon 1.2.0 hfd05255_1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 335482 + timestamp: 1764018063640 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -689,6 +4103,18 @@ packages: purls: [] size: 260182 timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 + md5: 4cb8e6b48f67de0b018719cdf1136306 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 56115 + timestamp: 1771350256444 - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e md5: 920bb03579f15389b9e512095ad995b7 @@ -700,9 +4126,21 @@ packages: purls: [] size: 207882 timestamp: 1765214722852 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.23.1-hc31b594_0.conda - sha256: b6ce82ebe3cf24e70179bd656eacfa97ce9df9a500f2cec6843043466a5e6af8 - md5: 68ceffc6cadae61846a207cae60de094 +- conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + sha256: 5e1e2e24ce279f77e421fcc0e5846c944a8a75f7cf6158427c7302b02984291a + md5: 7c6da34e5b6e60b414592c74582e28bf + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 193550 + timestamp: 1765215100218 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.0.3-hc31b594_0.conda + sha256: f02a289837c31d43405915b6efbe64f925dfb23e4ca2949f604fa0ab8a9094cc + md5: 4393b048c1e819f5262c05ccffb47265 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -713,8 +4151,32 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 353899 - timestamp: 1772620395951 + size: 378858 + timestamp: 1778843534911 +- conda: https://conda.anaconda.org/conda-forge/win-64/c-blosc2-3.0.3-h2af8807_0.conda + sha256: c52e09e1b553e090960dffe996cc581dfea82b07de8b94f5a64f3b9994485270 + md5: 5653c2768b45fc4e427c16742d95cc65 + depends: + - lz4-c >=1.10.0,<1.11.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zlib-ng >=2.3.3,<2.4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 246366 + timestamp: 1778843809086 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 + md5: f001e6e220355b7f87403a4d0e5bf1ca + depends: + - __win + license: ISC + purls: [] + size: 147734 + timestamp: 1772006322223 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc md5: 4492fd26db29495f0ba23f146cd5638d @@ -724,6 +4186,28 @@ packages: purls: [] size: 147413 timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + noarch: python + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + md5: 9b347a7ec10940d3f7941ff6c460b551 + depends: + - cached_property >=1.5.2,<1.5.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4134 + timestamp: 1615209571450 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + md5: 576d629e47797577ab0f1b351297ef4a + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cached-property?source=hash-mapping + size: 11065 + timestamp: 1615209567874 - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl name: cachetools version: 5.5.2 @@ -756,6 +4240,27 @@ packages: purls: [] size: 989514 timestamp: 1766415934926 +- conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + sha256: 9ee4ad706c5d3e1c6c469785d60e3c2b263eec569be0eac7be33fbaef978bccc + md5: 52ea1beba35b69852d210242dd20f97d + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 1537783 + timestamp: 1766416059188 - conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda sha256: de9bb34948b0ac7025707fe0bdaa26a6f253374ddf9da8f74b2ed14943c14211 md5: 6c913a686cb4060cbd7639a36fa144f0 @@ -777,6 +4282,41 @@ packages: - pkg:pypi/cartopy?source=hash-mapping size: 1541225 timestamp: 1756883734658 +- conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py312hc128f0a_1.conda + sha256: 4a4c6373e6acdbf14cc84ac9ed1d94edee9a933207a4187b443208dc1e0edfb0 + md5: fea4e4b20624096e12ce531ad029ed31 + depends: + - matplotlib-base >=3.6 + - numpy >=1.23,<3 + - packaging >=21 + - pyproj >=3.3.1 + - pyshp >=2.3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - shapely >=2.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cartopy?source=hash-mapping + size: 1583967 + timestamp: 1756884001067 +- conda: https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.7-pyhd8ed1ab_0.conda + sha256: 1237a587e35fa74b36323084e58620367a3adf7f60f201b7a9c41261958dc5d4 + md5: 1f878573c1ee2798c052bee1f5a94f50 + depends: + - ecmwf-datastores-client >=0.4.0 + - python >=3.10 + - requests >=2.5.0 + - tqdm + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/cdsapi?source=hash-mapping + size: 17643 + timestamp: 1759286472486 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 md5: 765c4d97e877cdbbb88ff33152b86125 @@ -803,6 +4343,51 @@ packages: - pkg:pypi/cffi?source=hash-mapping size: 295716 timestamp: 1761202958833 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_1.conda + sha256: 3e3bdcb85a2e79fe47d9c8ce64903c76f663b39cb63b8e761f6f884e76127f82 + md5: 46f7dccfee37a52a97c0ed6f33fcf0a3 + depends: + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 291324 + timestamp: 1761203195397 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.1-pyhd8ed1ab_0.conda + sha256: 2f800c85e4c05167281524b59aa621f173bed37480d4df65e65e7f76818def1a + md5: 0f12f8436a2a238e255d49ea3f8aefe2 + depends: + - attrs >=19.2 + - click + - numpy + - packaging + - python >=3.10 + - python-eccodes >=0.9.8 + - setuptools + - xarray >=0.15 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/cfgrib?source=hash-mapping + size: 44119 + timestamp: 1759323853736 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 + md5: 381bd45fb7aa032691f3063aff47e3a1 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + size: 13589 + timestamp: 1763607964133 - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda sha256: 02c483817cce596ab0fb79f0f64027a166e20db0c84973e61a08285d53ee463d md5: 84bf349fad55056ed326fc550671b65c @@ -819,30 +4404,85 @@ packages: - pkg:pypi/cftime?source=hash-mapping size: 426552 timestamp: 1768510920948 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 - md5: a9167b9571f3baa9d448faa2139d1089 +- conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py312h196c9fc_1.conda + sha256: 59f52a05804736e08b2f9d623c46b928392a17fea40993c22902f823fae02de2 + md5: 050bf7fb12ce89a057121f790d0fc659 + depends: + - numpy >=1.21.2 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cftime?source=hash-mapping + size: 371147 + timestamp: 1768511070154 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + sha256: 05ea76a016c77839b64f9f8ec581775f6c8a259044bd5b45a177e46ab4e7feac + md5: beb628209b2b354b98203066f90b3287 depends: - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/charset-normalizer?source=compressed-mapping - size: 58872 - timestamp: 1775127203018 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda - sha256: 526d434cf5390310f40f34ea6ec4f0c225cdf1e419010e624d399b13b2059f0f - md5: 4d18bc3af7cfcea97bd817164672a08c + size: 53210 + timestamp: 1772816516728 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 + md5: ea8a6c3256897cc31263de9f455e25d9 depends: + - python >=3.10 - __unix - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 97676 + timestamp: 1764518652276 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + sha256: c3bc9a49930fa1c3383a1485948b914823290efac859a2587ca57a270a652e08 + md5: 6cd3ccc98bacfcc92b2bd7f236f01a7e + depends: - python >=3.10 + - colorama + - __win + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 96620 + timestamp: 1764518654675 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + sha256: ba1ee6e2b2be3da41d70d0d51d1159010de900aa3f33fceaea8c52e9bd30a26e + md5: e9b05deb91c013e5224672a4ba9cf8d1 + depends: + - click >=4.0 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click?source=compressed-mapping - size: 98253 - timestamp: 1775578217828 + - pkg:pypi/click-plugins?source=hash-mapping + size: 12683 + timestamp: 1750848314962 +- conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + sha256: 1a52ae1febfcfb8f56211d1483a1ac4419b0028b7c3e9e61960a298978a42396 + md5: 55c7804f428719241a90b152016085a1 + depends: + - click >=4.0 + - python >=3.9,<4.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cligj?source=hash-mapping + size: 12521 + timestamp: 1733750069604 - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda sha256: 4c287c2721d8a34c94928be8fe0e9a85754e90189dd4384a31b1806856b50a67 md5: 61b8078a0905b12529abc622406cb62c @@ -852,7 +4492,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/cloudpickle?source=hash-mapping + - pkg:pypi/cloudpickle?source=compressed-mapping size: 27353 timestamp: 1765303462831 - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.13-h4d16d09_0.conda @@ -881,6 +4521,29 @@ packages: purls: [] size: 909055 timestamp: 1773323278409 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + sha256: 267c5349f017dc0264f2207dc7dbcaa723d95156381f93c70d7f5317a2936006 + md5: 1a4baa2f67377e0c55199c0f6fb243c4 + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-cgl >=0.60,<0.61.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl-static + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 3618368 + timestamp: 1753932634209 - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.10-hc46dffc_0.conda sha256: fef8b05cdefafc88ab92f754b45a93761208d6bfd65eadf5776ce46aaa0386f9 md5: eebf9946f2de6e0dec0b2fc5d7f69310 @@ -906,6 +4569,28 @@ packages: purls: [] size: 533188 timestamp: 1773281400046 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + sha256: 1aaa50213704ac118c6c37ee570bcf0b0d070500bc544e07da4400ea20a81abd + md5: f6c0a31bbd15559ae27c11385ff1c360 + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl-static + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 1004850 + timestamp: 1753923034553 - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.11-hc03379b_0.conda sha256: 5cb841f04812e7e4627269724b4b44a0c3b77d011c514bf737fe06552bcd9112 md5: 277ac9d140dd78f37886fde732e2f968 @@ -930,6 +4615,27 @@ packages: purls: [] size: 1150329 timestamp: 1773281208424 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + sha256: 82658130feca5915961cd4ea6fdbf2712b6440aedbd7b080bf9a0b8fe4e45e18 + md5: 4fb1c61625995e7d0f14371bc0ba2852 + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl-static + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 3095349 + timestamp: 1753922878665 - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.12-hf4fecb4_0.conda sha256: e6b521992f0dc809fa77d24cf20b87f0e72d4ff760a8fd7cdceec9442b01b488 md5: a7bfc4542f5a1fa6f6918505cd85c24b @@ -953,6 +4659,23 @@ packages: purls: [] size: 377435 timestamp: 1773281013386 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd615c49_6.conda + sha256: 4f4b562b308dbfdda92de2d3bb2de7c8a73ffa50254e22284d51951f91f2f016 + md5: cc4d1ff10fcd007cdce8eeeeb5d2a47c + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 737106 + timestamp: 1754085036510 - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.13-hc93afbd_0.conda sha256: a81c35dc2b0653ff551d6b5d828f3bb7a5bb265ca122a651d36cf5e9c28debc3 md5: 896d0e11072a71cb301721ba08cdae87 @@ -973,16 +4696,33 @@ packages: purls: [] size: 663930 timestamp: 1773281027043 -- conda: https://conda.anaconda.org/conda-forge/noarch/coincbc-2.10.13-0_metapackage.conda - sha256: dd447502f6be47275f35e4dfe226d73e9838bf3faeca32be08cab2e13bc6e72d - md5: 7aeefb4f0c648a61aad67c7d060b2d0b +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-h7214e40_4.conda + sha256: 710b47e7f9693145b5edc481e1880b15f0968986317e497d2eee5be647ba7d77 + md5: 3ebcb4d90b869ac257cc40b134ed4b87 depends: - - coin-or-cbc 2.10.13.* + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage license: EPL-2.0 license_family: OTHER purls: [] - size: 13586 - timestamp: 1773323279579 + size: 1098659 + timestamp: 1754074610069 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 md5: 2da13f2b299d8e1995bafbbe9689a2f7 @@ -1044,21 +4784,56 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy?source=hash-mapping - size: 320386 - timestamp: 1769155979897 -- conda: https://conda.anaconda.org/conda-forge/noarch/country_converter-1.3.2-pyhd8ed1ab_0.conda - sha256: b161a074b92715b9b6a53c35bb84abc0cecea4299ca76b0aaebab0e35b46f3dc - md5: 193a9e54636d8d70781a3e56370f5502 + - pkg:pypi/contourpy?source=hash-mapping + size: 320386 + timestamp: 1769155979897 +- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312h78d62e6_4.conda + sha256: 5f0dd3a4243e8293acc40abf3b11bcb23401268a1ef2ed3bce4d5a060383c1da + md5: 475bd41a63e613f2f2a2764cd1cd3b25 + depends: + - numpy >=1.25 + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 244035 + timestamp: 1769155978578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda + sha256: 6ed9b689e92c5e202d834d5a4eeba990ecbfda104ef40ac455f3d006d439a926 + md5: c78de13127e71cb1e581f473ac76f360 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 390409 + timestamp: 1778444934285 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.14.0-py312h05f76fc_0.conda + sha256: 33cb484abc9cccc6478faf11017126f2a654731f3b71cf8bfb6ae2a0157f9b23 + md5: a8e2fc15a3a4f78a355e34874c6b9f3e depends: - - pandas >=1.0.0 - - python >=3.9 - license: GPL-3.0-or-later - license_family: GPL + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/country-converter?source=hash-mapping - size: 51091 - timestamp: 1761151175246 + - pkg:pypi/coverage?source=hash-mapping + size: 413736 + timestamp: 1778444993998 - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda noarch: generic sha256: d3e9bbd7340199527f28bbacf947702368f31de60c433a16446767d3c6aaf6fe @@ -1070,12 +4845,12 @@ packages: purls: [] size: 46463 timestamp: 1772728929620 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.7-py312ha4b625e_0.conda - sha256: ec1635e4c3016f85d170f9f8d060f8a615d352b55bb39255a12dd3a1903d476c - md5: ab9e1a0591be902a1707159b58460453 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py312ha4b625e_0.conda + sha256: 16d3d1e8df34a36430a28f423380fbd93abe5670ca7b52e9f4a64c091fd3ddd9 + md5: c5a8e173200adf567dc2818d8bf1325f depends: - __glibc >=2.17,<3.0.a0 - - cffi >=1.14 + - cffi >=2.0 - libgcc >=14 - openssl >=3.5.6,<4.0a0 - python >=3.12,<3.13.0a0 @@ -1085,9 +4860,26 @@ packages: license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD purls: - - pkg:pypi/cryptography?source=compressed-mapping - size: 2534262 - timestamp: 1775637873338 + - pkg:pypi/cryptography?source=hash-mapping + size: 1912222 + timestamp: 1777966300032 +- conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-48.0.0-py312h232196e_0.conda + sha256: 1d4cf8a87630cdcdb2efb420b148bc01a012c67397aee29056fa3583a11338a7 + md5: 445065c9073b340cfc3f79718c54dbf3 + depends: + - cffi >=2.0 + - openssl >=3.5.6,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1644616 + timestamp: 1777966343257 - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1116,9 +4908,62 @@ packages: purls: [] size: 210103 timestamp: 1771943128249 -- conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda - sha256: 5497e56b12b8a07921668f6469d725be9826ffe5ae8a2f6f71d26369400b41ca - md5: 809f4cde7c853f437becc43415a2ecdf +- conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda + sha256: 75b3d3c9497cded41e029b7a0ce4cc157334bbc864d6701221b59bb76af4396d + md5: 29fd0bdf551881ab3d2801f7deaba528 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - toolz >=0.10.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cytoolz?source=hash-mapping + size: 623770 + timestamp: 1771855837505 +- conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py312he06e257_2.conda + sha256: e817c9154c917f562e378cf2898a1ff82f20c87ef465b75b2bcba94235604814 + md5: 978c009bc3f0add939e44aff97bfaee1 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - toolz >=0.10.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cytoolz?source=hash-mapping + size: 563651 + timestamp: 1771855915942 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.1.2-pyhcf101f3_1.conda + sha256: 12bbfcff238d56ea2f576a3c0f1074c84bdff3f3d1d522af99b471692bc0bfb8 + md5: 8826c749da19cdeff0a987411ba6dcd2 + depends: + - python >=3.10 + - dask-core >=2026.1.2,<2026.1.3.0a0 + - distributed >=2026.1.2,<2026.1.3.0a0 + - cytoolz >=0.11.2 + - lz4 >=4.3.2 + - numpy >=1.26 + - pandas >=2.0 + - bokeh >=3.1.0 + - jinja2 >=2.10.3 + - pyarrow >=16.0 + - python + constrains: + - openssl !=1.1.1e + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 11370 + timestamp: 1771422174009 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda + sha256: c8500be32e2c75b10fd7a0664b0e5abc956dece18a54774a53f357aeabe9e1b6 + md5: b20e7ce9afd59036ab194f3d1e27edf5 depends: - python >=3.10 - click >=8.1 @@ -1134,8 +4979,8 @@ packages: license_family: BSD purls: - pkg:pypi/dask?source=hash-mapping - size: 1066502 - timestamp: 1773823162829 + size: 1063599 + timestamp: 1769829714443 - pypi: https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl name: dateparser version: 1.4.0 @@ -1180,6 +5025,21 @@ packages: - pkg:pypi/debugpy?source=hash-mapping size: 2858582 timestamp: 1769744978783 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda + sha256: 5a886b1af3c66bf58213c7f3d802ea60fe8218313d9072bc1c9e8f7840548ba0 + md5: 032746a0b0663920f0afb18cec61062b + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 3996113 + timestamp: 1769745013982 - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 md5: 9ce473d1d1be1cc3810856a48b3fab32 @@ -1191,6 +5051,17 @@ packages: - pkg:pypi/decorator?source=hash-mapping size: 14129 timestamp: 1740385067843 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 + depends: + - python >=3.6 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/defusedxml?source=hash-mapping + size: 24062 + timestamp: 1615232388757 - conda: https://conda.anaconda.org/conda-forge/noarch/deprecation-2.1.0-pyh9f0ad1d_0.tar.bz2 sha256: 2695a60ff355b114d0c459458461d941d2209ec9aff152853b6a3ca8700c94ec md5: 7b6747d7cc2076341029cff659669e8b @@ -1203,6 +5074,59 @@ packages: - pkg:pypi/deprecation?source=hash-mapping size: 14487 timestamp: 1589881524975 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + sha256: 1ef84c0cc4efd0c2d58c3cb365945edbd9ee42a1c54514d1ccba4b641005f757 + md5: 080a808fce955026bf82107d955d32da + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/dill?source=hash-mapping + size: 95462 + timestamp: 1768863743943 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + sha256: 6d977f0b2fc24fee21a9554389ab83070db341af6d6f09285360b2e09ef8b26e + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + size: 275642 + timestamp: 1752823081585 +- conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.1.2-pyhcf101f3_1.conda + sha256: 678869f02e4d01cb6ce6838d279ff43c161a7730a3a63fec0a85d3524961ab66 + md5: 3c155e2914169b807ebb4027a8c0999c + depends: + - python >=3.10 + - click >=8.0 + - cloudpickle >=3.0.0 + - cytoolz >=0.12.0 + - dask-core >=2026.1.2,<2026.1.3.0a0 + - jinja2 >=2.10.3 + - locket >=1.0.0 + - msgpack-python >=1.0.2 + - packaging >=20.0 + - psutil >=5.8.0 + - pyyaml >=5.4.1 + - sortedcontainers >=2.0.5 + - tblib >=1.6.0 + - toolz >=0.12.0 + - tornado >=6.2.0 + - urllib3 >=1.26.5 + - zict >=3.0.0 + - python + constrains: + - openssl !=1.1.1e + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/distributed?source=hash-mapping + size: 844804 + timestamp: 1771421764975 - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e md5: d6bd3cd217e62bbd7efe67ff224cd667 @@ -1225,6 +5149,18 @@ packages: purls: [] size: 71809 timestamp: 1765193127016 +- conda: https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.4.0-hac47afa_0.conda + sha256: 09e30a170e0da3e9847d449b594b5e55e6ae2852edd3a3680e05753a5e015605 + md5: 3d3caf4ccc6415023640af4b1b33060a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 70943 + timestamp: 1765193243911 - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda sha256: 74e5def37983c19165beebbbfae4e5494b7cb030e97351114de31dcdbc91b951 md5: 7b2af124684a994217e62c641bca2e48 @@ -1236,17 +5172,59 @@ packages: - pkg:pypi/dpath?source=hash-mapping size: 21853 timestamp: 1762165431693 -- conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c - md5: 71bf9646cbfabf3022c8da4b6b4da737 +- conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda + sha256: 2a00d4fda4ce24dff71bc97b6a57cd61fa98be25da38d387d3935cfb8d84cdc3 + md5: 0f73a3e483c4fbc7bf6fb840d816c5a5 + depends: + - __glibc >=2.17,<3.0.a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - jasper >=4.2.8,<5.0a0 + - libaec >=1.1.5,<2.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libnetcdf >=4.9.3,<4.9.4.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4796539 + timestamp: 1772362605927 +- conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda + sha256: dfc2b7cc01741eb7575b29e915b760146167fd65ef2f98fad513f60ce6c8cc76 + md5: b67461a22f04b331bffd046bcfa4c7ac + depends: + - hdf5 >=1.14.6,<1.14.7.0a0 + - jasper >=4.2.8,<5.0a0 + - libaec >=1.1.5,<2.0a0 + - libnetcdf >=4.9.3,<4.9.4.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2293154 + timestamp: 1772014569543 +- conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda + sha256: c9e08781d043ab18ea83d2523a17d0bd763ae01274fb854c3024f2fee27aaecf + md5: d957f10f516dcdeb9e382c91d771df12 depends: + - attrs + - multiurl >=0.3.2 - python >=3.9 - license: MIT - license_family: MIT + - requests + - typing_extensions + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/et-xmlfile?source=hash-mapping - size: 21908 - timestamp: 1733749746332 + - pkg:pypi/ecmwf-datastores-client?source=hash-mapping + size: 26195 + timestamp: 1769417703446 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -1269,6 +5247,27 @@ packages: - pkg:pypi/executing?source=hash-mapping size: 30753 timestamp: 1756729456476 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda + sha256: dddea9ec53d5e179de82c24569d41198f98db93314f0adae6b15195085d5567f + md5: f58064cec97b12a7136ebb8a6f8a129b + depends: + - python >=3.10 + license: Unlicense + purls: + - pkg:pypi/filelock?source=compressed-mapping + size: 25845 + timestamp: 1773314012590 +- conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda + sha256: d02d04e24b79003442751240a7c7ad251c30e368f38808fb44c5a6e925c0436a + md5: fa9e9ec7bf26619a8edd3e11155f15d6 + depends: + - python >=3.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/findlibs?source=hash-mapping + size: 16541 + timestamp: 1753777739225 - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda sha256: 782fa186d7677fd3bc1ff7adb4cc3585f7d2c7177c30bcbce21f8c177135c520 md5: a6997a7dcd6673c0692c61dfeaea14ab @@ -1333,6 +5332,23 @@ packages: purls: [] size: 270705 timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda + sha256: ff2db9d305711854de430f946dc59bd40167940a1de38db29c5a78659f219d9c + md5: a0b1b87e871011ca3b783bbf410bc39f + depends: + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 195332 + timestamp: 1771382820659 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 md5: fee5683a3f04bd15cbd8318b096a27ab @@ -1356,9 +5372,9 @@ packages: purls: [] size: 4059 timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda - sha256: e81f6e1ddadbc81ce56b158790148835256d2a3d5762016d389daaa06decfeab - md5: 2396fee22e84f69dffc6e23135905ce8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + sha256: d235ae7075642044ceb3d922ef2a710a82665755ac9bbb7e8dad7daa72bc6d87 + md5: 294fb524171e2a2748cb7fe708aba826 depends: - __glibc >=2.17,<3.0.a0 - brotli @@ -1370,9 +5386,68 @@ packages: license: MIT license_family: MIT purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 3007892 + timestamp: 1778770568019 +- conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.63.0-py312h05f76fc_0.conda + sha256: 4e31266b0ddacb2e2f48f00d999aa7d5005c62a5cc51a32f9ce0be5b11e9897e + md5: 2944f5f8ea7e2db9cea01ed951e09194 + depends: + - brotli + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - unicodedata2 >=15.1.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: - pkg:pypi/fonttools?source=compressed-mapping - size: 2953293 - timestamp: 1776708606358 + size: 2533681 + timestamp: 1778770493020 +- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 + md5: d3549fd50d450b6d9e7dddff25dd2110 + depends: + - cached-property >=1.3.0 + - python >=3.9,<4 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/fqdn?source=hash-mapping + size: 16705 + timestamp: 1733327494780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda + sha256: 676540a8e7f73a894cb1fcb870e7bec623ec1c0a2d277094fd713261a02d8d56 + md5: 84ec3f5b46f3076be49f2cf3f1cfbf02 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxfixes + - xorg-libxi + license: MIT + license_family: MIT + purls: [] + size: 144010 + timestamp: 1719014356708 +- conda: https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-he0c23c2_3.conda + sha256: 8b41913ed6c8c0dadda463a649bc16f45e88faa58553efc6830f4de1138c97f2 + md5: 5872031ef7cba8435ff24af056777473 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 111956 + timestamp: 1719014753462 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b md5: 8462b5322567212beeb025f3519fb3e2 @@ -1383,6 +5458,16 @@ packages: purls: [] size: 173839 timestamp: 1774298173462 +- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_0.conda + sha256: 70815dbae6ccdfbb0a47269101a260b0a2e11a2ab5c0f7209f325d01bdb18fb7 + md5: 507b36518b5a595edda64066c820a6ef + depends: + - libfreetype 2.14.3 h57928b3_0 + - libfreetype6 2.14.3 hdbac1cb_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 185640 + timestamp: 1774300487600 - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda sha256: c8960e00a6db69b85c16c693ce05484facf20f1a80430552145f652a880e0d2a md5: ecb5d11305b8ba1801543002e69d2f2f @@ -1397,6 +5482,21 @@ packages: purls: [] size: 59299 timestamp: 1734014884486 +- conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda + sha256: 1e62cbc6daa74656034dc4a6e58faa2d50291719c1cba53cc0b1946f0d2b9404 + md5: d6a8059de245e53478b581742b53f71d + depends: + - libexpat >=2.6.4,<3.0a0 + - libiconv >=1.17,<2.0a0 + - minizip >=4.0.7,<5.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MPL-1.1 + license_family: MOZILLA + purls: [] + size: 77528 + timestamp: 1734015193826 - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda sha256: f4e0e6cd241bc24afb2d6d08e5d2ba170fad2475e522bdf297b7271bba268be6 md5: 63e20cf7b7460019b423fc06abb96c60 @@ -1412,17 +5512,53 @@ packages: - pkg:pypi/frozenlist?source=hash-mapping size: 55037 timestamp: 1752167383781 -- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda - sha256: b4a7aec32167502dd4a2d1fb1208c63760828d7111339aa5b305b2d776afa70f - md5: c18d2ba7577cdc618a20d45f1e31d14b +- conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.7.0-py312hfdf67e6_0.conda + sha256: 804ebdfe1c49a31e275c8aaced937f96b794ad5ff228685349a13d450753d253 + md5: 854caa541146c1c42d64c19fd63cbac9 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 49472 + timestamp: 1752167442686 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda + sha256: 239b67edf1c5e5caed52cf36e9bed47cb21b37721779828c130e6b3fd9793c1b + md5: 496c6c9411a6284addf55c898d6ed8d7 depends: - python >=3.10 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/fsspec?source=hash-mapping - size: 148973 - timestamp: 1774699581537 + - pkg:pypi/fsspec?source=compressed-mapping + size: 148757 + timestamp: 1770387898414 +- conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda + sha256: 4bcebe8f5f449b728bd0140e38c036060f22d31048e0c7980bf4cd6acdad2b62 + md5: 43dd16b113cc7b244d923b630026ff4f + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/geographiclib?source=hash-mapping + size: 40836 + timestamp: 1755865181359 +- conda: https://conda.anaconda.org/conda-forge/noarch/geohash2-1.1-py_0.tar.bz2 + sha256: 9652ffe18e48fd9a217e4ed1cc162f8f5d568c57646e480216da6316eee3497a + md5: d8eeeda3a0fd791973bc8be2ac8179fe + depends: + - python + license: GPL-3.0 + license_family: GPL + purls: + - pkg:pypi/geohash2?source=hash-mapping + size: 5709 - conda: https://conda.anaconda.org/conda-forge/noarch/geojson-3.2.0-pyhd8ed1ab_0.conda sha256: bfa3b5159e6696872586b2154ff9956e7e81d86d85a6a5601d25b26ca2bb916d md5: 9f9840fb1c2e009fb0009a2f9461e64a @@ -1448,7 +5584,8 @@ packages: - xyzservices license: BSD-3-Clause license_family: BSD - purls: [] + purls: + - pkg:pypi/geopandas?source=compressed-mapping size: 8761 timestamp: 1773131235020 - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda @@ -1463,9 +5600,21 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/geopandas?source=hash-mapping + - pkg:pypi/geopandas?source=compressed-mapping size: 254983 timestamp: 1773131233972 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda + sha256: ac453c9558c48febe452c79281c632b3749baef7c04ed4b62f871709aee2aa03 + md5: 40182a8d62a61d147ec7d3e4c5c36ac2 + depends: + - geographiclib >=1.52 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/geopy?source=hash-mapping + size: 72999 + timestamp: 1734342056836 - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda sha256: 08896dcd94e14a83f247e91748444e610f344ab42d80cbf2b6082b481c3f8f4b md5: 4d4efd0645cd556fab54617c4ad477ef @@ -1477,6 +5626,29 @@ packages: purls: [] size: 1974942 timestamp: 1761593471198 +- conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda + sha256: 032a16d78e69a20ffae6216191a66977bc50f6c21cb75f9853b37298b95308c4 + md5: 8c75d7e401a4d799ce8d4bb922320967 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + purls: [] + size: 1772787 + timestamp: 1761593910217 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff md5: 3bf7b9fd5a7136126e0234db4b87c8b6 @@ -1512,13 +5684,25 @@ packages: - pkg:pypi/gitpython?source=hash-mapping size: 158433 timestamp: 1767358832407 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.3-pyhcf101f3_0.conda - sha256: b6ab505ee1da1a8b732c045f4f26c32386f4d2bdf2019d06dab0d2d3c843a701 - md5: fc99cddcd8e6b37d975781e54f1770de +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.30.0-pyhcf101f3_0.conda + sha256: 23b93f620c3fd07d8ac6440b547e3e04e6ce1192c585620f6236ef9381515fd0 + md5: 7b98d992f037ebe87496162bd5885cf6 depends: - python >=3.10 - - googleapis-common-protos >=1.63.2,<2.0.0 - - protobuf >=4.25.8,<8.0.0 + - googleapis-common-protos >=1.56.3,<2.0.0 + - protobuf >=4.25.8,<7.0.0 - proto-plus >=1.25.0,<2.0.0 - google-auth >=2.14.1,<3.0.0 - requests >=2.20.0,<3.0.0 @@ -1527,11 +5711,11 @@ packages: license_family: APACHE purls: - pkg:pypi/google-api-core?source=hash-mapping - size: 105268 - timestamp: 1775900169330 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.2-pyhcf101f3_0.conda - sha256: 40f8e787f537c50717f8a1dc42c03aa158b455e0a50e0509481fa1789ff02656 - md5: 2c9520e7091c72839f2cea9217543ef7 + size: 105274 + timestamp: 1771485965861 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.49.0-pyhcf101f3_0.conda + sha256: e1adc17086434a65b0250c875e169632a317d795db3e1f43dd2fa56829cfc4fc + md5: c27afc4b6fc17cf42193f0035f7fe229 depends: - python >=3.10 - pyasn1-modules >=0.2.1 @@ -1546,27 +5730,27 @@ packages: license_family: APACHE purls: - pkg:pypi/google-auth?source=hash-mapping - size: 143969 - timestamp: 1775900146226 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.1-pyhcf101f3_0.conda - sha256: c8d00b57bd7596dd83fa81b53cfae105bcb9ff40f7157184d6c9f402b11726d5 - md5: 4ddaf759564b096dfb8a3829d6e64c2d - depends: - - python >=3.10 - - google-api-core >=2.11.0,<3.0.0 - - google-auth >=2.14.1,<3.0.0,!=2.24.0,!=2.25.0 - - grpcio >=1.75.1,<2.0.0 + size: 143883 + timestamp: 1772882564010 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + sha256: fcef1d51f6de304a23c19ea6b3114dcab9ce54482d9f506f9a3e0b48be514744 + md5: 48fcccc0b579087018df0afc332b8bd6 + depends: + - python >=3.10,<3.14 + - google-api-core >=1.31.6,<3.0.0,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0 + - google-auth >=1.25.0,<3.0.0 + - grpcio >=1.38.0,<2.0.0 - grpcio-status >=1.38.0,<2.0.0 - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/google-cloud-core?source=compressed-mapping - size: 33563 - timestamp: 1774963218524 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.10.1-pyhcf101f3_0.conda - sha256: a60cfd1ca765f1365276b83df220a7cf6c70da953ff6160a5759c2f520bacbd2 - md5: 3a22fc850d3aa5b2521db0ec76b99dc9 + - pkg:pypi/google-cloud-core?source=hash-mapping + size: 33593 + timestamp: 1768561863777 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.9.0-pyhcf101f3_0.conda + sha256: a42b7f24ded8a97ae18d46bbdf9485d951346e41c66b18f7f793d521c05a53d5 + md5: 71aa090f8647c9b9efa63994eaa0dc18 depends: - python >=3.10 - google-api-core >=2.27.0,<3.0.0 @@ -1580,9 +5764,9 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/google-cloud-storage?source=compressed-mapping - size: 203944 - timestamp: 1774277600254 + - pkg:pypi/google-cloud-storage?source=hash-mapping + size: 201445 + timestamp: 1770056609761 - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py312h03f33d3_1.conda sha256: 3f962b2cbdc2aac3089a5c708477657266c0a665f0eed09981a34d1ab6793065 md5: 68f704ea294dcec9e09edd9c3d233846 @@ -1598,6 +5782,22 @@ packages: - pkg:pypi/google-crc32c?source=hash-mapping size: 24900 timestamp: 1768549198202 +- conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py312h3d708b0_1.conda + sha256: 58381cbd3f0df0382b4f0981a6c1f34ba6f0be7fb84a9a29de134c5fe86f646c + md5: 91f5fad53070eed2524245d9a7902efa + depends: + - libcrc32c >=1.1.2,<1.2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/google-crc32c?source=hash-mapping + size: 28231 + timestamp: 1768549335337 - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda sha256: 23d825ed0664a8089c7958bffd819d26e1aba7579695c40dfbdb25a4864d8be6 md5: ba7f04ba62be69f9c9fef0c4487c210b @@ -1613,19 +5813,19 @@ packages: - pkg:pypi/google-resumable-media?source=hash-mapping size: 46929 timestamp: 1763404726218 -- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.74.0-pyhcf101f3_0.conda - sha256: 0c7454493ae6965b5351ecfb056fb8a36385c565a09642f49714dab0a164991e - md5: 4c8212089cf56e73b7d64c1c6440bc00 +- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.73.0-pyhcf101f3_0.conda + sha256: b228ef6e9a7aa4cbdff42df1ddc7ab305266268bbfaf2cf946a56da66818c7b7 + md5: 07531f1f9bb98acde68747f69127ccc1 depends: - python >=3.10 - - protobuf >=4.25.8,<8.0.0 + - protobuf >=3.20.2,<7.0.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/googleapis-common-protos?source=compressed-mapping - size: 149863 - timestamp: 1775210699986 + - pkg:pypi/googleapis-common-protos?source=hash-mapping + size: 146811 + timestamp: 1772881883607 - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c md5: 2cd94587f3a401ae05e03a6caf09539d @@ -1638,17 +5838,29 @@ packages: purls: [] size: 99596 timestamp: 1755102025473 -- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.80.0-py312h39ee1c6_0.conda - sha256: 50e4cc682762f05db2dfbd166e712ef528be0fbb1345da4e66920b7e11ece1d8 - md5: f5985e2be93c74e26e06a035c1d09c5b +- conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + sha256: 5f1714b07252f885a62521b625898326ade6ca25fbc20727cfe9a88f68a54bfd + md5: b785694dd3ec77a011ccf0c24725382b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 96336 + timestamp: 1755102441729 +- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py312h39ee1c6_0.conda + sha256: 43b09e083e0c3141cb118f84924b498b32d86da5f6a458b60e56e65cd5b97c4e + md5: b1995dadc14463d8f914c54cf2061a07 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20260107.1,<20260108.0a0 - libgcc >=14 - - libgrpc 1.80.0 h1d1128b_0 + - libgrpc 1.78.1 h1d1128b_0 - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - typing-extensions >=4.12,<5 @@ -1656,32 +5868,58 @@ packages: license_family: APACHE purls: - pkg:pypi/grpcio?source=hash-mapping - size: 900047 - timestamp: 1775544291539 -- conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.80.0-pyhcf101f3_0.conda - sha256: 0210b0366c98c751ee94a15da8d33f9570519b52b49c4d207644cbee08ba623d - md5: 1b35248ede1f089809c299a5174c74ce + size: 875590 + timestamp: 1774020588709 +- conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.78.1-py312h5881051_0.conda + sha256: 0452624b42956ec771f763b3341ea60a33b478deba8b2a18ef23c63e3a5526d1 + md5: 6cc0e610fb177c1407b07a25305026ed + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgrpc 1.78.1 h9ff2b3e_0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.12,<5 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/grpcio?source=hash-mapping + size: 717708 + timestamp: 1774013898778 +- conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.0-pyhd8ed1ab_0.conda + sha256: cab0cf75422ce7b3b21ad977e68035b093812070ea03ea4da84b460fdf19f376 + md5: 1239612d9082a423a1bde874a7ca130f depends: - - python >=3.10 - - protobuf >=6.31.1,<7.0.0 - - grpcio >=1.80.0 - googleapis-common-protos >=1.5.5 - - python + - grpcio >=1.78.0 + - protobuf >=6.31.1,<7.0.0 + - python >=3.10 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/grpcio-status?source=hash-mapping - size: 28301 - timestamp: 1775552970486 -- conda: https://conda.anaconda.org/gurobi/linux-64/gurobi-13.0.1-py312_0.conda - sha256: d8a3564018ea7e34b76548d0259d8933bd808eb1e5eabedf1a0e4ca85f940f8a - md5: a1841f5378cf8df084e4807c6f724b2e - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: PROPRIETARY - size: 47997079 - timestamp: 1768425596261 + size: 19238 + timestamp: 1770422777875 +- pypi: https://files.pythonhosted.org/packages/85/9b/9363877895a78258f24a883b137fae83e5cc5e33ed3768618f8ae2aa8da3/gurobipy-13.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: gurobipy + version: 13.0.1 + sha256: c8848329014960a640c57136bf2adc6a75dc73716f50729ca6c86d68b9f0b6b2 + requires_dist: + - numpy ; extra == 'matrixapi' + - scipy ; extra == 'matrixapi' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/8d/c7/c106367b5209ab5500df8feed64d596276d7e78fe7ab3b918ac938ce580b/gurobipy-13.0.1-cp312-cp312-win_amd64.whl + name: gurobipy + version: 13.0.1 + sha256: a77a8fa0937b274382dd3b436ab1aada3730d4270fb819b22614725dac927d9c + requires_dist: + - numpy ; extra == 'matrixapi' + - scipy ; extra == 'matrixapi' + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb md5: b8993c19b0c32a2f7b66cbb58ca27069 @@ -1706,9 +5944,58 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/h2?source=hash-mapping - size: 95967 - timestamp: 1756364871835 + - pkg:pypi/h2?source=hash-mapping + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + sha256: 5bf081c0f21a57fc84b5000d53f043d63638b77dcc2137f87511a4581838c9f6 + md5: ca7f9ba8762d3e360e47917a10e23760 + depends: + - h5py + - numpy + - packaging + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5netcdf?source=hash-mapping + size: 57732 + timestamp: 1769241877548 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312ha4f8f14_102.conda + sha256: de9ec9b1b01b90f2da2d896a5835a2fd8049859aff0c6331ca4594327ec79a8b + md5: b270340809d19ae40ff9913f277b803a + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=14 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1335314 + timestamp: 1775581269364 +- conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py312h03cd2ba_102.conda + sha256: aefa6f6882568f800150fe8d83698f4fd1c4ba4b042260d93cf1a503a460141c + md5: e00778685f838e9c7e40c8927b0f2a72 + depends: + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1085071 + timestamp: 1775581446982 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda sha256: 232c95b56d16d33d8256026a3b1ad34f7f9a75c179d388854be0fd624ddba9e3 md5: e194f6a2f498f0c7b1e6498bd0b12645 @@ -1725,9 +6012,30 @@ packages: - libstdcxx >=14 - libzlib >=1.3.2,<2.0a0 license: MIT + license_family: MIT purls: [] size: 2333599 timestamp: 1776778392713 +- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + sha256: 82abc468768c5130b45e4025fe289e0c84ea015d7fa23059503da212c89097cb + md5: b8862b83b5c899f5b65bcba0298b8478 + depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=78.3,<79.0a0 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.86.4,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 1322557 + timestamp: 1776778816190 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 md5: bd77f8da987968ec3927990495dc22e4 @@ -1741,24 +6049,54 @@ packages: purls: [] size: 756742 timestamp: 1695661547874 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_108.conda - sha256: 795c3a34643aa766450b8363b8c5dd6e65ad40e5cc64d138c3678d05068a380a - md5: cbb2d15a6e9aeb85f18f1a8f01c29b81 +- conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda + sha256: 52fa5dde69758c19c69ab68a3d7ebfb2c9042e3a55d405c29a59d3b0584fd790 + md5: 84344a916a73727c1326841007b52ca8 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 779637 + timestamp: 1695662145568 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + sha256: 1fc50ce3b86710fba3ec9c5714f1612b5ffa4230d70bfe43e2a1436eacba1621 + md5: c223ee1429ba538f3e48cfb4a0b97357 depends: - __glibc >=2.17,<3.0.a0 - libaec >=1.1.5,<2.0a0 - - libcurl >=8.19.0,<9.0a0 + - libcurl >=8.18.0,<9.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3708864 + timestamp: 1770390337946 +- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_hae35d4c_106.conda + sha256: d9f8f202ee91ae93515b18c498970f178dfd061743f25a65a205f848e197437f + md5: e2fb54650b51dcd92dfcbf42d2222ff8 + depends: + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.18.0,<9.0a0 + - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.5,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] - size: 3719931 - timestamp: 1774406907641 + size: 2353172 + timestamp: 1770389952810 - conda: https://conda.anaconda.org/conda-forge/linux-64/highspy-1.14.0-np2py312h0f77346_0.conda sha256: f86c64dfc5f8a8f32c2b5731a1614a42a092fee4aa4d53f56c3b93b4c9900822 md5: 3c2773b3530d49a2ed65ee8e4b477724 @@ -1775,6 +6113,22 @@ packages: - pkg:pypi/highspy?source=hash-mapping size: 2423059 timestamp: 1775498235447 +- conda: https://conda.anaconda.org/conda-forge/win-64/highspy-1.14.0-np2py312ha76dc74_0.conda + sha256: 236dde2a4ee42f020695e004831216a5de5002e2a95d733fa968efd13071785d + md5: 8f94276670b0aedbd95acec1e45d950e + depends: + - python + - numpy + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/highspy?source=hash-mapping + size: 2565469 + timestamp: 1775498320998 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba md5: 0a802cb9888dd14eeefc611f05c40b6e @@ -1830,6 +6184,19 @@ packages: - pkg:pypi/humanfriendly?source=hash-mapping size: 73563 timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + sha256: acdf32d1f9600091f0efc1a4293ad217074c86a96889509d3d04c13ffbc92e5a + md5: d243aef76c0a30e4c89cd39e496ea1be + depends: + - __win + - pyreadline3 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/humanfriendly?source=hash-mapping + size: 74084 + timestamp: 1733928364561 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 md5: 8e6923fc12f1fe8f8c4e5c9f343256ac @@ -1853,6 +6220,30 @@ packages: purls: [] size: 12723451 timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + sha256: 1bda728d70a619731b278c859eda364146cb5b4b8c739a64da8128353d81d1c4 + md5: 0097b24800cb696915c3dbd1f5335d3f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 14954024 + timestamp: 1773822508646 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + sha256: 7cd5eccdb171a0adbf83a1ad8fc4e17822f4fc3f5518da9040de64e88bc07343 + md5: 5b7ae2ec4e0750e094f804a6cf1b2a37 + depends: + - python >=3.10 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + size: 79520 + timestamp: 1772402363021 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -1878,19 +6269,86 @@ packages: - pkg:pypi/immutables?source=hash-mapping size: 54524 timestamp: 1757685416665 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 - md5: 080594bf4493e6bae2607e65390c520a +- conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py312he06e257_2.conda + sha256: 09cd81a43ab516c5411a605cc55e4038d7b2c5c591d1ba96deb29ef1c4143253 + md5: b8c34c4306b76f9161f1084bbc3921f2 depends: - - python >=3.10 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/immutables?source=hash-mapping + size: 55176 + timestamp: 1757685569952 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + depends: + - python >=3.9 - zipp >=3.20 - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=compressed-mapping - size: 34387 - timestamp: 1773931568510 + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 34641 + timestamp: 1747934053147 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + size: 33781 + timestamp: 1736252433366 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=compressed-mapping + size: 13387 + timestamp: 1760831448842 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyh6dadd2b_1.conda + sha256: 9cdadaeef5abadca4113f92f5589db19f8b7df5e1b81cb0225f7024a3aedefa3 + md5: b3a7d5842f857414d9ae831a799444dd + depends: + - __win + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.8.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=compressed-mapping + size: 132382 + timestamp: 1770566174387 - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.2.0-pyha191276_1.conda sha256: b77ed58eb235e5ad80e742b03caeed4bbc2a2ef064cb9a2deee3b75dfae91b2a md5: 8b267f517b81c13594ed68d646fd5dcb @@ -1915,12 +6373,34 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ipykernel?source=hash-mapping + - pkg:pypi/ipykernel?source=compressed-mapping size: 133644 timestamp: 1770566133040 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - sha256: 932044bd893f7adce6c9b384b96a72fd3804cc381e76789398c2fae900f21df7 - md5: b293210beb192c3024683bf6a998a0b8 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhccfa634_0.conda + sha256: 558073f3ceba49ab67d9e698ff2b49ddf1d1d3259de46b50795be1b6d8ec9de4 + md5: a522444721669fe6bb482f8814b969f4 + depends: + - __win + - decorator >=5.1.0 + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.14.0 + - python >=3.12 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - colorama >=0.4.4 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=compressed-mapping + size: 647253 + timestamp: 1772790189384 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + sha256: 1f90e346baab7926bc52d7b60c0625087e96b4fab1bdb9a7fe83ac842312c930 + md5: 326c46b8ec2a1b4964927c7ea55ebf49 depends: - __unix - decorator >=5.1.0 @@ -1937,9 +6417,20 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ipython?source=hash-mapping - size: 649967 - timestamp: 1774609994657 + - pkg:pypi/ipython?source=compressed-mapping + size: 648197 + timestamp: 1772790149194 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + sha256: 45821a8986b4cb2421f766b240dbe6998a3c3123f012dd566720c1322e9b6e18 + md5: 2f0ba4bc12af346bc6c99bdc377e8944 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython-genutils?source=hash-mapping + size: 28153 + timestamp: 1733399692864 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 md5: bd80ba060603cc228d9d81c257093119 @@ -1952,6 +6443,74 @@ packages: - pkg:pypi/ipython-pygments-lexers?source=hash-mapping size: 13993 timestamp: 1737123723464 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.8.5-pyhd8ed1ab_0.conda + sha256: 8cc67e44137bb779c76d92952fdc4d8cd475605f4f0d13e8d0f04f25c056939b + md5: 47672c493015ab57d5fcde9531ab18ef + depends: + - comm >=0.1.3 + - ipython >=4.0.0 + - ipython_genutils >=0.2.0,<0.3.0 + - jupyterlab_widgets >=1.0.0,<3 + - python >=3.3 + - traitlets >=4.3.1 + - widgetsnbextension >=3.6.10,<3.7.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipywidgets?source=hash-mapping + size: 104860 + timestamp: 1729599554932 +- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed + md5: 0b0154421989637d424ccf0f104be51a + depends: + - arrow >=0.15.0 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/isoduration?source=hash-mapping + size: 19832 + timestamp: 1733493720346 +- conda: https://conda.anaconda.org/conda-forge/noarch/isort-8.0.1-pyhd8ed1ab_0.conda + sha256: cc5c2b513143ea9675ba5b3570182f7568fd1029b299ee3bc58424dcce8c5539 + md5: 98cdd8615792e90da1023bc546f806d9 + depends: + - importlib-metadata >=4.6.0 + - python >=3.10,<4.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/isort?source=hash-mapping + size: 72146 + timestamp: 1772278531671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda + sha256: cea4c90ca4971cbc29d5930301cabcc581a781fd26d0cc7ca0aa459cb33ff573 + md5: 5455c1a77c2aa337f04d94ff0ef413c3 + depends: + - __glibc >=2.17,<3.0.a0 + - freeglut >=3.2.2,<4.0a0 + - libgcc >=14 + - libglu >=9.0.3,<10.0a0 + - libglu >=9.0.3,<9.1.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + license: JasPer-2.0 + purls: [] + size: 683370 + timestamp: 1772794291374 +- conda: https://conda.anaconda.org/conda-forge/win-64/jasper-4.2.9-h8ad263b_0.conda + sha256: 2bea6dfd60c072be94cd6cf1b3c257f34db68589cce6b2c8d0fa9eebc5f0a613 + md5: 639b25d49a9b147fbb193af0053eca96 + depends: + - freeglut >=3.2.2,<4.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: JasPer-2.0 + purls: [] + size: 447158 + timestamp: 1772794358554 - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 @@ -1973,7 +6532,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jinja2?source=hash-mapping + - pkg:pypi/jinja2?source=compressed-mapping size: 120685 timestamp: 1764517220861 - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda @@ -1999,6 +6558,29 @@ packages: purls: [] size: 82709 timestamp: 1726487116178 +- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.13.0-pyhd8ed1ab_0.conda + sha256: ba03ca5a6db38d9f48bd30172e8c512dea7a686a5c7701c6fcdb7b3023dae2ad + md5: 8d5f66ebf832c4ce28d5c37a0e76605c + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/json5?source=hash-mapping + size: 34017 + timestamp: 1767325114901 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + sha256: 1a1328476d14dfa8b84dbacb7f7cd7051c175498406dc513ca6c679dc44f3981 + md5: cd2214824e36b0180141d422aba01938 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 13967 + timestamp: 1765026384757 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 md5: ada41c863af263cc4c5fcbaff7c3e4dc @@ -2012,7 +6594,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/jsonschema?source=hash-mapping + - pkg:pypi/jsonschema?source=compressed-mapping size: 82356 timestamp: 1767839954256 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda @@ -2028,6 +6610,56 @@ packages: - pkg:pypi/jsonschema-specifications?source=hash-mapping size: 19236 timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + sha256: 6886fc61e4e4edd38fd38729976b134e8bd2143f7fce56cc80d7ac7bac99bce1 + md5: 8368d58342d0825f0843dc6acdd0c483 + depends: + - jsonschema >=4.26.0,<4.26.1.0a0 + - fqdn + - idna + - isoduration + - jsonpointer >1.13 + - rfc3339-validator + - rfc3986-validator >0.1.0 + - rfc3987-syntax >=1.1.0 + - uri-template + - webcolors >=24.6.0 + license: MIT + license_family: MIT + purls: [] + size: 4740 + timestamp: 1767839954258 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.1.1-pyhd8ed1ab_1.conda + sha256: b538e15067d05768d1c0532a6d9b0625922a1cce751dd6a2af04f7233a1a70e9 + md5: 9453512288d20847de4356327d0e1282 + depends: + - ipykernel + - ipywidgets + - jupyter_console + - jupyterlab + - nbconvert-core + - notebook + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter?source=hash-mapping + size: 8891 + timestamp: 1733818677113 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 62b7c96c6cd77f8173cc5cada6a9acaa + depends: + - importlib-metadata >=4.8.3 + - jupyter_server >=1.1.2 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-lsp?source=hash-mapping + size: 60377 + timestamp: 1756388269267 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda sha256: e402bd119720862a33229624ec23645916a7d47f30e1711a4af9e005162b84f3 md5: 8a3d6d0523f66cf004e563a50d9392b3 @@ -2045,6 +6677,43 @@ packages: - pkg:pypi/jupyter-client?source=compressed-mapping size: 112785 timestamp: 1767954655912 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_1.conda + sha256: aee0cdd0cb2b9321d28450aec4e0fd43566efcd79e862d70ce49a68bf0539bcd + md5: 801dbf535ec26508fac6d4b24adfb76e + depends: + - ipykernel >=6.14 + - ipython + - jupyter_client >=7.0.0 + - jupyter_core >=4.12,!=5.0.* + - prompt_toolkit >=3.0.30 + - pygments + - python >=3.9 + - pyzmq >=17 + - traitlets >=5.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-console?source=hash-mapping + size: 26874 + timestamp: 1733818130068 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + sha256: ed709a6c25b731e01563521ef338b93986cd14b5bc17f35e9382000864872ccc + md5: a8db462b01221e9f5135be466faeb3e0 + depends: + - __win + - pywin32 + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 64679 + timestamp: 1760643889625 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a md5: b38fe4e78ee75def7e599843ef4c1ab0 @@ -2063,6 +6732,140 @@ packages: - pkg:pypi/jupyter-core?source=hash-mapping size: 65503 timestamp: 1760643864586 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + sha256: e9964aaaf6d24a685cd5ce9d75731b643ed7f010fb979574a6580cd2f974c6cd + md5: 31e11c30bbee1682a55627f953c6725a + depends: + - jsonschema-with-format-nongpl >=4.18.0 + - packaging + - python >=3.9 + - python-json-logger >=2.0.4 + - pyyaml >=5.3 + - referencing + - rfc3339-validator + - rfc3986-validator >=0.1.1 + - traitlets >=5.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-events?source=hash-mapping + size: 24306 + timestamp: 1770937604863 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + sha256: 74c4e642be97c538dae1895f7052599dfd740d8bd251f727bce6453ce8d6cd9a + md5: d79a87dcfa726bcea8e61275feed6f83 + depends: + - anyio >=3.1.0 + - argon2-cffi >=21.1 + - jinja2 >=3.0.3 + - jupyter_client >=7.4.4 + - jupyter_core >=4.12,!=5.0.* + - jupyter_events >=0.11.0 + - jupyter_server_terminals >=0.4.4 + - nbconvert-core >=6.4.4 + - nbformat >=5.3.0 + - overrides >=5.0 + - packaging >=22.0 + - prometheus_client >=0.9 + - python >=3.10 + - pyzmq >=24 + - send2trash >=1.8.2 + - terminado >=0.8.3 + - tornado >=6.2.0 + - traitlets >=5.6.0 + - websocket-client >=1.7 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-server?source=hash-mapping + size: 347094 + timestamp: 1755870522134 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654 + md5: 7b8bace4943e0dc345fc45938826f2b8 + depends: + - python >=3.10 + - terminado >=0.8.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-server-terminals?source=hash-mapping + size: 22052 + timestamp: 1768574057200 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.5.6-pyhd8ed1ab_0.conda + sha256: 436a70259a9b4e13ce8b15faa8b37342835954d77a0a74d21dd24547e0871088 + md5: bcbb401d6fa84e0cee34d4926b0e9e93 + depends: + - async-lru >=1.0.0 + - httpx >=0.25.0,<1 + - ipykernel >=6.5.0,!=6.30.0 + - jinja2 >=3.0.3 + - jupyter-lsp >=2.0.0 + - jupyter_core + - jupyter_server >=2.4.0,<3 + - jupyterlab_server >=2.28.0,<3 + - notebook-shim >=0.2 + - packaging + - python >=3.10 + - setuptools >=41.1.0 + - tomli >=1.2.2 + - tornado >=6.2.0 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab?source=compressed-mapping + size: 8245973 + timestamp: 1773240966438 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 + constrains: + - jupyterlab >=4.0.8,<5.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-pygments?source=hash-mapping + size: 18711 + timestamp: 1733328194037 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + sha256: 381d2d6a259a3be5f38a69463e0f6c5dcf1844ae113058007b51c3bef13a7cee + md5: a63877cb23de826b1620d3adfccc4014 + depends: + - babel >=2.10 + - jinja2 >=3.0.3 + - json5 >=0.9.0 + - jsonschema >=4.18 + - jupyter_server >=1.21,<3 + - packaging >=21.3 + - python >=3.10 + - requests >=2.31 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-server?source=hash-mapping + size: 51621 + timestamp: 1761145478692 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.11-pyhd8ed1ab_0.conda + sha256: 639544e96969c7513b33bf3201a4dc3095625e34cff16c187f5dec9bee2dfb2f + md5: 05a08b368343304618b6a88425aa851a + depends: + - python >=3.7 + constrains: + - jupyterlab >=3,<5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-widgets?source=hash-mapping + size: 113654 + timestamp: 1729586559116 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 md5: b38117a3c920364aff79f870c984b4a3 @@ -2082,12 +6885,60 @@ packages: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 77120 + timestamp: 1773067050308 +- conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py312h78d62e6_0.conda + sha256: 5942bd7ae7b1d68906a00681e733b41ac8577ca7ac8da7523eb514d698b6e1f2 + md5: 4ff6f76c2c16c85806ee7533768f5e64 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 73357 + timestamp: 1773067062006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kmedoids-0.5.5-py312h6b5fed6_0.conda + sha256: ec9a66bf4c77b04183889d1e0ea13e3f8d25567fd3f0b7f925a1d16518c5cb3b + md5: 21f68353068a44a900575570cd6f5708 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: GPL-3.0-or-later + license_family: GPL + purls: + - pkg:pypi/kmedoids?source=hash-mapping + size: 479829 + timestamp: 1779452463977 +- conda: https://conda.anaconda.org/conda-forge/win-64/kmedoids-0.5.5-py312h575328f_0.conda + sha256: c9b98c35e4245c69e6bd02ab07782b16870f951a086105373c128ea7b4d937f7 + md5: fe4ce47d38407e98fe197d608a636da2 + depends: + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-3.0-or-later + license_family: GPL purls: - - pkg:pypi/kiwisolver?source=hash-mapping - size: 77120 - timestamp: 1773067050308 + - pkg:pypi/kmedoids?source=hash-mapping + size: 343875 + timestamp: 1779452641638 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 md5: fb53fb07ce46a575c5d004bbc96032c2 @@ -2104,6 +6955,30 @@ packages: purls: [] size: 1386730 timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda + sha256: eb60f1ad8b597bcf95dee11bc11fe71a8325bc1204cf51d2bb1f2120ffd77761 + md5: 4432f52dc0c8eb6a7a6abc00a037d93c + depends: + - openssl >=3.5.5,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 751055 + timestamp: 1769769688841 +- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699 + md5: 9b965c999135d43a3d0f7bd7d024e26a + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/lark?source=compressed-mapping + size: 94312 + timestamp: 1761596921009 - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 @@ -2117,9 +6992,23 @@ packages: purls: [] size: 249959 timestamp: 1768184673131 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c - md5: 18335a698559cdbcd86150a48bf54ba6 +- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda + sha256: 7eeb18c5c86db146b62da66d9e8b0e753a52987f9134a494309588bbeceddf28 + md5: b6c68d6b829b044cd17a41e0a8a23ca1 + depends: + - libjpeg-turbo >=3.1.2,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 522238 + timestamp: 1768184858107 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 + md5: 12bd9a3f089ee6c9266a37dab82afabd depends: - __glibc >=2.17,<3.0.a0 - zstd >=1.5.7,<1.6.0a0 @@ -2128,8 +7017,8 @@ packages: license: GPL-3.0-only license_family: GPL purls: [] - size: 728002 - timestamp: 1774197446916 + size: 725507 + timestamp: 1770267139900 - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 md5: a752488c68f2e7c456bcbd8f16eec275 @@ -2142,6 +7031,18 @@ packages: purls: [] size: 261513 timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + sha256: 45df58fca800b552b17c3914cc9ab0d55a82c5172d72b5c44a59c710c06c5473 + md5: 54b231d595bc1ff9bff668dd443ee012 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 172395 + timestamp: 1773113455582 - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.27.3-py312h1289d80_0.conda sha256: 781f3ddaf3b979284aa399698ae817f9351daf67595e390cfac5bae3a6828207 md5: 5b323b1b5edd0359606d7e53779a8b82 @@ -2158,6 +7059,22 @@ packages: - pkg:pypi/levenshtein?source=hash-mapping size: 143332 timestamp: 1762011214812 +- conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.27.3-py312hbb81ca0_0.conda + sha256: 6fc32acae93f2082687b97010d584a1fb10e2cdca3d53ae8e055961ee7fb301e + md5: 5b921bf403626767874c3f889dc24ce6 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - rapidfuzz >=3.8.0,<4.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 96337 + timestamp: 1762011340193 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda sha256: a7a4481a4d217a3eadea0ec489826a69070fcc3153f00443aa491ed21527d239 md5: 6f7b4302263347698fd24565fbf11310 @@ -2173,6 +7090,21 @@ packages: purls: [] size: 1384817 timestamp: 1770863194876 +- conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + sha256: 7e7f3754f8afaabd946dc11d7c00fd1dc93f0388a2d226a7abf1bf07deab0e2b + md5: 60da39dd5fd93b2a4a0f986f3acc2520 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1884784 + timestamp: 1770863303486 - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 md5: 86f7414544ae606282352fa1e116b41f @@ -2185,55 +7117,297 @@ packages: purls: [] size: 36544 timestamp: 1769221884824 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.7-gpl_hc2c16d8_100.conda - sha256: 2071a3eb03a868effef273eee8bb7baed6ee9fb2fb94421e9958dcf48ab2c599 - md5: dbeb5c8321cb2408d406a3da16a0ff0d +- conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + sha256: e54c08964262c73671d9e80e400333e59c617e0b454476ad68933c0c458156c8 + md5: 43b6385cfad52a7083f2c41984eb4e91 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 34463 + timestamp: 1769221960556 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.6-gpl_hc2c16d8_100.conda + sha256: 69ea8da58658ad26cb64fb0bfccd8a3250339811f0b57c6b8a742e5e51bacf70 + md5: 981d372c31a23e1aa9965d4e74d085d5 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - libgcc >=14 - - liblzma >=5.8.3,<6.0a0 + - liblzma >=5.8.2,<6.0a0 - libxml2 - libxml2-16 >=2.14.6 - - libzlib >=1.3.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - lzo >=2.10,<3.0a0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 887139 + timestamp: 1773243188979 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.6-gpl_he24518a_100.conda + sha256: 0cc7f963d689fcadc0f7e83eb1f538ea73543af92e2b988d552a3d12cceb56e6 + md5: c76cc84cfafa74e43d8951db29983ebb + depends: + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.5,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 891114 - timestamp: 1776096017113 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda - sha256: 0cef37eb013dc7091f17161c357afbdef9a9bc79ef6462508face6db3f37db77 - md5: 7e7f0a692eb62b95d3010563e7f963b6 + size: 1106665 + timestamp: 1773243755298 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-ha7f89c6_0_cpu.conda + sha256: 0117df14b22d795ee56d5fc08ceabc14e12fa9c93d64979e3616260225ed30ca + md5: 8aeb79715524b48267068fb0fd185956 depends: - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 - libgcc >=14 - license: LGPL-2.1-or-later - license_family: LGPL + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 6496823 + timestamp: 1776815770895 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hc74aee5_0_cpu.conda + sha256: 40391ae880c7bb101b0774fbaba62410dec5984d9f3527fe40798114c3de37a5 + md5: b5a964c5cafa1663a84bec0cccbd03db + depends: + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 4339700 + timestamp: 1776819462924 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_0_cpu.conda + sha256: a46a6264bea99b9980dfd469922a43a6ad8ed579b5d58c5236811b2893082ba7 + md5: 178d7e3f5c392e606ccd0aaff4331019 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 ha7f89c6_0_cpu + - libarrow-compute 24.0.0 h53684a4_0_cpu + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 592885 + timestamp: 1776816000408 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_0_cpu.conda + sha256: e07761db31c034dd1e80007d59e22859615ef4a263f2bf987f38aabbea77a17c + md5: 15b51e64c379f24f69dd93cace3525e8 + depends: + - libarrow 24.0.0 hc74aee5_0_cpu + - libarrow-compute 24.0.0 h081cd8e_0_cpu + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 447020 + timestamp: 1776819781866 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_0_cpu.conda + sha256: 24886c26b36267d706be56c06bd89b1692e3da0e3099bdc6bd5cecd042cca606 + md5: 73e0aeaa603ff40128e75435a3c5ac77 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 ha7f89c6_0_cpu + - libgcc >=14 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 2992194 + timestamp: 1776815851047 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_0_cpu.conda + sha256: 93171fdab7cf3c8b52ef1d3b897713bb8b820130bd3a8250c9bd5e4e3ecf70bb + md5: bd6eafa1d7f8b0cc288f007cf8de0555 + depends: + - libarrow 24.0.0 hc74aee5_0_cpu + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1753471 + timestamp: 1776819564791 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_0_cpu.conda + sha256: 37293ee47f819072805e7e23d3ed15e7f1baccfacb2080ed360a96e208d930b2 + md5: dc226b80ae51753ce2bd8193dcc42a88 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 ha7f89c6_0_cpu + - libarrow-acero 24.0.0 h635bf11_0_cpu + - libarrow-compute 24.0.0 h53684a4_0_cpu + - libgcc >=14 + - libparquet 24.0.0 h7376487_0_cpu + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 591654 + timestamp: 1776816104463 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_0_cpu.conda + sha256: 40ca580f478140a9d2a73e0d7307ce2b9e8666b5131bd053ded411cd6b575aea + md5: 72c2b0d37627da3386a0e7446b79008f + depends: + - libarrow 24.0.0 hc74aee5_0_cpu + - libarrow-acero 24.0.0 h7d8d6a5_0_cpu + - libarrow-compute 24.0.0 h081cd8e_0_cpu + - libparquet 24.0.0 h7051d1f_0_cpu + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 428602 + timestamp: 1776819923347 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_0_cpu.conda + sha256: ea628348819cbccf73b0440071c437e33db05e01fd9c7d4f6a0268c0217c12fc + md5: cb5a9557a2ffa1b18b4e05621354c6bd + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 ha7f89c6_0_cpu + - libarrow-acero 24.0.0 h635bf11_0_cpu + - libarrow-dataset 24.0.0 h635bf11_0_cpu + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 502184 + timestamp: 1776816139283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_0_cpu.conda + sha256: 569f9e5853bdf3cd1660d121595662e4852e6b157f02b73a3057ac6fe2208000 + md5: 913460f9f04cc084d326473c52f4df2d + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 hc74aee5_0_cpu + - libarrow-acero 24.0.0 h7d8d6a5_0_cpu + - libarrow-dataset 24.0.0 h7d8d6a5_0_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE purls: [] - size: 53316 - timestamp: 1773595896163 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - build_number: 6 - sha256: 7bfe936dbb5db04820cf300a9cc1f5ee8d5302fc896c2d66e30f1ee2f20fbfd6 - md5: 6d6d225559bfa6e2f3c90ee9c03d4e2e + size: 362008 + timestamp: 1776819969211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + build_number: 5 + sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c + md5: c160954f7418d7b6e87eaf05a8913fa9 depends: - - libopenblas >=0.3.32,<0.3.33.0a0 - - libopenblas >=0.3.32,<1.0a0 + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 constrains: - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas - mkl <2026 + - liblapack 3.11.0 5*_openblas + - libcblas 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18213 + timestamp: 1765818813880 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-7_h6c93730_netlib.conda + build_number: 7 + sha256: a7aa64ab66e2f1746c8a27ad0018801f5c52c949ec6f896c5b280e15fe0c67e2 + md5: b6e60216c858abd007ecb07a61d34893 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - blas * netlib + track_features: + - blas_netlib + - blas_netlib_2 license: BSD-3-Clause license_family: BSD purls: [] - size: 18621 - timestamp: 1774503034895 + size: 152133 + timestamp: 1763441180597 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e md5: 72c8fd1af66bd67bf580645b426513ed @@ -2245,6 +7419,18 @@ packages: purls: [] size: 79965 timestamp: 1764017188531 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda + sha256: 5097303c2fc8ebf9f9ea9731520aa5ce4847d0be41764edd7f6dee2100b82986 + md5: 444b0a45bbd1cb24f82eedb56721b9c4 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 82042 + timestamp: 1764017799966 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b md5: 366b40a69f0ad6072561c1d09301c886 @@ -2257,6 +7443,19 @@ packages: purls: [] size: 34632 timestamp: 1764017199083 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda + sha256: 3239ce545cf1c32af6fffb7fc7c75cb1ef5b6ea8221c66c85416bb2d46f5cccb + md5: 450e3ae947fc46b60f1d8f8f318b40d4 + depends: + - libbrotlicommon 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 34449 + timestamp: 1764017851337 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d md5: 4ffbb341c8b616aa2494b6afb26a0c5f @@ -2269,34 +7468,78 @@ packages: purls: [] size: 298378 timestamp: 1764017210931 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - build_number: 6 - sha256: 57edafa7796f6fa3ebbd5367692dd4c7f552be42109c2dd1a7c89b55089bf374 - md5: 36ae340a916635b97ac8a0655ace2a35 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda + sha256: 3226df6b7df98734440739f75527d585d42ca2bfe912fbe8d1954c512f75341a + md5: ccd93cfa8e54fd9df4e83dbe55ff6e8c + depends: + - libbrotlicommon 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 252903 + timestamp: 1764017901735 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + build_number: 5 + sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 + md5: 6636a2b6f1a87572df2970d3ebc87cc0 depends: - - libblas 3.11.0 6_h4a7cf45_openblas + - libblas 3.11.0 5_h4a7cf45_openblas constrains: - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas - - liblapacke 3.11.0 6*_openblas + - liblapacke 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapack 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18194 + timestamp: 1765818837135 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-7_hc41557d_netlib.conda + build_number: 7 + sha256: 58b88015610f69f014de4cdd3d0139617ba2612f5135710e8c7295da16c42f01 + md5: a3201147bbcbbed12d51bacad285e8c4 + depends: + - libblas 3.11.0.* + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + track_features: + - blas_netlib + - blas_netlib_2 license: BSD-3-Clause license_family: BSD purls: [] - size: 18622 - timestamp: 1774503050205 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.3-default_h746c552_1.conda - sha256: 7a86861402343f1cc0845b837986d677dd93cfe5006d4f02126aa13581d93b41 - md5: 80daec8cf93185515ac7b5d359e3f929 + size: 44724 + timestamp: 1763441236326 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.5-default_h746c552_1.conda + sha256: 7f479f796ba05f22324fb484f53da6f9948395499d7558cc4ff5ec24e91448b1 + md5: af8c5fb71cb5aa4861365af2784fc9ce depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm22 >=22.1.3,<22.2.0a0 + - libllvm22 >=22.1.5,<22.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 12822694 - timestamp: 1776099888592 + size: 12827971 + timestamp: 1778479852868 +- conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-22.1.5-default_ha2db4b5_0.conda + sha256: c10dcb835068ced8d0d45dfeb7126f5ff686258c0fbf2cd8ea6de5b629d0c52a + md5: 74229a56cbbfda28f75bed42ac5cacc7 + depends: + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 30485424 + timestamp: 1778465527873 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 md5: c965a5aa0d5c1c37ffc62dff36e28400 @@ -2308,6 +7551,17 @@ packages: purls: [] size: 20440 timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 + sha256: 75e60fbe436ba8a11c170c89af5213e8bec0418f88b7771ab7e3d9710b70c54e + md5: cd4cc2d0c610c8cb5419ccc979f2d6ce + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 25694 + timestamp: 1633684287072 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 @@ -2339,6 +7593,21 @@ packages: purls: [] size: 466704 timestamp: 1773218522665 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + sha256: 6b2143ba5454b399dab4471e9e1d07352a2f33b569975e6b8aedc2d9bf51cbb0 + md5: ed181e29a7ebf0f60b84b98d6140a340 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + purls: [] + size: 392543 + timestamp: 1773218585056 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 @@ -2350,6 +7619,18 @@ packages: purls: [] size: 73490 timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + sha256: 834e4881a18b690d5ec36f44852facd38e13afe599e369be62d29bd675f107ee + md5: e77030e67343e28b084fabd7db0ce43e + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 156818 + timestamp: 1761979842440 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 md5: 9314bc5a1fe7d1044dc9dfd3ef400535 @@ -2407,19 +7688,57 @@ packages: purls: [] size: 112766 timestamp: 1702146165126 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c - md5: 49f570f3bc4c874a06ea69b7225753af +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda + sha256: af03882afb7a7135288becf340c2f0cf8aa8221138a9a7b108aaeb308a486da1 + md5: 25efbd786caceef438be46da78a7b5ef + depends: + - openssl >=3.1.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 410555 + timestamp: 1685726568668 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 + md5: a3b390520c563d78cc58974de95a03e5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.5.* + - expat 2.8.0.* + license: MIT + license_family: MIT + purls: [] + size: 77241 + timestamp: 1777846112704 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + sha256: 2d81d647c1f01108803457cac999b947456f44dd0a3c2325395677feacaeca67 + md5: 264e350e035092b5135a2147c238aec4 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 76624 - timestamp: 1774719175983 + size: 71094 + timestamp: 1777846223617 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -2431,6 +7750,18 @@ packages: purls: [] size: 58592 timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 + md5: 720b39f5ec0610457b725eb3f396219a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 45831 + timestamp: 1769456418774 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 md5: e289f3d17880e44b633ba911d57a321b @@ -2440,6 +7771,15 @@ packages: purls: [] size: 8049 timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda + sha256: 71fae9ae05563ceec70adceb7bc66faa326a81a6590a8aac8a5074019070a2d8 + md5: d9f70dd06674e26b6d5a657ddd22b568 + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 8379 + timestamp: 1774300468411 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d md5: fb16b4b69e3f1dcfe79d80db8fd0c55d @@ -2454,6 +7794,21 @@ packages: purls: [] size: 384575 timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda + sha256: 497e9ab7c80f579e1b2850523740d6a543b8020f6b43be6bd6e83b3a6fb7fb32 + md5: f9975a0177ee6cdda10c86d1db1186b0 + depends: + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 340180 + timestamp: 1774300467879 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 md5: 0aa00f03f9e39fb9876085dee11a85d4 @@ -2468,6 +7823,21 @@ packages: purls: [] size: 1041788 timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + sha256: da2c96563c76b8c601746f03e03ac75d2b4640fa2ee017cb23d6c9fc31f1b2c6 + md5: b085746891cca3bd2704a450a7b4b5ce + depends: + - _openmp_mutex >=4.5 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - libgcc-ng ==15.2.0=*_18 + - msys2-conda-epoch <0.0a0 + - libgomp 15.2.0 h8ee18e1_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 820022 + timestamp: 1771382190160 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 md5: d5e96b1ed75ca01906b3d2469b4ce493 @@ -2478,48 +7848,182 @@ packages: purls: [] size: 27526 timestamp: 1771378224552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.3-h4f65170_4.conda - sha256: ae0f5fd59d6af90fe5a5acf9de80ba72fd7cba13b9cda117a523dcdcc94ac368 - md5: 494b21d400131f7724ce5daf09749983 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.2-hc2c0581_1.conda + sha256: 8e3b5a88a114a0a23caf12cd049f21f1554b721438731721889d2404fd026cfd + md5: c8ca404aeab8e32c9d6d82a82aeb6511 depends: - __glibc >=2.17,<3.0.a0 - blosc >=1.21.6,<2.0a0 - geos >=3.14.1,<3.14.2.0a0 - giflib >=5.2.2,<5.3.0a0 - json-c >=0.18,<0.19.0a0 - - lerc >=4.1.0,<5.0a0 - - libarchive >=3.8.6,<3.9.0a0 - - libcurl >=8.19.0,<9.0a0 + - lerc >=4.0.0,<5.0a0 + - libarchive >=3.8.5,<3.9.0a0 + - libcurl >=8.18.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libexpat >=2.7.4,<3.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libjxl >=0.11,<1.0a0 + - libkml >=1.3.0,<1.4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - muparser >=2.3.5,<2.4.0a0 + - openssl >=3.5.5,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - proj >=9.7.1,<9.8.0a0 + - xerces-c >=3.3.0,<3.4.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - libgdal 3.12.2.* + license: MIT + license_family: MIT + purls: [] + size: 12962357 + timestamp: 1771393493666 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.2-h9774fe2_1.conda + sha256: a84fe9c5c4ffe360bde5ede10d388570851ba6fcd4f84e99816a6c2f20e809cb + md5: 9f22154b122af399b220678d35edcc9d + depends: + - blosc >=1.21.6,<2.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - lerc >=4.0.0,<5.0a0 + - libarchive >=3.8.5,<3.9.0a0 + - libcurl >=8.18.0,<9.0a0 - libdeflate >=1.25,<1.26.0a0 - - libexpat >=2.7.5,<3.0a0 - - libgcc >=14 + - libexpat >=2.7.4,<3.0a0 - libiconv >=1.18,<2.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - libjxl >=0.11,<1.0a0 - libkml >=1.3.0,<1.4.0a0 - - liblzma >=5.8.3,<6.0a0 - - libpng >=1.6.57,<1.7.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.55,<1.7.0a0 - libspatialite >=5.1.0,<5.2.0a0 - - libsqlite >=3.53.0,<4.0a0 - - libstdcxx >=14 + - libsqlite >=3.51.2,<4.0a0 - libwebp-base >=1.6.0,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - - libzlib >=1.3.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - muparser >=2.3.5,<2.4.0a0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.5,<4.0a0 - pcre2 >=10.47,<10.48.0a0 - - proj >=9.8.1,<9.9.0a0 + - proj >=9.7.1,<9.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 - xerces-c >=3.3.0,<3.4.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - libgdal 3.12.3.* + - libgdal 3.12.2.* + license: MIT + license_family: MIT + purls: [] + size: 9816282 + timestamp: 1771395249315 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.12.2-hf70aa56_1.conda + sha256: 062b2d4c436b5b5e2b1b956b208dc053c7da480b36a909d6ef79017daed4650c + md5: ecf7b755370673d8d116ce45f7c8bbaa + depends: + - __glibc >=2.17,<3.0.a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - libaec >=1.1.5,<2.0a0 + - libgcc >=14 + - libgdal-core 3.12.2 hc2c0581_1 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 562852 + timestamp: 1771394821155 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf4-3.12.2-h5bd48a5_1.conda + sha256: 2dc401a74cbda6432633ab3cd86e9bdbf30dc834b90534475f75921afae9895a + md5: 861e471b9d7df1eed52ea9a25f227951 + depends: + - hdf4 >=4.2.15,<4.2.16.0a0 + - libaec >=1.1.5,<2.0a0 + - libgdal-core 3.12.2 h9774fe2_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 566768 + timestamp: 1771398131827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf5-3.12.2-hcaab353_1.conda + sha256: f5aa2ef73644ec614ff46ae4c8402d73f00f1d4a3e571e247635a0a14ebb448e + md5: ebc9b2164b2e599d5375361e230a1540 + depends: + - __glibc >=2.17,<3.0.a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=14 + - libgdal-core 3.12.2 hc2c0581_1 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 673369 + timestamp: 1771394889641 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-hdf5-3.12.2-h5260803_1.conda + sha256: c9211ed92d9862fc6e2ffc9a8db86ef18aaa759ca9a1ec250eb11d97f3ecfb18 + md5: 150230ce593ad139e1ab1437954b81e2 + depends: + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgdal-core 3.12.2 h9774fe2_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 643803 + timestamp: 1771398296860 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.12.2-h03ef1cf_1.conda + sha256: 8738ba6b64077ba579786c8b902262394b778d1d2cf11e3baf75e3b97a7dc47e + md5: ed2754a12c4fcc929bb39d6b6cc8729c + depends: + - __glibc >=2.17,<3.0.a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=14 + - libgdal-core 3.12.2 hc2c0581_1 + - libgdal-hdf4 3.12.2.* + - libgdal-hdf5 3.12.2.* + - libnetcdf >=4.9.3,<4.9.4.0a0 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 745903 + timestamp: 1771395436997 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-netcdf-3.12.2-h1c765f5_1.conda + sha256: 080eb227d80120b4c93d71efc881bfdbd11bed90c3707cb536893ba15fa52c01 + md5: 300ec561b23a4018262b90995350061a + depends: + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgdal-core 3.12.2 h9774fe2_1 + - libgdal-hdf4 3.12.2.* + - libgdal-hdf5 3.12.2.* + - libnetcdf >=4.9.3,<4.9.4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 12953524 - timestamp: 1775928379694 + size: 690068 + timestamp: 1771399686055 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee md5: 9063115da5bc35fdc3e1002e69b9ef6e @@ -2567,22 +8071,52 @@ packages: purls: [] size: 113911 timestamp: 1731331012126 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce - md5: bb26456332b07f68bf3b7622ed71c0da +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + sha256: 33eb5d5310a5c2c0a4707a0afa644801c2e08c8f70c45e1f62f354116dfe0970 + md5: 17d484ab9c8179c6a6e5b7dbb5065afc depends: - __glibc >=2.17,<3.0.a0 - - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 + - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libzlib >=1.3.2,<2.0a0 - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + purls: [] + size: 4754097 + timestamp: 1778508800134 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda + sha256: f61277e224e9889c221bb2eac0f57d5aeeb82fc45d3dc326957d251c97444f7c + md5: 5fb838786a8317ebb38056bbe236d3ff + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - pcre2 >=10.47,<10.48.0a0 + - libintl >=0.22.5,<1.0a0 + - libffi >=3.5.2,<3.6.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4398701 - timestamp: 1771863239578 + size: 4522891 + timestamp: 1778508851933 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda + sha256: a0105eb88f76073bbb30169312e797ed5449ebb4e964a756104d6e54633d17ef + md5: 8422fcc9e5e172c91e99aef703b3ce65 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libopengl >=1.7.0,<2.0a0 + - libstdcxx >=13 + license: SGI-B-2.0 + purls: [] + size: 325262 + timestamp: 1748692137626 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 md5: 434ca7e50e40f4918ab701e3facd59a0 @@ -2625,9 +8159,97 @@ packages: purls: [] size: 603262 timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.80.0-h1d1128b_0.conda - sha256: 6391a098496b68dc80dfd721293505782ab00bdce21cf6677587b925bcbafeca - md5: 4362f717c7656e8a08ecb50315c775c1 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + sha256: 94981bc2e42374c737750895c6fdcfc43b7126c4fc788cad0ecc7281745931da + md5: 939fb173e2a4d4e980ef689e99b35223 + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - msys2-conda-epoch <0.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 663864 + timestamp: 1771382118742 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + sha256: 17ea802cef3942b0a850b8e33b03fc575f79734f3c829cdd6a4e56e2dae60791 + md5: b2baa4ce6a9d9472aaa602b88f8d40ac + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgcc >=14 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + constrains: + - libgoogle-cloud 3.3.0 *_1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2558266 + timestamp: 1774212240265 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + sha256: 922c3bb6cab8bc8a6f1ffc645a3357d81fb6e73df67e34da4b9106957147ca18 + md5: ff5955f74e7a90ff59b0c6b15f5f63d8 + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libgoogle-cloud 3.3.0 *_1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 17141 + timestamp: 1774217556612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + sha256: 838b6798962039e7f1ed97be85c3a36ceacfd4611bdf76e7cc0b6cd8741edf57 + md5: da94b149c8eea6ceef10d9e408dcfeb3 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=14 + - libgoogle-cloud 3.3.0 h25dbb67_1 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + size: 779217 + timestamp: 1774212426084 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + sha256: 70ccc4b8e2319156afba27ad72e14868102bcd7af43841824e1ca40439020a44 + md5: 9c487cf981c6d9cdfb718daebc35fcdf + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgoogle-cloud 3.3.0 h2b231ac_1 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 17112 + timestamp: 1774217996193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + sha256: 5bb935188999fd70f67996746fd2dca85ec6204289e11695c316772e19451eb8 + md5: b5fb6d6c83f63d83ef2721dca6ff7091 depends: - __glibc >=2.17,<3.0.a0 - c-ares >=1.34.6,<2.0a0 @@ -2637,16 +8259,53 @@ packages: - libprotobuf >=6.33.5,<6.33.6.0a0 - libre2-11 >=2025.11.5 - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.78.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7021360 + timestamp: 1774020290672 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + sha256: e5667a557c6211db4e1de0bf3146b880977cd7447dce5e5f5cb7d9e3dc9afa70 + md5: 26dbb65607f8fe485df5ee98fa6eb79f + depends: + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.5,<4.0a0 - re2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - grpc-cpp =1.80.0 + - grpc-cpp =1.78.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 7092989 - timestamp: 1775543962358 + size: 11546515 + timestamp: 1774013326223 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 + md5: 3b576f6860f838f950c570f4433b086e + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2411241 + timestamp: 1765104337762 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda sha256: 2bdd1cdd677b119abc5e83069bec2e28fe6bfb21ebaea3cd07acee67f38ea274 md5: c2a0c1d0120520e979685034e0b79859 @@ -2658,6 +8317,17 @@ packages: purls: [] size: 1448617 timestamp: 1758894401402 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda + sha256: c722a04f065656b988a46dee87303ff0bf037179c50e2e76704b693def7f9a96 + md5: f4649d4b6bf40d616eda57d6255d2333 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 OR BSD-3-Clause + purls: [] + size: 536186 + timestamp: 1758894243956 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -2668,6 +8338,26 @@ packages: purls: [] size: 790176 timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + purls: [] + size: 696926 + timestamp: 1754909290005 +- conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + sha256: c7e4600f28bcada8ea81456a6530c2329312519efcf0c886030ada38976b0511 + md5: 2cf0cf76cc15d360dfa2f17fd6cf9772 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 95568 + timestamp: 1723629479451 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 md5: 6178c6f2fb254558238ef4e6c56fb782 @@ -2680,6 +8370,19 @@ packages: purls: [] size: 633831 timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + sha256: 698d57b5b90120270eaa401298319fcb25ea186ae95b340c2f4813ed9171083d + md5: 25a127bad5470852b30b239f030ec95b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 842806 + timestamp: 1775962811457 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda sha256: 0c2399cef02953b719afe6591223fb11d287d5a108ef8bb9a02dd509a0f738d7 md5: 1df8c1b1d6665642107883685db6cf37 @@ -2695,6 +8398,21 @@ packages: purls: [] size: 1883476 timestamp: 1770801977654 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-hf3f85d1_0.conda + sha256: 525c5382eb32a43e7baf45b452079bf23daf8f8bf19fee7c8dafa8c731ada8bd + md5: 869e71fcf2135212c51a96f7f7dbd00d + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libhwy >=1.3.0,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1317916 + timestamp: 1770801992810 - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda sha256: aa55f5779d6bc7bf24dc8257f053d5a0708b5910b6bc6ea1396f15febf812c98 md5: 00f0f4a9d2eb174015931b1a234d61ca @@ -2710,39 +8428,71 @@ packages: purls: [] size: 411495 timestamp: 1761132836798 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - build_number: 6 - sha256: 371f517eb7010b21c6cc882c7606daccebb943307cb9a3bf2c70456a5c024f7d - md5: 881d801569b201c2e753f03c84b85e15 +- conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1022.conda + sha256: eacacca7d9b0bcfca16d44365af2437509d58ea6730efdd2a7468963edf849a1 + md5: 6800434a33b644e46c28ffa3ec18afb1 + depends: + - libexpat >=2.7.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - uriparser >=0.9.8,<1.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1659205 + timestamp: 1761132867821 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda + build_number: 5 + sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 + md5: b38076eb5c8e40d0106beda6f95d7609 depends: - - libblas 3.11.0 6_h4a7cf45_openblas + - libblas 3.11.0 5_h4a7cf45_openblas constrains: - - blas 2.306 openblas - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas + - libcblas 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18200 + timestamp: 1765818857876 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-7_h018ca30_netlib.conda + build_number: 7 + sha256: e325ea316a9999983e0f6553f11410bd0c15f2f15a051f3a71726a2cf42a2b9d + md5: 2e2b680a6d0b0b58b94b4ffdf8a76b5b + depends: + - libblas 3.11.0.* + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + track_features: + - blas_netlib + - blas_netlib_2 license: BSD-3-Clause license_family: BSD purls: [] - size: 18624 - timestamp: 1774503065378 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_h6ae95b6_openblas.conda - build_number: 6 - sha256: 42acc0583f672a84f4df52d121e772e9b5b1ee15480e5770f3bd1c151b8120f5 - md5: af6df8ece92110c951032683af64f1fa + size: 2131489 + timestamp: 1763441291332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda + build_number: 5 + sha256: 3ed01602bf863a44d32fef697dd79ae53436644cf8b54d67cba0957757323bfe + md5: e487a0e38d89da76410cb92a5db39ec5 depends: - - libblas 3.11.0 6_h4a7cf45_openblas - - libcblas 3.11.0 6_h0358290_openblas - - liblapack 3.11.0 6_h47877c9_openblas + - libblas 3.11.0 5_h4a7cf45_openblas + - libcblas 3.11.0 5_h0358290_openblas + - liblapack 3.11.0 5_h47877c9_openblas constrains: - - blas 2.306 openblas + - blas 2.305 openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18632 - timestamp: 1774503080559 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.4-hf7376ad_0.conda - sha256: 6cf83bb8084b4b305fd2d6da9e3ab42acc0a01b19d11c4d7e9766dad91afce49 - md5: 80a690c83cba58ba483b90a07e59e721 + size: 18225 + timestamp: 1765818880545 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.6-hf7376ad_0.conda + sha256: c883814c109f6f1d3b159d6366a5d39dd1e160ce1cf48b27b6d7c4ee8d804232 + md5: 605a337de427d14e51adb39f8a07b282 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -2754,20 +8504,33 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 44242661 - timestamp: 1776821554393 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d - md5: b88d90cad08e6bc8ad540cb310a761fb + size: 44235433 + timestamp: 1779261596488 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb + md5: c7c83eecbb72d88b940c249af56c8b17 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - xz 5.8.3.* + - xz 5.8.2.* + license: 0BSD + purls: [] + size: 113207 + timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c + md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - xz 5.8.2.* license: 0BSD purls: [] - size: 113478 - timestamp: 1775825492909 + size: 106169 + timestamp: 1768752763559 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda sha256: cae2f8fe5258fc1a1d2b61cbc9190ed2c0a1b7cdf5d4aac98da071ade6dac152 md5: a2956b63b1851e9d5eb9f882d02fa3a9 @@ -2793,23 +8556,46 @@ packages: purls: [] size: 870788 timestamp: 1770718321021 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f - md5: 2a45e7f8af083626f009645a6481f12d +- conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.3-nompi_h3948bcf_104.conda + sha256: 70bc463082e8c861a2cd22b419fffd74aec98e43052be254c4fd0d51305742b3 + md5: 3747feaeeb94d1f7654bd10596360d21 + depends: + - blosc >=1.21.6,<2.0a0 + - bzip2 >=1.0.8,<2.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.18.0,<9.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzip >=1.11.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 679613 + timestamp: 1770718488654 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 + md5: b499ce4b026493a13774bcf0f4c33849 depends: - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.6,<2.0a0 + - c-ares >=1.34.5,<2.0a0 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.2,<4.0a0 license: MIT license_family: MIT purls: [] - size: 663344 - timestamp: 1773854035739 + size: 666600 + timestamp: 1756834976695 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 md5: d864d34357c3b65a4b731f78c0801dc4 @@ -2831,21 +8617,21 @@ packages: purls: [] size: 33418 timestamp: 1734670021371 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - sha256: 6dc30b28f32737a1c52dada10c8f3a41bc9e021854215efca04a7f00487d09d9 - md5: 89d61bc91d3f39fda0ca10fcd3c68594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 + md5: be43915efc66345cccb3c310b6ed0374 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.32,<0.3.33.0a0 + - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 5928890 - timestamp: 1774471724897 + size: 5927939 + timestamp: 1763114673331 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead md5: 7df50d44d4a14d6c31a2c54f2cd92157 @@ -2856,6 +8642,92 @@ packages: purls: [] size: 50757 timestamp: 1731330993524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + sha256: 5126b75e7733de31e261aa275c0a1fd38b25fdfff23e7d7056ebd6ca76d11532 + md5: c360be6f9e0947b64427603e91f9651f + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 ha770c72_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.26.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 934274 + timestamp: 1774001192674 +- conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + sha256: 6dcfa1bca059be36b0991ae0ac77dfb8fd681da64204f7665efcfc818a366140 + md5: 8067042d713b975596c7e033841e1580 + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 h57928b3_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.26.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3881744 + timestamp: 1774001818145 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + sha256: fec2ba047f7000c213ca7ace5452435197c79fbcb1690da7ce85e99312245984 + md5: cb93c6e226a7bed5557601846555153d + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 396403 + timestamp: 1774001149705 +- conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + sha256: 3c91ca766deae1a33280cd5f01959487d0b7a7ec046725e17be75e0383013335 + md5: 17bebbaf295fd21280269f7c92d2715f + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 436562 + timestamp: 1774001693139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_0_cpu.conda + sha256: 374a9c6222df047ab6d43c6efe96d380b7750b53ec9b84fc9ad8bf1c22df4522 + md5: c828cca50cd3a7c53d12ce8f0872c6ec + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 ha7f89c6_0_cpu + - libgcc >=14 + - libstdcxx >=14 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1428303 + timestamp: 1776815964191 +- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_0_cpu.conda + sha256: 12eca40be87388d28afbcf78c9897cd2a762a64122b2bbc0e8016acb447c8252 + md5: 0b34d3ccc580180446b7f7225ddab6ab + depends: + - libarrow 24.0.0 hc74aee5_0_cpu + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.6,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 966867 + timestamp: 1776819731491 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 md5: 70e3400cbbfa03e96dcde7fc13e38c7b @@ -2878,6 +8750,18 @@ packages: purls: [] size: 317729 timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + sha256: 218913aeee391460bd0e341b834dbd9c6fa6ae0a4276c0c300266cc99a816a28 + md5: 52f1280563f3b48b5f75414cd2d15dd1 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 385227 + timestamp: 1776315248638 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda sha256: c7e61b86c273ec1ce92c0e087d1a0f3ed3b9485507c6cd35e03bc63de1b6b03f md5: 405ec206d230d9d37ad7c2636114cbf4 @@ -2907,6 +8791,21 @@ packages: purls: [] size: 3638698 timestamp: 1769749419271 +- conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + sha256: 73e2ac7ff32b635b9f6a485dfd5ec1968b7f4bd49f21350e919b2ed8966edaa3 + md5: 69e5855826e56ea4b67fb888ef879afd + depends: + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7117788 + timestamp: 1769749718218 - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda sha256: 138fc85321a8c0731c1715688b38e2be4fb71db349c9ab25f685315095ae70ff md5: ced7f10b6cfb4389385556f47c0ad949 @@ -2923,6 +8822,22 @@ packages: purls: [] size: 213122 timestamp: 1768190028309 +- conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + sha256: 7e26b7868b10e40bc441e00c558927835eacef7e5a39611c2127558edd660c8f + md5: 3d863f1a19f579ca511f6ac02038ab5a + depends: + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 266062 + timestamp: 1768190189553 - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda sha256: eb4082a5135102f5ba9c302da13164d4ed1181d5f0db9d49e5e11a815a7b526f md5: df81fd57eacf341588d728c97920e86d @@ -2936,6 +8851,19 @@ packages: purls: [] size: 231670 timestamp: 1761670395043 +- conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda + sha256: d8d091afa0e5009b71e9a931da862a60104b75ca13c3021edf036620eebaf2d0 + md5: 7eeb5aed49853f8b3e1ca0463ef55a8e + depends: + - geos >=3.14.1,<3.14.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 403088 + timestamp: 1761671197546 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 md5: 7af961ef4aa2c1136e11dd43ded245ab @@ -2946,9 +8874,20 @@ packages: purls: [] size: 277661 timestamp: 1772479381288 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_hab3fe16_120.conda - sha256: 1226948565ea9fa4fbaefc8c5ff6bb4c66e3cb96a9db71d236dcc0be0bc319cb - md5: 5947bdda89ced07ab0d8a5d6503082c3 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda + sha256: d915f4fa8ebbf237c7a6e511ed458f2cfdc7c76843a924740318a15d0dd33d6d + md5: da2aa614d16a795b3007b6f4a1318a81 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: ISC + purls: [] + size: 276860 + timestamp: 1772479407566 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda + sha256: 403c1ad74ee70caaac02216a233ef9ec4531497ee14e7fea93a254a005ece88d + md5: 887245164c408c289d0cb45bd508ce5f depends: - __glibc >=2.17,<3.0.a0 - freexl >=2 @@ -2956,32 +8895,66 @@ packages: - geos >=3.14.1,<3.14.2.0a0 - libgcc >=14 - librttopo >=1.1.0,<1.2.0a0 - - libsqlite >=3.51.2,<4.0a0 + - libsqlite >=3.50.4,<4.0a0 - libstdcxx >=14 - libxml2 - libxml2-16 >=2.14.6 - libxml2-devel - libzlib >=1.3.1,<2.0a0 - - proj >=9.8.0,<9.9.0a0 + - proj >=9.7.0,<9.8.0a0 + - sqlite + - zlib + license: MPL-1.1 + license_family: MOZILLA + purls: [] + size: 4097449 + timestamp: 1761681679109 +- conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda + sha256: c34dd6238ac4723b83b2155b18e7a91ce70dc80b422a50b19c4c713c7c6a8d80 + md5: c0eeff876d19f52efddccbd4887bb66f + depends: + - freexl >=2 + - freexl >=2.0.0,<3.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - librttopo >=1.1.0,<1.2.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libxml2-devel + - libzlib >=1.3.1,<2.0a0 + - proj >=9.7.0,<9.8.0a0 - sqlite + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 - zlib license: MPL-1.1 license_family: MOZILLA purls: [] - size: 4094822 - timestamp: 1772594360111 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - sha256: ec37c79f737933bbac965f5dc0f08ef2790247129a84bb3114fad4900adce401 - md5: 810d83373448da85c3f673fbcb7ad3a3 + size: 8671657 + timestamp: 1761681604524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d + md5: 7dc38adcbf71e6b38748e919e16e0dce depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 958864 - timestamp: 1775753750179 + size: 954962 + timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + sha256: e70562450332ca8954bc16f3455468cca5ef3695c7d7187ecc87f8fc3c70e9eb + md5: 7fea434a17c323256acc510a041b80d7 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1304178 + timestamp: 1777986510497 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -2995,6 +8968,20 @@ packages: purls: [] size: 304790 timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09 + md5: 9dce2f112bfd3400f4f432b3d0ac07b2 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 292785 + timestamp: 1745608759342 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e md5: 1b08cd684f34175e4514474793d44bcb @@ -3018,6 +9005,36 @@ packages: purls: [] size: 27575 timestamp: 1771378314494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + sha256: 4888b9ea2593c36ca587a5ebe38d0a56a0e6d6a9e4bb7da7d9a326aaaca7c336 + md5: 8ed82d90e6b1686f5e98f8b7825a15ef + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 424208 + timestamp: 1753277183984 +- conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda + sha256: 87516b128ffa497fc607d5da0cc0366dbee1dbcc14c962bf9ea951d480c7698b + md5: 556d49ad5c2ad553c2844cc570bb71c7 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 636513 + timestamp: 1753277481158 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 md5: cd5a90476766d53e901500df9215e927 @@ -3036,17 +9053,57 @@ packages: purls: [] size: 435273 timestamp: 1762022005702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 - md5: 38ffe67b78c9d4de527be8315e5ada2c +- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + sha256: f1b8cccaaeea38a28b9cd496694b2e3d372bb5be0e9377c9e3d14b330d1cba8a + md5: 549845d5133100142452812feb9ba2e8 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 993166 + timestamp: 1762022118895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + sha256: ecbf4b7520296ed580498dc66a72508b8a79da5126e1d6dc650a7087171288f9 + md5: 1247168fe4a0b8912e3336bccdbf98a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 85969 + timestamp: 1768735071295 +- conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + sha256: 5d82af0779eab283416240da792a0d2fe4f8213c447e9f04aeaab1801468a90c + md5: 5f34fcb6578ea9bdbfd53cc2cfb88200 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 89061 + timestamp: 1768735187639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 40297 - timestamp: 1775052476770 + size: 40311 + timestamp: 1766271528534 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda sha256: a68280d57dfd29e3d53400409a39d67c4b9515097eba733aa6fe00c880620e2b md5: 31ad065eda3c2d88f8215b1289df9c89 @@ -3063,6 +9120,20 @@ packages: purls: [] size: 199795 timestamp: 1770077125520 +- conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda + sha256: 0f0965edca8b255187604fc7712c53fe9064b31a1845a7dfb2b63bf660de84a7 + md5: 804880b2674119b84277d6c16b01677d + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + constrains: + - libvulkan-headers 1.4.341.0.* + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 282251 + timestamp: 1770077165680 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 @@ -3076,6 +9147,32 @@ packages: purls: [] size: 429011 timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + sha256: 7b6316abfea1007e100922760e9b8c820d6fc19df3f42fb5aca684cfacb31843 + md5: f9bbae5e2537e3b06e0f7310ba76c893 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279176 + timestamp: 1752159543911 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + purls: [] + size: 36621 + timestamp: 1759768399557 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa md5: 92ed62436b625154323d40d5f2f11dd7 @@ -3090,6 +9187,21 @@ packages: purls: [] size: 395888 timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + sha256: 08dec73df0e161c96765468847298a420933a36bc4f09b50e062df8793290737 + md5: a69bbf778a462da324489976c84cfc8c + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - pthread-stubs + - ucrt >=10.0.20348.0 + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 1208687 + timestamp: 1727279378819 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c md5: 5aa797f8787fe7a17d1b0821485b5adc @@ -3116,56 +9228,109 @@ packages: purls: [] size: 837922 timestamp: 1764794163823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - sha256: 3bc5551720c58591f6ea1146f7d1539c734ed1c40e7b9f5cb8cb7e900c509aba - md5: 995d8c8bad2a3cc8db14675a153dec2b +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + sha256: 275c324f87bda1a3b67d2f4fcc3555eeff9e228a37655aa001284a7ceb6b0392 + md5: e49238a1609f9a4a844b09d9926f2c3d depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 + - icu >=78.2,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libxml2-16 2.15.3 hca6bf5a_0 - - libzlib >=1.3.2,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxml2-16 2.15.2 hca6bf5a_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 45968 + timestamp: 1772704614539 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h779ef1b_0.conda + sha256: 2131e25d4fb21be66d7ef685e1b2d66f04aa08e70b37322d557824389d0a4c2a + md5: be3843e412c9f9d697958aa68c72d09d + depends: + - icu >=78.2,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxml2-16 2.15.2 h3cfd58e_0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 46810 - timestamp: 1776376751152 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda - sha256: 3d44f737c5ae52d5af32682cc1530df433f401f8e58a7533926536244127572a - md5: e79d2c2f24b027aa8d5ab1b1ba3061e7 + size: 43866 + timestamp: 1772704745691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda + sha256: 08d2b34b49bec9613784f868209bb7c3bb8840d6cf835ff692e036b09745188c + md5: f3bc152cb4f86babe30f3a4bf0dbef69 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 + - icu >=78.2,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libzlib >=1.3.2,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.2 + license: MIT + license_family: MIT + purls: [] + size: 557492 + timestamp: 1772704601644 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h3cfd58e_0.conda + sha256: d6d792f8f1d6786b9144adfa62c33a04aeec3d76682351b353ca1224fc1a74f3 + md5: f6dd496a1f2b66951110a3a0817f699b + depends: + - icu >=78.2,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - libxml2 2.15.3 + - libxml2 2.15.2 license: MIT license_family: MIT purls: [] - size: 559775 - timestamp: 1776376739004 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.3-h49c6c72_0.conda - sha256: adada9c781ea51faea3e3adcd6883dc294ff2fa044c7f4e199430a11862dfa40 - md5: be70cb50dd0ecc1531c58034d38f72e0 + size: 520731 + timestamp: 1772704723763 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.2-he237659_0.conda + sha256: 4ac0f70a6b985573f057f839445044d6e8c0312599c4839488296666ee56a8dd + md5: 52a4ab30ceaaf314737892c82aadeca4 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 + - icu >=78.2,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libxml2 2.15.3 h49c6c72_0 - - libxml2-16 2.15.3 hca6bf5a_0 - - libzlib >=1.3.2,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxml2 2.15.2 he237659_0 + - libxml2-16 2.15.2 hca6bf5a_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 80239 + timestamp: 1772704626884 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.2-h779ef1b_0.conda + sha256: cb11fa374e23384d34dafc9f81cee109ee0567db90e5aca9acc95cd5bad2fdb5 + md5: 4370b4f7ad7ceb9d3c770e05aec6ad60 + depends: + - icu >=78.2,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxml2 2.15.2 h779ef1b_0 + - libxml2-16 2.15.2 h3cfd58e_0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 80529 - timestamp: 1776376762779 + size: 124050 + timestamp: 1772704764816 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5 md5: 87e6096ec6d542d1c1f8b33245fe8300 @@ -3179,6 +9344,20 @@ packages: purls: [] size: 245434 timestamp: 1757963724977 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda + sha256: 13da38939c2c20e7112d683ab6c9f304bfaf06230a2c6a7cf00359da1a003ec7 + md5: 46034d9d983edc21e84c0b36f1b4ba61 + depends: + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 420223 + timestamp: 1757963935611 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda sha256: 991e7348b0f650d495fb6d8aa9f8c727bdf52dabf5853c0cc671439b160dce48 md5: a7b27c075c9b7f459f1c022090697cba @@ -3193,6 +9372,21 @@ packages: purls: [] size: 109043 timestamp: 1730442108429 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda + sha256: 8ed49d8aa0ff908e16c82f92154174027c8906429e8b63d71f0b27ecc987b43e + md5: 09066edc7810e4bd1b41ad01a6cc4706 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 146856 + timestamp: 1730442305774 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 md5: d87ff7921124eccd67248aa483c23fec @@ -3205,9 +9399,23 @@ packages: purls: [] size: 63629 timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.6-pyhc364b38_1.conda - sha256: 1d46bb40bcccf85c06a6c4146715c1cd4cec3185d39587233fe18c4394a41d87 - md5: c1c64645ec79275e496eeefb689d4d47 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061 + md5: dbabbd6234dea34040e631f87676292f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + size: 58347 + timestamp: 1774072851498 +- conda: https://conda.anaconda.org/conda-forge/noarch/linopy-0.6.5-pyhc364b38_1.conda + sha256: f22513fdb12d132e18b8b71011bef5bcd71b7ca879632b543311f1ca566c645b + md5: 962880d1ef29e4afe03add94992e47c0 depends: - python >=3.11 - numpy @@ -3228,8 +9436,8 @@ packages: license_family: MIT purls: - pkg:pypi/linopy?source=hash-mapping - size: 100245 - timestamp: 1774520821548 + size: 99859 + timestamp: 1772610557175 - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 md5: 91e27ef3d05cc772ce627e51cff111c4 @@ -3241,6 +9449,39 @@ packages: - pkg:pypi/locket?source=hash-mapping size: 8250 timestamp: 1650660473123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py312h3d67a73_1.conda + sha256: e8ae9141c7afcc95555fca7ff5f91d7a84f094536715211e750569fd4bb2caa4 + md5: a669145a2c834895bdf3fcba1f1e5b9c + depends: + - python + - lz4-c + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - lz4-c >=1.10.0,<1.11.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/lz4?source=hash-mapping + size: 44154 + timestamp: 1765026394687 +- conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py312hc3c93f3_1.conda + sha256: d9139738fe6b7a4c8490f333435d3855ce4a2b15895cfd28fd976d62bb5ce0da + md5: 835dcb698b526cfeab01e1f5f908ca5c + depends: + - python + - lz4-c + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - lz4-c >=1.10.0,<1.11.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/lz4?source=hash-mapping + size: 45673 + timestamp: 1765026421038 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -3253,6 +9494,18 @@ packages: purls: [] size: 167055 timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + sha256: 632cf3bdaf7a7aeb846de310b6044d90917728c73c77f138f08aa9438fc4d6b5 + md5: 0b69331897a92fac3d8923549d48d092 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 139891 + timestamp: 1733741168264 - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 md5: 45161d96307e3a447cc3eb5896cf6f8c @@ -3264,6 +9517,21 @@ packages: purls: [] size: 191060 timestamp: 1753889274283 +- conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + sha256: 344f4f225c6dfb523fb477995545542224c37a5c86161f053a1a18fe547aa979 + md5: c5cb4159f0eea65663b31dd1e49bbb71 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 165589 + timestamp: 1753889311940 - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda sha256: 967841d300598b17f76ba812e7dae642176692ed2a6735467b93c2b2debe35c1 md5: cc293b4cad9909bf66ca117ea90d4631 @@ -3296,11 +9564,42 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 26057 timestamp: 1772445297924 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py312h7900ff3_0.conda - sha256: 6d66175e1a4ffb91ed954e2c11066d2e03a05bce951a808275069836ddfc993e - md5: 2a7663896e5aab10b60833a768c4c272 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py312h05f76fc_1.conda + sha256: b744287a780211ac4595126ef96a44309c791f155d4724021ef99092bae4aace + md5: a73298d225c7852f97403ca105d10a13 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 28510 + timestamp: 1772445175216 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.9-py312h7900ff3_0.conda + sha256: cdd59bb1a52b09979f11c68909d53120b2e749edd1992853a74e1604db19c8b0 + md5: 579c6a324b197594fabc9240bddf2d8b + depends: + - matplotlib-base >=3.10.9,<3.10.10.0a0 + - pyside6 >=6.7.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 17831 + timestamp: 1777000588302 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.9-py312h2e8e312_0.conda + sha256: a1864fb26f541716aff7c194d6399b17ec90ee4fded2f74034fe4db7c930c60d + md5: 779fa0e5531694e039385f739ceb88b4 depends: - - matplotlib-base >=3.10.8,<3.10.9.0a0 + - matplotlib-base >=3.10.9,<3.10.10.0a0 - pyside6 >=6.7.2 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -3308,11 +9607,11 @@ packages: license: PSF-2.0 license_family: PSF purls: [] - size: 17415 - timestamp: 1763055550515 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda - sha256: 70cf0e7bfd50ef50eb712a6ca1eef0ef0d63b7884292acc81353327b434b548c - md5: b8dc157bbbb69c1407478feede8b7b42 + size: 18066 + timestamp: 1777000842638 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda + sha256: c7e133837376e53e6a52719c205a3067c42f05769bc3e8307417f8d817dfc63e + md5: 7d499b5b6d150f133800dc3a582771c7 depends: - __glibc >=2.17,<3.0.a0 - contourpy >=1.0.1 @@ -3320,8 +9619,8 @@ packages: - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libgcc >=14 - libstdcxx >=14 - numpy >=1.23 @@ -3338,8 +9637,37 @@ packages: license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping - size: 8442149 - timestamp: 1763055517581 + size: 8336056 + timestamp: 1777000573501 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.9-py312h0ebf65c_0.conda + sha256: 539ca0eac473a1b7f9da1071ddcd6fe9a3bdd9e51eab0f1c498e6345c1898e8b + md5: 3752482b0df88d7a08a0791f906e87ae + depends: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 8033620 + timestamp: 1777000825433 - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda sha256: 9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603 md5: 00e120ce3e40bad7bfc78861ce3c4a25 @@ -3352,6 +9680,17 @@ packages: - pkg:pypi/matplotlib-inline?source=hash-mapping size: 15175 timestamp: 1761214578417 +- conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda + sha256: 9b0037171dad0100f0296699a11ae7d355237b55f42f9094aebc0f41512d96a1 + md5: 827064ddfe0de2917fb29f1da4f8f533 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mccabe?source=hash-mapping + size: 12934 + timestamp: 1733216573915 - conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.10-h05a5f5f_0.conda sha256: 0c3700d15377156937ddc89a856527ad77e7cf3fd73cb0dffc75fce8030ddd16 md5: da01bb40572e689bd1535a5cee6b1d68 @@ -3370,20 +9709,128 @@ packages: purls: [] size: 93471 timestamp: 1746450475308 +- conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.0.10-h9fa1bad_0.conda + sha256: feacd3657c60ef0758228fc93d46cedb45ac1b1d151cb09780a4d6c4b8b32543 + md5: 2ffdc180adc65f509e996d63513c04b7 + depends: + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zstd >=1.5.7,<1.6.0a0 + license: Zlib + license_family: Other + purls: [] + size: 86618 + timestamp: 1746450788037 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + sha256: d3fb4beb5e0a52b6cc33852c558e077e1bfe44df1159eb98332d69a264b14bae + md5: b11e360fc4de2b0035fc8aaa74f17fd6 + depends: + - python >=3.10 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mistune?source=hash-mapping + size: 74250 + timestamp: 1766504456031 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_455.conda + sha256: d9e8b095fabbdacf375c389dd74455d10fff9d957c43de04a16868159cf6fc4d + md5: 60a88e17a01bb4afbaa103e7cf0b7f72 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 965435 + timestamp: 1767634789522 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hfdbc840_455.conda + sha256: 2437ea7bc37e0272e83a2c099fcccb9496a4dc2b5c18e81c00c60e1627ca501f + md5: af78d25729eaf1e74308ede48c3739c3 + depends: + - mkl-include 2025.3.0 h57928b3_455 + - tbb 2022.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 110616763 + timestamp: 1771561743058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda + sha256: 94068fd39d1a672f8799e3146a18ba4ef553f0fcccefddb3c07fbdabfd73667a + md5: 2e489969e38f0b428c39492619b5e6e5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/msgpack?source=hash-mapping + size: 102525 + timestamp: 1762504116832 +- conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.2-py312hf90b1b7_1.conda + sha256: 0408cc0868e0963922c76940d618266df88518a7b58b5d28da8378911916b998 + md5: 3272249c8d0f9cb7693e189611b9943f + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/msgpack?source=hash-mapping + size: 87478 + timestamp: 1762504274037 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda sha256: 0da7e7f4e69bfd6c98eff92523e93a0eceeaec1c6d503d4a4cd0af816c3fe3dc md5: 17c77acc59407701b54404cfd3639cac depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 100056 + timestamp: 1771611023053 +- conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.7.1-py312h05f76fc_0.conda + sha256: 3a33346421defe3bd5dfdd10bed8a7055a2ce3b696aafa47f9ec5b1749d38c54 + md5: 3b54ef7993acc98becf31e0016e0404d + depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/multidict?source=hash-mapping - size: 100056 - timestamp: 1771611023053 + size: 91620 + timestamp: 1771610831076 +- conda: https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.7-pyhd8ed1ab_0.conda + sha256: d87816da0e16812f93db1b3b174ef5465047c290457bf72ff750e137f8473a31 + md5: e585c71c2ed48e4eee1663d627ddcd47 + depends: + - python >=3.9 + - python-dateutil + - pytz + - requests + - tqdm + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/multiurl?source=hash-mapping + size: 22874 + timestamp: 1753802497931 - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 md5: 37293a85a0f4f77bbd9cf7aaefc62609 @@ -3407,9 +9854,21 @@ packages: purls: [] size: 203174 timestamp: 1747116762269 -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda - sha256: 676cbfbf709ce984a14e3af5aef70f1ec94a29ea3fdec477115ae302b34a1a2d - md5: 6cac1a50359219d786453c6fef819f98 +- conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda + sha256: 57f78d8cd9a282d03cd7a7ffb1f42d570e1bbfb42d606e99de5c16e089067185 + md5: 013aabb169d59009bdf7d70319360e9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 148557 + timestamp: 1747117340968 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.18.0-pyhcf101f3_0.conda + sha256: 456c86370e7568c3462010f49be25e052ffb9ebf94860708dfc4b6eac1e45147 + md5: bc317f07dd82e410012684d2e3a9c06d depends: - python >=3.10 - python @@ -3417,8 +9876,53 @@ packages: license_family: MIT purls: - pkg:pypi/narwhals?source=compressed-mapping - size: 283664 - timestamp: 1776691974709 + size: 280418 + timestamp: 1773164865770 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b + md5: 00f5b8dafa842e0c27c1cd7296aa4875 + depends: + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - nbformat >=5.1 + - python >=3.8 + - traitlets >=5.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbclient?source=compressed-mapping + size: 28473 + timestamp: 1766485646962 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + sha256: 628fea99108df8e33396bb0b88658ec3d58edf245df224f57c0dce09615cbed2 + md5: b14079a39ae60ac7ad2ec3d9eab075ca + depends: + - beautifulsoup4 + - bleach-with-css !=5.0.0 + - defusedxml + - importlib-metadata >=3.6 + - jinja2 >=3.0 + - jupyter_core >=4.7 + - jupyterlab_pygments + - markupsafe >=2.0 + - mistune >=2.0.3,<4 + - nbclient >=0.5.0 + - nbformat >=5.7 + - packaging + - pandocfilters >=1.4.1 + - pygments >=2.4.1 + - python >=3.10 + - traitlets >=5.1 + - python + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.17.0 *_0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbconvert?source=compressed-mapping + size: 202284 + timestamp: 1769709543555 - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 md5: bbe1963f1e47f594070ffe87cdf612ea @@ -3434,6 +9938,22 @@ packages: - pkg:pypi/nbformat?source=hash-mapping size: 100945 timestamp: 1733402844974 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbqa-1.9.0-pyhd8ed1ab_0.conda + sha256: cf2323ebaf70dd55bda9292b008975c134896091c550d881eca4cb5669b09afd + md5: 44f74c1a5386ea4d95a0f34314f68517 + depends: + - autopep8 >=1.5 + - importlib-metadata >=1.4 + - ipython >=7.8.0 + - python >=3.8.0 + - tokenize-rt >=3.2.0 + - tomli + license: MIT + license_family: MIT + purls: + - pkg:pypi/nbqa?source=hash-mapping + size: 34693 + timestamp: 1724794010943 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 @@ -3475,6 +9995,27 @@ packages: - pkg:pypi/netcdf4?source=hash-mapping size: 1109790 timestamp: 1760540565753 +- conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.3-nompi_py312h79d12a2_100.conda + sha256: 880d34f210aeddc023ed17014b0b4ab032a74e1018bf84965185b9e5a9e84368 + md5: b599bb301b740b9bb1089190c1b1a912 + depends: + - certifi + - cftime + - hdf5 >=1.14.6,<1.14.7.0a0 + - libnetcdf >=4.9.3,<4.9.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/netcdf4?source=hash-mapping + size: 977728 + timestamp: 1760541025877 - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 md5: a2c1eeadae7a309daed9d62c96012a2b @@ -3492,6 +10033,38 @@ packages: - pkg:pypi/networkx?source=hash-mapping size: 1587439 timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + sha256: fd2cbd8dfc006c72f45843672664a8e4b99b2f8137654eaae8c3d46dca776f63 + md5: 16c2a0e9c4a166e53632cfca4f68d020 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + size: 136216 + timestamp: 1758194284857 +- conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + sha256: 045edd5d571c235de67472ad8fe03d9706b8426c4ba9a73f408f946034b6bc5e + md5: 24a9dde77833cc48289ef92b4e724da4 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + size: 134870 + timestamp: 1758194302226 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee + md5: eb52d14a901e23c39e9e7b4a1a5c015f + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 40866 + timestamp: 1766261270149 - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b md5: 9a66894dfd07c4510beb6b3f9672ccc0 @@ -3502,9 +10075,39 @@ packages: purls: [] size: 3843 timestamp: 1582593857545 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.1-py312h88efc94_101.conda - sha256: 2978bc3fdeab4eb24ed21a0319f2a817e417935f5afdbc54550b6a187b8e4ab2 - md5: f31fa7178c477ce82dfb47273582de15 +- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda + sha256: 11cfeabc41ed73bb088315d96cfdfeaaa10470c06ce6332bae368590e3047ef6 + md5: 471096452091ae8c460928ad5ff143cc + depends: + - importlib_resources >=5.0 + - jupyter_server >=2.4.0,<3 + - jupyterlab >=4.5.6,<4.6 + - jupyterlab_server >=2.28.0,<3 + - notebook-shim >=0.2,<0.3 + - python >=3.10 + - tornado >=6.2.0 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/notebook?source=compressed-mapping + size: 10113914 + timestamp: 1773250273088 +- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056 + md5: e7f89ea5f7ea9401642758ff50a2d9c1 + depends: + - jupyter_server >=1.8,<3 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/notebook-shim?source=hash-mapping + size: 16817 + timestamp: 1733408419340 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.1-py312h88efc94_102.conda + sha256: f46a6264647aa650d7481ca27aa5dc93c78bb1d7721f572ac326e79211264ee3 + md5: 98ecb65a9dd993774cc03f07a8b83231 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -3517,16 +10120,34 @@ packages: license: MIT license_family: MIT purls: + - pkg:pypi/numexpr?source=compressed-mapping + size: 214944 + timestamp: 1778498659910 +- conda: https://conda.anaconda.org/conda-forge/win-64/numexpr-2.14.1-py312h0c4f959_102.conda + sha256: e4e95a617c328f688f24a42eeedb27ab7a259fcde9cab95651235e27daa24118 + md5: ec5fb486545f4f928a86b2d2862418fd + depends: + - nomkl + - numpy >=1.23,<3 + - numpy >=1.23.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: - pkg:pypi/numexpr?source=hash-mapping - size: 213828 - timestamp: 1762595020114 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda - sha256: 1aab7ba963affa572956b1bd8d239df52a9c7bc799c560f98bc658ab70224e10 - md5: 5930ee8a175a242b4f001b1e9e72024f + size: 205330 + timestamp: 1778498800383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + sha256: dfcbeadb3e7ad0da7a55a0525884ca34c19584154e13cc4159396b305d1bd445 + md5: 6e31d55ee1110fda83b4f4045f4d73ff depends: - python - - libgcc >=14 - libstdcxx >=14 + - libgcc >=14 - __glibc >=2.17,<3.0.a0 - liblapack >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 @@ -3537,9 +10158,29 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy?source=hash-mapping - size: 8757569 - timestamp: 1773839284329 + - pkg:pypi/numpy?source=compressed-mapping + size: 8759520 + timestamp: 1779169200325 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda + sha256: 9abf760418f2497f87715fa35d1c9cea5416be9edd1b166a218dfabe3b16e5be + md5: 1dd6f497cc8369359f024463426e323c + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=compressed-mapping + size: 7169449 + timestamp: 1779169226122 - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda sha256: dfa8222df90736fa13f8896f5a573a50273af8347542d412c3bd1230058e56a5 md5: d4f3f31ee39db3efecb96c0728d4bdbf @@ -3569,38 +10210,39 @@ packages: purls: [] size: 355400 timestamp: 1758489294972 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda - sha256: 21c4f6c7f41dc9bec2ea2f9c80440d9a4d45a6f2ac13243e658f10dcf1044146 - md5: 680608784722880fbfe1745067570b00 +- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + sha256: 24342dee891a49a9ba92e2018ec0bde56cc07fdaec95275f7a55b96f03ea4252 + md5: e723ab7cc2794c954e1b22fde51c16e4 + depends: + - libpng >=1.6.55,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 245594 + timestamp: 1772624841727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + sha256: 2e185a3dc2bdc4525dd68559efa3f24fa9159a76c40473e320732b35115163b2 + md5: 3c40a106eadf7c14c6236ceddb267893 depends: - __glibc >=2.17,<3.0.a0 - cyrus-sasl >=2.1.28,<3.0a0 - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - libstdcxx >=14 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: OLDAP-2.8 license_family: BSD purls: [] - size: 786149 - timestamp: 1775741359582 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda - sha256: 04839d313708a6b8c185bc9fcc56ccef985ed91520420c665b5e67b55fd8b5fb - md5: 04ab345ef65b88bcbb8ac3d083427bfc - depends: - - et_xmlfile - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/openpyxl?source=hash-mapping - size: 476128 - timestamp: 1769122092500 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb - md5: da1b85b6a87e141f5140bb9924cecab0 + size: 785570 + timestamp: 1771970256722 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c + md5: f61eb8cd60ff9057122a3d338b99c00f depends: - __glibc >=2.17,<3.0.a0 - ca-certificates @@ -3608,8 +10250,73 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 3167099 - timestamp: 1775587756857 + size: 3164551 + timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 + md5: eb585509b815415bc964b2c7e11c7eb3 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9343023 + timestamp: 1769557547888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + sha256: a60c2578c8422e0c67206d269767feb4d3e627511558b6866e5daf2231d5214d + md5: 8027fce94fdfdf2e54f9d18cbae496df + depends: + - tzdata + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1468651 + timestamp: 1773230208923 +- conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + sha256: f65b96be3790bdb90195226dfbcac2025b680bdffdbedc7e87d919161a63f8a7 + md5: 1e03f610c02a16fdd7fee7430ec23115 + depends: + - tzdata + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - snappy >=1.2.2,<1.3.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1438607 + timestamp: 1773230254230 +- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c + md5: e51f1e4089cad105b6cac64bd8166587 + depends: + - python >=3.9 + - typing_utils + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/overrides?source=hash-mapping + size: 30139 + timestamp: 1734587755455 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 md5: 58335b26c38bf4a20f399384c33cbcf9 @@ -3674,6 +10381,69 @@ packages: - pkg:pypi/pandas?source=hash-mapping size: 15099922 timestamp: 1759266031115 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + sha256: 7f37f3ccea378f491f68979c7afd7f2dbc8ee83c3461dfab3cce15d436298f44 + md5: 57d80e87a8b3161bcf26472deceaa556 + depends: + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.12.* *_cp312 + - pytz >=2020.1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - blosc >=1.21.3 + - qtpy >=2.3.0 + - pandas-gbq >=0.19.0 + - lxml >=4.9.2 + - fsspec >=2022.11.0 + - xarray >=2022.12.0 + - gcsfs >=2022.11.0 + - tabulate >=0.9.0 + - numba >=0.56.4 + - xlrd >=2.0.1 + - html5lib >=1.1 + - beautifulsoup4 >=4.11.2 + - pyqt5 >=5.15.9 + - openpyxl >=3.1.0 + - zstandard >=0.19.0 + - psycopg2 >=2.9.6 + - bottleneck >=1.3.6 + - pytables >=3.8.0 + - pyreadstat >=1.2.0 + - python-calamine >=0.1.7 + - pyarrow >=10.0.1 + - s3fs >=2022.11.0 + - matplotlib >=3.6.3 + - pyxlsb >=1.0.10 + - tzdata >=2022.7 + - odfpy >=1.4.1 + - sqlalchemy >=2.0.0 + - scipy >=1.10.0 + - xlsxwriter >=3.0.5 + - fastparquet >=2022.12.0 + - numexpr >=2.8.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 13779090 + timestamp: 1764615170494 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + md5: 457c2c8c08e54905d6954e79cb5b5db9 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandocfilters?source=hash-mapping + size: 11627 + timestamp: 1631603397334 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94 md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -3724,6 +10494,20 @@ packages: purls: [] size: 1222481 timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + sha256: 3e9e02174edf02cb4bcdd75668ad7b74b8061791a3bc8bdb8a52ae336761ba3e + md5: 77eaf2336f3ae749e712f63e36b0f0a1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 995992 + timestamp: 1763655708300 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a md5: d0d408b1f18883a944376da5cf8101ea @@ -3755,9 +10539,33 @@ packages: - zlib-ng >=2.3.3,<2.4.0a0 license: HPND purls: - - pkg:pypi/pillow?source=compressed-mapping + - pkg:pypi/pillow?source=hash-mapping size: 1039561 timestamp: 1775060059882 +- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.2.0-py312h31f0997_0.conda + sha256: ab7c254e49d0999bbfc3d3b2c76e7d5f9f831692c864c641cf10c557b727ad7e + md5: ba3bcb72a269e7751cadbdd784f84dec + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libwebp-base >=1.6.0,<2.0a0 + - tk >=8.6.13,<8.7.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - libxcb >=1.17.0,<2.0a0 + - python_abi 3.12.* *_cp312 + - libtiff >=4.7.1,<4.8.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - lcms2 >=2.18,<3.0a0 + - openjpeg >=2.5.4,<3.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 944998 + timestamp: 1775060119774 - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a md5: c01af13bdc553d1a8fbfff6e8db075f0 @@ -3771,9 +10579,24 @@ packages: purls: [] size: 450960 timestamp: 1754665235234 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 - md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 +- conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + sha256: 246fce4706b3f8b247a7d6142ba8d732c95263d3c96e212b9d63d6a4ab4aff35 + md5: 08c8fa3b419df480d985e304f7884d35 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 542795 + timestamp: 1754665193489 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + sha256: 0289f0a38337ee201d984f8f31f11f6ef076cfbbfd0ab9181d12d9d1d099bf46 + md5: 82c1787f2a65c0155ef9652466ee98d6 depends: - python >=3.10 - python @@ -3781,8 +10604,8 @@ packages: license_family: MIT purls: - pkg:pypi/platformdirs?source=compressed-mapping - size: 25862 - timestamp: 1775741140609 + size: 25646 + timestamp: 1773199142345 - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 md5: 3e9427ee186846052e81fadde8ebe96a @@ -3798,11 +10621,23 @@ packages: - pkg:pypi/plotly?source=compressed-mapping size: 5251872 timestamp: 1772628857717 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda - sha256: c3da6a82313020b690b556df64062aaa440f26ef5ce5ced6e7a5f5343061893e - md5: fd16be490f5403adfbf27dd4901bbe34 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=compressed-mapping + size: 25877 + timestamp: 1764896838868 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.38.1-pyh6a1acc5_0.conda + sha256: 66b1fcb302268a21a0dc818cf550d615b6e93e3d693bec612c7948231bb30489 + md5: b20de145c676cbae6138ac478cdb137b depends: - - polars-runtime-32 ==1.40.0 + - polars-runtime-32 ==1.38.1 - python >=3.10 - python constrains: @@ -3816,24 +10651,24 @@ packages: - pyiceberg >=0.7.1 - altair >=5.4.0 - great_tables >=0.8.0 - - polars-runtime-32 ==1.40.0 - - polars-runtime-64 ==1.40.0 - - polars-runtime-compat ==1.40.0 + - polars-runtime-32 ==1.38.1 + - polars-runtime-64 ==1.38.1 + - polars-runtime-compat ==1.38.1 license: MIT license_family: MIT purls: - pkg:pypi/polars?source=hash-mapping - size: 536257 - timestamp: 1776563396053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda + size: 525771 + timestamp: 1770417396090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.38.1-py310hffdcd12_0.conda noarch: python - sha256: 4f270fd8e73b29052cbed427cf82bcdf6ff70d8b47db30250a1ea5d250a3a039 - md5: 8eacf9ff4d4e1ca1b52f8f3ba3e0c993 + sha256: cf48147429a4f993b0fb1d2376d238d62843341e3ad0a2b1a058fc6130efd16d + md5: b659a59ec7b67623dcaec02388e06fb9 depends: - python + - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - - libgcc >=14 - _python_abi3_support 1.* - cpython >=3.10 constrains: @@ -3842,11 +10677,56 @@ packages: license_family: MIT purls: - pkg:pypi/polars-runtime-32?source=hash-mapping - size: 41995503 - timestamp: 1776563396053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda - sha256: dff6f355025b9a510d9093e29fd970fa1091e758b848c9dec814d96ae63a09ba - md5: b23619e5e9009eaa070ead0342034027 + size: 35483982 + timestamp: 1770417396088 +- conda: https://conda.anaconda.org/conda-forge/win-64/polars-runtime-32-1.38.1-py310hca7251b_0.conda + noarch: python + sha256: e3d66b5053af2fa908272ed9f14d7f0add401391ff4fc7bd6fa9854ae9068e21 + md5: b5cb5bc8ed2f9df48909637e7fca0aba + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/polars-runtime-32?source=hash-mapping + size: 39451459 + timestamp: 1770417363447 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda + sha256: 5b81b7516d4baf43d0c185896b245fa7384b25dc5615e7baa504b7fa4e07b706 + md5: 7f3ac694319c7eaf81a0325d6405e974 + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.10 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=hash-mapping + size: 200827 + timestamp: 1765937577534 +- conda: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda + sha256: 9c9f851688f1463c0c6a667dc34a8bce9a7ee2f630b0346ece448e77938f7d5b + md5: e557abf678a0bf100fe7cf9d2b4f4a72 + depends: + - python >=3.9 + - python-utils >=3.8.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/progressbar2?source=hash-mapping + size: 54711 + timestamp: 1734172966353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda + sha256: c94d3d8ef40d1ea018860d66c416003bc03adede7d212efc9218bb64041fe2f7 + md5: 031e33ae075b336c0ce92b14efa886c5 depends: - sqlite - libtiff @@ -3855,15 +10735,76 @@ packages: - libgcc >=14 - libstdcxx >=14 - libtiff >=4.7.1,<4.8.0a0 - - libsqlite >=3.53.0,<4.0a0 - - libcurl >=8.19.0,<9.0a0 + - libcurl >=8.18.0,<9.0a0 + - libsqlite >=3.51.2,<4.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + purls: [] + size: 3593669 + timestamp: 1770890751115 +- conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_3.conda + sha256: 8ff06eae963bdc7580ccb246df911614e9a5a23683b26326df76b1b6f3258e94 + md5: f2b0478a02d35bac5b872d4d63b96be3 + depends: + - sqlite + - libtiff + - libcurl + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libsqlite >=3.51.2,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libcurl >=8.18.0,<9.0a0 constrains: - proj4 ==999999999999 license: MIT license_family: MIT purls: [] - size: 3652144 - timestamp: 1775840249166 + size: 3084268 + timestamp: 1770890802564 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + sha256: ed08acd2ce6c69063693193450df89e8695e8b1251b399d34fb56ab45d900cbc + md5: 128297355faf0afcb84e22e43d472101 + depends: + - libcurl >=8.10.1,<9.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 183665 + timestamp: 1730769570131 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + sha256: 75b2589159d04b3fb92db16d9970b396b9124652c784ab05b66f584edc97f283 + md5: 7526d20621b53440b0aae45d4797847e + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/prometheus-client?source=compressed-mapping + size: 56634 + timestamp: 1768476602855 - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae md5: edb16f14d920fb3faf17f5ce582942d6 @@ -3878,6 +10819,16 @@ packages: - pkg:pypi/prompt-toolkit?source=hash-mapping size: 273927 timestamp: 1756321848365 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda + sha256: e79922a360d7e620df978417dd033e66226e809961c3e659a193f978a75a9b0b + md5: 6d034d3a6093adbba7b24cb69c8c621e + depends: + - prompt-toolkit >=3.0.52,<3.0.53.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7212 + timestamp: 1756321849562 - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda sha256: d0ff67d89cf379a9f0367f563320621f0bc3969fe7f5c85e020f437de0927bb4 md5: 0cf580c1b73146bb9ff1bbdb4d4c8cf9 @@ -3892,19 +10843,33 @@ packages: - pkg:pypi/propcache?source=hash-mapping size: 54233 timestamp: 1744525107433 -- conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.2-pyhcf101f3_0.conda - sha256: 7e760f67afa1db0a84cd24fd69af4ad4a19a55ecee23831f23ecfe083784f27b - md5: 69ab91a71f1ed94ac535059b1cc38e97 +- conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.3.1-py312h31fea79_0.conda + sha256: 2824ee1e6597d81e6b2840ab9502031ee873cab57eadf8429788f1d3225e09ad + md5: 8a1fef8f5796cf8076c7d1897e28ed5a + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50573 + timestamp: 1744525241304 +- conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.1-pyhd8ed1ab_0.conda + sha256: 0d91d1687ed442f9b8ffd6792cf3127529a088e020fac7915e0c40cc23be3037 + md5: c9b8e02d974817913ab94dae12c7340b depends: + - protobuf >=3.19.0,<7.0.0 - python >=3.10 - - protobuf >=4.25.8,<8.0.0 - - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/proto-plus?source=compressed-mapping - size: 43909 - timestamp: 1774635388215 + - pkg:pypi/proto-plus?source=hash-mapping + size: 43555 + timestamp: 1770104240191 - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py312ha7b3241_2.conda sha256: 53997629b27a2465989f23e3a6212cfcc19f51c474d8f89905bb99859140ee88 md5: 0aee4f9ff95fc4bc78264a93e2a74adf @@ -3925,6 +10890,24 @@ packages: - pkg:pypi/protobuf?source=hash-mapping size: 481654 timestamp: 1773265949321 +- conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.33.5-py312hcb3287e_2.conda + sha256: e0b7a45635bd862851bd0d2c032caa68ed6efa3e81f158f2b499bf302215b871 + md5: fb436c574057d701c5ab12e82b2a8941 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libprotobuf 6.33.5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/protobuf?source=hash-mapping + size: 487552 + timestamp: 1773266611956 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda sha256: d834fd656133c9e4eaf63ffe9a117c7d0917d86d89f7d64073f4e3a0020bd8a7 md5: dd94c506b119130aef5a9382aed648e7 @@ -3936,9 +10919,24 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/psutil?source=compressed-mapping + - pkg:pypi/psutil?source=hash-mapping size: 225545 timestamp: 1769678155334 +- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py312he5662c2_0.conda + sha256: edffc84c001a05b996b5f8607c8164432754e86ec9224e831cd00ebabdec04e7 + md5: a2724c93b745fc7861948eb8b9f6679a + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 242769 + timestamp: 1769678170631 - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 md5: b3c17d95b5a10c6e64a21fa17573e70e @@ -3950,6 +10948,18 @@ packages: purls: [] size: 8252 timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + sha256: 7e446bafb4d692792310ed022fe284e848c6a868c861655a92435af7368bae7b + md5: 3c8f2573569bb816483e5cf57efbbe29 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 9389 + timestamp: 1726802555076 - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 md5: 7d9daffbb8d8e0af0f769dbbcd173a54 @@ -3974,6 +10984,20 @@ packages: - pkg:pypi/pulp?source=hash-mapping size: 225053 timestamp: 1757853374018 +- conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py312he39998a_3.conda + sha256: 3bb5873de8cc58bf60e98ede81f9badc662df008d4721a11ca67436c42e2ebcd + md5: 24137cbf886d65446010a6db084bfcef + depends: + - amply >=0.1.2 + - coin-or-cbc + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pulp?source=hash-mapping + size: 14328976 + timestamp: 1757853424445 - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 @@ -3996,18 +11020,92 @@ packages: - pkg:pypi/py-cpuinfo?source=hash-mapping size: 25766 timestamp: 1733236452235 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.3-pyhcf101f3_0.conda - sha256: 6fd53b7a2793404aef62313ff2fcfef0c661d6b71de90ef3d38c0908249eea76 - md5: f5a488544d2eb37f46b3bebf1f378337 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py312h7900ff3_0.conda + sha256: ce11f466f0dcfc41bd0ef3719adb396fbffa6b866aac75c9242938fa58e546d5 + md5: f9ced0be11f0d3120336e4171a121c2a + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 26787 + timestamp: 1776927989772 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-24.0.0-py312h2e8e312_0.conda + sha256: 7c1ea8732d3c7e33c087354457955695063b051bce145253eb74aadea5b8b7b1 + md5: 4106966f2b6e3ea2c946e83193b37bea + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 27110 + timestamp: 1776928440676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py312h2054cf2_0_cpu.conda + sha256: cb2c89aeb97a97572869200e37c153098c5877c7be4774f045459976e0f70233 + md5: fe5033add07e3cf4876fd091b5fecf31 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.23,<3 + - apache-arrow-proc * cpu + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5401544 + timestamp: 1776927982900 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-24.0.0-py312h12c7521_0_cpu.conda + sha256: cc0e427c03d316ca68f932d991fd63e1f8b30bab0cb2700f190f77e198ed45eb + md5: 2bb68e0ac996a7a7c7aff53791d0e692 + depends: + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libprotobuf >=6.33.5 + - numpy >=1.23,<3 + - apache-arrow-proc * cpu + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 3614245 + timestamp: 1777521968621 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + sha256: 2b6e22e97af814153c0a993ea66811de9db05b2a6946dcb97a3953af13c33a80 + md5: c203d401759f448f9e792974e055bcdc depends: - python >=3.10 - - python license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pyasn1?source=hash-mapping - size: 66593 - timestamp: 1773729387446 + - pkg:pypi/pyasn1?source=compressed-mapping + size: 63471 + timestamp: 1769186345593 - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda sha256: 5495061f5d3d6b82b74d400273c586e7c1f1700183de1d2d1688e900071687cb md5: c689b62552f6b63f32f3322e463f3805 @@ -4020,6 +11118,17 @@ packages: - pkg:pypi/pyasn1-modules?source=hash-mapping size: 95990 timestamp: 1743436137965 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda + sha256: 1950f71ff44e64163e176b1ca34812afc1a104075c3190de50597e1623eb7d53 + md5: 85815c6a22905c080111ec8d56741454 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pycodestyle?source=hash-mapping + size: 35182 + timestamp: 1750616054854 - conda: https://conda.anaconda.org/conda-forge/noarch/pycountry-24.6.1-pyhd8ed1ab_0.conda sha256: de60a268ee916eab46016e8b76b6bbd858710dcedeb7188d5e100b863c24cd1c md5: 62ed8c560f1b5b8d74ed11e68e9ae223 @@ -4044,13 +11153,13 @@ packages: - pkg:pypi/pycparser?source=hash-mapping size: 110100 timestamp: 1733195786147 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.2-pyhd8ed1ab_0.conda - sha256: 25a4fb0acf8a1eb3eb0f1ebc1c5610dd9efe5f29616c625d1ee84a9a76eeb5df - md5: 18301be1ab749bc57ae189377836cc47 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydeck-0.9.1-pyhd8ed1ab_0.conda + sha256: 0e715646b7e2a5b76d56f22c7bc4dedfb60332a96ec00449b7ec028d324fb572 + md5: 4b13d1d2d5cba37be9fa3c0922bbf995 depends: - jinja2 >=2.10.1 - numpy >=1.16.4 - - python >=3.10 + - python >=3.9 constrains: - ipywidgets >=7,<8 - traitlets >=4.3.2 @@ -4059,34 +11168,52 @@ packages: license_family: Apache purls: - pkg:pypi/pydeck?source=hash-mapping - size: 8360396 - timestamp: 1776371116205 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 - md5: 16c18772b340887160c79a6acc022db0 + size: 4796214 + timestamp: 1738346682233 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 depends: - - python >=3.10 + - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pygments?source=compressed-mapping - size: 893031 - timestamp: 1774796815820 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.12.1-pyhcf101f3_0.conda - sha256: 4279ee4cf2533fd17910ae7373159d9bee2492d8c50932ddc74dd27a70b15de4 - md5: b27a9f4eca2925036e43542488d3a804 + - pkg:pypi/pygments?source=hash-mapping + size: 889287 + timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.11.0-pyhd8ed1ab_0.conda + sha256: ac605d7fa239f78c508b47f2a0763236eef8d52b53852b84d784b598f92a1573 + md5: f9517d2fe1501919d7a236aba73409bb depends: - python >=3.10 - - typing_extensions >=4.0 - - python constrains: - cryptography >=3.4.0 license: MIT license_family: MIT purls: - pkg:pypi/pyjwt?source=hash-mapping - size: 32247 - timestamp: 1773482160904 + size: 30144 + timestamp: 1769858771741 +- conda: https://conda.anaconda.org/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 + md5: 7d9916ed19ecda71f0b00963365252a7 + depends: + - astroid >=4.0.2,<=4.1.dev0 + - colorama >=0.4.5 + - isort >=5,!=5.13,<9 + - mccabe >=0.6,<0.8 + - platformdirs >=2.2 + - python >=3.10 + - tomli >=1.1 + - tomlkit >=0.10.1 + - dill >=0.3.7 + - python + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/pylint?source=compressed-mapping + size: 391910 + timestamp: 1771619020969 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py312h053e1f3_0.conda sha256: 2b0a366d9066e3d9f495369b95cdb1b9d3dba2f59577e4560b7d1086e1fe3d70 md5: f8e7e5ddfbdca16b65335b0b6615eb4c @@ -4105,20 +11232,38 @@ packages: - pkg:pypi/pyogrio?source=hash-mapping size: 661347 timestamp: 1764402531050 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.0.0-pyhcf101f3_0.conda - sha256: db1475010a893f3592132fbf03d99cfbf10822fb03f185898f3d014af485fdbd - md5: 5291776e59082b5244ab973a8fd66e8b +- conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py312h3f2e00f_0.conda + sha256: ce75abd4eecdffac3160c3230119e9fc6f77875ca90deb04b84986832ec91b1f + md5: d63733f2a0893b5d42fc4e005d5dc265 + depends: + - libgdal-core >=3.12.0,<3.13.0a0 + - numpy + - packaging + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyogrio?source=hash-mapping + size: 880946 + timestamp: 1764402680849 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-26.2.0-pyhcf101f3_0.conda + sha256: 9ce0ca5a46b47fe8af5e5fc160484b80979d1d80bddc56761a251ddccc4c4f4c + md5: 063a810c2e0ee1a5e921ecd57b5e4b72 depends: - python >=3.10 - - cryptography >=46.0.0,<47 - - typing-extensions >=4.9 + - cryptography >=46.0.0,<49 + - typing_extensions >=4.9 - python license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/pyopenssl?source=hash-mapping - size: 134272 - timestamp: 1774513012966 + size: 130658 + timestamp: 1779003427956 - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -4131,23 +11276,41 @@ packages: - pkg:pypi/pyparsing?source=hash-mapping size: 110893 timestamp: 1769003998136 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda - sha256: f2364cce98f54305b655c3a0fb36042b75269c3c868f98f476c2fe0aee75ad97 - md5: 9d5ea11aefbdf548a2d8c965c1b2ebad +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312he675c61_3.conda + sha256: ea0299f9699547531e81dd685f7ff0e50f7bc6dad932d8005ef24c3393cc07c1 + md5: c3258c31e507a81f0b52156bcca81e73 depends: - python - proj - certifi - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - proj >=9.8.0,<9.9.0a0 + - __glibc >=2.17,<3.0.a0 + - proj >=9.7.1,<9.8.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyproj?source=hash-mapping + size: 551823 + timestamp: 1772623249858 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py312h8b773d8_3.conda + sha256: 5419a0bbe321dc813b2621a76b09129dd11dd61c07a7df2adb20e4f1267d32af + md5: 8cc67b62d41cd3c0562cf18c3598fb6a + depends: + - python + - proj + - certifi + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 - python_abi 3.12.* *_cp312 + - proj >=9.7.1,<9.8.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyproj?source=hash-mapping - size: 553635 - timestamp: 1773003206083 + size: 868964 + timestamp: 1772623259417 - conda: https://conda.anaconda.org/conda-forge/noarch/pypsa-1.1.2-pyhd8ed1ab_0.conda sha256: 60c71d1f6b0ee8bbc0bd7b58f6e842745ecdc0042cc8e1b95057282f28219ee3 md5: 658fdb0a50c41f214553706c4d702195 @@ -4177,6 +11340,18 @@ packages: - pkg:pypi/pypsa?source=hash-mapping size: 242307 timestamp: 1772004090295 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.6-py312h2e8e312_0.conda + sha256: 355b5fa16daf16d3bffced756e4333115625f01bb17bf00e0e65fb4a86f3ba81 + md5: 526783c6efcba14ac3efd2cef440254e + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyreadline3?source=hash-mapping + size: 171538 + timestamp: 1778848418493 - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda sha256: d9a0be08f14d5d513611f9902affb49ca3ed72e05509d15d3cdf1970a84b9233 md5: c138c7aaa6a10b5762dcd92247864aff @@ -4188,32 +11363,66 @@ packages: - pkg:pypi/pyshp?source=hash-mapping size: 454408 timestamp: 1764355333136 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py312h50ac2ff_2.conda - sha256: 768c4934fff390f7a8c7cc780dec576af7876e308bc24de406bdf81281f19daa - md5: 013718f42467861794fd1844a93978be +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.1-py312h50ac2ff_1.conda + sha256: 6f9e4fd9f6aa1d82a524384399c956c0c79c6c5df5ae42e241eb59f42c11ffbf + md5: 90f891bc96f673acbff89f6f405aef10 depends: - python - - qt6-main 6.11.0.* + - qt6-main 6.11.1.* - libgcc >=14 - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 - libopengl >=1.7.0,<2.0a0 + - libclang13 >=22.1.5 - libxslt >=1.1.43,<2.0a0 + - qt6-main >=6.11.1,<6.12.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libegl >=1.7.0,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - libgl >=1.7.0,<2.0a0 - - qt6-main >=6.11.0,<6.12.0a0 - - libegl >=1.7.0,<2.0a0 - python_abi 3.12.* *_cp312 - - libclang13 >=21.1.8 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pyside6?source=compressed-mapping + size: 13797566 + timestamp: 1778933891067 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.11.1-py312ha7d0d2e_1.conda + sha256: 3b74e218df8f1e44599fcec686b50daa13214949087a109beca54db5a2db344e + md5: 08cd4cab6c22ee97776628d6c8292092 + depends: + - python + - qt6-main 6.11.1.* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 - libvulkan-loader >=1.4.341.0,<2.0a0 + - python_abi 3.12.* *_cp312 + - qt6-main >=6.11.1,<6.12.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libxslt >=1.1.43,<2.0a0 + - libclang13 >=22.1.5 license: LGPL-3.0-only license_family: LGPL purls: - - pkg:pypi/pyside6?source=hash-mapping - - pkg:pypi/shiboken6?source=hash-mapping - size: 13353987 - timestamp: 1776276345512 + - pkg:pypi/pyside6?source=compressed-mapping + size: 11575248 + timestamp: 1778933918611 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca + md5: e2fd202833c4a981ce8a65974fe4abd1 + depends: + - __win + - python >=3.9 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21784 + timestamp: 1733217448189 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -4226,14 +11435,14 @@ packages: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytables-3.11.1-py312hefc0c3f_1.conda - sha256: 73bba37e8b479ca0d672be6b068c2c619f9c7f64e99192ac291a5c52898dc632 - md5: 8a5d24e88a90eca7588ed83481eb8de1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytables-3.11.1-py312hefc0c3f_2.conda + sha256: 7965fe25678dcc5ec15e587ff045091362d5bc6545eafbc1c5284fafc467429d + md5: 1b72208ba3a8a34d49ec37ed249cc682 depends: - __glibc >=2.17,<3.0.a0 - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - - c-blosc2 >=2.23.1,<2.24.0a0 + - c-blosc2 >=3.0.2,<3.1.0a0 - hdf5 >=1.14.6,<1.14.7.0a0 - libgcc >=14 - libstdcxx >=14 @@ -4250,8 +11459,70 @@ packages: license_family: BSD purls: - pkg:pypi/tables?source=hash-mapping - size: 1633840 - timestamp: 1774333814399 + size: 1633823 + timestamp: 1778345160845 +- conda: https://conda.anaconda.org/conda-forge/win-64/pytables-3.11.1-py312h20cef2e_2.conda + sha256: 20270f765452ff7de755e137341954c480034fb98565e609f7926f4980d265de + md5: a037f50f79b536c4b977f6d904baf6d8 + depends: + - blosc >=1.21.6,<2.0a0 + - bzip2 >=1.0.8,<2.0a0 + - c-blosc2 >=3.0.2,<3.1.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - numexpr + - numpy >=1.20.0 + - numpy >=1.23,<3 + - packaging + - py-cpuinfo + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.4.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/tables?source=hash-mapping + size: 1488821 + timestamp: 1778345277845 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + sha256: 9e749fb465a8bedf0184d8b8996992a38de351f7c64e967031944978de03a520 + md5: 2b694bad8a50dc2f712f5368de866480 + depends: + - pygments >=2.7.2 + - python >=3.10 + - iniconfig >=1.0.1 + - packaging >=22 + - pluggy >=1.5,<2 + - tomli >=1 + - colorama >=0.4 + - exceptiongroup >=1 + - python + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 299581 + timestamp: 1765062031645 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26 + md5: 6891acad5e136cb62a8c2ed2679d6528 + depends: + - coverage >=7.10.6 + - pluggy >=1.2 + - pytest >=7 + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-cov?source=hash-mapping + size: 29016 + timestamp: 1757612051022 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda sha256: a44655c1c3e1d43ed8704890a91e12afd68130414ea2c0872e154e5633a13d7e md5: 7eccb41177e15cc672e1babe9056018e @@ -4279,6 +11550,28 @@ packages: purls: [] size: 31608571 timestamp: 1772730708989 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.13-h0159041_0_cpython.conda + sha256: a02b446d8b7b167b61733a3de3be5de1342250403e72a63b18dac89e99e6180e + md5: 2956dff38eb9f8332ad4caeba941cfe7 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.4,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 15840187 + timestamp: 1772728877265 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 @@ -4292,6 +11585,59 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + sha256: 36429765f626c345710fbae14aeeda676c1745427667eb480bb855b7089affba + md5: 69fc0a99fc21b26b81026c72e00f83df + depends: + - python >=3.10 + - filelock >=3.15.4 + - platformdirs <5,>=4.3.6 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/python-discovery?source=compressed-mapping + size: 33996 + timestamp: 1773161039118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda + sha256: 11e3fdbd01acf7a255126ac0f98c56cdb47515d83d3be6548baa757e8e67b232 + md5: fe3e310aa4a84610012a3889e23d76eb + depends: + - python + - attrs + - cffi + - findlibs + - eccodes >=2.46.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/eccodes?source=hash-mapping + size: 230465 + timestamp: 1772376218988 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-eccodes-2.46.0-np2py312h226b611_0.conda + sha256: f9a22543d78d355aa8faa8049de4d7cafbe33e07cf4a7aa7ebe6facb7c7b64bd + md5: dac45a197e14d635ec763553cc8ac6d2 + depends: + - python + - attrs + - cffi + - findlibs + - eccodes >=2.46.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/eccodes?source=hash-mapping + size: 200483 + timestamp: 1772376258734 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 md5: 23029aae904a2ba587daba708208012f @@ -4314,17 +11660,40 @@ packages: purls: [] size: 46449 timestamp: 1772728979370 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda - sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc - md5: d8d30923ccee7525704599efd722aa16 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/python-json-logger?source=hash-mapping + size: 13383 + timestamp: 1677079727691 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: 7ead57407430ba33f681738905278d03 depends: - python >=3.10 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/tzdata?source=compressed-mapping - size: 147315 - timestamp: 1775223532978 + - pkg:pypi/tzdata?source=hash-mapping + size: 143542 + timestamp: 1765719982349 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda + sha256: c367af466c169ee825e9a2422439076190424af0bf1d2074bb9b96757f812c86 + md5: 24ed1dc544b101075fa7462be5c3a5c5 + depends: + - python >=3.9 + - typing_extensions >3.10.0.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/python-utils?source=hash-mapping + size: 32423 + timestamp: 1734115316868 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda build_number: 8 sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 @@ -4336,18 +11705,17 @@ packages: purls: [] size: 6958 timestamp: 1752805918820 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.1.post1-pyhcf101f3_0.conda - sha256: d35c15c861d5635db1ba847a2e0e7de4c01994999602db1f82e41b5935a9578a - md5: f8a489f43a1342219a3a4d69cecc6b25 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 + md5: bc8e3267d44011051f2eb14d22fb0960 depends: - - python >=3.10 - - python + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/pytz?source=compressed-mapping - size: 201725 - timestamp: 1773679724369 + - pkg:pypi/pytz?source=hash-mapping + size: 189015 + timestamp: 1742920947249 - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda sha256: 991caa5408aea018488a2c94e915c11792b9321b0ef64401f4829ebd0abfb3c0 md5: 644bd4ca9f68ef536b902685d773d697 @@ -4360,21 +11728,67 @@ packages: - pkg:pypi/pyu2f?source=hash-mapping size: 36786 timestamp: 1733738704089 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_2.conda + sha256: 1d33c24d5590e1061e6320fbc90f395f2d14a6b3b6a4d4b3035c7c99238f6de2 + md5: 30b76957c7960ba1610ea759691b531c + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: PSF-2.0 + purls: + - pkg:pypi/pywin32?source=hash-mapping + size: 6686746 + timestamp: 1779222945272 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py312h275cf98_1.conda + sha256: 61cc6c2c712ab4d2b8e7a73d884ef8d3262cb80cc93a4aa074e8b08aa7ddd648 + md5: 66255d136bd0daa41713a334db41d9f0 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - winpty + license: MIT + license_family: MIT + purls: + - pkg:pypi/pywinpty?source=hash-mapping + size: 215371 + timestamp: 1759557609855 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf md5: 15878599a87992e44c059731771591cb depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 198293 + timestamp: 1770223620706 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_1.conda + sha256: 1cab6cbd6042b2a1d8ee4d6b4ec7f36637a41f57d2f5c5cf0c12b7c4ce6a62f6 + md5: 9f6ebef672522cb9d9a6257215ca5743 + depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping - size: 198293 - timestamp: 1770223620706 + size: 179738 + timestamp: 1770223468771 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda noarch: python sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 @@ -4393,6 +11807,24 @@ packages: - pkg:pypi/pyzmq?source=compressed-mapping size: 211567 timestamp: 1771716961404 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda + noarch: python + sha256: d84bcc19a945ca03d1fd794be3e9896ab6afc9f691d58d9c2da514abe584d4df + md5: eb1ec67a70b4d479f7dd76e6c8fe7575 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zeromq >=4.3.5,<4.3.6.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 183235 + timestamp: 1771716967192 - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc md5: 353823361b1d27eb3960efb076dfcaf6 @@ -4404,9 +11836,20 @@ packages: purls: [] size: 552937 timestamp: 1720813982144 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda - sha256: d2cb212a4abd66c13df44771c22ee23c0b013ba1d5dbb5e10e8a13e261a47c6b - md5: c81127acb50fdc7760682495fc9ab088 +- conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + sha256: 887d53486a37bd870da62b8fa2ebe3993f912ad04bd755e7ed7c47ced97cbaa8 + md5: 854fbdff64b572b5c0b470f334d34c11 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LicenseRef-Qhull + purls: [] + size: 1377020 + timestamp: 1720814433486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.1-pl5321h16c4a6b_0.conda + sha256: 787d9a8eb7bb993e4a543901b8edade35c1c8e75d67cadb65c56a8f9c38119a5 + md5: cdae26862f9e4c674b8443fd267f2401 depends: - libxcb - xcb-util @@ -4417,66 +11860,100 @@ packages: - xcb-util-cursor - libgl-devel - libegl-devel - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - - libvulkan-loader >=1.4.341.0,<2.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - libgl >=1.7.0,<2.0a0 - - libegl >=1.7.0,<2.0a0 - - openssl >=3.5.6,<4.0a0 - - dbus >=1.16.2,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 - - krb5 >=1.22.2,<1.23.0a0 - - fontconfig >=2.17.1,<3.0a0 - - fonts-conda-ecosystem - - libxcb >=1.17.0,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - - xorg-libxcomposite >=0.4.7,<1.0a0 - - xorg-libxxf86vm >=1.1.7,<2.0a0 - - icu >=78.3,<79.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - wayland >=1.25.0,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - xcb-util-keysyms >=0.4.1,<0.5.0a0 - xorg-libxcursor >=1.2.3,<2.0a0 - double-conversion >=3.4.0,<3.5.0a0 - - alsa-lib >=1.2.15.3,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - libglib >=2.88.1,<3.0a0 + - libsqlite >=3.53.1,<4.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libdrm >=2.4.125,<2.5.0a0 - xorg-libxext >=1.3.7,<2.0a0 - - harfbuzz >=14.1.0 - - libsqlite >=3.53.0,<4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - harfbuzz >=14.2.0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 - libfreetype >=2.14.3 - libfreetype6 >=2.14.3 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - openssl >=3.5.6,<4.0a0 + - xcb-util-cursor >=0.1.6,<0.2.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - xorg-libxxf86vm >=1.1.7,<2.0a0 + - icu >=78.3,<79.0a0 + - libxcb >=1.17.0,<2.0a0 + - wayland >=1.25.0,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 - libtiff >=4.7.1,<4.8.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libpq >=18.3,<19.0a0 + - libegl >=1.7.0,<2.0a0 - xcb-util-wm >=0.4.2,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - xorg-libxtst >=1.2.5,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 - libcups >=2.3.3,<2.4.0a0 - - xorg-libx11 >=1.8.13,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + constrains: + - qt ==6.11.1 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 60185269 + timestamp: 1778597122245 +- conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.11.1-pl5321hfcac499_0.conda + sha256: 362210095bc596fa32a38f04384db95b3f71f33c84d617e0d8fd1868dd2a89cd + md5: ae7392b852564d9f4f506dfc4ded3c6a + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - harfbuzz >=14.2.0 + - icu >=78.3,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libwebp-base >=1.6.0,<2.0a0 - libpng >=1.6.58,<1.7.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libxrandr >=1.5.5,<2.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - zstd >=1.5.7,<1.6.0a0 + - openssl >=3.5.6,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libbrotlicommon >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - - xcb-util-cursor >=0.1.6,<0.2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - - xorg-libsm >=1.2.6,<2.0a0 - - libpq >=18.3,<19.0a0 - - libglib >=2.86.4,<3.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libglib >=2.88.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 constrains: - - qt ==6.11.0 + - qt ==6.11.1 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 59928585 - timestamp: 1776322501700 + size: 89576147 + timestamp: 1778597003415 - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.5-py312h1289d80_0.conda sha256: 4bb69b2f68fd23e34592e4f9bf5842179debf77a59c19eeac2ec26708b7e2a62 md5: e27bccb2b700b55a6d8967b14f08cb59 @@ -4493,6 +11970,74 @@ packages: - pkg:pypi/rapidfuzz?source=hash-mapping size: 2141428 timestamp: 1775565638201 +- conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.5-py312hbb81ca0_0.conda + sha256: a204fa6ef22f6b455c9468f635dfe12fcf4099a2a2ce5cbabef3b1fb0481a385 + md5: 08d485def71d89e5a42151f2bb82246e + depends: + - numpy + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rapidfuzz?source=hash-mapping + size: 1019922 + timestamp: 1775566058387 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py312hcedc861_0.conda + sha256: c7a9a69149a15262e14c32232459d45e3ef58aee65e46ed60b270a6ded54a573 + md5: f0d110978a87b200a06412b56b26407c + depends: + - __glibc >=2.17,<3.0.a0 + - affine + - attrs + - certifi + - click >=4,!=8.2.* + - click-plugins + - cligj >=0.5 + - libgcc >=14 + - libgdal-core >=3.12.1,<3.13.0a0 + - libstdcxx >=14 + - numpy >=1.23,<3 + - proj >=9.7.1,<9.8.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools >=0.9.8 + - snuggs >=1.4.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/rasterio?source=hash-mapping + size: 8133020 + timestamp: 1767632791843 +- conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py312h064b072_0.conda + sha256: 634c8463f17a8f1bebd4e755962aae1db520c254c54d9f43e29d9f9234c758e6 + md5: 16b23ed5a34d9358725d862be3f387f5 + depends: + - affine + - attrs + - certifi + - click >=4,!=8.2.* + - click-plugins + - cligj >=0.5 + - libgdal-core >=3.12.1,<3.13.0a0 + - numpy >=1.23,<3 + - proj >=9.7.1,<9.8.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools >=0.9.8 + - snuggs >=1.4.1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/rasterio?source=hash-mapping + size: 8508908 + timestamp: 1767633001059 - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda sha256: 3fc684b81631348540e9a42f6768b871dfeab532d3f47d5c341f1f83e2a2b2b2 md5: 66a715bc01c77d43aca1f9fcb13dde3c @@ -4503,6 +12048,16 @@ packages: purls: [] size: 27469 timestamp: 1768190052132 +- conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + sha256: 345b1ed8288d81510101f886aaf547e3294370e5dab340c4c3fcb0b25e5d99e0 + md5: 6807f05dcf3f1736ad6cc9525b8b8725 + depends: + - libre2-11 2025.11.05 h04e5de1_1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 220305 + timestamp: 1768190225351 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -4530,20 +12085,25 @@ packages: - pkg:pypi/referencing?source=hash-mapping size: 51788 timestamp: 1760379115194 -- pypi: https://files.pythonhosted.org/packages/11/0e/a9f6f81013e0deaf559b25711623864970fe6a098314e374ccb1540a4152/regex-2026.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl + name: regex + version: 2026.5.9 + sha256: 86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: regex - version: 2026.4.4 - sha256: 993f657a7c1c6ec51b5e0ba97c9817d06b84ea5fa8d82e43b9405de0defdc2b9 + version: 2026.5.9 + sha256: dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8 requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda - sha256: c0249bc4bf4c0e8e06d0e7b4d117a5d593cc4ab2144d5006d6d47c83cb0af18e - md5: 10afbb4dbf06ff959ad25a92ccee6e59 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 + md5: c65df89a0b2e321045a9e01d1337b182 depends: - python >=3.10 - - certifi >=2023.5.7 + - certifi >=2017.4.17 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - urllib3 >=1.26,<3 + - urllib3 >=1.21.1,<3 - python constrains: - chardet >=3.0.2,<6 @@ -4551,8 +12111,8 @@ packages: license_family: APACHE purls: - pkg:pypi/requests?source=compressed-mapping - size: 63712 - timestamp: 1774894783063 + size: 63602 + timestamp: 1766926974520 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda sha256: 909ec1510bbb6fad9276534352025f428050a4deeea86e68d61c8c580938ac82 md5: a55b220de8970208f583e38639cfbecc @@ -4576,6 +12136,42 @@ packages: - pkg:pypi/reretry?source=hash-mapping size: 12563 timestamp: 1735477549872 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5 + md5: 36de09a8d3e5d5e6f4ee63af49e59706 + depends: + - python >=3.9 + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3339-validator?source=hash-mapping + size: 10209 + timestamp: 1733600040800 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 + md5: 912a71cc01012ee38e6b90ddd561e36f + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3986-validator?source=hash-mapping + size: 7818 + timestamp: 1598024297745 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92 + md5: 7234f99325263a5af6d4cd195035e8f2 + depends: + - python >=3.9 + - lark >=1.2.2 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3987-syntax?source=hash-mapping + size: 22913 + timestamp: 1752876729969 - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda sha256: 62f46e85caaba30b459da7dfcf3e5488ca24fd11675c33ce4367163ab191a42c md5: 3ffc5a3572db8751c2f15bacf6a0e937 @@ -4592,6 +12188,21 @@ packages: - pkg:pypi/rpds-py?source=hash-mapping size: 383750 timestamp: 1764543174231 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py312hdabe01f_0.conda + sha256: faad05e6df2fc15e3ae06fdd71a36e17ff25364777aa4c40f2ec588740d64091 + md5: 2c51baeda0a355b0a5e7b6acb28cf02d + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 243577 + timestamp: 1764543069837 - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda sha256: e32e94e7693d4bc9305b36b8a4ef61034e0428f58850ebee4675978e3c2e5acf md5: 58958bb50f986ac0c46f73b6e290d5fe @@ -4604,6 +12215,49 @@ packages: - pkg:pypi/rsa?source=hash-mapping size: 31709 timestamp: 1744825527634 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.5-h40fa522_0.conda + noarch: python + sha256: da5d47b231a590257b4ee0f3459e6ec30012ae549e3c29601cd15de178dafe9c + md5: 2ad709f7abc95e934d96e7a20b837b6e + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 9273260 + timestamp: 1772780208047 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.5-h5739096_0.conda + noarch: python + sha256: d0bba8615cc662c684bb79a30145b8d4940a80d6906d12ef5ed074f1f1879bc8 + md5: 4b5fef0aa16f91d1286205ff19f2123c + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 9732695 + timestamp: 1772780220897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda + sha256: 150a0a5254e8b15ad737549721c7d13406cd96432f3f446e07073dbd98bb2491 + md5: f2bd09e21c5844a12e2f5eefcd075555 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 388111 + timestamp: 1778113913631 - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py312h3226591_1.conda sha256: 23c643c37fafa14ba3f2b7a407126ea5e732a3655ea8157cf9f977098f863448 md5: 38decbeae260892040709cafc0514162 @@ -4625,6 +12279,26 @@ packages: - pkg:pypi/scikit-learn?source=hash-mapping size: 9726193 timestamp: 1765801245538 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py312hea30aaf_1.conda + sha256: cc3057fd244a13afe94bdb5e3fb6ecbd7ece78559ebdb55a86ae40202ed813a0 + md5: e5cd920b237e02178573ce47ffa87e8c + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.3.0 + - threadpoolctl >=3.2.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8884013 + timestamp: 1765801252142 - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda sha256: e3ad577361d67f6c078a6a7a3898bf0617b937d44dc4ccd57aa3336f2b5778dd md5: 3e38daeb1fb05a95656ff5af089d2e4c @@ -4648,6 +12322,27 @@ packages: - pkg:pypi/scipy?source=hash-mapping size: 17109648 timestamp: 1771880675810 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py312h9b3c559_0.conda + sha256: bdb2437aa5db3a00c5e69808f9d1a695bbe74b4758ffdf2e79777c8e11680443 + md5: bf4d70d225c530053128bae8d2531516 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15009886 + timestamp: 1771881635432 - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda noarch: python sha256: ea29a69b14dd6be5cdeeaa551bf50d78cafeaf0351e271e358f9b820fcab4cb0 @@ -4677,9 +12372,9 @@ packages: - pkg:pypi/seaborn?source=hash-mapping size: 227843 timestamp: 1733730112409 -- conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.5.0-pyhd8ed1ab_0.conda - sha256: 205deac728eaa569beb9ff5d90d56d14609b8a6f62b12c051f26d6a36e66ce3a - md5: 7319c1ceef93e25092de1f0788ac5763 +- conda: https://conda.anaconda.org/conda-forge/noarch/searoute-1.6.0-pyhd8ed1ab_0.conda + sha256: bea89dc2a23f14bff0c1c341723b3d511c8432e270180841623dd7e5e45d0a98 + md5: d221ac6ce809d593ada589c459a9aaa9 depends: - geojson - networkx @@ -4688,8 +12383,35 @@ packages: license_family: MIT purls: - pkg:pypi/searoute?source=hash-mapping - size: 690362 - timestamp: 1774311615361 + size: 594630 + timestamp: 1779069793047 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda + sha256: 305446a0b018f285351300463653d3d3457687270e20eda37417b12ee386ef76 + md5: 6ac53f3fff2c416d63511843a04646fa + depends: + - __win + - pywin32 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/send2trash?source=hash-mapping + size: 22864 + timestamp: 1770937641143 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda + sha256: 59656f6b2db07229351dfb3a859c35e57cc8e8bcbc86d4e501bff881a6f771f1 + md5: 28eb91468df04f655a57bcfbb35fc5c5 + depends: + - __linux + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/send2trash?source=hash-mapping + size: 24108 + timestamp: 1770937597662 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1 md5: 8e194e7b992f99a5015edbd4ebd38efd @@ -4698,7 +12420,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/setuptools?source=hash-mapping + - pkg:pypi/setuptools?source=compressed-mapping size: 639697 timestamp: 1773074868565 - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda @@ -4717,6 +12439,23 @@ packages: - pkg:pypi/shapely?source=hash-mapping size: 631649 timestamp: 1762523699384 +- conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py312h37f46ab_2.conda + sha256: 06f2e00ea487689ad23de7a9f791378ad00d69d464cd809ccce1ad39486263a9 + md5: 674ce7b99e43ac450b79d6c9c8a11705 + depends: + - geos >=3.14.1,<3.14.2.0a0 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/shapely?source=hash-mapping + size: 596670 + timestamp: 1762523748692 - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl name: shelved-cache version: 0.3.1 @@ -4736,9 +12475,9 @@ packages: - pkg:pypi/six?source=hash-mapping size: 18455 timestamp: 1753199211006 -- conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.6.0-pyhcf101f3_0.conda - sha256: 435636387b2ef076cd9fb0a66b68182746f8942b056665128c1724ef583e4c42 - md5: 458a05a84fe73bf082c0cf7d8a716c69 +- conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.1-pyhcf101f3_0.conda + sha256: f53c2c89e3efddd4a0aafcd6ff525811685ae6a4ba87c9e884c4e681cc90a462 + md5: bdb3de24557a6b6e6283d2ed5daf8e01 depends: - python >=3.10 - wrapt @@ -4747,60 +12486,19 @@ packages: license_family: MIT purls: - pkg:pypi/smart-open?source=hash-mapping - size: 57157 - timestamp: 1776091507089 -- conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhd8ed1ab_0.conda - sha256: ae723ba6ab7b1998a04ef16b357c1e0043ffd4f4ac9b0da71e393680343a3c86 - md5: 69db183edbe5b7c3e6c157980057a9d0 + size: 56802 + timestamp: 1771856898593 +- conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + sha256: eb92d0ad94b65af16c73071cc00cc0e10f2532be807beb52758aab2b06eb21e2 + md5: 87f47a78808baf2fa1ea9c315a1e48f1 depends: - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/smmap?source=compressed-mapping - size: 27064 - timestamp: 1775587040128 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-cluster-generic-1.0.9-pyhdfd78af_0.tar.bz2 - sha256: 38a9a779f242843e94fed34b0fbc0f9be0001f6bd322681c83146186fdd48da6 - md5: 9b1db7127119f513696d620eefe7bf67 - depends: - - python >=3.11.0,<4.0.0 - - snakemake-interface-common >=1.13.0,<2.0.0 - - snakemake-interface-executor-plugins >=9.0.0,<10.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/snakemake-executor-plugin-cluster-generic?source=hash-mapping - size: 13919 - timestamp: 1710194099964 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-2.6.1-pyhdfd78af_0.conda - sha256: b610bfb14a14138a1cd21601c67a6711f8dab934d27e60cf9846935ca61d6fc8 - md5: cdc12c1fc327c33f65e1f6a1a27dbaef - depends: - - numpy >=1.26.4,<3.0 - - pandas >=2.2.3,<3.0 - - python >=3.11.0,<4.0.0 - - pyyaml - - snakemake-executor-plugin-slurm-jobstep >=0.4.0,<0.5.0 - - snakemake-interface-common >=1.21.0,<2.0.0 - - snakemake-interface-executor-plugins >=9.3.9,<10.0.0 - - throttler >=1.2.2,<2.0.0 - license: MIT - license_family: MIT - size: 46932 - timestamp: 1776413574557 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-jobstep-0.4.0-pyhdfd78af_0.conda - sha256: 82ad84bf106e0fbab62f6c001311aff53faefe323254c8b2b3540f310bb48dfe - md5: 7d4f2bf739967798eb4d8c02d59cf36c - depends: - - python >=3.11.0,<4.0.0 - - snakemake-interface-common >=1.13.0,<2.0.0 - - snakemake-interface-executor-plugins >=9.0.0,<10.0.0 - license: MIT - purls: - - pkg:pypi/snakemake-executor-plugin-slurm-jobstep?source=hash-mapping - size: 14678 - timestamp: 1765807808315 + - pkg:pypi/smmap?source=hash-mapping + size: 26051 + timestamp: 1739781801801 - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyh84498cf_0.conda sha256: e0304136ad68e797f0e9bc0d2adcedb3239d77a7363c7a5d708b8d7f1559be1e md5: 9e6c1430992f6fe49bc25030426f5969 @@ -4851,22 +12549,21 @@ packages: - pkg:pypi/snakemake-interface-report-plugins?source=hash-mapping size: 14490 timestamp: 1761910544502 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.4.1-pyh84498cf_0.conda - sha256: 695a2c5c2bc417df0e440943f7637953f9e8c6e887c59432947d7e14ae1ffdac - md5: 8e6d2ea30aec2f8eabd03cac524f1f33 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.3.3-pyh84498cf_0.conda + sha256: 2e604c1fa050cae5a73d674e5a787270b96ca4278a0efd2809716bf60beb7129 + md5: c4ef3a38917ff6cccf1697a3608d3a23 depends: - - humanfriendly >=10.0,<11 - python >=3.11.0,<4.0.0 + - reretry >=0.11.8,<0.12.0 - snakemake-interface-common >=1.12.0,<2.0.0 - - tenacity >=9.1.4,<10.0 - throttler >=1.2.2,<2.0.0 - wrapt >=1.15.0,<2.0.0 license: MIT license_family: MIT purls: - pkg:pypi/snakemake-interface-storage-plugins?source=hash-mapping - size: 22783 - timestamp: 1773699846635 + size: 22251 + timestamp: 1771594084558 - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.6.2-pyhdfd78af_0.tar.bz2 sha256: 02b77c75df45c004d04aef9ee23a8d84f7a1fc9cf1e6734492696d7678c8c0c0 md5: aa88acccf6bd0c9b4e156ebaa5ee6437 @@ -4907,41 +12604,20 @@ packages: - pkg:pypi/snakemake?source=hash-mapping size: 875635 timestamp: 1750757163506 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-cached-http-0.3-pyhdfd78af_0.conda - sha256: bfeb67de43a70a563567d4a5f200e24481e1b72eefc0ccc43e445f4f8c177b5a - md5: 15fe83cb157467c0c85c375f56abf199 - depends: - - httpx >=0.27,<1.dev0 - - platformdirs >=4.0,<5.dev0 - - python >=3.11,<4.0.0 - - reretry >=0.11,<1.dev0 - - snakemake-interface-common >=1.14,<2.dev0 - - snakemake-interface-storage-plugins >=4.2,<5.0 - - snakemake-storage-plugin-http >=0.3,<1.dev0 - - tqdm-loggable >=0.2,<1.dev0 - - typing_extensions >=4.15,<5.dev0 - - zstandard >=0.25.0,<0.26.0 - license: MIT - purls: - - pkg:pypi/snakemake-storage-plugin-cached-http?source=hash-mapping - size: 21008 - timestamp: 1770697322502 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.1-pyhdfd78af_0.conda - sha256: b9ba0397aeefed5ffc61f6de9af249c133f68bc90692b367c7b99cb596babfe0 - md5: 1c9fb83c45139a074c0fd4bd4d829a80 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-storage-plugin-http-0.3.0-pyhdfd78af_0.tar.bz2 + sha256: 0fe598fee2cbb25ce5a6bd073a3514f36adde5e6e3e1ed486c7066e742286492 + md5: 269943ac6637718947763b4f989710fc depends: - - humanfriendly - python >=3.11.0,<4.0.0 - requests >=2.31.0,<3.0.0 - requests-oauthlib >=1.3.1,<2.0.0 - snakemake-interface-common >=1.14.0,<2.0.0 - snakemake-interface-storage-plugins >=4.1.0,<5.0.0 license: MIT - license_family: MIT purls: - pkg:pypi/snakemake-storage-plugin-http?source=hash-mapping - size: 15256 - timestamp: 1774034096454 + size: 13546 + timestamp: 1742824892142 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda sha256: 48f3f6a76c34b2cfe80de9ce7f2283ecb55d5ed47367ba91e8bb8104e12b8f11 md5: 98b6c9dc80eb87b2519b97bcf7e578dd @@ -4955,6 +12631,21 @@ packages: purls: [] size: 45829 timestamp: 1762948049098 +- conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + sha256: d2deda1350abf8c05978b73cf7fe9147dd5c7f2f9b312692d1b98e52efad53c3 + md5: 3075846de68f942150069d4289aaad63 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 67417 + timestamp: 1762948090450 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad md5: 03fe290994c5e4ec17293cfb6bdce520 @@ -4966,21 +12657,64 @@ packages: - pkg:pypi/sniffio?source=hash-mapping size: 15698 timestamp: 1762941572482 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda - sha256: a0e35087ebf0720fa758cb261583bee0a328143238524ea47625b37108280291 - md5: dc540e5bd5616d83a1ec46af8315ff98 +- conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + sha256: 61f9373709e7d9009e3a062b135dbe44b16e684a4fcfe2dd624143bc0f80d402 + md5: 9aa358575bbd4be126eaa5e0039f835c depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 - - libgcc >=14 - - libsqlite 3.53.0 hf4e2dac_0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 - - readline >=8.3,<9.0a0 + - numpy + - pyparsing >=2.1.6 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/snuggs?source=hash-mapping + size: 11313 + timestamp: 1733818738919 +- conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + sha256: d1e3e06b5cf26093047e63c8cc77b70d970411c5cbc0cb1fad461a8a8df599f7 + md5: 0401a17ae845fa72c7210e206ec5647d + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/sortedcontainers?source=hash-mapping + size: 28657 + timestamp: 1738440459037 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac + md5: 18de09b20462742fe093ba39185d9bac + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/soupsieve?source=hash-mapping + size: 38187 + timestamp: 1769034509657 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.32.3-hcee41ef_1.tar.bz2 + sha256: 92b004539613e6093bb5b126b0267031c039e01cf828fc404507adfec1670470 + md5: eba59aaa700c4787661b55a8aa3541a7 + depends: + - libgcc-ng >=7.5.0 + - ncurses >=6.1,<7.0.0a0 + - readline >=8.0,<9.0a0 + license: Public-Domain (http://www.sqlite.org/copyright.html) + purls: [] + size: 1445533 + timestamp: 1594304296672 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.1-hdb435a2_0.conda + sha256: cdac82f7ff491ac4915161e560094ad830606b1316099046e565ef3dda9f58ce + md5: 5833ae18b609bf0790e0bfe6f95b3351 + depends: + - libsqlite 3.53.1 hf5d6505_0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 205091 - timestamp: 1775753763547 + size: 425712 + timestamp: 1777986518363 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 md5: b1b505328da7a6b246787df4b5a49fbc @@ -5015,6 +12749,27 @@ packages: - pkg:pypi/statsmodels?source=hash-mapping size: 11903737 timestamp: 1764983555676 +- conda: https://conda.anaconda.org/conda-forge/win-64/statsmodels-0.14.6-py312h196c9fc_0.conda + sha256: 93daa6ead03ff50b6366c6389d268f46d490ad50724a312c2ba59dbd6b6e2415 + md5: 180f6ee9579c0c6111af5a5638686a64 + depends: + - numpy <3,>=1.22.3 + - numpy >=1.23,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy !=1.9.2,>=1.8 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 11419682 + timestamp: 1764983650145 - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda sha256: 3f661e98a09f976775a494488beb3d35ebb00f535b169c6bd891f2e280d55783 md5: 3b887b7b3468b0f494b4fad40178b043 @@ -5024,21 +12779,64 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/tabulate?source=hash-mapping + - pkg:pypi/tabulate?source=compressed-mapping size: 43964 timestamp: 1772732795746 -- conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda - sha256: 32e75900d6a094ffe4290a8c9f1fa15744d9da8ff617aba4acaa0f057a065c34 - md5: 043f0599dc8aa023369deacdb5ac24eb +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9 + md5: 0f9817ffbe25f9e69ceba5ea70c52606 + depends: + - libhwloc >=2.12.2,<2.12.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 155869 + timestamp: 1767886839029 +- conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + sha256: 6b549360f687ee4d11bf85a6d6a276a30f9333df1857adb0fe785f0f8e9bcd60 + md5: f88bb644823094f436792f80fba3207e depends: - python >=3.10 - python - license: Apache-2.0 - license_family: APACHE + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/tblib?source=hash-mapping + size: 19397 + timestamp: 1762956379123 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + sha256: b375e8df0d5710717c31e7c8e93c025c37fa3504aea325c7a55509f64e5d4340 + md5: e43ca10d61e55d0a8ec5d8c62474ec9e + depends: + - __win + - pywinpty >=1.1.0 + - python >=3.10 + - tornado >=6.1.0 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/terminado?source=hash-mapping + size: 23665 + timestamp: 1766513806974 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + sha256: 6b6727a13d1ca6a23de5e6686500d0669081a117736a87c8abf444d60c1e40eb + md5: 17b43cee5cc84969529d5d0b0309b2cb + depends: + - __unix + - ptyprocess + - python >=3.10 + - tornado >=6.1.0 + - python + license: BSD-2-Clause + license_family: BSD purls: - - pkg:pypi/tenacity?source=hash-mapping - size: 31404 - timestamp: 1770510172846 + - pkg:pypi/terminado?source=hash-mapping + size: 24749 + timestamp: 1766513766867 - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda sha256: 6016672e0e72c4cf23c0cf7b1986283bd86a9c17e8d319212d78d8e9ae42fdfd md5: 9d64911b31d57ca443e9f1e36b04385f @@ -5061,6 +12859,18 @@ packages: - pkg:pypi/throttler?source=hash-mapping size: 12341 timestamp: 1691135604942 +- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2 + md5: f1acf5fdefa8300de697982bcb1761c9 + depends: + - python >=3.5 + - webencodings >=0.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/tinycss2?source=hash-mapping + size: 28285 + timestamp: 1729802975370 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac md5: cffd3bdd58090148f4cfcd831f4b26ab @@ -5075,6 +12885,29 @@ packages: purls: [] size: 3301196 timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3 + md5: 0481bfd9814bf525bd4b3ee4b51494c4 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: TCL + license_family: BSD + purls: [] + size: 3526350 + timestamp: 1769460339384 +- conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.2.0-pyhd8ed1ab_0.conda + sha256: b8da0c728e1313e116a06084ea770c6ad752b9cd086d52b20fcd464bdce52e4b + md5: 0a42378794e0425eb5defc9d63e60607 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tokenize-rt?source=hash-mapping + size: 12383 + timestamp: 1748092106333 - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda sha256: fd30e43699cb22ab32ff3134d3acf12d6010b5bbaa63293c37076b50009b91f8 md5: d0fc809fa4c4d85e959ce4ab6e1de800 @@ -5087,6 +12920,29 @@ packages: - pkg:pypi/toml?source=hash-mapping size: 24017 timestamp: 1764486833072 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8 + md5: 72e780e9aa2d0a3295f59b1874e3768b + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=compressed-mapping + size: 21453 + timestamp: 1768146676791 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda + sha256: b35082091c8efd084e51bc3a4a2d3b07897eff232aaf58cbc0f959b6291a6a93 + md5: 385dca77a8b0ec6fa9b92cb62d09b43b + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomlkit?source=hash-mapping + size: 39224 + timestamp: 1768476626454 - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda sha256: 4e379e1c18befb134247f56021fdf18e112fb35e64dd1691858b0a0f3bea9a45 md5: c07a6153f8306e45794774cf9b13bd32 @@ -5109,9 +12965,24 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=compressed-mapping + - pkg:pypi/tornado?source=hash-mapping size: 859665 timestamp: 1774358032165 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.5-py312he06e257_0.conda + sha256: 1220c986664e9e8662e660dc64dd97ed823926b1ba05175771408cf1d6a46dd2 + md5: c6c66a64da3d2953c83ed2789a7f4bdb + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 859726 + timestamp: 1774358173994 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 md5: e5ce43272193b38c2e9037446c1d9206 @@ -5124,18 +12995,19 @@ packages: - pkg:pypi/tqdm?source=compressed-mapping size: 94132 timestamp: 1770153424136 -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-loggable-0.4.1-pyhd8ed1ab_0.conda - sha256: 8def9a46c51fc4304853fcf65054f3c155ef93a95417f384ee58c7849826ba41 - md5: e38b732ce8d5f44d06386a9f600c7d0d +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda + sha256: 63cc2def6e168622728c7800ed6b3c1761ceecb18b354c81cee1a0a94c09900a + md5: af77160f8428924c17db94e04aa69409 depends: - python >=3.10 - - tqdm >4.64 - license: MIT - license_family: MIT + - colorama + - __win + - python + license: MPL-2.0 and MIT purls: - - pkg:pypi/tqdm-loggable?source=hash-mapping - size: 17078 - timestamp: 1773757189785 + - pkg:pypi/tqdm?source=hash-mapping + size: 93399 + timestamp: 1770153445242 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed @@ -5169,6 +13041,17 @@ packages: - pkg:pypi/typing-extensions?source=hash-mapping size: 51692 timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c + md5: f6d7aa696c67756a650e91e15e88223c + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/typing-utils?source=hash-mapping + size: 15183 + timestamp: 1733331395943 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c md5: ad659d0a2b3e47e38d829aa8cad2d610 @@ -5188,6 +13071,48 @@ packages: - check-manifest ; extra == 'devenv' - zest-releaser ; extra == 'devenv' requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 + md5: 55fd03988b1b1bc6faabbfb5b481ecd7 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 14882 + timestamp: 1769438717830 +- conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.1.0-py312hf90b1b7_0.conda + sha256: 109cff6bde0af580472e8ece93323c9cf11a53c983867e411d47e212cd8efd1e + md5: 46f58bf68d690efadc0b1eb17e9f763d + depends: + - cffi + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 18354 + timestamp: 1769438970742 - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda sha256: 895bbfe9ee25c98c922799de901387d842d7c01cae45c346879865c6a907f229 md5: 0b6c506ec1f272b685240e70a29261b8 @@ -5199,9 +13124,35 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2?source=compressed-mapping + - pkg:pypi/unicodedata2?source=hash-mapping size: 410641 timestamp: 1770909099497 +- conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py312he06e257_0.conda + sha256: 577fcd97b5b855d341ee511307a0c05f632d184544e31ff9621690770843c995 + md5: 9c46f390eb4b5c6e502df20378e442dd + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 405896 + timestamp: 1770909182518 +- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0 + md5: e7cb0f5745e4c5035a460248334af7eb + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/uri-template?source=hash-mapping + size: 23990 + timestamp: 1733323714454 - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda sha256: 2aad2aeff7c69a2d7eecd7b662eef756b27d6a6b96f3e2c2a7071340ce14543e md5: d71d3a66528853c0a1ac2c02d79a0284 @@ -5213,6 +13164,18 @@ packages: purls: [] size: 48270 timestamp: 1715010035325 +- conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + sha256: ed0eed8ed0343d29cdbfaeb1bfd141f090af696547d69f91c18f46350299f00d + md5: 28b4cf9065681f43cc567410edf8243d + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 49181 + timestamp: 1715010467661 - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a md5: 9272daa869e03efe68833e3dc7a02130 @@ -5239,6 +13202,71 @@ packages: - pkg:pypi/validators?source=hash-mapping size: 40032 timestamp: 1746267229282 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a + md5: 1e610f2416b6acdd231c5f573d754a0f + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19356 + timestamp: 1767320221521 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 + md5: 37eb311485d2d8b2c419449582046a42 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_34 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 683233 + timestamp: 1767320219644 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 + md5: 242d9f25d2ae60c76b38a5e42858e51d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 115235 + timestamp: 1767320173250 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda + sha256: b83246d145ba0e6814d2ed0b616293e56924e6c7d6649101f5a4f97f9e757ed1 + md5: 704c22301912f7e37d0a92b2e7d5942d + depends: + - python >=3.10 + - distlib >=0.3.7,<1 + - filelock <4,>=3.24.2 + - importlib-metadata >=6.6 + - platformdirs >=3.9.1,<5 + - python-discovery >=1 + - typing_extensions >=4.13.2 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=compressed-mapping + size: 4647775 + timestamp: 1773133660203 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + sha256: 63ff4ec6e5833f768d402f5e95e03497ce211ded5b6f492e660e2bfc726ad24d + md5: f276d1de4553e8fca1dfb6988551ebb4 + depends: + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 19347 + timestamp: 1767320221943 - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda sha256: ea374d57a8fcda281a0a89af0ee49a2c2e99cc4ac97cf2e2db7064e74e764bdb md5: 996583ea9c796e5b915f7d7580b51ea6 @@ -5278,9 +13306,72 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/wcwidth?source=hash-mapping + - pkg:pypi/wcwidth?source=compressed-mapping size: 71550 timestamp: 1770634638503 +- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6 + md5: 6639b6b0d8b5a284f027a2003669aa65 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webcolors?source=hash-mapping + size: 18987 + timestamp: 1761899393153 +- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 + md5: 2841eb5bfc75ce15e9a0054b98dcd64d + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webencodings?source=hash-mapping + size: 15496 + timestamp: 1733236131358 +- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + sha256: 42a2b61e393e61cdf75ced1f5f324a64af25f347d16c60b14117393a98656397 + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/websocket-client?source=hash-mapping + size: 61391 + timestamp: 1759928175142 +- conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-3.6.10-pyhd8ed1ab_0.conda + sha256: 6aeb16d2aacdae68ba7afd980925264f5d0459dd165e3406f13f23949df346c1 + md5: 4d52bbdb661dc1b5a1c2aeb1afcd9a67 + depends: + - notebook >=4.4.1 + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/widgetsnbextension?source=hash-mapping + size: 633673 + timestamp: 1729587712065 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 + depends: + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + purls: + - pkg:pypi/win-inet-pton?source=hash-mapping + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + sha256: 9df10c5b607dd30e05ba08cbd940009305c75db242476f4e845ea06008b0a283 + md5: 1cee351bf20b830d991dbe0bc8cd7dfe + license: MIT + license_family: MIT + purls: [] + size: 1176306 - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py312h4c3975b_1.conda sha256: 8320d5af37eb8933e5d129884ea013b2687e75b08aff5216193df3378eaea92f md5: 8af3faf88325836e46c6cb79828e058c @@ -5295,41 +13386,59 @@ packages: - pkg:pypi/wrapt?source=hash-mapping size: 64608 timestamp: 1756851740646 -- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.6.1-pyhd8ed1ab_1.conda - sha256: e27b45ca791cfbcad37d64b8615d0672d94aafa00b014826fcbca2ce18bd1cc0 - md5: 145c6f2ac90174d9ad1a2a51b9d7c1dd +- conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py312he06e257_1.conda + sha256: f9e9e28ef3a0564a5588427b9503ed08e5fe3624b8f8132d60383439a47baafc + md5: fc10fd823d05bde83cda9e90dbef34ed depends: - - numpy >=1.24 - - packaging >=23.2 - - pandas >=2.1 - - python >=3.10 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 63012 + timestamp: 1756852490793 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.2.0-pyhcf101f3_0.conda + sha256: 1d49f2c80c63913c5a9a525b64434a30cf1386502d0f24607db61bd46fa36a40 + md5: b1b3a2477c1b888f15bbef01d7a9615f + depends: + - python >=3.11 + - numpy >=1.26 + - packaging >=24.1 + - pandas >=2.2 + - python constrains: - - scipy >=1.11 - - dask-core >=2023.11 - - bottleneck >=1.3 - - zarr >=2.16 - - flox >=0.7 - - h5py >=3.8 - - iris >=3.7 - - cartopy >=0.22 - - numba >=0.57 - - sparse >=0.14 - - pint >=0.22 - - distributed >=2023.11 - - hdf5 >=1.12 - - seaborn-base >=0.13 - - nc-time-axis >=1.4 - - matplotlib-base >=3.8 - - toolz >=0.12 - - netcdf4 >=1.6.0 + - bottleneck >=1.4 + - cartopy >=0.23 - cftime >=1.6 + - dask-core >=2024.6 + - distributed >=2024.6 + - flox >=0.9 - h5netcdf >=1.3 + - h5py >=3.11 + - hdf5 >=1.14 + - iris >=3.9 + - matplotlib-base >=3.8 + - nc-time-axis >=1.4 + - netcdf4 >=1.6.0 + - numba >=0.60 + - numbagg >=0.8 + - pint >=0.24 + - pydap >=3.5.0 + - scipy >=1.13 + - seaborn-base >=0.13 + - sparse >=0.15 + - toolz >=0.12 + - zarr >=2.18 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/xarray?source=hash-mapping - size: 879913 - timestamp: 1749743321359 + - pkg:pypi/xarray?source=compressed-mapping + size: 1011911 + timestamp: 1771083999178 - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d md5: fdc27cb255a7a2cc73b7919a968b48f0 @@ -5416,6 +13525,18 @@ packages: purls: [] size: 1660075 timestamp: 1766327494699 +- conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + sha256: 9583a8fcf01c59b26a4285bc151b6315fd0bd504e1628f004519dc871eb17073 + md5: d1097e01041cfed41c81f1e3d1f52572 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3598939 + timestamp: 1766327729418 - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda sha256: 19c2bb14bec84b0e995b56b752369775c75f1589314b43733948bb5f471a6915 md5: b56e0c8432b56decafae7e78c5f29ba5 @@ -5475,6 +13596,18 @@ packages: purls: [] size: 15321 timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + sha256: 156a583fa43609507146de1c4926172286d92458c307bb90871579601f6bc568 + md5: 8436cab9a76015dfe7208d3c9f97c156 + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 109246 + timestamp: 1762977105140 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda sha256: 048c103000af9541c919deef03ae7c5e9c570ffb4024b42ecb58dbde402e373a md5: f2ba4192d38b6cef2bb2c25029071d90 @@ -5527,6 +13660,18 @@ packages: purls: [] size: 20591 timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + sha256: 366b8ae202c3b48958f0b8784bbfdc37243d3ee1b1cd4b8e76c10abe41fa258b + md5: a7c03e38aa9c0e84d41881b9236eacfb + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 70691 + timestamp: 1762977015220 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f md5: 34e54f03dfea3e7a2dcf1453a85f1085 @@ -5629,17 +13774,17 @@ packages: purls: [] size: 570010 timestamp: 1766154256151 -- conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda - sha256: 663ea9b00d68c2da309114923924686ab6d3f59ef1b196c5029ba16799e7bb07 - md5: 4487b9c371d0161d54b5c7bbd890c0fc +- conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + sha256: b194a1fbc38f29c563b102ece9d006f7a165bf9074cdfe50563d3bce8cae9f84 + md5: 16933322051fa260285f1a44aae91dd6 depends: - - python >=3.9 + - python >=3.8 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/xyzservices?source=hash-mapping - size: 51732 - timestamp: 1774900074457 + size: 51128 + timestamp: 1763813786075 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad md5: a77f85f77be52ff59391544bfe73390a @@ -5651,9 +13796,24 @@ packages: purls: [] size: 85189 timestamp: 1753484064210 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.23.0-py312h8a5da7c_0.conda - sha256: 5d991a8f418675338528ea8097e55143ad833807a110c4251879040351e0d4af - md5: 4b403cb52e72211c489a884b29290c2c +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 63944 + timestamp: 1753484092156 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.24.2-py312h8a5da7c_0.conda + sha256: 9906e3e09ea7b734325cce2ebe7ac9a1d645d49e71823bffa54d9bf157c6b3ed + md5: 348307a7ed6137b1022f3809e2762f39 depends: - __glibc >=2.17,<3.0.a0 - idna >=2.0 @@ -5665,9 +13825,27 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/yarl?source=hash-mapping - size: 147028 - timestamp: 1772409590700 + - pkg:pypi/yarl?source=compressed-mapping + size: 155061 + timestamp: 1779246264888 +- conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.24.2-py312h05f76fc_0.conda + sha256: cd91174742137ccc24566596e516a6505e99adf7fd93d45b61dea51cb82f8805 + md5: 0871bb7bdf76fe114373f2e8012ebd83 + depends: + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/yarl?source=compressed-mapping + size: 151702 + timestamp: 1779246206775 - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.9.4-pyhd8ed1ab_0.conda sha256: 1ad021f32290e72b70a84dfe0c9b278c61aaa1254f1e1c287d68c32ee4f1093f md5: 89d5edf5d52d3bc1ed4d7d3feef508ba @@ -5696,18 +13874,43 @@ packages: purls: [] size: 311150 timestamp: 1772476812121 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - sha256: 523616c0530d305d2216c2b4a8dfd3872628b60083255b89c5e0d8c42e738cca - md5: e1c36c6121a7c9c76f2f148f1e83b983 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda + sha256: b8568dfde46edf3455458912ea6ffb760e4456db8230a0cf34ecbc557d3c275f + md5: 1ab0237036bfb14e923d6107473b0021 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libsodium >=1.0.21,<1.0.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 265665 + timestamp: 1772476832995 +- conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + sha256: 5488542dceeb9f2874e726646548ecc5608060934d6f9ceaa7c6a48c61f9cc8d + md5: e52c2ef711ccf31bb7f70ca87d144b9e + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zict?source=hash-mapping + size: 36341 + timestamp: 1733261642963 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae + md5: 30cd29cb87d819caead4d55184c1d115 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/zipp?source=compressed-mapping - size: 24461 - timestamp: 1776131454755 + - pkg:pypi/zipp?source=hash-mapping + size: 24194 + timestamp: 1764460141901 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda sha256: 245c9ee8d688e23661b95e3c6dd7272ca936fabc03d423cdb3cdee1bbcf9f2f2 md5: c2a01a08fc991620a74b32420e97868a @@ -5719,6 +13922,19 @@ packages: purls: [] size: 95931 timestamp: 1774072620848 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + sha256: ef408f85f664a4b9c9dac3cb2e36154d9baa15a88984ea800e11060e0f2394a1 + md5: 5187ecf958be3c39110fe691cbd6873e + depends: + - libzlib 1.3.2 hfd05255_2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Zlib + license_family: Other + purls: [] + size: 850351 + timestamp: 1774072891049 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f md5: 2aadb0d17215603a82a2a6b0afd9a4cb @@ -5731,23 +13947,18 @@ packages: purls: [] size: 122618 timestamp: 1770167931827 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda - sha256: c2bcb8aa930d6ea3c9c7a64fc4fab58ad7bcac483a9a45de294f67d2f447f413 - md5: 02738ff9855946075cbd1b5274399a41 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + sha256: 71332532332d13b5dbe57074ddcf82ae711bdc132affa5a2982a29ffa06dc234 + md5: 46a21c0a4e65f1a135251fc7c8663f83 depends: - - python - - cffi >=1.11 - - zstd >=1.5.7,<1.5.8.0a0 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/zstandard?source=compressed-mapping - size: 467133 - timestamp: 1762512686069 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Zlib + license_family: Other + purls: [] + size: 124542 + timestamp: 1770167984883 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 @@ -5759,3 +13970,16 @@ packages: purls: [] size: 601375 timestamp: 1764777111296 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 + md5: 053b84beec00b71ea8ff7a4f84b55207 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 388453 + timestamp: 1764777142545 diff --git a/pixi.toml b/pixi.toml index 7cd6125..a0d1007 100644 --- a/pixi.toml +++ b/pixi.toml @@ -2,44 +2,73 @@ authors = ["energyls "] channels = ["conda-forge", "bioconda", "gurobi"] name = "shift" -platforms = ["linux-64"] +description = "Techno-economic optimization of global iron and steel supply chains under decarbonization" +platforms = ["linux-64", "win-64"] version = "0.1.0" [tasks] [dependencies] - - -python = ">=3.11,<3.14" +atlite = ">=0.3,!=0.5.0" +cartopy = ">=0.25.0" +geojson = ">=3.2.0" +geohash2 = "*" +geopandas = ">=1" +geopy = ">=2.4.1" +joblib = ">=1.3.0" +jupyter = ">=1.0" +libgdal-netcdf = ">=3.10.3" +linopy = ">=0.6.1" +matplotlib = ">=3.10.7" +netcdf4 = ">=1.7.2,!=1.7.4" +networkx = ">=3.5" +numpy = ">=1.26.4" +pandas = ">=2.1" +pycountry = ">=24.6.1" pypsa = ">=1.1.2" -pandas = ">=2.0" -numpy = ">=1.24" -matplotlib = ">=3.5" -seaborn = ">=0.13" -xarray = "==2025.6.1" -netcdf4 = ">=1.6" -cartopy = ">=0.23" -geopandas = ">=0.13" -pyproj = ">=3.0" -pyyaml = ">=6.0" -requests = ">=2.25" +python = ">=3.10" +pyyaml = "*" +scipy = ">=1.16.3" +scikit-learn = ">=1.0" +kmedoids = "*" +seaborn = ">=0.13.2" searoute = ">=1.5.0" -tqdm = ">=4.64" -country_converter = ">=0.7" -linopy = ">=0.3" -gurobi = ">=12.0.3" -# gurobipy = "*" # Gurobi is required by some solver calls; version managed via gurobi channel/license -snakemake-executor-plugin-cluster-generic = ">=1.0.9" -snakemake-executor-plugin-slurm = ">=1.9.2" +shapely = ">=2.1.2,<3" snakemake-minimal = "==9.6.2" snakemake-storage-plugin-http = ">=0.3" -snakemake-storage-plugin-cached-http = ">=0.1.0" -pycountry = ">=24.6.1" -# Further requirements -ipykernel = ">=7.0.0" -coincbc = "*" -shapely = ">=2.1.2,<3" -openpyxl = ">=3.1.5" +tqdm = "*" +xarray = ">=2026.0.0" [pypi-dependencies] -wbdata = ">=0.3.0" +# pip-installable packages (always included) +gurobipy = "*" +wbdata = ">=1.1.0" + +[feature.test.dependencies] +pytest = "*" +pytest-cov = "*" + +[feature.test.tasks] +unit-tests = "pytest tests" + +[feature.dev.dependencies] +ruff = "*" +pre-commit = "*" +pylint = "*" +ipykernel = "*" +ipython = "*" +nbqa = "*" + +[environments] +default = { features = [], solve-group = "default" } +test = { features = ["test"], solve-group = "default" } +dev = { features = ["dev", "test"], solve-group = "default" } + +[tool.ruff] +# Ruff linter configuration +line-length = 88 +target-version = "py310" +exclude = ["**/*.ipynb"] + +[tool.ruff.lint] +select = ["E", "F", "W", "I"] # Basic style, logical and import checks diff --git a/rules/preparation.smk b/rules/preparation.smk new file mode 100644 index 0000000..cfba22b --- /dev/null +++ b/rules/preparation.smk @@ -0,0 +1,125 @@ + + + +rule download_labour_data: + output: + merged="resources/merged_labour_inputs.csv", + threads: 1 + resources: + mem_mb=2000, + script: + str(SCRIPT_DIR / "download_labour_data.py") + + +rule prepare_labour_cost: + input: + merged="resources/merged_labour_inputs.csv", + output: + labour_cost="resources/labour_cost_clustered.csv", + threads: 1 + resources: + mem_mb=2000, + script: + str(SCRIPT_DIR / "prepare_labour_cost.py") + + +rule prepare_wacc: + input: + wacc="data/wacc-global.csv", + bus_locations="data/bus_locations.csv", + output: + wacc="resources/wacc-clustered.csv", + threads: 2 + resources: + mem_mb=5000, + notebook: + # "notebooks/prepare-wacc.ipynb" + str(NOTEBOOKS_DIR / "prepare-wacc.ipynb") + + +rule prepare_political_stability: + input: + political_stability="data/political-stability/globaleconomy.csv", #https://www.theglobaleconomy.com/rankings/wb_political_stability/ + bus_locations="data/bus_locations.csv", + output: + political_stability="resources/political_stability_clustered.csv", + threads: 2 + resources: + mem_mb=5000, + notebook: + str(NOTEBOOKS_DIR / "prepare-political-stability.ipynb") + + +rule prepare_chokepoints: + input: + trade_options="data/trade_opt.csv", + bus_locations="data/bus_locations.csv", + output: + trade_options_chokepoints="resources/trade_opt_chokepoints.csv", + map_chokepoints="results/figures_general/chokepoints/map_chokepoints.pdf", + map_chokepoints_png="results/figures_general/chokepoints/map_chokepoints.png", + threads: 2 + resources: + mem_mb=5000, + params: + shipping_routes=config["trade"]["shipping_routes"], + notebook: + str(NOTEBOOKS_DIR / "prepare-chokepoints.ipynb") + + +rule retrieve_iron_ore: + input: + iron_ore_production="data/owid-iron-ore/iron-ore-crude-ore-production.csv", + iron_ore_cost="data/devlin2023-supplementary.xlsx", + bus_locations="data/bus_locations.csv", + output: + iron_ore="resources/ironore-production.csv", + iron_ore_map="results/figures_general/iron_ore_map.pdf", + threads: 2 + resources: + mem_mb=5000, + notebook: + str(NOTEBOOKS_DIR / "global-iron-ore.ipynb") + + +rule prepare_iron_ore: + input: + iron_ore="resources/ironore-production.csv", + bus_locations="data/bus_locations.csv", + output: + iron_ore="resources/ironore_production_clustered.csv", + threads: 2 + resources: + mem_mb=5000, + notebook: + str(NOTEBOOKS_DIR / "prepare-iron-ore.ipynb") + + +rule prepare_steel_demand: + input: + steel_demand="data/demand/steel_demands/output_data/country_raw_steel_demand_and_dri_share.csv", + bus_locations="data/bus_locations.csv", + output: + steel_demand="resources/steel_demand_clustered_{cost_year}.csv", + threads: 2 + resources: + mem_mb=5000, + notebook: + str(NOTEBOOKS_DIR / "prepare-steel-demand.ipynb") + + +if config["enable"].get("cluster_renewables", True): + + rule cluster_renewables: + input: + merged_cdf="data/renewable_profiles_global_merged.nc", + merged_geojson="data/renewable_profiles_global_merged.geojson", + output: + clustered="resources/renewables_clustered.nc", + report="resources/renewables_clustering_report.json", + threads: 4 + resources: + mem_mb=16000, + time_min=60, + script: + str(SCRIPT_DIR / "cluster_renewables.py") diff --git a/rules/reporting.smk b/rules/reporting.smk new file mode 100644 index 0000000..d3565e8 --- /dev/null +++ b/rules/reporting.smk @@ -0,0 +1,199 @@ +"""Reporting workflow rules. + +Collects final figures and presentation artifacts produced by notebooks and the +main optimization workflow. +""" + +rule plot_regions: + output: + global_map_countries = "results/figures_general/global_map_countries.pdf", #workflow/notebooks/plot_countries.ipynb + global_map_countries_png = "results/figures_general/global_map_countries.png", #workflow/notebooks/plot_countries.ipynb + notebook: + str(NOTEBOOKS_DIR / "plot_countries.ipynb") + + +rule collect_figures: + input: + global_supply_curve = "../results/figures_general/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.pdf", #workflow/notebooks/analysis-coststructure.ipynb + global_supply_curve_png = "../results/figures_general/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.png", #workflow/notebooks/analysis-coststructure.ipynb + electricity_demand = "../results/figures_general/electricity_demand.pdf", #workflow/notebooks/analysis-electricity-demand.ipynb + electricity_demand_png = "../results/figures_general/electricity_demand.png", #workflow/notebooks/analysis-electricity-demand.ipynb + electricity_demand_steel = "../results/figures_general/electricity_demand_in_steel.pdf", #workflow/notebooks/analysis-electricity-demand.ipynb + electricity_demand_steel_png = "../results/figures_general/electricity_demand_in_steel.png", #workflow/notebooks/analysis-electricity-demand.ipynb + global_map_countries = "../results/figures_general/global_map_countries.pdf", #workflow/notebooks/plot_countries.ipynb + global_map_countries_png = "../results/figures_general/global_map_countries.png", #workflow/notebooks/plot_countries.ipynb + cost_comparison = "../results/figures_general/comparison/cost_comparison.pdf", #workflow/notebooks/compare-scenarios.ipynb + cost_comparison_png = "../results/figures_general/comparison/cost_comparison.png", #workflow/notebooks/compare-scenarios.ipynb + value_chain_comparison = "../results/figures_general/value_chain_comparison.pdf", #workflow/notebooks/analyse-steel-hbi-split.ipynb + value_chain_comparison_png = "../results/figures_general/value_chain_comparison.png", #workflow/notebooks/analyse-steel-hbi-split.ipynb + hourly_analysis = "../results/figures_general/hourly_analysis.pdf", #workflow/notebooks/analysis-hourly.ipynb + hourly_analysis_png = "../results/figures_general/hourly_analysis.png", #workflow/notebooks/analysis-hourly.ipynb + iron_ore = "../results/figures_general/trade-today/Iron_Ore_net_flow.pdf", + dri_hbi = "../results/figures_general/trade-today/DRI-HBI_net_flow.pdf", + steel_raw = "../results/figures_general/trade-today/Steel_raw_net_flow.pdf", + mga_plot = "../results/figures_general/mga/mga_analysis.pdf", # integrated in workflow + mga_plot_png = "../results/figures_general/mga/mga_analysis.png", # integrated in workflow + map_chokepoints = "../results/figures_general/chokepoints/map_chokepoints.pdf", # integrated in workflow + map_chokepoints_png = "../results/figures_general/chokepoints/map_chokepoints.png", # integrated in workflow + + +rule get_figures: + input: + [ + "results/figures_general/comparison/cost_year~2050/wacc~regional/lcox_comparison_East_Asia_East_East_Asia.pdf", + "results/figures_general/comparison/cost_year~2050/wacc~regional/lcox_comparison_South_America_Europe.pdf", + "results/figures_general/mga/chain_id~supplyconstraint/wacc~regional/mga_analysis.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~default/map_hbi.pdf", + "results/figures_general/global_map_countries.pdf", + "results/figures_general/chokepoints/map_chokepoints.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~mga-chokepoints/map_hbi_0.002.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~mga-chokepoints/map_ironore_0.002.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~mga-blocs/map_hbi_0.001.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~mga-blocs/map_ironore_0.001.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~constrain-supply/map_hbi_250.0.pdf", + "results/chain_id~supplyconstraint/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~constrain-supply/map_ironore_250.0.pdf", + "results/figures_general/global_supply_curve/chain_id~supplyconstraint/cost_year~2050/uniform/default/global_supply_curve_cost_average_hbi.pdf", + "results/figures_general/global_supply_curve/chain_id~supplyconstraint/cost_year~2050/uniform/default/global_supply_curve_cost_global_hbi.pdf", + "results/figures_general/global_supply_curve/chain_id~supplyconstraint/cost_year~2050/regional/default/global_supply_curve_cost_average_hbi.pdf", + "results/figures_general/global_supply_curve/chain_id~supplyconstraint/cost_year~2050/regional/default/global_supply_curve_cost_global_hbi.pdf", + ] + output: + [ + "results/figures_streamlined/lcox-east-asia.pdf", + "results/figures_streamlined/lcox-south-america.pdf", + "results/figures_streamlined/mga-analysis.pdf", + "results/figures_streamlined/map-hbi-opti.pdf", + "results/figures_streamlined/map-countries.pdf", + "results/figures_streamlined/map-chokepoints.pdf", + "results/figures_streamlined/map-hbi-chokepoints.pdf", + "results/figures_streamlined/map-ironore-chokepoints.pdf", + "results/figures_streamlined/map-hbi-blocs.pdf", + "results/figures_streamlined/map-ironore-blocs.pdf", + "results/figures_streamlined/map-hbi-supply.pdf", + "results/figures_streamlined/map-ironore-supply.pdf", + "results/figures_streamlined/supply-sorted-homo.pdf", + "results/figures_streamlined/supply-unsorted-homo.pdf", + "results/figures_streamlined/supply-sorted-hetero.pdf", + "results/figures_streamlined/supply-unsorted-hetero.pdf", + ] + threads: 1 + run: + for i in range(len(input)): + copyfile(input[i], output[i]) + + + +rule plot_mga: + input: + network_mga_production = "results/chain_id~{trade_chain}/cost_year~2050/interone~hbi/intertwo~eaf/wacc~{wacc}/final~steel/scenario~mga-stability-weighted/network.nc", + network_mga_chokepoints = "results/chain_id~{trade_chain}/cost_year~2050/interone~hbi/intertwo~eaf/wacc~{wacc}/final~steel/scenario~mga-chokepoints/network.nc", + network_mga_blocks = "results/chain_id~{trade_chain}/cost_year~2050/interone~hbi/intertwo~eaf/wacc~{wacc}/final~steel/scenario~mga-blocs/network.nc", + network_pareto_supply = "results/chain_id~{trade_chain}/cost_year~2050/interone~hbi/intertwo~eaf/wacc~{wacc}/final~steel/scenario~constrain-supply/network.nc", + political_stability = "resources/political_stability_clustered.csv", + trade_options_chokepoints = "resources/trade_opt_chokepoints.csv", + steel_demand = "resources/steel_demand_clustered_2050.csv", + output: + mga_plot = "results/figures_general/mga/chain_id~{trade_chain}/wacc~{wacc}/mga_analysis.pdf", + mga_plot_png = "results/figures_general/mga/chain_id~{trade_chain}/wacc~{wacc}/mga_analysis.png", + resources: + mem_mb=4000, + threads: 2 + notebook: + str(NOTEBOOKS_DIR / "plot-mga.ipynb") + +rule plot_mga_all: + input: + expand("results/figures_general/mga/chain_id~{trade_chain}/wacc~{wacc}/mga_analysis.pdf", trade_chain=[config["trade_chains"]["id"]], wacc=[config["trade_chains"]["wacc"]], allow_missing=True) #wacc=["uniform", "regional"] + + +rule plot_trade_today: + input: + baci_folder = ancient("../data/BACI_HS22_V202601"), + output: + iron_ore = "../results/figures_general/trade-today/Iron_Ore_net_flow.pdf", + iron_ore_png = "../results/figures_general/trade-today/Iron_Ore_net_flow.png", + dri_hbi = "../results/figures_general/trade-today/DRI-HBI_net_flow.pdf", + dri_hbi_png = "../results/figures_general/trade-today/DRI-HBI_net_flow.png", + steel_raw = "../results/figures_general/trade-today/Steel_raw_net_flow.pdf", + steel_raw_png = "../results/figures_general/trade-today/Steel_raw_net_flow.png", + iron_ore_csv = "../results/figures_general/trade-today/Iron_Ore_trade_iso3.csv", + dri_hbi_csv = "../results/figures_general/trade-today/DRI-HBI_trade_iso3.csv", + steel_raw_csv = "../results/figures_general/trade-today/Steel_raw_trade_iso3.csv", + script: + "notebooks/plot_todays-trade.py" + +rule plot_global_supply: + input: + trade_network="results/chain_id~{trade_chain}/cost_year~{cost_year}/interone~hbi/intertwo~eaf/wacc~{wacc}/final~steel/scenario~{scenario}/network.nc", + # supply = "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", + # supply_nodemand = "../resources/supply_curves_nodemand/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", + supply_curves_interone = expand( + "resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{interone}.csv", + allow_missing=True, region=config["regions"]), + steel_demand="resources/steel_demand_clustered_{cost_year}.csv", + output: + network_curve="results/figures_general/global_supply_curve/chain_id~{trade_chain}/cost_year~{cost_year}/{wacc}/{scenario}/global_supply_curve_{sort}_{interone}.pdf", + network_curve_png="results/figures_general/global_supply_curve/chain_id~{trade_chain}/cost_year~{cost_year}/{wacc}/{scenario}/global_supply_curve_{sort}_{interone}.png", + # supply_curves + notebook: + str(NOTEBOOKS_DIR / "analysis-globalsupplycurve.ipynb") + +rule plot_global_supply_all: + input: + expand("results/figures_general/global_supply_curve/chain_id~{trade_chain}/cost_year~{cost_year}/{wacc}/{scenario}/global_supply_curve_{sort}_{interone}.pdf", trade_chain=[config["trade_chains"]["id"]], cost_year=[2050], wacc=["regional", "uniform"], interone=["hbi"], scenario=["default"], sort=["cost_average","cost_global"], allow_missing=True) + +rule plot_comparison: + input: + default = "results/chain_id~labour_2050/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~default/network.nc", + stability = "results/chain_id~labour_2050/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~mga-stability-weighted/network_0.02.nc", + hightrans = "results/chain_id~hightrans_2050/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~default/network.nc", + output: + cost_comparison="results/figures_general/comparison/cost_comparison.pdf", + cost_comparison_png="results/figures_general/comparison/cost_comparison.png", + notebook: + str(NOTEBOOKS_DIR / "compare-scenarios.ipynb") + + +# Variables captured by the plot_compare_lcox input lambda (avoids two-argument lambda) + +# First case +_lcox_low_cost = ["East_Asia"] +_lcox_high_cost = ["East_East_Asia"] +_comparison = ["East_East_Asia", "East_Asia"] + +# Second case +# _lcox_low_cost = ["South_America"] +# _lcox_high_cost = ["Europe"] +# _comparison = ["Europe", "South_America"] + + +_lcox_quantities = [1, 10, 100] + +rule plot_compare_lcox: + params: + low_cost = _lcox_low_cost, + high_cost = _lcox_high_cost, + quantities = _lcox_quantities, + comparison = _comparison, + input: + supply_networks=lambda wildcards: expand( + "resources/lco-hbi/cost_year~{cost_year}/wacc~{wacc}/{region}_allocated_share/network_{qty}.nc", + cost_year=wildcards.cost_year, + wacc=wildcards.wacc, + region=_lcox_low_cost + _lcox_high_cost, + qty=_lcox_quantities, + ), + trade_result=lambda wildcards: ( + f"results/chain_id~{config['trade_chains']['id']}" + f"/cost_year~{wildcards.cost_year}/interone~hbi/intertwo~eaf" + f"/wacc~{wildcards.wacc}/final~steel/scenario~default/network.nc" + ), + output: + lcox_comparison="results/figures_general/comparison/cost_year~{cost_year}/wacc~{wacc}/lcox_comparison_" + f"{_lcox_low_cost[0]}" + "_" + f"{_lcox_high_cost[0]}" + ".pdf", + lcox_comparison_png="results/figures_general/comparison/cost_year~{cost_year}/wacc~{wacc}/lcox_comparison_" + f"{_lcox_low_cost[0]}" + "_" + f"{_lcox_high_cost[0]}" + ".png", + notebook: + str(NOTEBOOKS_DIR / "plot-compare-lcox.ipynb") + +rule plot_compare_lcox_all: + input: + expand("results/figures_general/comparison/cost_year~{cost_year}/wacc~{wacc}/lcox_comparison_" + f"{_lcox_low_cost[0]}" + "_" + f"{_lcox_high_cost[0]}" + ".pdf", cost_year=[2050], wacc=[config["trade_chains"]["wacc"]], low_cost=_lcox_low_cost, high_cost=_lcox_high_cost, allow_missing=True) diff --git a/rules/supply_curves.smk b/rules/supply_curves.smk new file mode 100644 index 0000000..194711e --- /dev/null +++ b/rules/supply_curves.smk @@ -0,0 +1,208 @@ +"""Supply-curve workflow rules. + +Builds technology inputs, prepares regional PyPSA networks, solves regional LCoX +problems, and aggregates the resulting supply curves. +""" + +from trade_chain_utils import route_label_for_product, get_stage_groups, get_trade_chain + + +# Helper: find the internal route label for a product from config trade_chains +def _process_label_for_product(product): + return route_label_for_product(config, product) + + +def _product_uses_renewables(product): + """Check if a product's stage group uses renewable_electricity. + + Products with renewable inputs should generate reserved/unreserved scenarios. + Products with only grid electricity should skip the unreserved variant. + """ + chain = get_trade_chain(config) + route_label = route_label_for_product(config, product) + + # Find the stage group for this product + for group in get_stage_groups(chain): + if group["label"] == route_label: + # Check if any stage in the group uses renewable_electricity + for stage in group["stages"]: + energy_inputs = stage.get("energy_inputs", []) + if "renewable_electricity" in energy_inputs: + return True + return False + + # Default to True if product not found (conservative) + return True + + +def _all_supply_curve_targets(): + targets = [] + for region in config["regions"]: + wacc = config["trade_chains"].get("wacc", "uniform") + for product in SUPPLY_CURVE_PRODUCTS: + targets.append( + f"resources/supply_curves/cost_year~2050/wacc~{wacc}/{region}_marginal_cost_{product}.csv" + ) + return targets + + +rule retrieve_cost_data: + output: + costs="resources/technology_data/costs_{cost_year}.csv", + threads: 1 + resources: + mem_mb=500, + params: + version=config["techno-economic parameters"]["pypsa_tech_version"], + script: + str(SCRIPT_DIR / "tech_database.py") + + +rule build_generic_model: + input: + costs="resources/technology_data/costs_{cost_year}.csv", + output: + skeleton="resources/generic_production_model/generic_model_{cost_year}.nc", + # Also produce one skeleton per detected stage-group so Snakemake tracks them + group_skeletons=[ + f"resources/generic_production_model/generic_model_{{cost_year}}_{(g.get('label') or 'group')}.nc" + for g in get_stage_groups(get_trade_chain(config)) + ], + threads: 1 + resources: + mem_mb=1000, + script: + str(SCRIPT_DIR / "build_x_supply_chain.py") + + +rule prepare_regional_network: + input: + # Prefer a per-stage-group skeleton when a route_label exists for the product; + # otherwise fall back to the legacy full skeleton. + skeleton=lambda wildcards: ( + f"resources/generic_production_model/generic_model_{wildcards.cost_year}_{_process_label_for_product(wildcards.product)}.nc" + if _process_label_for_product(wildcards.product) + else f"resources/generic_production_model/generic_model_{wildcards.cost_year}.nc" + ), + renewables="resources/renewables_clustered.nc", + tech_costs="resources/technology_data/costs_{cost_year}.csv", + local_demand="data/un_enerdata_demand_2050_final.csv", + wacc="resources/wacc-clustered.csv", + labour_cost="resources/labour_cost_clustered.csv", + output: + # Output keyed by product; route_label is internal to the script + network="resources/networks/base_{cost_year}_{region}_{wacc}_{product}_{scenario}.nc", + log: + "logs/prepare_regional_network_{cost_year}_{region}_{wacc}_{product}_{scenario}.log", + wildcard_constraints: + scenario="reserved|unreserved|allocated_share", + product="hbi|steel", + threads: 1 + resources: + mem_mb=2000, + params: + region="{region}", + product="{product}", + route_label=lambda wildcards: _process_label_for_product(wildcards.product), + config=config, + uniform_interest_rate=config["interest_rate"]["default"], + message: + "Preparing {wildcards.scenario} regional network: {wildcards.region} -> {wildcards.product} " + "(cost_year={wildcards.cost_year})" + script: + str(SCRIPT_DIR / "prepare_regional_network.py") + + +if config["enable"].get("run_supply_chain", True): + + rule calculate_regional_lcox: + input: + base_network="resources/networks/base_{cost_year}_{region}_{wacc}_{product}_{scenario}.nc", + local_demand="data/un_enerdata_demand_2050_final.csv", + output: + # Internal cache keyed by route_label for reuse; only products matter for supply curves + results="resources/lco-{product}/cost_year~{cost_year}/wacc~{wacc}/{region}_{scenario}/results_{product_demand_mt}.csv", + network=( + temp( + "resources/lco-{product}/cost_year~{cost_year}/wacc~{wacc}/{region}_{scenario}/network_{product_demand_mt}.nc" + ) + if not config.get("outputs", {}).get( + "keep_optimization_networks", False + ) + else "resources/lco-{product}/cost_year~{cost_year}/wacc~{wacc}/{region}_{scenario}/network_{product_demand_mt}.nc" + ), + log: + "logs/calculate_regional_lcox_{cost_year}_{region}_{wacc}_{product}_{scenario}_{product_demand_mt}.log", + wildcard_constraints: + product_demand_mt=r"\d+(?:\.\d+)?", + scenario="reserved|unreserved|allocated_share", + product="hbi|steel", + threads: 2 + resources: + mem_mb=4000, + params: + product_demand_mt="{product_demand_mt}", + compute_iis=config.get("solver", {}).get("compute_iis", False), + product="{product}", + route_label=lambda wildcards: _process_label_for_product(wildcards.product), + message: + "Calculating LCoX ({wildcards.scenario}) for {wildcards.product} in {wildcards.region} " + "(demand={wildcards.product_demand_mt} Mt/year)." + script: + str(SCRIPT_DIR / "calculate_lcox.py") + + +if config["enable"].get("run_supply_curve", True): + + rule create_supply_curve: + input: + lco_reserved=lambda wildcards: expand( + f"resources/lco-{wildcards.product}/cost_year~{wildcards.cost_year}/wacc~{wildcards.wacc}/{wildcards.region}_{{scenario}}/results_{{product_demand_mt}}.csv", + scenario=config.get("supply_curve", {}).get( + "default_scenario", "allocated_share" + ), + product_demand_mt=config.get("steel_demand_levels"), + ), + lco_unreserved=lambda wildcards: ( + expand( + f"resources/lco-{wildcards.product}/cost_year~{wildcards.cost_year}/wacc~{wildcards.wacc}/{wildcards.region}_unreserved/results_{{product_demand_mt}}.csv", + product_demand_mt=config.get("steel_demand_levels"), + ) + if config.get("supply_curve", {}).get("generate_unreserved", False) + and _product_uses_renewables(wildcards.product) + else [] + ), + skeleton="resources/generic_production_model/generic_model_{cost_year}.nc", + steel_demand="resources/steel_demand_clustered_{cost_year}.csv", + output: + # Public supply-curve artifact is product-labeled; the stage label + # is only used to locate the correct upstream LCoX runs. + supply="resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{product}.csv", + supply_unreserved=( + "resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{product}_unreserved.csv" + if config.get("supply_curve", {}).get("generate_unreserved", False) + and _product_uses_renewables("{product}") + else temp( + "resources/supply_curves_unreserved_tmp/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{product}__unreserved.csv" + ) + ), + supply_curve="resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{product}.pdf", + log: + "logs/create_supply_curve_{cost_year}_{region}_{product}_{wacc}.log", + wildcard_constraints: + product="hbi|steel", + wacc="uniform|regional", + threads: 1 + message: + "Combining LCo results (default={} + optional unreserved) to create supply curve for {{wildcards.region}} {{wildcards.product}}.".format( + config.get("supply_curve", {}).get( + "default_scenario", "allocated_share" + ) + ) + script: + str(SCRIPT_DIR / "create_supply_curve.py") + + +rule create_all_supply_curves: + input: + _all_supply_curve_targets(), diff --git a/rules/trade_model.smk b/rules/trade_model.smk new file mode 100644 index 0000000..65516e8 --- /dev/null +++ b/rules/trade_model.smk @@ -0,0 +1,68 @@ +"""Trade-model workflow rules. + +Consumes supply curves and scenario inputs to run the interregional trade model +and collect the scenario-level outputs. +""" + + +rule model_trade: + input: + supply_curves_interone=expand( + "resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{interone}.csv", + allow_missing=True, + cost_year=[2050], + region=config["regions"], + interone=["hbi"], + ), + supply_curves_intertwo=expand( + "resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_marginal_cost_{intertwo}.csv", + allow_missing=True, + cost_year=[2050], + region=config["regions"], + intertwo=["steel"], + ), + trade_options="resources/trade_opt_chokepoints.csv", + bus_locations="data/bus_locations.csv", + demand="data/un_enerdata_demand_2050_final.csv", + steel_demand="resources/steel_demand_clustered_{cost_year}.csv", + iron_ore="resources/ironore_production_clustered.csv", + grid_potential="data/grid_potential_custom.csv", + political_stability="resources/political_stability_clustered.csv", + output: + trade_result=f"results/{trade_scenarios.wildcard_pattern}/result.csv", + trade_network=f"results/{trade_scenarios.wildcard_pattern}/network.nc", + trade_plot_ironore=f"results/{trade_scenarios.wildcard_pattern}/map_ironore.pdf", + trade_plot_ironore_png=f"results/{trade_scenarios.wildcard_pattern}/map_ironore.png", + trade_plot_hbi=f"results/{trade_scenarios.wildcard_pattern}/map_hbi.pdf", + trade_plot_hbi_png=f"results/{trade_scenarios.wildcard_pattern}/map_hbi.png", + trade_plot_steel=f"results/{trade_scenarios.wildcard_pattern}/map_steel.pdf", + trade_plot_steel_png=f"results/{trade_scenarios.wildcard_pattern}/map_steel.png", + threads: 4 + params: + iron_ore_potential=config["iron_ore"]["potential_allowance"], + cost_penalty=config["design"]["cost_penalty"], + scenarios=config["scenario"], + trade=config["trade"], + script: + str(SCRIPT_DIR / "model_trade.py") + + + +rule model_trade_all: + input: + networks=expand( + "results/{scenarios}/network.nc", + scenarios=trade_scenarios.instance_patterns, + ), + results=expand( + "results/{scenarios}/result.csv", + scenarios=trade_scenarios.instance_patterns, + ), + trade_plot_ironore=expand( + "results/{scenarios}/map_ironore.pdf", + scenarios=trade_scenarios.instance_patterns, + ), + trade_plot_steel=expand( + "results/{scenarios}/map_steel.pdf", + scenarios=trade_scenarios.instance_patterns, + ), diff --git a/workflow/Snakefile b/workflow/Snakefile deleted file mode 100644 index 16ac25b..0000000 --- a/workflow/Snakefile +++ /dev/null @@ -1,427 +0,0 @@ -from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider -import sys -from email import utils -from snakemake.utils import Paramspace -import pandas as pd -from os.path import normpath, exists, isdir -from shutil import copyfile, move - -# HTTP = HTTPRemoteProvider() -sys.path.append("./scripts") - -# Read scenario definitions to construct wildcard and instance patterns from them -trade_scenarios = Paramspace(pd.read_csv("../config/trade_scenarios.csv", dtype=str)) - - -configfile: "../config/config.yaml" - -# localrules: all - -wildcard_constraints: - country="[a-zA-Z]+", - sweep="[a-zA-Z]+", - rule="(0|[1-9][0-9]?|100)" - -rule retrieve_cost_data: - params: - version=config['costs']['version'], - output: - costs="../resources/technology_data/costs_{cost_year}.csv", - resources: - mem_mb=1000, - retries: 2 - threads: 2 - script: - "scripts/retrieve_cost_data.py" - - -# Prepare the trace file prior to running the model -rule retrieve_trace_steel: - input: - trace = "../../trace-fneum/trace/resources/networks/default/{cost_year}/shipping-steel/DE-DE/network.nc" - output: - trace="../resources/trace/steel_{cost_year}.nc", - resources: - mem_mb=5000, - threads: 2 - run: - copyfile(input[0], output[0]) - - -rule prepare_wacc: - input: - wacc = "../data/wacc-global.csv", - bus_locations = "../data/bus_locations.csv", - output: - wacc = "../resources/wacc-clustered.csv" - resources: - mem_mb=5000, - threads: 2 - notebook: - "notebooks/prepare-wacc.ipynb" - - -rule prepare_political_stability: - input: - political_stability = "../data/political-stability/globaleconomy.csv", #https://www.theglobaleconomy.com/rankings/wb_political_stability/ - bus_locations = "../data/bus_locations.csv", - output: - political_stability = "../resources/political_stability_clustered.csv" - resources: - mem_mb=5000, - threads: 2 - notebook: - "notebooks/prepare-political-stability.ipynb" - - -rule prepare_chokepoints: - params: - shipping_routes=config["trade"]["shipping_routes"], - input: - trade_options = "../data/trade_opt.csv", - bus_locations = "../data/bus_locations.csv", - output: - trade_options_chokepoints = "../resources/trade_opt_chokepoints.csv", - map_chokepoints = "../results/figures_general/chokepoints/map_chokepoints.pdf", - map_chokepoints_png = "../results/figures_general/chokepoints/map_chokepoints.png", - resources: - mem_mb=5000, - threads: 2 - notebook: - "notebooks/prepare-chokepoints.ipynb" - - -rule retrieve_iron_ore: - input: - iron_ore_production = "../data/owid-iron-ore/iron-ore-crude-ore-production.csv", - iron_ore_cost = "../data/devlin2023-supplementary.xlsx", - bus_locations = "../data/bus_locations.csv", - output: - iron_ore = "../resources/ironore-production.csv", - iron_ore_map = "../results/figures_general/iron_ore_map.pdf", - resources: - mem_mb=5000, - threads: 2 - notebook: - "notebooks/global-iron-ore.ipynb" - - -rule prepare_iron_ore: - input: - iron_ore = "../resources/ironore-production.csv", - bus_locations = "../data/bus_locations.csv", - output: - iron_ore = "../resources/ironore_production_clustered.csv", - resources: - mem_mb=5000, - threads: 2 - notebook: - "notebooks/prepare-iron-ore.ipynb" - - -rule prepare_steel_demand: - input: - steel_demand = "../data/demand/steel_demands/output_data/country_raw_steel_demand_and_dri_share.csv", - bus_locations = "../data/bus_locations.csv", - output: - steel_demand = '../resources/steel_demand_clustered_{cost_year}.csv', - resources: - mem_mb=5000, - threads: 2 - notebook: - "notebooks/prepare-steel-demand.ipynb" - - - -if config["enable"].get("run_supply_chain", True): - # Individual model calculating the LCoH for up to 60% of maximum potential as demand - # Stores the resulting LCoH in a csv file - rule model_lcoh: - message: - "Calculating LCoH for region {wildcards.region} for {wildcards.demand_factor}% of estimated maximum hydrogen potential." - input: - supply_data ="../data/new_renewables/supply_{region}_2013_cleaned.nc", - costs = "../resources/technology_data/costs_{cost_year}.csv" - output: - results="../resources/lcoh/cost_year~{cost_year}/{region}/results_{demand_factor}.csv", - network="../resources/lcoh/cost_year~{cost_year}/{region}/network_{demand_factor}.nc", - threads: 4 - script: - "scripts/model_lcoh.py" - - rule model_lcox: - message: - "Calculating the LCoX of {wildcards.product} for region {wildcards.region} for {wildcards.demand_factor}% of estimated maximum product potential." - params: - interest_rate=config["interest_rate"], - # region_specific_wacc=config["region-specific-wacc"], - input: - supply_data ="../data/new_renewables/supply_{region}_2013_cleaned.nc", - costs = "../resources/technology_data/costs_{cost_year}.csv", - trace = "../resources/trace/steel_{cost_year}.nc", - wacc = "../resources/wacc-clustered.csv", - output: - results="../resources/lco-{product}/cost_year~{cost_year}/wacc~{wacc}/{region}/results_{demand_factor}.csv", - network="../resources/lco-{product}/cost_year~{cost_year}/wacc~{wacc}/{region}/network_{demand_factor}.nc", - threads: 4 - resources: - mem_mb=8000, - script: - "scripts/model_lcox.py" - - -# Read all the individual LCoH values for one region and combine them into a supply curve -# stored as a single csv file per region. Note: the visiual plot includes iron ore costs, the csv without since it is added later in the workflow. - -if config["enable"].get("run_supply_curve", True): - rule create_supply_curve: - message: - "Combining individual LCo{wildcards.product[0]} results to create a supply curve for region {wildcards.region}." - input: - lco_product_data = lambda wildcards: expand( - f"../resources/lco-{wildcards.product}/cost_year~{wildcards.cost_year}/wacc~{wildcards.wacc}/{wildcards.region}/results_{{demand_factor}}.csv", - demand_factor=config["demand_factors"], - allow_missing=True - ), - local_demand = "../data/un_enerdata_demand_2050_final.csv", - steel_demand = "../resources/steel_demand_clustered_{cost_year}.csv", - output: - supply = "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", - supply_nodemand = "../resources/supply_curves_nodemand/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", - supply_curve = "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.pdf", - threads: 2 - script: - "scripts/create_supply_curve.py" - - - -rule create_all_supply_curves: - input: - expand( - "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", - cost_year=[2030,2050], wacc=["uniform"], region=config["regions"], product=["steel"], allow_missing=True - ) #cost_year=[2030,2050], region=config["regions"], product=["steel", "hydrogen"] - - -rule model_trade: - params: - iron_ore_potential=config["iron_ore"]["potential_allowance"], - cost_penalty=config["design"]["cost_penalty"], - scenarios=config["scenario"], - interest_rate=config["interest_rate"], - # region_specific_wacc=config["region-specific-wacc"], - diversity_factor=config["trade"]["diversity_factor"], - input: - supply_curves_interone = expand( - "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{interone}.csv", - allow_missing=True, region=config["regions"]), - supply_curves_intertwo = expand( - "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{intertwo}.csv", - allow_missing=True, region=config["regions"]), - # supply_curves_final = expand( - # "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{final}.csv", - # allow_missing=True, region=config["regions"]), - transport_costs = "../data/transport_costs/steel_r_iron_r.csv", - trade_options = "../resources/trade_opt_chokepoints.csv", - bus_locations = "../data/bus_locations.csv", - demand = "../data/un_enerdata_demand_2050_final.csv", - steel_demand = "../resources/steel_demand_clustered_{cost_year}.csv", - iron_ore = "../resources/ironore_production_clustered.csv", - grid_potential = "../data/grid_potential_custom.csv", - wacc = "../resources/wacc-clustered.csv", - political_stability = "../resources/political_stability_clustered.csv", - output: - trade_result = f"../results/{trade_scenarios.wildcard_pattern}/result.csv", - trade_network = f"../results/{trade_scenarios.wildcard_pattern}/network.nc", - trade_plot_ironore = f"../results/{trade_scenarios.wildcard_pattern}/map_ironore.pdf", - trade_plot_ironore_png = f"../results/{trade_scenarios.wildcard_pattern}/map_ironore.png", - trade_plot_hbi = f"../results/{trade_scenarios.wildcard_pattern}/map_hbi.pdf", - trade_plot_hbi_png = f"../results/{trade_scenarios.wildcard_pattern}/map_hbi.png", - trade_plot_steel = f"../results/{trade_scenarios.wildcard_pattern}/map_steel.pdf", - trade_plot_steel_png = f"../results/{trade_scenarios.wildcard_pattern}/map_steel.png", - threads: 4 - script: - "scripts/model_trade.py" - - -rule plot_mga: - input: - network_mga_production = "../results/cost_year~2050/interone~hbi/intertwo~eaf-grid/final~steel/wacc~{wacc}/scenario~mga-stability-weighted/network.nc", - network_mga_chokepoints = "../results/cost_year~2050/interone~hbi/intertwo~eaf-grid/final~steel/wacc~{wacc}/scenario~mga-chokepoints/network.nc", - network_mga_blocks = "../results/cost_year~2050/interone~hbi/intertwo~eaf-grid/final~steel/wacc~{wacc}/scenario~mga-blocs/network.nc", - political_stability = "../resources/political_stability_clustered.csv", - trade_options_chokepoints = "../resources/trade_opt_chokepoints.csv", - output: - mga_plot = "../results/figures_general/mga/wacc~{wacc}/mga_analysis.pdf", - mga_plot_png = "../results/figures_general/mga/wacc~{wacc}/mga_analysis.png", - resources: - mem_mb=4000, - threads: 2 - notebook: - "notebooks/plot-mga.ipynb" - -rule plot_mga_all: - input: - expand("../results/figures_general/mga/wacc~{wacc}/mga_analysis.pdf", wacc=["regional"], allow_missing=True) #wacc=["uniform", "regional"] - - -# Povide a rule which triggers creation of all scenarios listed (= rows) in 'scenarios/trade_scenarios.csv' -rule model_trade_all: - input: - networks=expand("../results/{scenarios}/network.nc", scenarios=trade_scenarios.instance_patterns), - results=expand("../results/{scenarios}/result.csv", scenarios=trade_scenarios.instance_patterns), - trade_plot_ironore=expand("../results/{scenarios}/map_ironore.pdf", scenarios=trade_scenarios.instance_patterns), - trade_plot_steel=expand("../results/{scenarios}/map_steel.pdf", scenarios=trade_scenarios.instance_patterns), - -rule plot_trade_today: - input: - baci_folder = ancient("../data/BACI_HS22_V202601"), - output: - iron_ore = "../results/figures_general/trade-today/Iron_Ore_net_flow.pdf", - iron_ore_png = "../results/figures_general/trade-today/Iron_Ore_net_flow.png", - dri_hbi = "../results/figures_general/trade-today/DRI-HBI_net_flow.pdf", - dri_hbi_png = "../results/figures_general/trade-today/DRI-HBI_net_flow.png", - steel_raw = "../results/figures_general/trade-today/Steel_raw_net_flow.pdf", - steel_raw_png = "../results/figures_general/trade-today/Steel_raw_net_flow.png", - iron_ore_csv = "../results/figures_general/trade-today/Iron_Ore_trade_iso3.csv", - dri_hbi_csv = "../results/figures_general/trade-today/DRI-HBI_trade_iso3.csv", - steel_raw_csv = "../results/figures_general/trade-today/Steel_raw_trade_iso3.csv", - script: - "notebooks/plot_todays-trade.py" - - -rule plot_global_supply: - input: - trade_network="../results/cost_year~{cost_year}/interone~hbi/intertwo~eaf-grid/final~steel/wacc~{wacc}/scenario~{scenario}/network.nc", - # supply = "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", - # supply_nodemand = "../resources/supply_curves_nodemand/cost_year~{cost_year}/wacc~{wacc}/{region}_{product}.csv", - supply_curves_interone = expand( - "../resources/supply_curves/cost_year~{cost_year}/wacc~{wacc}/{region}_{interone}.csv", - allow_missing=True, region=config["regions"]), - supply_curves_interone_nodemand = expand( - "../resources/supply_curves_nodemand/cost_year~{cost_year}/wacc~{wacc}/{region}_{interone}.csv", - allow_missing=True, region=config["regions"]), - output: - network_curve="../results/figures_general/global_supply_curve/cost_year~{cost_year}/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.pdf", - network_curve_png="../results/figures_general/global_supply_curve/cost_year~{cost_year}/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.png", - # supply_curves - notebook: - "notebooks/analysis-globalsupplycurve.ipynb" - -rule plot_global_supply_all: - input: - expand("../results/figures_general/global_supply_curve/cost_year~{cost_year}/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.pdf", cost_year=[2050], wacc=["regional"], interone=["hbi"], scenario=["default"], sort=[True,False], demand=[True,False], allow_missing=True) - - -rule collect_figures: - input: - global_supply_curve = "../results/figures_general/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.pdf", #workflow/notebooks/analysis-coststructure.ipynb - global_supply_curve_png = "../results/figures_general/{wacc}/{scenario}/global_supply_curve_{sort}_demand_{demand}_{interone}.png", #workflow/notebooks/analysis-coststructure.ipynb - electricity_demand = "../results/figures_general/electricity_demand.pdf", #workflow/notebooks/analysis-electricity-demand.ipynb - electricity_demand_png = "../results/figures_general/electricity_demand.png", #workflow/notebooks/analysis-electricity-demand.ipynb - electricity_demand_steel = "../results/figures_general/electricity_demand_in_steel.pdf", #workflow/notebooks/analysis-electricity-demand.ipynb - electricity_demand_steel_png = "../results/figures_general/electricity_demand_in_steel.png", #workflow/notebooks/analysis-electricity-demand.ipynb - global_map_countries = "../results/figures_general/global_map_countries.pdf", #workflow/notebooks/plot_countries.ipynb - global_map_countries_png = "../results/figures_general/global_map_countries.png", #workflow/notebooks/plot_countries.ipynb - cost_comparison = "../results/figures_general/comparison/cost_comparison.pdf", #workflow/notebooks/compare-scenarios.ipynb - cost_comparison_png = "../results/figures_general/comparison/cost_comparison.png", #workflow/notebooks/compare-scenarios.ipynb - value_chain_comparison = "../results/figures_general/value_chain_comparison.pdf", #workflow/notebooks/analyse-steel-hbi-split.ipynb - value_chain_comparison_png = "../results/figures_general/value_chain_comparison.png", #workflow/notebooks/analyse-steel-hbi-split.ipynb - hourly_analysis = "../results/figures_general/hourly_analysis.pdf", #workflow/notebooks/analysis-hourly.ipynb - hourly_analysis_png = "../results/figures_general/hourly_analysis.png", #workflow/notebooks/analysis-hourly.ipynb - iron_ore = "../results/figures_general/trade-today/Iron_Ore_net_flow.pdf", - dri_hbi = "../results/figures_general/trade-today/DRI-HBI_net_flow.pdf", - steel_raw = "../results/figures_general/trade-today/Steel_raw_net_flow.pdf", - mga_plot = "../results/figures_general/mga/mga_analysis.pdf", # integrated in workflow - mga_plot_png = "../results/figures_general/mga/mga_analysis.png", # integrated in workflow - map_chokepoints = "../results/figures_general/chokepoints/map_chokepoints.pdf", # integrated in workflow - map_chokepoints_png = "../results/figures_general/chokepoints/map_chokepoints.png", # integrated in workflow - - -### Additional rules - -rule create_hydrogen_supply_curve_with_demand: - message: - "Combining individual LCoH results to create a supply curve for region {wildcards.region} with demand lines." - input: - lcoh_data = expand( - "../resources/lcoh/cost_year~{cost_year}/{region}/results_{demand_factor}.csv", - demand_factor=config["demand_factors"], - allow_missing=True, - ), - final_demand_data = "../data/un_enerdata_demand_2050_final.csv" - output: - supply_curve="../resources/supply_curves_subtracted_with_demand/cost_year~{cost_year}/{region}_hydrogen.pdf" - script: - "scripts/create_hydrogen_supply_curve_with_demand.py" -rule create_all_supply_curves_with_demand: - input: - expand( - "../resources/supply_curves_subtracted_with_demand/cost_year~{cost_year}/{region}_hydrogen.pdf", cost_year=[2030,2050], region=config["regions"], allow_missing=True - ) - - -# rule model_trade_singlestage: -# input: -# supply_curves = expand( -# "../resources/supply_curves/cost_year~{cost_year}/{region}_{product}.csv", -# allow_missing=True, region=config["regions"] ), -# transport_costs = "../data/transport_costs/{transport_cost}.csv", -# trade_options = "../data/trade_opt.csv", -# bus_locations = "../data/bus_locations.csv", -# demand = "../data/un_enerdata_demand_2050_final.csv", -# steel_demand = "../resources/steel_production_clustered.csv", -# output: -# trade_result = f"../results/{trade_scenarios.wildcard_pattern}/result.csv", -# trade_network = f"../results/{trade_scenarios.wildcard_pattern}/network.nc", -# trade_plot = f"../results/{trade_scenarios.wildcard_pattern}/plot.pdf" -# script: -# "scripts/model_trade_singlestage.py" - - -### Toolkit - -# Under development -# rule input_cost_comp: -# message: -# "Comparing input costs" - -# notebook: -# "workflow/notebooks/input-cost-comp.ipynb" - - -rule sync: - # """ - # Synchronize the WSL repo ~/git/shift to Windows J:\\wsl-sync\\shift using rsync. - # - Preserves times, symlinks, and directory structure. - # - Deletes files on the destination that no longer exist in the source. - # - Excludes common VCS/temporary files. - # """ - # Use a phony target so you can run: snakemake sync_shift_repo - shell: - r""" - set -euo pipefail - - SRC="$HOME/git/shift/" - DEST="/mnt/j/wsl-sync/shift" - - # Ensure destination directory exists - mkdir -p "$DEST" - - # Rsync options explained: - # -a : archive mode (recursive, preserves symlinks, times, etc.) - # -v : verbose - # -h : human-readable numbers - # --delete : remove files in DEST not present in SRC (mirror behavior) - # --checksum (optional): compare file content not just mtimes/size (slower, safer) - # --exclude-from: filter file for ignores - # --info=progress2: nice single-line progress - # --no-perms/--no-group: avoid NTFS permission warnings on WSL - rsync -avh --delete \ - --info=progress2 \ - --no-perms --no-group \ - "$SRC" "$DEST" - - # # Stamp the phony output so Snakemake considers the rule done - # touch {output} - """ \ No newline at end of file diff --git a/workflow/notebooks/_helpers.py b/workflow/notebooks/_helpers_notebooks.py similarity index 93% rename from workflow/notebooks/_helpers.py rename to workflow/notebooks/_helpers_notebooks.py index c2bcfaa..65a9afe 100644 --- a/workflow/notebooks/_helpers.py +++ b/workflow/notebooks/_helpers_notebooks.py @@ -1,29 +1,17 @@ -import calendar -import io import logging import os -import shutil -import subprocess -import sys -import time -import zipfile -from datetime import datetime, timedelta from pathlib import Path -import country_converter as coco -import geopandas as gpd -import numpy as np -import pandas as pd import requests import yaml # from fake_useragent import UserAgent # from pypsa.components import component_attrs, components -from shapely.geometry import Point from tqdm import tqdm logger = logging.getLogger(__name__) + def load_config(config): with open(config, "r") as stream: try: @@ -62,7 +50,6 @@ def mock_snakemake( keyword arguments fixing the wildcards. Only necessary if wildcards are needed. """ - import os import snakemake as sm from pypsa.definitions.structures import Dict @@ -79,7 +66,7 @@ def mock_snakemake( script_dir = Path(__file__).parent.resolve() if root_dir is None: - root_dir = script_dir.parent + root_dir = script_dir.parent.parent else: root_dir = Path(root_dir).resolve() @@ -187,4 +174,4 @@ def progress_retrieve(url, file, disable=False): with open(file, "wb") as f: for data in response.iter_content(chunk_size=chunk_size): f.write(data) - t.update(len(data)) \ No newline at end of file + t.update(len(data)) diff --git a/workflow/notebooks/analysis-basemodel.ipynb b/workflow/notebooks/analysis-basemodel.ipynb index d45880b..46b5572 100644 --- a/workflow/notebooks/analysis-basemodel.ipynb +++ b/workflow/notebooks/analysis-basemodel.ipynb @@ -8,7 +8,6 @@ "outputs": [], "source": [ "import pypsa\n", - "import pandas as pd\n", "import numpy as np\n", "import xarray as xr" ] @@ -132,7 +131,7 @@ "metadata": {}, "outputs": [], "source": [ - "(n.generators.p_nom_opt/n.generators.p_nom_max * 100).round(2)" + "(n.generators.p_nom_opt / n.generators.p_nom_max * 100).round(2)" ] }, { @@ -188,7 +187,7 @@ "metadata": {}, "outputs": [], "source": [ - "pypsatopo.generate(n, file_format = \"png\", file_output = output_fn)" + "pypsatopo.generate(n, file_format=\"png\", file_output=output_fn)" ] }, { @@ -207,6 +206,7 @@ "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", + "\n", "n.statistics.energy_balance(aggregate_time=False, comps=[\"Store\"]).droplevel(0).iloc[\n", " :, :\n", "].groupby(\"carrier\").sum().T.plot.line()\n", @@ -225,7 +225,6 @@ "metadata": {}, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots()\n", "n.statistics.energy_balance(aggregate_time=False).loc[:, :, \"el\"].droplevel(0).iloc[\n", " :, :4000\n", diff --git a/workflow/notebooks/analysis-coststructure.ipynb b/workflow/notebooks/analysis-coststructure.ipynb index 35a5f4d..8641ce1 100644 --- a/workflow/notebooks/analysis-coststructure.ipynb +++ b/workflow/notebooks/analysis-coststructure.ipynb @@ -8,9 +8,6 @@ "outputs": [], "source": [ "import pypsa\n", - "import pandas as pd\n", - "import numpy as np\n", - "import xarray as xr\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", @@ -22,15 +19,45 @@ "execution_count": null, "id": "2fe8468f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "WildcardError", + "evalue": "Wildcards in input files cannot be determined from output files: (rule collect_figures, line 8, /mnt/c/Users/scl38887/Documents/git/shift/rules/reporting.smk)\n'interone'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/io/__init__.py:1140\u001b[39m, in \u001b[36mapply_wildcards..format_match\u001b[39m\u001b[34m(match)\u001b[39m\n\u001b[32m 1139\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1140\u001b[39m value = \u001b[43mwildcards\u001b[49m\u001b[43m[\u001b[49m\u001b[43mname\u001b[49m\u001b[43m]\u001b[49m\n\u001b[32m 1141\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mstr\u001b[39m(value) \u001b[38;5;66;03m# convert anything into a str\u001b[39;00m\n", + "\u001b[31mKeyError\u001b[39m: 'interone'", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[31mWildcardError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/rules.py:875\u001b[39m, in \u001b[36mRule.expand_input\u001b[39m\u001b[34m(self, wildcards, groupid)\u001b[39m\n\u001b[32m 874\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m875\u001b[39m incomplete = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_apply_wildcards\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 876\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 877\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43minput\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 878\u001b[39m \u001b[43m \u001b[49m\u001b[43mwildcards\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 879\u001b[39m \u001b[43m \u001b[49m\u001b[43mconcretize\u001b[49m\u001b[43m=\u001b[49m\u001b[43mconcretize_iofile\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 880\u001b[39m \u001b[43m \u001b[49m\u001b[43mmapping\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmapping\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 881\u001b[39m \u001b[43m \u001b[49m\u001b[43mincomplete_checkpoint_func\u001b[49m\u001b[43m=\u001b[49m\u001b[43mhandle_incomplete_checkpoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 882\u001b[39m \u001b[43m \u001b[49m\u001b[43mpath_modifier\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43minput_modifier\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 883\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mproperty\u001b[39;49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43minput\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 884\u001b[39m \u001b[43m \u001b[49m\u001b[43mgroupid\u001b[49m\u001b[43m=\u001b[49m\u001b[43mgroupid\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 885\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 886\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m WildcardError \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/rules.py:835\u001b[39m, in \u001b[36mRule._apply_wildcards\u001b[39m\u001b[34m(self, newitems, olditems, wildcards, concretize, check_return_type, omit_callable, mapping, no_flattening, aux_params, path_modifier, property, incomplete_checkpoint_func, allow_unpack, groupid, non_derived_items)\u001b[39m\n\u001b[32m 831\u001b[39m item_ = \u001b[38;5;28mself\u001b[39m.apply_path_modifier(\n\u001b[32m 832\u001b[39m item_, path_modifier, \u001b[38;5;28mproperty\u001b[39m=\u001b[38;5;28mproperty\u001b[39m\n\u001b[32m 833\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m835\u001b[39m concrete = \u001b[43mconcretize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mitem_\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwildcards\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfrom_callable\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 836\u001b[39m newitems.append(concrete)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/rules.py:865\u001b[39m, in \u001b[36mRule.expand_input..concretize_iofile\u001b[39m\u001b[34m(f, wildcards, from_callable)\u001b[39m\n\u001b[32m 864\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m865\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mapply_wildcards\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwildcards\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/io/__init__.py:866\u001b[39m, in \u001b[36m_IOFile.apply_wildcards\u001b[39m\u001b[34m(self, wildcards)\u001b[39m\n\u001b[32m 864\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 865\u001b[39m file_with_wildcards_applied = IOFile(\n\u001b[32m--> \u001b[39m\u001b[32m866\u001b[39m \u001b[43mapply_wildcards\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwildcards\u001b[49m\u001b[43m)\u001b[49m,\n\u001b[32m 867\u001b[39m rule=\u001b[38;5;28mself\u001b[39m.rule,\n\u001b[32m 868\u001b[39m )\n\u001b[32m 869\u001b[39m file_with_wildcards_applied.clone_flags(\u001b[38;5;28mself\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/io/__init__.py:1145\u001b[39m, in \u001b[36mapply_wildcards\u001b[39m\u001b[34m(pattern, wildcards)\u001b[39m\n\u001b[32m 1143\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m WildcardError(\u001b[38;5;28mstr\u001b[39m(ex))\n\u001b[32m-> \u001b[39m\u001b[32m1145\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mWILDCARD_REGEX\u001b[49m\u001b[43m.\u001b[49m\u001b[43msub\u001b[49m\u001b[43m(\u001b[49m\u001b[43mformat_match\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpattern\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/io/__init__.py:1143\u001b[39m, in \u001b[36mapply_wildcards..format_match\u001b[39m\u001b[34m(match)\u001b[39m\n\u001b[32m 1142\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m ex:\n\u001b[32m-> \u001b[39m\u001b[32m1143\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m WildcardError(\u001b[38;5;28mstr\u001b[39m(ex))\n", + "\u001b[31mWildcardError\u001b[39m: 'interone'", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[31mWildcardError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m_helpers_notebooks\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m mock_snakemake\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m snakemake = \u001b[43mmock_snakemake\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcollect_figures\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[43m \u001b[49m\u001b[43mscenario\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmga-nwa-iso\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# \"\", # penalty-sa, penalty-ea, penalty-nwa, penalty-oc\u001b[39;49;00m\n\u001b[32m 6\u001b[39m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcost_average\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 7\u001b[39m \u001b[43m \u001b[49m\u001b[43mdemand\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 8\u001b[39m \u001b[43m \u001b[49m\u001b[43mwacc\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43muniform\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\n\u001b[32m 9\u001b[39m \u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m/mnt/c/Users/scl38887/Documents/git/shift/workflow/notebooks/_helpers_notebooks.py:123\u001b[39m, in \u001b[36mmock_snakemake\u001b[39m\u001b[34m(rulename, root_dir, configfiles, submodule_dir, **wildcards)\u001b[39m\n\u001b[32m 121\u001b[39m dag = sm.dag.DAG(workflow, rules=[rule])\n\u001b[32m 122\u001b[39m wc = Dict(wildcards)\n\u001b[32m--> \u001b[39m\u001b[32m123\u001b[39m job = \u001b[43msm\u001b[49m\u001b[43m.\u001b[49m\u001b[43mjobs\u001b[49m\u001b[43m.\u001b[49m\u001b[43mJob\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrule\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdag\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwc\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 125\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mmake_accessable\u001b[39m(*ios):\n\u001b[32m 126\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m io \u001b[38;5;129;01min\u001b[39;00m ios:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/jobs.py:244\u001b[39m, in \u001b[36mJob.__init__\u001b[39m\u001b[34m(self, rule, dag, wildcards_dict, format_wildcards, targetfile, groupid)\u001b[39m\n\u001b[32m 232\u001b[39m \u001b[38;5;28mself\u001b[39m.wildcards = Wildcards(fromdict=\u001b[38;5;28mself\u001b[39m.wildcards_dict)\n\u001b[32m 233\u001b[39m \u001b[38;5;28mself\u001b[39m._format_wildcards = (\n\u001b[32m 234\u001b[39m \u001b[38;5;28mself\u001b[39m.wildcards\n\u001b[32m 235\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m format_wildcards \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 236\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m Wildcards(fromdict=format_wildcards)\n\u001b[32m 237\u001b[39m )\n\u001b[32m 239\u001b[39m (\n\u001b[32m 240\u001b[39m \u001b[38;5;28mself\u001b[39m.input,\n\u001b[32m 241\u001b[39m input_mapping,\n\u001b[32m 242\u001b[39m \u001b[38;5;28mself\u001b[39m.dependencies,\n\u001b[32m 243\u001b[39m \u001b[38;5;28mself\u001b[39m.incomplete_input_expand,\n\u001b[32m--> \u001b[39m\u001b[32m244\u001b[39m ) = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrule\u001b[49m\u001b[43m.\u001b[49m\u001b[43mexpand_input\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mwildcards_dict\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgroupid\u001b[49m\u001b[43m=\u001b[49m\u001b[43mgroupid\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 246\u001b[39m \u001b[38;5;28mself\u001b[39m.output, output_mapping = \u001b[38;5;28mself\u001b[39m.rule.expand_output(\u001b[38;5;28mself\u001b[39m.wildcards_dict)\n\u001b[32m 247\u001b[39m \u001b[38;5;66;03m# other properties are lazy to be able to use additional parameters and check already existing files\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/envs/shift/lib/python3.12/site-packages/snakemake/rules.py:887\u001b[39m, in \u001b[36mRule.expand_input\u001b[39m\u001b[34m(self, wildcards, groupid)\u001b[39m\n\u001b[32m 875\u001b[39m incomplete = \u001b[38;5;28mself\u001b[39m._apply_wildcards(\n\u001b[32m 876\u001b[39m \u001b[38;5;28minput\u001b[39m,\n\u001b[32m 877\u001b[39m \u001b[38;5;28mself\u001b[39m.input,\n\u001b[32m (...)\u001b[39m\u001b[32m 884\u001b[39m groupid=groupid,\n\u001b[32m 885\u001b[39m )\n\u001b[32m 886\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m WildcardError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m--> \u001b[39m\u001b[32m887\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m WildcardError(\n\u001b[32m 888\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mWildcards in input files cannot be determined from output files:\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 889\u001b[39m \u001b[38;5;28mstr\u001b[39m(e),\n\u001b[32m 890\u001b[39m rule=\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 891\u001b[39m )\n\u001b[32m 893\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.dependencies:\n\u001b[32m 894\u001b[39m dependencies = {\n\u001b[32m 895\u001b[39m f: \u001b[38;5;28mself\u001b[39m.dependencies[f_]\n\u001b[32m 896\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m f, f_ \u001b[38;5;129;01min\u001b[39;00m mapping.items()\n\u001b[32m 897\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m f_ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.dependencies\n\u001b[32m 898\u001b[39m }\n", + "\u001b[31mWildcardError\u001b[39m: Wildcards in input files cannot be determined from output files: (rule collect_figures, line 8, /mnt/c/Users/scl38887/Documents/git/shift/rules/reporting.smk)\n'interone'" + ] + } + ], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks_notebooks import mock_snakemake\n", + "\n", "snakemake = mock_snakemake(\n", - " \"collect_figures\",\n", - " scenario=\"mga-nwa-iso\", #\"\", # penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", - " sort=\"cost_average\",\n", - " demand=False,\n", - " )" + " \"collect_figures\",\n", + " scenario=\"mga-nwa-iso\", # \"\", # penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", + " sort=\"cost_average\",\n", + " demand=False,\n", + " wacc=\"uniform\"\n", + ")" ] }, { @@ -60,7 +87,9 @@ "source": [ "trade_model = f\"../../results/cost_year~2050/interone~hbi/intertwo~eaf-grid/final~steel/scenario~{scenario}/network.nc\"\n", "# single_region = \"../../resources/lcos/cost_year~2030/Europe/network_1.nc\" # old\n", - "single_region = \"../../resources/lco-steel/cost_year~2030/South_South_America/network_1.nc\"" + "single_region = (\n", + " \"../../resources/lco-steel/cost_year~2030/South_South_America/network_1.nc\"\n", + ")" ] }, { @@ -107,7 +136,7 @@ "outputs": [], "source": [ "iron_ore_cost = n.generators[n.generators.carrier == \"iron_ore\"].marginal_cost.mean()\n", - "iron_ore_to_steel = 1/n.links[n.links.carrier == 'steel'].efficiency.mean()\n", + "iron_ore_to_steel = 1 / n.links[n.links.carrier == \"steel\"].efficiency.mean()\n", "iron_ore_cost_notransport = iron_ore_cost * iron_ore_to_steel\n", "print(f\"Iron ore cost (w/o transport): {iron_ore_cost_notransport:.2f} €/t_steel\")" ] @@ -136,19 +165,29 @@ "outputs": [], "source": [ "# Steel supply cost distribution per region (boxplot), including iron ore cost w/o transport\n", - "steel_links = n.links[n.links.carrier == 'steel'].copy()\n", - "steel_links['region'] = steel_links['bus1'].str.replace('_ore$', '', regex=True)\n", + "steel_links = n.links[n.links.carrier == \"steel\"].copy()\n", + "steel_links[\"region\"] = steel_links[\"bus1\"].str.replace(\"_ore$\", \"\", regex=True)\n", "# Add iron ore cost w/o transport to each steel supply cost. The marginal cost of steel links refers to bus0, so an adjustment to steel (bus1) is required\n", - "steel_links['total_cost'] = steel_links['marginal_cost'] * iron_ore_to_steel + iron_ore_cost_notransport\n", + "steel_links[\"total_cost\"] = (\n", + " steel_links[\"marginal_cost\"] * iron_ore_to_steel + iron_ore_cost_notransport\n", + ")\n", "\n", "fig, ax = plt.subplots(figsize=(7, 5))\n", - "sns.boxplot(x='region', y='total_cost', data=steel_links, ax=ax, width=0.5, color='steelblue', fliersize=3)\n", - "ax.set_ylabel('Steel supply cost incl. iron ore (€/t_product)')\n", - "ax.set_xlabel('Region')\n", - "ax.set_title('Steel supply cost distribution per region (incl. iron ore material cost)')\n", + "sns.boxplot(\n", + " x=\"region\",\n", + " y=\"total_cost\",\n", + " data=steel_links,\n", + " ax=ax,\n", + " width=0.5,\n", + " color=\"steelblue\",\n", + " fliersize=3,\n", + ")\n", + "ax.set_ylabel(\"Steel supply cost incl. iron ore (€/t_product)\")\n", + "ax.set_xlabel(\"Region\")\n", + "ax.set_title(\"Steel supply cost distribution per region (incl. iron ore material cost)\")\n", "ax.set_xticklabels(ax.get_xticklabels(), rotation=90)\n", "ax.set_ylim(0, None)\n", - "ax.grid(axis='y')\n", + "ax.grid(axis=\"y\")\n", "plt.tight_layout()\n", "plt.show()" ] @@ -168,8 +207,11 @@ "metadata": {}, "outputs": [], "source": [ - "costs_per_carrier = n_ssa.statistics.system_cost() / n_ssa.statistics.energy_balance().loc[\"Load\",\"Steel\",\"Steel\"]\n", - "costs_per_carrier #.sum()" + "costs_per_carrier = (\n", + " n_ssa.statistics.system_cost()\n", + " / n_ssa.statistics.energy_balance().loc[\"Load\", \"Steel\", \"Steel\"]\n", + ")\n", + "costs_per_carrier # .sum()" ] }, { @@ -184,18 +226,18 @@ "costs = costs.groupby(level=\"carrier\").sum()\n", "\n", "fig, ax = plt.subplots(figsize=(6, 4))\n", - "colors = sns.color_palette('Set2', len(costs))\n", - "ax.bar(['Total'], [costs.sum()], color='lightgrey', label='Total')\n", + "colors = sns.color_palette(\"Set2\", len(costs))\n", + "ax.bar([\"Total\"], [costs.sum()], color=\"lightgrey\", label=\"Total\")\n", "bottom = 0\n", "for i, (carrier, value) in enumerate(zip(costs.index, costs.values)):\n", - " ax.bar(['Total'], [value], bottom=bottom, color=colors[i], label=carrier)\n", + " ax.bar([\"Total\"], [value], bottom=bottom, color=colors[i], label=carrier)\n", " bottom += value\n", - "ax.set_ylabel('Cost (€/t_steel)')\n", - "ax.set_xlabel('Carrier')\n", - "ax.set_title('Steel supply costs single region (w/o iron ore material cost)')\n", - "ax.grid(axis='y', alpha=0.4, zorder=0)\n", - "ax.legend(title='Carrier', bbox_to_anchor=(1.05, 1), loc='upper left')\n", - "ax.set_ylim(0,500)\n", + "ax.set_ylabel(\"Cost (€/t_steel)\")\n", + "ax.set_xlabel(\"Carrier\")\n", + "ax.set_title(\"Steel supply costs single region (w/o iron ore material cost)\")\n", + "ax.grid(axis=\"y\", alpha=0.4, zorder=0)\n", + "ax.legend(title=\"Carrier\", bbox_to_anchor=(1.05, 1), loc=\"upper left\")\n", + "ax.set_ylim(0, 500)\n", "plt.tight_layout()\n", "plt.show()" ] @@ -208,7 +250,7 @@ "outputs": [], "source": [ "# Sanity check: objective value divided by total steel load should equal cost per ton steel\n", - "n_ssa.objective / n_ssa.statistics.energy_balance().loc[\"Load\",\"Steel\",\"Steel\"] * (-1)" + "n_ssa.objective / n_ssa.statistics.energy_balance().loc[\"Load\", \"Steel\", \"Steel\"] * (-1)" ] }, { @@ -227,7 +269,9 @@ "outputs": [], "source": [ "# Iron ore price analysis\n", - "iron_ore_price = n.buses_t.marginal_price.loc[:, n.buses[n.buses.carrier == \"iron_ore\"].index]\n", + "iron_ore_price = n.buses_t.marginal_price.loc[\n", + " :, n.buses[n.buses.carrier == \"iron_ore\"].index\n", + "]\n", "\n", "# Steel price analysis\n", "steel_price = n.buses_t.marginal_price.loc[:, n.buses[n.buses.carrier == \"steel\"].index]" @@ -242,17 +286,12 @@ "source": [ "# Helper to clean region names (remove _ore)\n", "def clean_region_names(index):\n", - " return [re.sub(r'_ore$', '', str(i)) for i in index]\n", + " return [re.sub(r\"_ore$\", \"\", str(i)) for i in index]\n", + "\n", "\n", "# Prepare data for both carriers\n", - "data = {\n", - " 'iron_ore': iron_ore_price,\n", - " 'steel': steel_price\n", - "}\n", - "titles = {\n", - " 'iron_ore': 'Iron Ore',\n", - " 'steel': 'Steel'\n", - "}\n", + "data = {\"iron_ore\": iron_ore_price, \"steel\": steel_price}\n", + "titles = {\"iron_ore\": \"Iron Ore\", \"steel\": \"Steel\"}\n", "\n", "fig, axes = plt.subplots(2, 2, figsize=(10, 10))\n", "\n", @@ -261,24 +300,26 @@ " price_df = price_df.copy()\n", " price_df.columns = clean_region_names(price_df.columns)\n", " price_T = price_df.T\n", - " price_T.columns = ['Price']\n", + " price_T.columns = [\"Price\"]\n", " price_T.index = clean_region_names(price_T.index)\n", "\n", " # Boxplot (narrower)\n", - " sns.boxplot(data=price_df.melt(var_name='Region', value_name=\"\"), ax=axes[i,0], width=0.3)\n", - " axes[i,0].set_title(f'{titles[carrier]} Price Distribution Across Regions')\n", - " axes[i,0].set_ylabel('Price (€/t_product)')\n", - " axes[i,0].set_xlabel('Region')\n", - " axes[i,0].set_ylim(0, price_df.max().max() * 1.1)\n", + " sns.boxplot(\n", + " data=price_df.melt(var_name=\"Region\", value_name=\"\"), ax=axes[i, 0], width=0.3\n", + " )\n", + " axes[i, 0].set_title(f\"{titles[carrier]} Price Distribution Across Regions\")\n", + " axes[i, 0].set_ylabel(\"Price (€/t_product)\")\n", + " axes[i, 0].set_xlabel(\"Region\")\n", + " axes[i, 0].set_ylim(0, price_df.max().max() * 1.1)\n", "\n", " # Bar plot\n", - " price_T.plot(kind='bar', ax=axes[i,1], legend=False, width=0.5)\n", - " axes[i,1].set_title(f'{titles[carrier]} Price per Region')\n", - " axes[i,1].set_ylabel('Price (€/t_product)')\n", - " axes[i,1].set_xlabel('Region')\n", - " axes[i,1].set_xticklabels(price_T.index, rotation=90)\n", - " axes[i,1].set_ylim(0, price_df.max().max() * 1.1)\n", - " axes[i,1].grid(axis='y', alpha=0.4)\n", + " price_T.plot(kind=\"bar\", ax=axes[i, 1], legend=False, width=0.5)\n", + " axes[i, 1].set_title(f\"{titles[carrier]} Price per Region\")\n", + " axes[i, 1].set_ylabel(\"Price (€/t_product)\")\n", + " axes[i, 1].set_xlabel(\"Region\")\n", + " axes[i, 1].set_xticklabels(price_T.index, rotation=90)\n", + " axes[i, 1].set_ylim(0, price_df.max().max() * 1.1)\n", + " axes[i, 1].grid(axis=\"y\", alpha=0.4)\n", "\n", "plt.tight_layout()\n", "plt.show()" diff --git a/workflow/notebooks/analysis-domestic-demand.ipynb b/workflow/notebooks/analysis-domestic-demand.ipynb index de2c35a..960dba6 100644 --- a/workflow/notebooks/analysis-domestic-demand.ipynb +++ b/workflow/notebooks/analysis-domestic-demand.ipynb @@ -38,11 +38,12 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", + "\n", "snakemake = mock_snakemake(\n", - " \"collect_figures\",\n", - " scenario=\"penalty-oc\" # penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", - " )" + " \"collect_figures\",\n", + " scenario=\"penalty-oc\", # penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", + ")" ] }, { @@ -62,7 +63,7 @@ "source": [ "df[\"demand\"] = df[\"demand\"].div(1e6)\n", "df.unit = \"TWh\"\n", - "df[\"el_demand\"] = df[\"demand\"] * df[\"el_share\"] /100\n", + "df[\"el_demand\"] = df[\"demand\"] * df[\"el_share\"] / 100\n", "df.drop(columns=[\" note\"], inplace=True)\n", "\n", "electricity_to_steel = snakemake.config[\"electricity_steel_ratio\"]\n", @@ -116,9 +117,9 @@ "\n", "ax.bar(df.index, height=df[\"el_demand\"])\n", "\n", - "ax.set_ylabel('Electricity demand 2050 in TWh')\n", - "ax.set_title('Electricity demand 2050')\n", - "ax.grid(axis='y', alpha=0.4, zorder=0)\n", + "ax.set_ylabel(\"Electricity demand 2050 in TWh\")\n", + "ax.set_title(\"Electricity demand 2050\")\n", + "ax.grid(axis=\"y\", alpha=0.4, zorder=0)\n", "plt.xticks(rotation=90)\n", "\n", "plt.tight_layout()\n", @@ -146,9 +147,9 @@ "\n", "ax.bar(df.index, height=df[\"el_demand in Mt_steel\"])\n", "\n", - "ax.set_ylabel('Electricity demand 2050 in Mt steel')\n", - "ax.set_title('Electricity demand 2050 in Mt steel')\n", - "ax.grid(axis='y', alpha=0.4, zorder=0)\n", + "ax.set_ylabel(\"Electricity demand 2050 in Mt steel\")\n", + "ax.set_title(\"Electricity demand 2050 in Mt steel\")\n", + "ax.grid(axis=\"y\", alpha=0.4, zorder=0)\n", "plt.xticks(rotation=90)\n", "\n", "plt.tight_layout()\n", diff --git a/workflow/notebooks/analysis-globalsupplycurve.ipynb b/workflow/notebooks/analysis-globalsupplycurve.ipynb index 557bbdf..ad016c2 100644 --- a/workflow/notebooks/analysis-globalsupplycurve.ipynb +++ b/workflow/notebooks/analysis-globalsupplycurve.ipynb @@ -9,73 +9,95 @@ "source": [ "import pypsa\n", "import pandas as pd\n", - "import numpy as np\n", - "import xarray as xr\n", "\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import re" + "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": null, - "id": "b782c0cf", + "id": "f766eb9c", "metadata": {}, "outputs": [], "source": [ - "\"snakemake\" not in globals()" + "if \"snakemake\" not in globals():\n", + " from _helpers_notebooks import mock_snakemake\n", + " snakemake = mock_snakemake(\n", + " \"plot_global_supply\",\n", + " scenario=\"default\", # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", + " sort= \"cost_global\", #\"cost_global\", \"cost_average\"\n", + " wacc=\"uniform\",\n", + " cost_year=\"2050\",\n", + " interone=\"hbi\",\n", + " trade_chain=\"supplyconstraint\"\n", + " )" ] }, { "cell_type": "code", "execution_count": null, - "id": "f766eb9c", + "id": "2f3f5021", "metadata": {}, "outputs": [], "source": [ - "# if \"snakemake\" not in globals():\n", - "# from _helpers import mock_snakemake\n", - "# snakemake = mock_snakemake(\n", - "# \"plot_global_supply\",\n", - "# scenario=\"default\", # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", - "# sort=False,\n", - "# demand=False,\n", - "# wacc=\"regional\",\n", - "# cost_year=\"2050\",\n", - "# interone=\"hbi\",\n", - "# )" + "scenario = snakemake.wildcards.scenario\n", + "sort = snakemake.wildcards.sort" ] }, { "cell_type": "code", "execution_count": null, - "id": "2f3f5021", + "id": "08b15d2c", "metadata": {}, "outputs": [], "source": [ - "scenario = snakemake.wildcards.scenario\n", - "sort = snakemake.wildcards.sort\n", - "demand = snakemake.wildcards.demand" + "process = \"hbi\" # or \"eaf\" # DISCLAIMER: Steel only supply curve \"steel\" from model not supported yet\n", + "xlim = None\n", + "ylim = 1130\n", + "add_iron_ore_cost = True\n", + "plot_optimal_curve = False # Uses the optimal supply curve from the trade model, which may differ from the single curves due to the trade-offs between different producers. If False, the single curves are plotted, which may not reflect the optimal supply curve from the trade model." ] }, { "cell_type": "markdown", - "id": "10a85957", + "id": "0a7a4f57", "metadata": {}, "source": [ - "### Steel supply curve all regions (from model)" + "### Description" + ] + }, + { + "cell_type": "markdown", + "id": "1fae3ac7", + "metadata": {}, + "source": [ + "This notebook plots the global supply curve with different approaches. Once from the supply curves, and once from the trade model. The results should be identical, unless the parameter `add_iron_ore_cost` is `True`, because the trade model uses iron ore costs from trade results whereas the supply curves add a generic cost premium" + ] + }, + { + "cell_type": "markdown", + "id": "df7e4a41", + "metadata": {}, + "source": [ + "### Get steel demand" ] }, { "cell_type": "code", "execution_count": null, - "id": "08b15d2c", + "id": "ca9505fe", "metadata": {}, "outputs": [], "source": [ - "process = \"hbi\" # or \"eaf\" # DISCLAIMER: Steel only supply curve \"steel\" from model not supported yet\n", - "xlim = None" + "steel_demand = pd.read_csv(snakemake.input.steel_demand, index_col=\"region\")" + ] + }, + { + "cell_type": "markdown", + "id": "10a85957", + "metadata": {}, + "source": [ + "### Steel supply curve all regions (from model)" ] }, { @@ -118,7 +140,10 @@ "source": [ "# Iron ore cost per ton of steel (w/o transport)\n", "iron_ore_to_steel = snakemake.config[\"iron_ore\"][\"ore_to_steel_ratio\"]\n", - "iron_ore_cost_notransport = n.generators[n.generators.carrier == \"iron_ore\"].marginal_cost.mean() * iron_ore_to_steel\n", + "iron_ore_cost_notransport = (\n", + " n.generators[n.generators.carrier == \"iron_ore\"].marginal_cost.mean()\n", + " * iron_ore_to_steel\n", + ")\n", "print(f\"Iron ore cost (w/o transport): {iron_ore_cost_notransport:.2f} €/t_steel\")" ] }, @@ -130,7 +155,7 @@ "outputs": [], "source": [ "# Select process\n", - "interone = n.links[n.links.carrier == 'hbi']" + "interone = n.links[n.links.carrier == \"hbi\"]" ] }, { @@ -140,7 +165,7 @@ "metadata": {}, "outputs": [], "source": [ - "interone.loc[:,'region'] = interone['bus1'].str.replace('_hbi$', '', regex=True)" + "interone.loc[:, \"region\"] = interone[\"bus1\"].str.replace(\"_hbi$\", \"\", regex=True)" ] }, { @@ -151,10 +176,12 @@ "outputs": [], "source": [ "# Marginal costs refer to bus0 (which is iron ore). To get the cost of steel (bus1), the process efficiency needs to be taken into account\n", - "iron_ore_to_steel = 1/interone.efficiency.mean()\n", + "iron_ore_to_steel = 1 / interone.efficiency.mean()\n", "\n", - "interone.loc[:,'cost in €/t_steel'] = interone.marginal_cost.values * iron_ore_to_steel\n", - "interone.loc[:,'cost in €/t_steel incl. iron ore'] = interone['cost in €/t_steel'] + iron_ore_cost_notransport" + "interone.loc[:, \"cost in €/t_steel\"] = interone.marginal_cost.values * iron_ore_to_steel\n", + "interone.loc[:, \"cost in €/t_steel incl. iron ore\"] = (\n", + " interone[\"cost in €/t_steel\"] + iron_ore_cost_notransport\n", + ")" ] }, { @@ -165,7 +192,14 @@ "outputs": [], "source": [ "# Add quantity\n", - "interone.loc[:,'quantity in Mt_steel'] = interone.p_nom_max.values / iron_ore_to_steel / 1e6" + "if plot_optimal_curve:\n", + " interone.loc[:, \"quantity in Mt_steel\"] = (\n", + " interone.p_nom_opt.values / iron_ore_to_steel / 1e6\n", + " )\n", + "else:\n", + " interone.loc[:, \"quantity in Mt_steel\"] = (\n", + " interone.p_nom_max.values / iron_ore_to_steel / 1e6\n", + " )" ] }, { @@ -176,14 +210,16 @@ "outputs": [], "source": [ "# Sort by cost for supply curve\n", - "interone_sorted = interone.sort_values('cost in €/t_steel incl. iron ore').reset_index(drop=True)\n", + "interone_sorted = interone.sort_values(\"cost in €/t_steel\"+(\" incl. iron ore\" if add_iron_ore_cost else \"\")).reset_index(\n", + " drop=True\n", + ")\n", "\n", "# Assign a color to each region\n", - "region_list = interone_sorted['region'].unique()\n", + "region_list = interone_sorted[\"region\"].unique()\n", "region_colors = snakemake.config[\"colors\"]\n", "\n", - "cum_quantity_line = interone_sorted['quantity in Mt_steel'].cumsum()\n", - "cum_cost_line = interone_sorted['cost in €/t_steel incl. iron ore']\n", + "cum_quantity_line = interone_sorted[\"quantity in Mt_steel\"].cumsum()\n", + "cum_cost_line = interone_sorted[\"cost in €/t_steel\"+(\" incl. iron ore\" if add_iron_ore_cost else \"\")] \n", "\n", "# Prepare for stacked area plot: for each link, plot a bar at its cost, colored by region\n", "cum_quantity = 0\n", @@ -193,10 +229,10 @@ "bar_colors = []\n", "for _, row in interone_sorted.iterrows():\n", " bar_lefts.append(cum_quantity)\n", - " bar_widths.append(row['quantity in Mt_steel'])\n", - " bar_costs.append(row['cost in €/t_steel incl. iron ore'])\n", - " bar_colors.append(region_colors[row['region']])\n", - " cum_quantity += row['quantity in Mt_steel']" + " bar_widths.append(row[\"quantity in Mt_steel\"])\n", + " bar_costs.append(row[\"cost in €/t_steel\"+(\" incl. iron ore\" if add_iron_ore_cost else \"\")])\n", + " bar_colors.append(region_colors[row[\"region\"]])\n", + " cum_quantity += row[\"quantity in Mt_steel\"]" ] }, { @@ -206,40 +242,83 @@ "metadata": {}, "outputs": [], "source": [ - "def plot_supply_curve(bar_lefts, bar_widths, bar_costs, bar_colors, region_colors, region_list, xlim=2500):\n", + "def plot_supply_curve(\n", + " bar_lefts, bar_widths, bar_costs, bar_colors, region_colors, region_list, xlim=2500, ylim=1500\n", + "):\n", "\n", " fig, ax = plt.subplots(figsize=(10, 5))\n", - " ax.bar(bar_lefts, bar_costs, width=bar_widths, color=bar_colors, align='edge', edgecolor='none', alpha=0.8)\n", + " ax.bar(\n", + " bar_lefts,\n", + " bar_costs,\n", + " width=bar_widths,\n", + " color=bar_colors,\n", + " align=\"edge\",\n", + " edgecolor=\"none\",\n", + " alpha=0.8,\n", + " )\n", " # Add the classic supply curve line\n", - " \n", - " ax.step(cum_quantity_line, cum_cost_line, where='pre', color='black', linewidth=1.2, label='Supply curve')\n", + "\n", + " ax.step(\n", + " cum_quantity_line,\n", + " cum_cost_line,\n", + " where=\"pre\",\n", + " color=\"black\",\n", + " linewidth=1.2,\n", + " label=\"Supply curve\",\n", + " )\n", "\n", " # Add vertical line of current demand and REMIND demand\n", " current_demand = 2000 # Mt steel\n", - " ax.axvline(current_demand, color='red', linestyle='--', label='Current demand (2020)')\n", - " ax.annotate('Current demand (2025)', xy=(current_demand, 50), xytext=(current_demand+50, 150), rotation=90, color='red')\n", - " remind_demand = 725 # Mt steel, REMIND global steel long-term hydrogen: 700-750 Mt\n", - " ax.axvline(remind_demand, color='orange', linestyle='--', label='REMIND 2050 demand')\n", - " ax.annotate('REMIND 2050 demand', xy=(remind_demand, 50), xytext=(remind_demand+50, 150), rotation=90, color='orange')\n", + " ax.axvline(\n", + " current_demand, color=\"black\", linestyle=\"--\", label=\"Current demand (2020)\", alpha=0.6,\n", + " )\n", + " ax.annotate(\n", + " \"Grey steel \\ndemand 2025\",\n", + " xy=(current_demand, 50),\n", + " xytext=(current_demand + 50, 750),\n", + " rotation=90,\n", + " color=\"black\",\n", + " alpha=0.6,\n", + " )\n", + " remind_demand = steel_demand[\"SteelDemand_DRI_Mt\"].sum() # Mt steel, REMIND global steel long-term hydrogen: 700-750 Mt\n", + " ax.axvline(\n", + " remind_demand, color=\"black\", linestyle=\"--\", label=\"REMIND 2050 demand\", alpha=0.6,\n", + " )\n", + " ax.annotate(\n", + " \"Green steel \\ndemand 2050\",\n", + " xy=(remind_demand, 50),\n", + " xytext=(remind_demand + 50, 750),\n", + " rotation=90,\n", + " color=\"black\",\n", + " alpha=0.6,\n", + " )\n", "\n", - " ax.set_xlabel('Cumulative quantity (Mt)')\n", - " ax.set_ylabel('Supply cost (€/t_steel)')\n", - " ax.set_title(f'Combined {process} supply curve')\n", - " ax.set_ylim(0, 1000)\n", + " ax.set_xlabel(\"Cumulative quantity (Mt)\")\n", + " ax.set_ylabel(\"Cost of HBI in €/t$_{hbi}$\")\n", + " # ax.set_title(f\"Combined {process} supply curve\")\n", + " ax.set_ylim(0, ylim)\n", " ax.set_xlim(0, sum(bar_widths))\n", " ax.set_xlim(0, xlim)\n", - " ax.grid(axis='y', alpha=0.4, zorder=0)\n", + " ax.grid(axis=\"y\", alpha=0.4, zorder=0)\n", " # Legend for regions\n", - " handles = [plt.Rectangle((0,0),1,1, color=region_colors[reg]) for reg in region_list]\n", - " handles.append(plt.Line2D([0], [0], color='black', linewidth=1.2, label='Supply curve'))\n", - " labels = list(region_list) + ['Supply curve']\n", - " ax.legend(handles, labels, title='Region', bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " handles = [\n", + " plt.Rectangle((0, 0), 1, 1, color=region_colors[reg], alpha=0.8) for reg in region_list\n", + " ]\n", + " handles.append(\n", + " plt.Line2D([0], [0], color=\"black\", linewidth=1.2, label=\"Supply curve\")\n", + " )\n", + " region_nice_names = snakemake.config.get(\"region_nice_names\", {})\n", + " labels = [region_nice_names.get(reg, reg.replace(\"_\", \" \")) for reg in region_list] + [\"Supply curve\"]\n", + " ax.legend(\n", + " handles, labels, title=\"Region\", bbox_to_anchor=(1.05, 1), loc=\"upper left\",\n", + " frameon=False,\n", + " )\n", " plt.tight_layout()\n", " plt.savefig(snakemake.output.network_curve)\n", " plt.savefig(snakemake.output.network_curve_png, dpi=300)\n", " plt.show()\n", "\n", - " return" + " return\n" ] }, { @@ -249,7 +328,16 @@ "metadata": {}, "outputs": [], "source": [ - "plot_supply_curve(bar_lefts=bar_lefts, bar_widths=bar_widths, bar_costs=bar_costs, bar_colors=bar_colors, region_colors=region_colors, region_list=region_list, xlim=xlim)" + "plot_supply_curve(\n", + " bar_lefts=bar_lefts,\n", + " bar_widths=bar_widths,\n", + " bar_costs=bar_costs,\n", + " bar_colors=bar_colors,\n", + " region_colors=region_colors,\n", + " region_list=region_list,\n", + " xlim=xlim,\n", + " ylim=ylim,\n", + ")" ] }, { @@ -267,25 +355,20 @@ "metadata": {}, "outputs": [], "source": [ - "process = \"hbi\" # eaf, hbi, eaf-grid, steel\n", - "include_ironorecost = True\n", - "ironorecost = 97*1.59\n", - "year = 2050\n", - "demand = demand # Subtract local demand from supply curve\n", - "sort_over_all = False # \"True\" to sort over all regions, \"False\" to sort within each region\n", - "sort = sort #\"cost_global\" # \"cost_global\", \"cost_average\", \"False\", or the variable sort (obtained from snakemake workflow)\n", - "xlim = None # \"None\" or int\n", - "regions = snakemake.config[\"regions\"].keys()" + "sort_over_all = True # \"True\" to sort over all regions, \"False\" to sort within each region\n", + "# sort = \"cost_global\" # \"cost_global\" # a\n", + "# \"cost_global\", \"cost_average\", \"False\", or the variable sort (obtained from snakemake workflow)" ] }, { "cell_type": "code", "execution_count": null, - "id": "22ff3926", + "id": "16d619cb", "metadata": {}, "outputs": [], "source": [ - "print(demand)" + "ironorecost = 97 * 1.59\n", + "regions = snakemake.config[\"regions\"].keys()" ] }, { @@ -297,13 +380,18 @@ "source": [ "def sort_by_average(df_all):\n", " # Drop rows where either cost or demand is NaN before calculating weighted average\n", - " df_clean = df_all.dropna(subset=['LCOX [EUR/t]', 'demand [t]'])\n", + " df_clean = df_all.dropna(subset=[ \"lcox [EUR/t]\", \"demand [t]\"])\n", " # Get weighted average cost per region\n", - " df_clean['weighted_cost'] = df_clean['LCOX [EUR/t]'] * df_clean['demand [t]']\n", - " average_cost_per_region = df_clean.groupby('region')['weighted_cost'].sum() / df_clean.groupby('region')['demand [t]'].sum()\n", - " # Sort df_all by average_cost_per_region, then by LCOX within each region\n", - " df_all['avg_region_cost'] = df_all['region'].map(average_cost_per_region)\n", - " df_all = df_all.sort_values(['avg_region_cost', 'LCOX [EUR/t]']).drop(columns='avg_region_cost')\n", + " df_clean[\"weighted_cost\"] = df_clean[\"lcox [EUR/t]\"] * df_clean[\"demand [t]\"]\n", + " average_cost_per_region = (\n", + " df_clean.groupby(\"region\")[\"weighted_cost\"].sum()\n", + " / df_clean.groupby(\"region\")[\"demand [t]\"].sum()\n", + " )\n", + " # Sort df_all by average_cost_per_region, then by cox within each region\n", + " df_all[\"avg_region_cost\"] = df_all[\"region\"].map(average_cost_per_region)\n", + " df_all = df_all.sort_values([\"avg_region_cost\", \"lcox [EUR/t]\"]).drop(\n", + " columns=\"avg_region_cost\"\n", + " )\n", " return df_all" ] }, @@ -317,48 +405,40 @@ "df_all = pd.DataFrame()\n", "\n", "# Select input files directly from snakemake (avoids hardcoded paths)\n", - "if demand:\n", - " input_files = snakemake.input.supply_curves_interone\n", - "else:\n", - " input_files = snakemake.input.supply_curves_interone_nodemand\n", + "input_files = snakemake.input.supply_curves_interone\n", "\n", "for fn in input_files:\n", " # Extract region from filename pattern: {region}_{process}.csv\n", - " region = fn.split(\"/\")[-1].replace(f\"_{process}.csv\", \"\")\n", + " region = fn.split(\"/\")[-1].split(\"_marginal_cost\")[0]\n", "\n", - " df = pd.read_csv(fn, index_col=0)\n", + " df = pd.read_csv(fn)\n", " df[\"region\"] = region\n", "\n", + " # Calculate the difference in demand to get the quantity supplied at each cost step\n", " diff = df[\"demand [t]\"].diff()\n", " diff[0] = diff[1] # set first value to second to avoid NaN\n", " df[\"demand [t]\"] = diff\n", "\n", " df_all = pd.concat([df_all, df], ignore_index=True)\n", "\n", + "# Remove rows where the lcox [EUR/t] value is NaN (e.g. due to missing data for some regions)\n", + "df_all = df_all.dropna(subset=[\"lcox [EUR/t]\"])\n", + "\n", + "\n", "if sort_over_all:\n", - " df_all = df_all.sort_values('LCOX [EUR/t]').reset_index(drop=True)\n", + " df_all = df_all.sort_values(\"lcox [EUR/t]\").reset_index(drop=True)\n", "\n", "if sort == False:\n", " pass\n", "elif sort == \"cost_global\":\n", - " df_all = df_all.sort_values('LCOX [EUR/t]').reset_index(drop=True)\n", + " df_all = df_all.sort_values(\"lcox [EUR/t]\").reset_index(drop=True)\n", "elif sort == \"cost_average\":\n", " df_all = sort_by_average(df_all)\n", "else:\n", " ValueError(f\"value for sort is {sort} and not valid\")\n", "\n", - "if include_ironorecost:\n", - " df_all['LCOX [EUR/t]'] += ironorecost\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8dcd9d98", - "metadata": {}, - "outputs": [], - "source": [ - "# df_all[df_all[\"region\"]==\"Europe\"]" + "if add_iron_ore_cost:\n", + " df_all[\"lcox [EUR/t]\"] += ironorecost" ] }, { @@ -368,8 +448,8 @@ "metadata": {}, "outputs": [], "source": [ - "cum_quantity_line = df_all['demand [t]'].cumsum()/1e6 # Mt steel\n", - "cum_cost_line = df_all['LCOX [EUR/t]']\n", + "cum_quantity_line = df_all[\"demand [t]\"].cumsum() / 1e6 # Mt steel\n", + "cum_cost_line = df_all[\"lcox [EUR/t]\"]\n", "\n", "# Prepare for stacked area plot based on df_all\n", "cum_quantity = 0\n", @@ -379,10 +459,10 @@ "bar_colors = []\n", "for _, row in df_all.iterrows():\n", " bar_lefts.append(cum_quantity)\n", - " bar_widths.append(row['demand [t]']/1e6) # Mt steel\n", - " bar_costs.append(row['LCOX [EUR/t]'])\n", - " bar_colors.append(region_colors[row['region']])\n", - " cum_quantity += row['demand [t]']/1e6 # Mt steel" + " bar_widths.append(row[\"demand [t]\"] / 1e6) # Mt steel\n", + " bar_costs.append(row[\"lcox [EUR/t]\"])\n", + " bar_colors.append(region_colors[row[\"region\"]])\n", + " cum_quantity += row[\"demand [t]\"] / 1e6 # Mt steel" ] }, { @@ -392,17 +472,16 @@ "metadata": {}, "outputs": [], "source": [ - "plot_supply_curve(bar_lefts=bar_lefts, bar_widths=bar_widths, bar_costs=bar_costs, bar_colors=bar_colors, region_colors=region_colors, region_list=region_list, xlim=xlim)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d35aef6e", - "metadata": {}, - "outputs": [], - "source": [ - "demand" + "plot_supply_curve(\n", + " bar_lefts=bar_lefts,\n", + " bar_widths=bar_widths,\n", + " bar_costs=bar_costs,\n", + " bar_colors=bar_colors,\n", + " region_colors=region_colors,\n", + " region_list=region_list,\n", + " xlim=xlim,\n", + " ylim=ylim,\n", + ")" ] } ], diff --git a/workflow/notebooks/analysis-hourly.ipynb b/workflow/notebooks/analysis-hourly.ipynb index 5336959..4b93efa 100644 --- a/workflow/notebooks/analysis-hourly.ipynb +++ b/workflow/notebooks/analysis-hourly.ipynb @@ -9,13 +9,9 @@ "source": [ "import pypsa\n", "import pandas as pd\n", - "import numpy as np\n", - "import xarray as xr\n", "\n", "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import re\n", - "from _helpers import load_config" + "from _helpers_notebooks import load_config" ] }, { @@ -44,7 +40,9 @@ "metadata": {}, "outputs": [], "source": [ - "single_region = f\"../../resources/lco-{product}/cost_year~2030/{region}/network_1-0partload.nc\"\n", + "single_region = (\n", + " f\"../../resources/lco-{product}/cost_year~2030/{region}/network_1-0partload.nc\"\n", + ")\n", "# single_region = f\"../../resources/lcos/cost_year~2030/Europe/network_1.nc\"" ] }, @@ -189,7 +187,7 @@ "metadata": {}, "outputs": [], "source": [ - "n.statistics.energy_balance.iplot.area() # Ely als negativen Stromverbraucher, H2 Verbrauch der DRI als linie" + "n.statistics.energy_balance.iplot.area() # Ely als negativen Stromverbraucher, H2 Verbrauch der DRI als linie" ] }, { @@ -208,18 +206,23 @@ "outputs": [], "source": [ "df = n.statistics.energy_balance(aggregate_time=False).loc[\n", - " :, \n", - " [\"Photovoltaics\", \"Wind energy\",\n", - " \"battery inverter (charging)\", \"battery inverter (discharging)\",\n", - " \"electrolysis\", \"electric arc furnace\", \"direct reduction furnace\"],\n", - " \"Electricity\"\n", + " :,\n", + " [\n", + " \"Photovoltaics\",\n", + " \"Wind energy\",\n", + " \"battery inverter (charging)\",\n", + " \"battery inverter (discharging)\",\n", + " \"electrolysis\",\n", + " \"electric arc furnace\",\n", + " \"direct reduction furnace\",\n", + " ],\n", + " \"Electricity\",\n", "]\n", "\n", - "df = df.loc[:, pd.Timestamp(\"2013-07-23\"):pd.Timestamp(\"2013-07-28\")]\n", + "df = df.loc[:, pd.Timestamp(\"2013-07-23\") : pd.Timestamp(\"2013-07-28\")]\n", "\n", "df = (\n", - " df\n", - " .reset_index(level=[\"component\", \"bus_carrier\"], drop=True)\n", + " df.reset_index(level=[\"component\", \"bus_carrier\"], drop=True)\n", " .groupby(\"carrier\")\n", " .sum()\n", ")" @@ -233,7 +236,7 @@ "outputs": [], "source": [ "config_fn = \"../../config/config.yaml\"\n", - "colors = load_config(config_fn)[\"colors\"] " + "colors = load_config(config_fn)[\"colors\"]" ] }, { @@ -265,23 +268,15 @@ "# Optional: overlay hydrogen consumption (as before)\n", "n.statistics.energy_balance(aggregate_time=False).loc[\n", " \"Link\", \"direct reduction furnace\", \"Hydrogen\"\n", - "].loc[\n", - " pd.Timestamp(\"2013-07-23\"):pd.Timestamp(\"2013-07-28\")\n", - "].div(system_scale).plot(\n", - " ax=ax,\n", - " color=\"black\",\n", - " linewidth=1.5,\n", - " label=\"DRI H$_2$ consumption\"\n", + "].loc[pd.Timestamp(\"2013-07-23\") : pd.Timestamp(\"2013-07-28\")].div(system_scale).plot(\n", + " ax=ax, color=\"black\", linewidth=1.5, label=\"DRI H$_2$ consumption\"\n", ")\n", "\n", "# Styling (matching your original)\n", "ax.grid(True, alpha=0.5, linestyle=\"--\")\n", "ax.set_xlabel(\"Day\", fontsize=9)\n", "ax.set_ylabel(\"Electricity Balance in MW\", fontsize=9)\n", - "ax.set_xlim(\n", - " pd.Timestamp(\"2013-07-23\"),\n", - " pd.Timestamp(\"2013-07-28\")\n", - ")\n", + "ax.set_xlim(pd.Timestamp(\"2013-07-23\"), pd.Timestamp(\"2013-07-28\"))\n", "\n", "ax.legend(\n", " loc=\"center left\",\n", @@ -289,7 +284,7 @@ ")\n", "\n", "plt.tight_layout()\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -354,9 +349,15 @@ "outputs": [], "source": [ "# Electricity to steel ratio\n", - "steel_demand = n.statistics.energy_balance().loc[:, 'Steel', 'Steel'].values[0] # in t of steel\n", - "pv_supply = n.statistics.energy_balance().loc[:, 'Photovoltaics', 'Electricity'].values[0] # in MWh\n", - "wind_supply = n.statistics.energy_balance().loc[:, 'Wind energy', 'Electricity'].values[0] # in MWh\n", + "steel_demand = (\n", + " n.statistics.energy_balance().loc[:, \"Steel\", \"Steel\"].values[0]\n", + ") # in t of steel\n", + "pv_supply = (\n", + " n.statistics.energy_balance().loc[:, \"Photovoltaics\", \"Electricity\"].values[0]\n", + ") # in MWh\n", + "wind_supply = (\n", + " n.statistics.energy_balance().loc[:, \"Wind energy\", \"Electricity\"].values[0]\n", + ") # in MWh\n", "\n", "steel_demand\n", "elec_to_steel = (pv_supply + wind_supply) * (-1) / steel_demand # in MWh/t\n", @@ -398,7 +399,7 @@ "metadata": {}, "outputs": [], "source": [ - "n.statistics.energy_balance().loc[\"Load\",\"Steel\",:].iloc[0] # tonnes of steel" + "n.statistics.energy_balance().loc[\"Load\", \"Steel\", :].iloc[0] # tonnes of steel" ] }, { @@ -408,7 +409,9 @@ "metadata": {}, "outputs": [], "source": [ - "n.statistics.optimal_capacity().mul(1e3) / n.statistics.energy_balance().loc[\"Load\",\"Steel\",:].iloc[0] " + "n.statistics.optimal_capacity().mul(1e3) / n.statistics.energy_balance().loc[\n", + " \"Load\", \"Steel\", :\n", + "].iloc[0]" ] } ], diff --git a/workflow/notebooks/analysis-iron-ore.ipynb b/workflow/notebooks/analysis-iron-ore.ipynb index 07d1a93..d36ff9f 100644 --- a/workflow/notebooks/analysis-iron-ore.ipynb +++ b/workflow/notebooks/analysis-iron-ore.ipynb @@ -8,14 +8,7 @@ "outputs": [], "source": [ "import pypsa\n", - "import pandas as pd\n", - "import numpy as np\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import re\n", - "from _helpers import load_config" + "import pandas as pd" ] }, { @@ -44,7 +37,9 @@ "metadata": {}, "outputs": [], "source": [ - "single_region = f\"../../resources/lco-{product}/cost_year~2030/{region}/network_1-0partload.nc\"\n", + "single_region = (\n", + " f\"../../resources/lco-{product}/cost_year~2030/{region}/network_1-0partload.nc\"\n", + ")\n", "# single_region = f\"../../resources/lcos/cost_year~2030/Europe/network_1.nc\"" ] }, diff --git a/workflow/notebooks/analysis-re.ipynb b/workflow/notebooks/analysis-re.ipynb deleted file mode 100644 index 5941845..0000000 --- a/workflow/notebooks/analysis-re.ipynb +++ /dev/null @@ -1,217 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "e20b8494", - "metadata": {}, - "outputs": [], - "source": [ - "import pypsa\n", - "import pandas as pd\n", - "import numpy as np\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import re\n", - "from _helpers import load_config" - ] - }, - { - "cell_type": "markdown", - "id": "8c69b5a1", - "metadata": {}, - "source": [ - "### Hypothesis" - ] - }, - { - "cell_type": "markdown", - "id": "10fb4741", - "metadata": {}, - "source": [ - "`n.statistics.energy-balance()` shows the aggregation of all single generators, that is why it is never 0\n", - "How it should be: single quality classes should get down to 0, but then the question arises: should you throw them into one model, or separate? How is the local demand handled? How does this align with the philosophy of multiple demands?" - ] - }, - { - "cell_type": "markdown", - "id": "6a6fe391", - "metadata": {}, - "source": [ - "### Paths" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "95f46bc0", - "metadata": {}, - "outputs": [], - "source": [ - "product = \"steel\" # \"eaf\" or \"steel\" or \"eaf-grid\"\n", - "region = \"Europe\" # e.g. \"Europe\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7612cfe6", - "metadata": {}, - "outputs": [], - "source": [ - "single_region = f\"../../resources/lco-{product}/cost_year~2030/{region}/network_1-0partload.nc\"\n", - "# single_region = f\"../../resources/lcos/cost_year~2030/Europe/network_1.nc\"" - ] - }, - { - "cell_type": "markdown", - "id": "792916c9", - "metadata": {}, - "source": [ - "### Read product model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a0322cd4", - "metadata": {}, - "outputs": [], - "source": [ - "n = pypsa.Network(single_region)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0d72387c", - "metadata": {}, - "outputs": [], - "source": [ - "n.statistics()" - ] - }, - { - "cell_type": "markdown", - "id": "4c158d96", - "metadata": {}, - "source": [ - "### RE profiles" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "40ff9de9", - "metadata": {}, - "outputs": [], - "source": [ - "# Generate a df with p_nom_opt, p_nom_max and flh\n", - "gen_df = n.generators[[\"p_nom_opt\", \"p_nom_max\"]].copy()\n", - "# remove iron ore DRI-ready (exp)\n", - "gen_df = gen_df[~gen_df.index.str.contains(\"iron ore DRI-ready\")]\n", - "gen_df[\"flh\"] = n.generators_t.p_max_pu.sum(axis=0) \n", - "gen_df = gen_df.rename(columns={\"p_nom_opt\": \"installed (MW)\", \"p_nom_max\": \"potential (MW)\", \"flh\": \"flh\"})\n", - "# reorder columns\n", - "gen_df = gen_df[[\"flh\", \"potential (MW)\", \"installed (MW)\"]]\n", - "gen_df = gen_df.sort_values(by=\"flh\", ascending=False)\n", - "sum_row = pd.DataFrame(gen_df.sum(numeric_only=True)).T\n", - "sum_row.index = [\"Total\"]\n", - "gen_df[\"utilization\"] = gen_df[\"installed (MW)\"] / gen_df[\"potential (MW)\"]\n", - "gen_df = pd.concat([gen_df, sum_row])\n", - "gen_df.round(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "54fa21cb", - "metadata": {}, - "outputs": [], - "source": [ - "n.generators_t.p_max_pu.loc[:, n.generators[n.generators.carrier == \"wind\"].index].mean(axis=1).plot(figsize=(15, 5), grid=True, ylim=(0, 1))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "77d59322", - "metadata": {}, - "outputs": [], - "source": [ - "n.generators_t.p_max_pu.loc[:, \"onwind 1\"].plot(figsize=(15, 5), grid=True, ylim=(0, 1))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "66c8b444", - "metadata": {}, - "outputs": [], - "source": [ - "n.generators_t.p_max_pu.loc[:, \"onwind 11\"].plot(figsize=(15, 5), grid=True, ylim=(0, 1))" - ] - }, - { - "cell_type": "markdown", - "id": "dfe1d1d9", - "metadata": {}, - "source": [ - "### Actual feed in" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ea7d102c", - "metadata": {}, - "outputs": [], - "source": [ - "n.generators_t.p.loc[:, n.generators[n.generators.carrier==\"wind\"].index].mean().round(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d0744559", - "metadata": {}, - "outputs": [], - "source": [ - "n.generators_t.p.loc[:, n.generators[n.generators.carrier==\"wind\"].index].plot(figsize=(15, 5), grid=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0c70acdd", - "metadata": {}, - "outputs": [], - "source": [ - "n.statistics.energy_balance.iplot.area(bus_carrier=\"electricity\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "shift", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/workflow/notebooks/analysis-steel-hbi-split.ipynb b/workflow/notebooks/analysis-steel-hbi-split.ipynb index 6add435..cb50c97 100644 --- a/workflow/notebooks/analysis-steel-hbi-split.ipynb +++ b/workflow/notebooks/analysis-steel-hbi-split.ipynb @@ -9,10 +9,7 @@ "source": [ "import pandas as pd\n", "import pypsa\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from _helpers import load_config" + "import matplotlib.pyplot as plt" ] }, { @@ -30,11 +27,12 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", + "\n", "snakemake = mock_snakemake(\n", - " \"collect_figures\",\n", - " scenario=\"default\" # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", - " )" + " \"collect_figures\",\n", + " scenario=\"default\", # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", + ")" ] }, { @@ -82,11 +80,21 @@ "metadata": {}, "outputs": [], "source": [ - "n_eaf = pypsa.Network(f\"../../resources/lco-eaf/cost_year~2030/{region}/network_{demand_factor}.nc\")\n", - "n_eaf_grid = pypsa.Network(f\"../../resources/lco-eaf-grid/cost_year~2030/{region}/network_{demand_factor}.nc\")\n", - "n_hbi = pypsa.Network(f\"../../resources/lco-hbi/cost_year~2030/{region}/network_{demand_factor}.nc\")\n", - "n_steel = pypsa.Network(f\"../../resources/lco-steel/cost_year~2030/{region}/network_{demand_factor}.nc\")\n", - "n_steel_pload90 = pypsa.Network(f\"../../resources/lco-steel/cost_year~2030/{region}/network_{demand_factor}-90partload.nc\")" + "n_eaf = pypsa.Network(\n", + " f\"../../resources/lco-eaf/cost_year~2030/{region}/network_{demand_factor}.nc\"\n", + ")\n", + "n_eaf_grid = pypsa.Network(\n", + " f\"../../resources/lco-eaf-grid/cost_year~2030/{region}/network_{demand_factor}.nc\"\n", + ")\n", + "n_hbi = pypsa.Network(\n", + " f\"../../resources/lco-hbi/cost_year~2030/{region}/network_{demand_factor}.nc\"\n", + ")\n", + "n_steel = pypsa.Network(\n", + " f\"../../resources/lco-steel/cost_year~2030/{region}/network_{demand_factor}.nc\"\n", + ")\n", + "n_steel_pload90 = pypsa.Network(\n", + " f\"../../resources/lco-steel/cost_year~2030/{region}/network_{demand_factor}-90partload.nc\"\n", + ")" ] }, { @@ -153,8 +161,11 @@ "metadata": {}, "outputs": [], "source": [ - "costs_per_carrier_hbi = n_hbi.statistics.system_cost() / n_hbi.statistics.energy_balance().loc[\"Load\",\"HBI\",\"HBI\"]\n", - "costs_per_carrier_hbi #.sum()" + "costs_per_carrier_hbi = (\n", + " n_hbi.statistics.system_cost()\n", + " / n_hbi.statistics.energy_balance().loc[\"Load\", \"HBI\", \"HBI\"]\n", + ")\n", + "costs_per_carrier_hbi # .sum()" ] }, { @@ -164,8 +175,11 @@ "metadata": {}, "outputs": [], "source": [ - "costs_per_carrier_eaf = n_eaf.statistics.system_cost() / n_eaf.statistics.energy_balance().loc[\"Load\",\"Steel\",\"Steel\"]\n", - "costs_per_carrier_eaf #.sum()" + "costs_per_carrier_eaf = (\n", + " n_eaf.statistics.system_cost()\n", + " / n_eaf.statistics.energy_balance().loc[\"Load\", \"Steel\", \"Steel\"]\n", + ")\n", + "costs_per_carrier_eaf # .sum()" ] }, { @@ -175,8 +189,11 @@ "metadata": {}, "outputs": [], "source": [ - "costs_per_carrier_eaf_grid = n_eaf_grid.statistics.system_cost() / n_eaf_grid.statistics.energy_balance().loc[\"Load\",\"Steel\",\"Steel\"]\n", - "costs_per_carrier_eaf_grid #.sum()" + "costs_per_carrier_eaf_grid = (\n", + " n_eaf_grid.statistics.system_cost()\n", + " / n_eaf_grid.statistics.energy_balance().loc[\"Load\", \"Steel\", \"Steel\"]\n", + ")\n", + "costs_per_carrier_eaf_grid # .sum()" ] }, { @@ -186,8 +203,11 @@ "metadata": {}, "outputs": [], "source": [ - "costs_per_carrier_steel = n_steel.statistics.system_cost() / n_steel.statistics.energy_balance().loc[\"Load\",\"Steel\",\"Steel\"]\n", - "costs_per_carrier_steel #.sum()" + "costs_per_carrier_steel = (\n", + " n_steel.statistics.system_cost()\n", + " / n_steel.statistics.energy_balance().loc[\"Load\", \"Steel\", \"Steel\"]\n", + ")\n", + "costs_per_carrier_steel # .sum()" ] }, { @@ -197,8 +217,11 @@ "metadata": {}, "outputs": [], "source": [ - "costs_per_carrier_steel_pload90 = n_steel_pload90.statistics.system_cost() / n_steel_pload90.statistics.energy_balance().loc[\"Load\",\"Steel\",\"Steel\"]\n", - "costs_per_carrier_steel_pload90 #.sum()" + "costs_per_carrier_steel_pload90 = (\n", + " n_steel_pload90.statistics.system_cost()\n", + " / n_steel_pload90.statistics.energy_balance().loc[\"Load\", \"Steel\", \"Steel\"]\n", + ")\n", + "costs_per_carrier_steel_pload90 # .sum()" ] }, { @@ -236,21 +259,30 @@ " s2.index = idx\n", " return s2.groupby(level=0).sum() * (-1)\n", "\n", - "costs_hbi = pd.concat([iron_ore_cost_per_steel, flatten_and_group(costs_per_carrier_hbi)])\n", + "\n", + "costs_hbi = pd.concat(\n", + " [iron_ore_cost_per_steel, flatten_and_group(costs_per_carrier_hbi)]\n", + ")\n", "costs_eaf = flatten_and_group(costs_per_carrier_eaf)\n", "costs_eaf_grid = flatten_and_group(costs_per_carrier_eaf_grid)\n", - "costs_steel = pd.concat([iron_ore_cost_per_steel,flatten_and_group(costs_per_carrier_steel)])\n", - "costs_steel_pload90 = pd.concat([iron_ore_cost_per_steel, flatten_and_group(costs_per_carrier_steel_pload90)])\n", - " \n", + "costs_steel = pd.concat(\n", + " [iron_ore_cost_per_steel, flatten_and_group(costs_per_carrier_steel)]\n", + ")\n", + "costs_steel_pload90 = pd.concat(\n", + " [iron_ore_cost_per_steel, flatten_and_group(costs_per_carrier_steel_pload90)]\n", + ")\n", + "\n", "\n", "# Combine into a single DataFrame: rows = carriers, cols = techs\n", - "costs_df = pd.DataFrame({\n", - " 'EAF': costs_eaf,\n", - " 'EAF_grid': costs_eaf_grid,\n", - " 'HBI': costs_hbi,\n", - " 'Steel': costs_steel,\n", - " 'Steel_pload90': costs_steel_pload90\n", - "}).fillna(0)\n", + "costs_df = pd.DataFrame(\n", + " {\n", + " \"EAF\": costs_eaf,\n", + " \"EAF_grid\": costs_eaf_grid,\n", + " \"HBI\": costs_hbi,\n", + " \"Steel\": costs_steel,\n", + " \"Steel_pload90\": costs_steel_pload90,\n", + " }\n", + ").fillna(0)\n", "\n", "# Ensure deterministic carrier order\n", "carriers = costs_df.index.tolist()\n", @@ -259,14 +291,17 @@ "fig, ax = plt.subplots(figsize=(10, 4))\n", "# colors = sns.color_palette('Set2', len(carriers))\n", "# transpose so index is tech, columns are carriers; stacked by carriers\n", - "costs_df.T.plot(kind='bar', stacked=True, ax=ax, color=colors, edgecolor='none')\n", + "costs_df.T.plot(kind=\"bar\", stacked=True, ax=ax, color=colors, edgecolor=\"none\")\n", "\n", - "ax.set_ylabel('Cost (€/t_steel)')\n", + "ax.set_ylabel(\"Cost (€/t_steel)\")\n", "# ax.set_xlabel('Technology')\n", - "ax.set_xticklabels(['EAF', 'EAF-grid', 'HBI\\nmin. load 90%', 'Steel', 'Steel\\nmin. load 90%'], rotation=0)\n", - "ax.set_title(f'Cost structure ({region}, best {demand_factor}% of RE potentials)')\n", - "ax.grid(axis='y', alpha=0.4, zorder=0)\n", - "ax.legend(title='Carrier', bbox_to_anchor=(1.05, 1), loc='upper left')\n", + "ax.set_xticklabels(\n", + " [\"EAF\", \"EAF-grid\", \"HBI\\nmin. load 90%\", \"Steel\", \"Steel\\nmin. load 90%\"],\n", + " rotation=0,\n", + ")\n", + "ax.set_title(f\"Cost structure ({region}, best {demand_factor}% of RE potentials)\")\n", + "ax.grid(axis=\"y\", alpha=0.4, zorder=0)\n", + "ax.legend(title=\"Carrier\", bbox_to_anchor=(1.05, 1), loc=\"upper left\")\n", "ax.set_ylim(0, None)\n", "plt.tight_layout()\n", "\n", @@ -302,7 +337,9 @@ "outputs": [], "source": [ "# Electricity to steel ratio\n", - "steel_in_Mt = n.statistics.energy_balance().loc[\"Load\", :,\"Steel\"].sum() /1e6 * (-1) # from t to Mt\n", + "steel_in_Mt = (\n", + " n.statistics.energy_balance().loc[\"Load\", :, \"Steel\"].sum() / 1e6 * (-1)\n", + ") # from t to Mt\n", "steel_in_Mt" ] }, @@ -314,7 +351,12 @@ "outputs": [], "source": [ "# Electricity to steel ratio\n", - "electricity_in_TWh = n.statistics.energy_balance().loc[\"Generator\", [\"Photovoltaics\", \"Wind energy\"],:].sum() / 1e6 # from MWh to TWh\n", + "electricity_in_TWh = (\n", + " n.statistics.energy_balance()\n", + " .loc[\"Generator\", [\"Photovoltaics\", \"Wind energy\"], :]\n", + " .sum()\n", + " / 1e6\n", + ") # from MWh to TWh\n", "\n", "electricity_in_TWh" ] @@ -347,7 +389,7 @@ "metadata": {}, "outputs": [], "source": [ - "n.statistics.energy_balance() #.iplot()" + "n.statistics.energy_balance() # .iplot()" ] } ], diff --git a/workflow/notebooks/analysis-trace.ipynb b/workflow/notebooks/analysis-trace.ipynb index 68b562b..8ffc75d 100644 --- a/workflow/notebooks/analysis-trace.ipynb +++ b/workflow/notebooks/analysis-trace.ipynb @@ -7,7 +7,6 @@ "metadata": {}, "outputs": [], "source": [ - "import pandas as pd\n", "import pypsa" ] }, @@ -28,7 +27,9 @@ "metadata": {}, "outputs": [], "source": [ - "n = pypsa.Network(\"../../../trace-fneum/trace/resources/networks/default/2030/shipping-steel/DE-DE/network.nc\")" + "n = pypsa.Network(\n", + " \"../../../trace-fneum/trace/resources/networks/default/2030/shipping-steel/DE-DE/network.nc\"\n", + ")" ] }, { @@ -85,7 +86,6 @@ "outputs": [], "source": [ "import pypsatopo\n", - "import pandas as pd\n", "import pypsa" ] }, @@ -96,7 +96,9 @@ "metadata": {}, "outputs": [], "source": [ - "n = pypsa.Network(\"../../../trace-fneum/trace/resources/networks/default/2030/shipping-steel/DE-DE/network.nc\")" + "n = pypsa.Network(\n", + " \"../../../trace-fneum/trace/resources/networks/default/2030/shipping-steel/DE-DE/network.nc\"\n", + ")" ] }, { @@ -106,35 +108,7 @@ "metadata": {}, "outputs": [], "source": [ - "pypsatopo.generate(n, file_format = \"png\", file_output = output_fn)" - ] - }, - { - "cell_type": "markdown", - "id": "1fae9cf5", - "metadata": {}, - "source": [ - "### Netview (not working)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3e2eb0e8", - "metadata": {}, - "outputs": [], - "source": [ - "from pypsa_netview.draw import draw_network" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "838ba0b1", - "metadata": {}, - "outputs": [], - "source": [ - "draw_network(n, show_capacities=True)" + "pypsatopo.generate(n, file_format=\"png\", file_output=output_fn)" ] } ], diff --git a/workflow/notebooks/analysis-transport-cost.ipynb b/workflow/notebooks/analysis-transport-cost.ipynb new file mode 100644 index 0000000..ac2aa97 --- /dev/null +++ b/workflow/notebooks/analysis-transport-cost.ipynb @@ -0,0 +1,102 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "b0311363", + "metadata": {}, + "outputs": [], + "source": [ + "import pypsa\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a98efb58", + "metadata": {}, + "outputs": [], + "source": [ + "n = pypsa.Network(\"../../results/chain_id~newre_2050/cost_year~2050/interone~hbi/intertwo~eaf/wacc~regional/final~steel/scenario~default/network.nc\")" + ] + }, + { + "cell_type": "markdown", + "id": "5a18fba6", + "metadata": {}, + "source": [ + "### Transport efficiency" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6edd6dee", + "metadata": {}, + "outputs": [], + "source": [ + "n.links[n.links.carrier == \"shipping_iron_ore\"].efficiency.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a3a5201", + "metadata": {}, + "outputs": [], + "source": [ + "n.links[n.links.carrier == \"shipping_hbi\"].efficiency.describe()" + ] + }, + { + "cell_type": "markdown", + "id": "b69794c5", + "metadata": {}, + "source": [ + "### Transport cost" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6b82f5f", + "metadata": {}, + "outputs": [], + "source": [ + "n.links[n.links.carrier == \"shipping_iron_ore\"].marginal_cost.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5942c78", + "metadata": {}, + "outputs": [], + "source": [ + "n.links[n.links.carrier == \"shipping_hbi\"].marginal_cost.describe()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "shift", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/analysis_pypsa_lcox.ipynb b/workflow/notebooks/analysis_pypsa_lcox.ipynb new file mode 100644 index 0000000..a5be402 --- /dev/null +++ b/workflow/notebooks/analysis_pypsa_lcox.ipynb @@ -0,0 +1,2154 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "41da0fe7", + "metadata": {}, + "source": [ + "# LCO‑HBI Analysis (Fixed Copy)\n", + "This simplified, cleaned notebook loads a solved PyPSA network, inspects `n.statistics()` output, and computes a defensible LCO‑HBI using a robust fallback if statistics are unavailable." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "872d512b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:pypsa.network.io:New version 1.2.1 available! (Current: 1.1.2)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Run at 2026-05-20T17:43:03.061869Z\n", + "pypsa version 1.1.2\n", + "Found 6 network files under C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resources\\lco-hbi\\cost_year~2050\\Europe_reserved\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:pypsa.network.io:Imported network 'LCOX-Europe-hbi-0.01' has buses, carriers, generators, links, loads, stores, sub_networks\n", + "INFO:pypsa.network.io:New version 1.2.1 available! (Current: 1.1.2)\n", + "INFO:pypsa.network.io:Imported network 'LCOX-Europe-hbi-0.1' has buses, carriers, generators, links, loads, stores, sub_networks\n", + "INFO:pypsa.network.io:New version 1.2.1 available! (Current: 1.1.2)\n", + "INFO:pypsa.network.io:Imported network 'LCOX-Europe-hbi-1.0' has buses, carriers, generators, links, loads, stores, sub_networks\n", + "INFO:pypsa.network.io:New version 1.2.1 available! (Current: 1.1.2)\n", + "INFO:pypsa.network.io:Imported network 'LCOX-Europe-hbi-10.0' has buses, carriers, generators, links, loads, stores, sub_networks\n", + "INFO:pypsa.network.io:New version 1.2.1 available! (Current: 1.1.2)\n", + "INFO:pypsa.network.io:Imported network 'LCOX-Europe-hbi-100.0' has buses, carriers, generators, links, loads, stores, sub_networks\n", + "INFO:pypsa.network.io:New version 1.2.1 available! (Current: 1.1.2)\n", + "INFO:pypsa.network.io:Imported network 'LCOX-Europe-hbi-1000.0' has buses, carriers, generators, links, loads, stores, sub_networks\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
networkfilehbi_loadshbi_tons_per_yeardemand_mttotal_lcox_per_t_hbi
0network_0.01C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour...hbi_demand1.000000e+040.01546.343745
1network_0.1C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour...hbi_demand1.000000e+050.10546.343000
2network_1C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour...hbi_demand1.000000e+061.00546.343006
3network_10C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour...hbi_demand1.000000e+0710.00546.343006
4network_100C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour...hbi_demand1.000000e+08100.00546.343292
5network_1000C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour...hbi_demand1.000000e+091000.00562.528782
\n", + "
" + ], + "text/plain": [ + " network file \\\n", + "0 network_0.01 C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour... \n", + "1 network_0.1 C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour... \n", + "2 network_1 C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour... \n", + "3 network_10 C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour... \n", + "4 network_100 C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour... \n", + "5 network_1000 C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\resour... \n", + "\n", + " hbi_loads hbi_tons_per_year demand_mt total_lcox_per_t_hbi \n", + "0 hbi_demand 1.000000e+04 0.01 546.343745 \n", + "1 hbi_demand 1.000000e+05 0.10 546.343000 \n", + "2 hbi_demand 1.000000e+06 1.00 546.343006 \n", + "3 hbi_demand 1.000000e+07 10.00 546.343006 \n", + "4 hbi_demand 1.000000e+08 100.00 546.343292 \n", + "5 hbi_demand 1.000000e+09 1000.00 562.528782 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
renewable_pvrenewable_wind_onshorerenewable_wind_offshorebattery_elecelectrolysishydrogendirect_reduction_furnace
capexfomcapexfomcapexfomcapexcapexfomcapexcapexfom
demand_mt
0.0121.5603595.332561227.54431125.2578551.880000e-073.800000e-089.000000e-0941.47766911.3571424.19341499.580606110.039829
0.1021.5604625.332587227.54348025.2577634.490000e-089.200000e-092.200000e-0941.47767311.3571444.19344799.580610110.039834
1.0021.5604615.332587227.54348625.2577632.432000e-084.960000e-091.210000e-0941.47767411.3571444.19344799.580610110.039834
10.0021.5604615.332587227.54348625.2577638.000000e-122.000000e-120.000000e+0041.47767411.3571444.19344799.580610110.039834
100.0021.4321495.300851227.67771525.2726630.000000e+000.000000e+000.000000e+0041.44940711.3494044.22980099.585769110.045535
1000.0036.7844419.097960213.43974323.6922212.486100e-105.075000e-111.682000e-1151.75601014.1714903.43546099.832869110.318588
\n", + "
" + ], + "text/plain": [ + " renewable_pv renewable_wind_onshore \\\n", + " capex fom capex fom \n", + "demand_mt \n", + "0.01 21.560359 5.332561 227.544311 25.257855 \n", + "0.10 21.560462 5.332587 227.543480 25.257763 \n", + "1.00 21.560461 5.332587 227.543486 25.257763 \n", + "10.00 21.560461 5.332587 227.543486 25.257763 \n", + "100.00 21.432149 5.300851 227.677715 25.272663 \n", + "1000.00 36.784441 9.097960 213.439743 23.692221 \n", + "\n", + " renewable_wind_offshore battery_elec electrolysis \\\n", + " capex fom capex capex \n", + "demand_mt \n", + "0.01 1.880000e-07 3.800000e-08 9.000000e-09 41.477669 \n", + "0.10 4.490000e-08 9.200000e-09 2.200000e-09 41.477673 \n", + "1.00 2.432000e-08 4.960000e-09 1.210000e-09 41.477674 \n", + "10.00 8.000000e-12 2.000000e-12 0.000000e+00 41.477674 \n", + "100.00 0.000000e+00 0.000000e+00 0.000000e+00 41.449407 \n", + "1000.00 2.486100e-10 5.075000e-11 1.682000e-11 51.756010 \n", + "\n", + " hydrogen direct_reduction_furnace \n", + " fom capex capex fom \n", + "demand_mt \n", + "0.01 11.357142 4.193414 99.580606 110.039829 \n", + "0.10 11.357144 4.193447 99.580610 110.039834 \n", + "1.00 11.357144 4.193447 99.580610 110.039834 \n", + "10.00 11.357144 4.193447 99.580610 110.039834 \n", + "100.00 11.349404 4.229800 99.585769 110.045535 \n", + "1000.00 14.171490 3.435460 99.832869 110.318588 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Solar PV
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(31, 119, 180, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Solar PV Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 21.560358665999996, + 21.560461756099997, + 21.560461496830005, + 21.56046148612, + 21.4321490399534, + 36.78444084917607 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Solar PV
FOM: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(31, 119, 180, 0.58)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Solar PV Β· FOM", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 5.332561255999999, + 5.3325867536, + 5.332586689460001, + 5.332586686809, + 5.3008509448528, + 9.09796015638662 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Onshore wind
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(255, 127, 14, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Onshore wind Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 227.54431060299996, + 227.543480262, + 227.54348630482005, + 227.54348632108, + 227.6777150617776, + 213.43974331480248 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Onshore wind
FOM: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(255, 127, 14, 0.58)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Onshore wind Β· FOM", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 25.257854872999996, + 25.2577627031, + 25.25776337383001, + 25.257763375639, + 25.2726630232871, + 23.692220853095996 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Offshore wind
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(44, 160, 44, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Offshore wind Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 1.8799999999999996e-7, + 4.49e-8, + 2.4320000000000005e-8, + 8.000000000000001e-12, + 0, + 2.4861000000000003e-10 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Offshore wind
FOM: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(44, 160, 44, 0.58)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Offshore wind Β· FOM", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 3.8e-8, + 9.2e-9, + 4.960000000000001e-9, + 2.0000000000000004e-12, + 0, + 5.075000000000002e-11 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Battery storage
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(214, 39, 40, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Battery storage Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 9e-9, + 2.2000000000000003e-9, + 1.2100000000000002e-9, + 0, + 0, + 1.6820000000000006e-11 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Electrolyzer
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(148, 103, 189, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Electrolyzer Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 41.47766877899999, + 41.4776734385, + 41.47767353410001, + 41.47767353437, + 41.4494067245472, + 51.75600983954598 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Electrolyzer
FOM: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(148, 103, 189, 0.58)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Electrolyzer Β· FOM", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 11.357142346999998, + 11.3571436227, + 11.35714364888, + 11.357143648958, + 11.349403817085, + 14.171490065795352 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Hydrogen storage
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(140, 86, 75, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Hydrogen storage Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 4.193413646, + 4.1934474679, + 4.193447037500001, + 4.193447040504, + 4.2297995211365, + 3.4354602440477207 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Direct reduction furnace
Capex: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(227, 119, 194, 0.98)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Direct reduction furnace Β· Capex", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 99.58060556799998, + 99.5806102069, + 99.58061014736002, + 99.580610147937, + 99.5857692801926, + 99.83286881596774 + ] + }, + { + "hovertemplate": "Demand: %{x:.2f} Mt/year
Direct reduction furnace
FOM: %{y:.2f} €/t HBI", + "marker": { + "color": "rgba(227, 119, 194, 0.58)", + "line": { + "color": "white", + "width": 0.6 + } + }, + "name": "Direct reduction furnace Β· FOM", + "type": "bar", + "width": [ + 0.009000000000000003, + 0.09000000000000001, + 0.8999999999999998, + 9, + 90, + 899.9999999999998 + ], + "x": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "y": [ + 110.03982854399996, + 110.0398336703, + 110.03983360451002, + 110.039833605146, + 110.04553461515287, + 110.3185876900458 + ] + } + ], + "layout": { + "bargap": 0, + "barmode": "stack", + "font": { + "size": 14 + }, + "height": 700, + "hovermode": "x unified", + "legend": { + "title": { + "text": "Technology / cost" + } + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Europe HBI LCOX breakdown" + }, + "width": 1100, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "0.01", + "0.1", + "1", + "10", + "100", + "1000" + ], + "tickvals": [ + 0.010000000000000002, + 0.1, + 0.9999999999999998, + 10, + 100, + 999.9999999999998 + ], + "title": { + "text": "HBI demand [Mt/year]" + }, + "type": "log" + }, + "yaxis": { + "gridcolor": "rgba(0,0,0,0.1)", + "title": { + "text": "Levelized Cost of HBI [€/t]" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
renewable_pvrenewable_wind_onshorerenewable_wind_offshorebattery_elecelectrolysishydrogendirect_reduction_furnace
capexfomcapexfomcapexfomcapexcapexfomcapexcapexfom
demand_mt
0.0121.5603595.332561227.54431125.2578551.880000e-073.800000e-089.000000e-0941.47766911.3571424.19341499.580606110.039829
0.1021.5604625.332587227.54348025.2577634.490000e-089.200000e-092.200000e-0941.47767311.3571444.19344799.580610110.039834
1.0021.5604615.332587227.54348625.2577632.432000e-084.960000e-091.210000e-0941.47767411.3571444.19344799.580610110.039834
10.0021.5604615.332587227.54348625.2577638.000000e-122.000000e-120.000000e+0041.47767411.3571444.19344799.580610110.039834
100.0021.4321495.300851227.67771525.2726630.000000e+000.000000e+000.000000e+0041.44940711.3494044.22980099.585769110.045535
1000.0036.7844419.097960213.43974323.6922212.486100e-105.075000e-111.682000e-1151.75601014.1714903.43546099.832869110.318588
\n", + "
" + ], + "text/plain": [ + " renewable_pv renewable_wind_onshore \\\n", + " capex fom capex fom \n", + "demand_mt \n", + "0.01 21.560359 5.332561 227.544311 25.257855 \n", + "0.10 21.560462 5.332587 227.543480 25.257763 \n", + "1.00 21.560461 5.332587 227.543486 25.257763 \n", + "10.00 21.560461 5.332587 227.543486 25.257763 \n", + "100.00 21.432149 5.300851 227.677715 25.272663 \n", + "1000.00 36.784441 9.097960 213.439743 23.692221 \n", + "\n", + " renewable_wind_offshore battery_elec electrolysis \\\n", + " capex fom capex capex \n", + "demand_mt \n", + "0.01 1.880000e-07 3.800000e-08 9.000000e-09 41.477669 \n", + "0.10 4.490000e-08 9.200000e-09 2.200000e-09 41.477673 \n", + "1.00 2.432000e-08 4.960000e-09 1.210000e-09 41.477674 \n", + "10.00 8.000000e-12 2.000000e-12 0.000000e+00 41.477674 \n", + "100.00 0.000000e+00 0.000000e+00 0.000000e+00 41.449407 \n", + "1000.00 2.486100e-10 5.075000e-11 1.682000e-11 51.756010 \n", + "\n", + " hydrogen direct_reduction_furnace \n", + " fom capex capex fom \n", + "demand_mt \n", + "0.01 11.357142 4.193414 99.580606 110.039829 \n", + "0.10 11.357144 4.193447 99.580610 110.039834 \n", + "1.00 11.357144 4.193447 99.580610 110.039834 \n", + "10.00 11.357144 4.193447 99.580610 110.039834 \n", + "100.00 11.349404 4.229800 99.585769 110.045535 \n", + "1000.00 14.171490 3.435460 99.832869 110.318588 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load and compare every solved network in a folder\n", + "import pathlib\n", + "from datetime import datetime\n", + "from typing import Any\n", + "\n", + "import pandas as pd\n", + "import pypsa\n", + "import seaborn as sns\n", + "import plotly.graph_objects as go\n", + "from plotly.io import renderers\n", + "from IPython.display import display\n", + "\n", + "renderers.default = \"vscode\"\n", + "\n", + "print(\"Run at\", datetime.now().isoformat() + \"Z\")\n", + "print(\"pypsa version\", getattr(pypsa, \"__version__\", \"unknown\"))\n", + "\n", + "repo_root = pathlib.Path(\"../..\").resolve()\n", + "network_folder = pathlib.Path(r\"resources/lco-hbi/cost_year~2050/Europe_reserved\")\n", + "if not network_folder.is_absolute():\n", + " network_folder = (repo_root / network_folder).resolve()\n", + "\n", + "network_files = sorted(network_folder.rglob(\"*.nc\"))\n", + "if not network_files:\n", + " raise FileNotFoundError(f\"No .nc files found under {network_folder}\")\n", + "\n", + "print(f\"Found {len(network_files)} network files under {network_folder}\")\n", + "\n", + "\n", + "def network_label(path: pathlib.Path, root: pathlib.Path) -> str:\n", + " try:\n", + " rel_path = path.relative_to(root)\n", + " except ValueError:\n", + " rel_path = path\n", + " return rel_path.with_suffix(\"\").as_posix()\n", + "\n", + "\n", + "def collapse_stats_table(value: Any) -> pd.Series:\n", + " \"\"\"Return a Series indexed by the specific technology name, e.g. renewable_pv.\"\"\"\n", + "\n", + " def comp_name_from_tuple(tup):\n", + " parts = [str(x) for x in tup]\n", + " if len(parts) >= 2:\n", + " return \"_\".join(parts[1:])\n", + " return parts[0]\n", + "\n", + " if isinstance(value, pd.Series):\n", + " series = pd.to_numeric(value, errors=\"coerce\").fillna(0)\n", + " if isinstance(series.index, pd.MultiIndex):\n", + " names = [comp_name_from_tuple(t) for t in series.index.values]\n", + " return pd.Series(series.values, index=names).groupby(level=0).sum()\n", + " return series\n", + " if isinstance(value, pd.DataFrame):\n", + " numeric = value.select_dtypes(include=\"number\")\n", + " if numeric.empty:\n", + " return pd.Series(dtype=float)\n", + " row_sum = numeric.sum(axis=1)\n", + " if isinstance(row_sum.index, pd.MultiIndex):\n", + " names = [comp_name_from_tuple(t) for t in row_sum.index.values]\n", + " return pd.Series(row_sum.values, index=names).groupby(level=0).sum()\n", + " return row_sum\n", + " return pd.Series({\"value\": float(value)})\n", + "\n", + "\n", + "def hbi_annual_output_tons(network: pypsa.Network):\n", + " hbi_loads = network.loads.index[\n", + " network.loads[\"bus\"].astype(str).str.contains(\"hbi\", case=False, na=False)\n", + " ].tolist()\n", + " if not hbi_loads:\n", + " raise ValueError(\"No HBI load found in network.loads.\")\n", + "\n", + " load_ts = network.loads_t.p.reindex(columns=hbi_loads, fill_value=0)\n", + " hbi_hourly_tons = load_ts.sum(axis=1)\n", + "\n", + " if \"objective\" in getattr(network, \"snapshot_weightings\", pd.DataFrame()).columns:\n", + " weights = network.snapshot_weightings[\"objective\"].reindex(\n", + " hbi_hourly_tons.index\n", + " )\n", + " else:\n", + " weights = pd.Series(1.0, index=hbi_hourly_tons.index)\n", + " weights = weights.fillna(1.0)\n", + "\n", + " annual_tons = float((hbi_hourly_tons * weights).sum())\n", + " return annual_tons, hbi_loads\n", + "\n", + "\n", + "def lcox_breakdown_per_ton(network: pypsa.Network):\n", + " annual_hbi_tons, hbi_loads = hbi_annual_output_tons(network)\n", + " if annual_hbi_tons <= 0:\n", + " raise ValueError(\"Annual HBI output must be positive.\")\n", + "\n", + " cost_tables = {\n", + " \"capex\": collapse_stats_table(network.stats.capex()),\n", + " \"opex\": collapse_stats_table(network.stats.opex()),\n", + " \"fom\": collapse_stats_table(network.stats.fom()),\n", + " }\n", + "\n", + " records = []\n", + " for category, series in cost_tables.items():\n", + " for technology, value in series.items():\n", + " if float(value) == 0.0:\n", + " continue\n", + " records.append(\n", + " {\n", + " \"category\": category,\n", + " \"technology\": str(technology),\n", + " \"value_per_t_hbi\": float(value) / annual_hbi_tons,\n", + " }\n", + " )\n", + "\n", + " breakdown = pd.DataFrame(records)\n", + " return breakdown, annual_hbi_tons, hbi_loads\n", + "\n", + "\n", + "sns.set_theme(style=\"whitegrid\", context=\"talk\", font_scale=0.9)\n", + "\n", + "technology_names = {\n", + " \"renewable_pv\": \"Solar PV\",\n", + " \"renewable_wind_onshore\": \"Onshore wind\",\n", + " \"renewable_wind_offshore\": \"Offshore wind\",\n", + " \"battery_elec\": \"Battery storage\",\n", + " \"electrolysis\": \"Electrolyzer\",\n", + " \"hydrogen\": \"Hydrogen storage\",\n", + " \"direct_reduction_furnace\": \"Direct reduction furnace\",\n", + "}\n", + "\n", + "category_names = {\n", + " \"capex\": \"Capex\",\n", + " \"opex\": \"Opex\",\n", + " \"fom\": \"FOM\",\n", + "}\n", + "\n", + "technology_order_preference = [\n", + " \"renewable_pv\",\n", + " \"renewable_wind_onshore\",\n", + " \"renewable_wind_offshore\",\n", + " \"battery_elec\",\n", + " \"electrolysis\",\n", + " \"hydrogen\",\n", + " \"direct_reduction_furnace\",\n", + "]\n", + "\n", + "breakdown_frames = []\n", + "summary_records = []\n", + "skipped_records = []\n", + "for network_path in network_files:\n", + " network_name = network_label(network_path, network_folder)\n", + " network = pypsa.Network(str(network_path))\n", + " try:\n", + " breakdown, annual_hbi_tons, hbi_loads = lcox_breakdown_per_ton(network)\n", + " except ValueError as exc:\n", + " skipped_records.append(\n", + " {\n", + " \"network\": network_name,\n", + " \"file\": str(network_path),\n", + " \"reason\": str(exc),\n", + " }\n", + " )\n", + " print(f\"Skipping {network_name}: {exc}\")\n", + " continue\n", + "\n", + " if breakdown.empty:\n", + " skipped_records.append(\n", + " {\n", + " \"network\": network_name,\n", + " \"file\": str(network_path),\n", + " \"reason\": \"Empty cost breakdown\",\n", + " }\n", + " )\n", + " print(f\"Skipping {network_name}: empty cost breakdown\")\n", + " continue\n", + "\n", + " demand_mt = annual_hbi_tons / 1e6\n", + " breakdown = breakdown.assign(\n", + " network=network_name,\n", + " file=str(network_path),\n", + " hbi_loads=\", \".join(hbi_loads),\n", + " hbi_tons_per_year=annual_hbi_tons,\n", + " demand_mt=demand_mt,\n", + " )\n", + " breakdown_frames.append(breakdown)\n", + " summary_records.append(\n", + " {\n", + " \"network\": network_name,\n", + " \"file\": str(network_path),\n", + " \"hbi_loads\": \", \".join(hbi_loads),\n", + " \"hbi_tons_per_year\": annual_hbi_tons,\n", + " \"demand_mt\": demand_mt,\n", + " \"total_lcox_per_t_hbi\": float(breakdown[\"value_per_t_hbi\"].sum()),\n", + " }\n", + " )\n", + "\n", + "if not breakdown_frames:\n", + " raise ValueError(\n", + " f\"No networks with HBI cost breakdowns found under {network_folder}\"\n", + " )\n", + "\n", + "long_df = pd.concat(breakdown_frames, ignore_index=True)\n", + "summary_df = (\n", + " pd.DataFrame(summary_records).sort_values(\"demand_mt\").reset_index(drop=True)\n", + ")\n", + "\n", + "technology_order = [\n", + " tech for tech in technology_order_preference if tech in set(long_df[\"technology\"])\n", + "]\n", + "\n", + "plot_df = long_df.pivot_table(\n", + " index=\"demand_mt\",\n", + " columns=[\"technology\", \"category\"],\n", + " values=\"value_per_t_hbi\",\n", + " aggfunc=\"sum\",\n", + " fill_value=0,\n", + ")\n", + "\n", + "all_columns = pd.MultiIndex.from_product([technology_order, [\"capex\", \"opex\", \"fom\"]])\n", + "plot_df = plot_df.reindex(columns=all_columns, fill_value=0)\n", + "present_columns = [col for col in plot_df.columns if float(plot_df[col].sum()) > 0]\n", + "plot_df = plot_df[present_columns]\n", + "\n", + "display(summary_df)\n", + "display(plot_df)\n", + "\n", + "if skipped_records:\n", + " display(pd.DataFrame(skipped_records))\n", + "\n", + "base_palette = sns.color_palette(\"tab10\", n_colors=max(len(technology_order), 1))\n", + "technology_colors = {tech: base_palette[i] for i, tech in enumerate(technology_order)}\n", + "\n", + "\n", + "def rgba_color(base_color, category):\n", + " if category == \"capex\":\n", + " alpha = 0.98\n", + " elif category == \"opex\":\n", + " alpha = 0.78\n", + " else:\n", + " alpha = 0.58\n", + " r, g, b = [int(round(c * 255)) for c in base_color]\n", + " return f\"rgba({r}, {g}, {b}, {alpha})\"\n", + "\n", + "\n", + "bar_widths = [x * 0.9 for x in plot_df.index.tolist()]\n", + "\n", + "tech_blocks = [\n", + " (tech, [col for col in plot_df.columns if col[0] == tech])\n", + " for tech in technology_order\n", + " if any(col[0] == tech for col in plot_df.columns)\n", + "]\n", + "\n", + "fig = go.Figure()\n", + "seen_labels = set()\n", + "for technology, cols in tech_blocks:\n", + " for category in [\"capex\", \"opex\", \"fom\"]:\n", + " column = (technology, category)\n", + " if column not in plot_df.columns:\n", + " continue\n", + " values = plot_df[column]\n", + " if float(values.sum()) <= 0:\n", + " continue\n", + " tech_label = technology_names.get(\n", + " technology, technology.replace(\"_\", \" \").title()\n", + " )\n", + " cat_label = category_names.get(category, category.upper())\n", + " label = f\"{tech_label} Β· {cat_label}\"\n", + " fig.add_trace(\n", + " go.Bar(\n", + " x=plot_df.index.tolist(),\n", + " y=values.values.tolist(),\n", + " width=bar_widths,\n", + " name=label if label not in seen_labels else label,\n", + " marker_color=rgba_color(technology_colors[technology], category),\n", + " marker_line_color=\"white\",\n", + " marker_line_width=0.6,\n", + " hovertemplate=(\n", + " f\"Demand: %{{x:.2f}} Mt/year\"\n", + " f\"
{tech_label}\"\n", + " f\"
{cat_label}: %{{y:.2f}} €/t HBI\"\n", + " \"\"\n", + " ),\n", + " )\n", + " )\n", + " seen_labels.add(label)\n", + "\n", + "region_name = network_folder.name.replace(\"_reserved\", \"\").replace(\"_\", \" \")\n", + "fig.update_layout(\n", + " barmode=\"stack\",\n", + " title=f\"{region_name} HBI LCOX breakdown\",\n", + " xaxis_title=\"HBI demand [Mt/year]\",\n", + " yaxis_title=\"Levelized Cost of HBI [€/t]\",\n", + " template=\"plotly_white\",\n", + " legend_title=\"Technology / cost\",\n", + " width=max(1100, 170 * len(plot_df.index)),\n", + " height=700,\n", + " bargap=0.0,\n", + " font=dict(size=14),\n", + " hovermode=\"x unified\",\n", + ")\n", + "fig.update_xaxes(\n", + " type=\"log\",\n", + " tickmode=\"array\",\n", + " tickvals=plot_df.index.tolist(),\n", + " ticktext=[f\"{d:g}\" for d in plot_df.index],\n", + ")\n", + "fig.update_yaxes(gridcolor=\"rgba(0,0,0,0.1)\")\n", + "\n", + "# interactive_html = (repo_root / \"results\" / \"figures_general\" / f\"{network_folder.name}_hbi_lcox_interactive.html\")\n", + "# interactive_html.parent.mkdir(parents=True, exist_ok=True)\n", + "# fig.write_html(str(interactive_html), include_plotlyjs=\"cdn\")\n", + "# print(f\"Interactive HTML written to {interactive_html}\")\n", + "display(fig)\n", + "\n", + "plot_df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "shift-dev", + "language": "python", + "name": "shift-dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/colors.ipynb b/workflow/notebooks/colors.ipynb new file mode 100644 index 0000000..800f730 --- /dev/null +++ b/workflow/notebooks/colors.ipynb @@ -0,0 +1,118 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d86d9a35", + "metadata": {}, + "outputs": [], + "source": [ + "from cmcrameri import cm\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e988c3f", + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(0, 14, 15)[None, :]\n", + "plt.imshow(x, aspect='auto', cmap=cm.batlowS) # or any other colourmap\n", + "plt.axis('off')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f3c5cb4", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.colors as mcolors\n", + "\n", + "regions = sorted([\n", + " \"Central_America\", \"East_Asia\", \"East_East_Asia\", \"Eurasia\", \"Europe\",\n", + " \"Far_West_Europe\", \"Middle_East\", \"North_America\", \"North_West_Africa\",\n", + " \"Oceania\", \"Pacific_Asia\", \"South_America\", \"South_South_America\",\n", + " \"Subsaharan_Africa\", \"West_Asia\"\n", + "])\n", + "\n", + "n = len(regions)\n", + "colors_rgba = cm.batlowS(np.linspace(0, 1, n))\n", + "hex_colors = [mcolors.to_hex(c).upper() for c in colors_rgba]\n", + "\n", + "for region, hex_color in zip(regions, hex_colors):\n", + " print(f\" {(region + ':').ljust(25)} '{hex_color}'\")" + ] + }, + { + "cell_type": "markdown", + "id": "c4584ddc", + "metadata": {}, + "source": [ + "### okabeito" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d3c51d9", + "metadata": {}, + "outputs": [], + "source": [ + "from cmap import Colormap\n", + "\n", + "okabeito = Colormap('okabeito:okabeito') # case insensitive" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ecbcc58c", + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(0, 14, 15)[None, :]\n", + "plt.imshow(x, aspect='auto', cmap=okabeito.to_mpl())\n", + "plt.axis('off')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ce77fa1", + "metadata": {}, + "outputs": [], + "source": [ + "hex_colors_ok = [mcolors.to_hex(okabeito(i)).upper() for i in np.linspace(0, 1, n)]\n", + "\n", + "for region, hex_color in zip(regions, hex_colors_ok):\n", + " print(f\" {(region + ':').ljust(25)} '{hex_color}'\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "shift", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/compare-scenarios.ipynb b/workflow/notebooks/compare-scenarios.ipynb index a7d79ea..cbf005f 100644 --- a/workflow/notebooks/compare-scenarios.ipynb +++ b/workflow/notebooks/compare-scenarios.ipynb @@ -8,13 +8,8 @@ "outputs": [], "source": [ "import pypsa\n", - "import pandas as pd\n", - "import numpy as np\n", - "import xarray as xr\n", "\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import re" + "import matplotlib.pyplot as plt" ] }, { @@ -24,11 +19,12 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", + "\n", "snakemake = mock_snakemake(\n", - " \"collect_figures\",\n", - " scenario=\"default\" # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", - " )" + " \"plot_comparison\",\n", + " scenario=\"default\", # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", + ")" ] }, { @@ -59,6 +55,16 @@ "### Read networks in Network collection" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "99b8dc61", + "metadata": {}, + "outputs": [], + "source": [ + "scenarios = snakemake.input.keys()" + ] + }, { "cell_type": "code", "execution_count": null, @@ -68,9 +74,8 @@ "source": [ "nc = {}\n", "\n", - "for scenario in config[\"scenario\"].keys():\n", - "\n", - " trade_model_fn = f\"../../results/cost_year~2030/interone~hbi/intertwo~eaf-grid/final~steel/scenario~{scenario}/network.nc\"\n", + "for scenario in scenarios:\n", + " trade_model_fn = snakemake.input[scenario]\n", "\n", " n = pypsa.Network(trade_model_fn)\n", " n.name = scenario\n", @@ -113,7 +118,9 @@ "outputs": [], "source": [ "df = nc.statistics.system_cost(groupby=\"carrier\").to_frame(\"systemcost\")\n", - "steel_demand = nc.statistics.withdrawal().to_frame().loc[\"Load\",\"default\",\"steel\"].value\n", + "steel_demand = (\n", + " nc.statistics.withdrawal().to_frame().loc[\"Load\", \"default\", \"steel\"][0]\n", + ")\n", "\n", "df = df / steel_demand\n", "# df" @@ -127,26 +134,42 @@ "outputs": [], "source": [ "# Pivot to get networks as rows and carriers as columns\n", - "plot_df = (\n", - " df.pivot_table(\n", - " index=\"network\",\n", - " columns=\"carrier\",\n", - " values=\"systemcost\",\n", - " aggfunc=\"sum\"\n", - " )\n", + "plot_df = df.pivot_table(\n", + " index=\"network\", columns=\"carrier\", values=\"systemcost\", aggfunc=\"sum\"\n", ")\n", "\n", - "order = [\"iron_ore\", \"shipping_iron_ore\", \"hbi\", \"shipping_hbi\", \"steel\"]\n", + "order = [\"iron_ore\", \"shipping_iron_ore\", \"hbi\", \"shipping_hbi\", \"steel\"]\n", "\n", "plot_df = plot_df[order]\n", "\n", - "plot_df.rename(columns={\n", - " \"iron_ore\": \"Iron ore\",\n", - " \"shipping_iron_ore\": \"Shipping iron ore\",\n", - " \"hbi\": \"DRI\",\n", - " \"shipping_hbi\": \"Shipping HBI\",\n", - " \"steel\": \"EAF\"\n", - "}, inplace=True)" + "plot_df.rename(\n", + " columns={\n", + " \"iron_ore\": \"Iron ore\",\n", + " \"shipping_iron_ore\": \"Shipping iron ore\",\n", + " \"hbi\": \"DRI\",\n", + " \"shipping_hbi\": \"Shipping HBI\",\n", + " \"steel\": \"EAF\",\n", + " },\n", + " inplace=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cdc881f0", + "metadata": {}, + "source": [ + "Remove HBI transport cost for scenario with artifically high transport costs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f27e730f", + "metadata": {}, + "outputs": [], + "source": [ + "plot_df.loc[\"hightrans\", \"Shipping HBI\"] = 0" ] }, { @@ -162,7 +185,7 @@ " stacked=True,\n", " figsize=(8, 4),\n", " color=[nc[\"default\"].carriers.color[c] for c in order],\n", - " alpha=0.8\n", + " alpha=0.8,\n", ")\n", "\n", "# ---- Axis labels ----\n", @@ -181,12 +204,12 @@ "\n", "for i, total in enumerate(totals):\n", " ax.text(\n", - " i, \n", - " total, \n", + " i,\n", + " total,\n", " f\"{total:.1f}\", # adjust scaling if needed\n", " ha=\"center\",\n", " va=\"bottom\",\n", - " fontsize=10\n", + " fontsize=10,\n", " )\n", "\n", "# ---- Flip legend order ----\n", @@ -196,13 +219,13 @@ " labels[::-1],\n", " title=\"Cost component\",\n", " bbox_to_anchor=(1.02, 1),\n", - " loc=\"upper left\"\n", + " loc=\"upper left\",\n", ")\n", "\n", "plt.xticks(rotation=0)\n", "plt.tight_layout()\n", - "plt.savefig(snakemake.input.cost_comparison, dpi=300)\n", - "plt.savefig(snakemake.input.cost_comparison_png, dpi=300)\n", + "plt.savefig(snakemake.output.cost_comparison, dpi=300)\n", + "plt.savefig(snakemake.output.cost_comparison_png, dpi=300)\n", "plt.show()" ] }, diff --git a/workflow/notebooks/compare_renewables_trace_vs_pypsa-earth.ipynb b/workflow/notebooks/compare_renewables_trace_vs_pypsa-earth.ipynb new file mode 100644 index 0000000..a107400 --- /dev/null +++ b/workflow/notebooks/compare_renewables_trace_vs_pypsa-earth.ipynb @@ -0,0 +1,578 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c8a1e585", + "metadata": {}, + "source": [ + "# Compare TRACE vs PyPSA-Earth Renewable Datasets\n", + "\n", + "**Objective:** Compare the legacy TRACE renewable data with the new PyPSA-Earth clustered output.\n", + "\n", + "- **TRACE:** External pre-aggregated legacy dataset from the TRACE package. It is the deprecated reference source for the old consolidated structure.\n", + "- **PyPSA-Earth:** Newly calculated clustered renewable dataset built from the atlite workflow. It preserves cell-level spatial resolution through region-technology pseudo-generators.\n", + "\n", + "**Primary comparison goals:**\n", + "1. Compare installed capacity and energy potential between TRACE and PyPSA-Earth.\n", + "2. Visualize capacity-factor distributions and merit-order structure.\n", + "3. Compare cluster-level timeseries behavior per region.\n", + "4. Keep the stacked region comparison as the main regional capacity overview.\n", + "5. Use one consistent visual style across all plots." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e22644b", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "from pathlib import Path\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import xarray as xr\n", + "from IPython.display import display\n", + "import plot_helpers\n", + "\n", + "sns.set_theme(style=\"whitegrid\", context=\"talk\", font_scale=1.12)\n", + "plt.rcParams.update(\n", + " {\n", + " \"figure.figsize\": (14, 6),\n", + " \"figure.titlesize\": 16,\n", + " \"font.size\": 11,\n", + " \"axes.titlesize\": 14,\n", + " \"axes.labelsize\": 12,\n", + " \"axes.titleweight\": \"semibold\",\n", + " \"xtick.labelsize\": 10,\n", + " \"ytick.labelsize\": 10,\n", + " \"legend.fontsize\": 10,\n", + " \"legend.title_fontsize\": 11,\n", + " \"axes.labelpad\": 8,\n", + " }\n", + ")\n", + "logging.basicConfig(level=logging.INFO, format=\"%(message)s\")\n", + "\n", + "BASE_DIR = Path(\"../..\")\n", + "TRACE_FILE = BASE_DIR / \"data/new_renewables_consolidated.nc\"\n", + "PYPSA_EARTH_FILE = BASE_DIR / \"resources/renewables_clustered.nc\"\n", + "PYPSA_EARTH_META_FILE = BASE_DIR / \"resources/clusters_cache.joblib\"\n", + "\n", + "SOURCE_STYLES = {\n", + " \"TRACE\": {\"color\": \"#6B7280\", \"marker\": \"o\"},\n", + " \"PyPSA-Earth\": {\"color\": \"#A8A29E\", \"marker\": \"s\"},\n", + "}\n", + "TECH_COLORS = {\n", + " \"onwind\": \"#1F77B4\",\n", + " \"solar\": \"#D62728\",\n", + "}\n", + "\n", + "print(f\"TRACE: {'βœ“' if TRACE_FILE.exists() else 'βœ—'} {TRACE_FILE}\")\n", + "print(f\"PyPSA-Earth: {'βœ“' if PYPSA_EARTH_FILE.exists() else 'βœ—'} {PYPSA_EARTH_FILE}\")\n", + "print(\n", + " f\"Metadata: {'βœ“' if PYPSA_EARTH_META_FILE.exists() else 'βœ—'} {PYPSA_EARTH_META_FILE}\"\n", + ")\n", + "\n", + "trace_ds = xr.open_dataset(TRACE_FILE) if TRACE_FILE.exists() else None\n", + "pypsa_earth_ds = (\n", + " xr.open_dataset(PYPSA_EARTH_FILE) if PYPSA_EARTH_FILE.exists() else None\n", + ")\n", + "pypsa_earth_meta = None\n", + "if PYPSA_EARTH_META_FILE.exists():\n", + " import joblib\n", + "\n", + " pypsa_earth_meta = joblib.load(PYPSA_EARTH_META_FILE)\n", + "\n", + "summary_rows = []\n", + "for label, ds in [(\"TRACE\", trace_ds), (\"PyPSA-Earth\", pypsa_earth_ds)]:\n", + " if ds is None:\n", + " continue\n", + " summary_rows.append(\n", + " {\n", + " \"source\": label,\n", + " \"dimensions\": dict(ds.sizes),\n", + " \"variables\": \", \".join(list(ds.data_vars)),\n", + " \"regions\": int(ds.sizes.get(\"region\", 0)),\n", + " \"technologies\": int(ds.sizes.get(\"technology\", 0)),\n", + " \"classes\": int(ds.sizes.get(\"class\", 0)),\n", + " \"time_steps\": int(ds.sizes.get(\"time\", ds.sizes.get(\"hour\", 0))),\n", + " }\n", + " )\n", + "\n", + "summary_df = pd.DataFrame(summary_rows)\n", + "if not summary_df.empty:\n", + " display(summary_df)\n", + "\n", + "if pypsa_earth_meta is not None:\n", + " metadata_df = pd.DataFrame(\n", + " [\n", + " dict(info, cluster_name=name)\n", + " for name, info in pypsa_earth_meta.get(\"cluster_metadata\", {}).items()\n", + " ]\n", + " )\n", + " if not metadata_df.empty:\n", + " metadata_df[\"technology\"] = metadata_df[\"technology\"].astype(str)\n", + " metadata_df[\"region\"] = metadata_df[\"region\"].astype(str)\n", + " display(\n", + " metadata_df[\n", + " [\n", + " \"region\",\n", + " \"technology\",\n", + " \"cluster_id\",\n", + " \"n_buses_consolidated\",\n", + " \"total_capacity_mw\",\n", + " \"avg_cf\",\n", + " ]\n", + " ].head(12)\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03a80b1a", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"\\n\" + \"=\" * 70)\n", + "print(\"TRACE DATASET DIAGNOSTICS\")\n", + "print(\"=\" * 70)\n", + "\n", + "trace_diagnostic_rows = []\n", + "if trace_ds is not None:\n", + " trace_diagnostic_rows.append(\n", + " {\n", + " \"source\": \"TRACE\",\n", + " \"dimensions\": dict(trace_ds.sizes),\n", + " \"regions\": int(trace_ds.sizes.get(\"region\", 0)),\n", + " \"technologies\": int(trace_ds.sizes.get(\"technology\", 0)),\n", + " \"sites\": int(trace_ds.sizes.get(\"class\", trace_ds.sizes.get(\"site_id\", 0))),\n", + " \"time_steps\": int(\n", + " trace_ds.sizes.get(\"time\", trace_ds.sizes.get(\"hour\", 0))\n", + " ),\n", + " \"variables\": \", \".join(list(trace_ds.data_vars)),\n", + " }\n", + " )\n", + " trace_diag_df = pd.DataFrame(trace_diagnostic_rows)\n", + " display(trace_diag_df)\n", + "\n", + " trace_capacity_stats = []\n", + " for tech_name in [\"windonshore\", \"pvplant\"]:\n", + " if \"technology\" not in trace_ds.coords:\n", + " continue\n", + " if tech_name not in [str(v) for v in trace_ds.technology.values]:\n", + " continue\n", + " try:\n", + " capacity_values = trace_ds[\"capacity\"].sel(technology=tech_name).values\n", + " capacity_values = capacity_values[~np.isnan(capacity_values)]\n", + " trace_capacity_stats.append(\n", + " {\n", + " \"technology\": tech_name,\n", + " \"count\": int(len(capacity_values)),\n", + " \"min_mw\": float(np.min(capacity_values)),\n", + " \"median_mw\": float(np.median(capacity_values)),\n", + " \"mean_mw\": float(np.mean(capacity_values)),\n", + " \"max_mw\": float(np.max(capacity_values)),\n", + " }\n", + " )\n", + " except Exception:\n", + " continue\n", + " if trace_capacity_stats:\n", + " display(pd.DataFrame(trace_capacity_stats))\n", + "else:\n", + " print(\"TRACE file not found.\")\n", + "\n", + "print(\"\\n\" + \"=\" * 70)\n", + "print(\"PYPSA-EARTH DATASET DIAGNOSTICS\")\n", + "print(\"=\" * 70)\n", + "\n", + "pypsa_diagnostic_rows = []\n", + "if pypsa_earth_ds is not None:\n", + " pypsa_diagnostic_rows.append(\n", + " {\n", + " \"source\": \"PyPSA-Earth\",\n", + " \"dimensions\": dict(pypsa_earth_ds.sizes),\n", + " \"regions\": int(pypsa_earth_ds.sizes.get(\"region\", 0)),\n", + " \"technologies\": int(pypsa_earth_ds.sizes.get(\"technology\", 0)),\n", + " \"clusters\": int(pypsa_earth_ds.sizes.get(\"class\", 0)),\n", + " \"time_steps\": int(\n", + " pypsa_earth_ds.sizes.get(\"time\", pypsa_earth_ds.sizes.get(\"hour\", 0))\n", + " ),\n", + " \"variables\": \", \".join(list(pypsa_earth_ds.data_vars)),\n", + " }\n", + " )\n", + " pypsa_diag_df = pd.DataFrame(pypsa_diagnostic_rows)\n", + " display(pypsa_diag_df)\n", + "\n", + " pypsa_capacity_stats = []\n", + " for tech_name in [\"onwind\", \"solar\"]:\n", + " if tech_name not in [str(v) for v in pypsa_earth_ds.technology.values]:\n", + " continue\n", + " try:\n", + " capacity_values = (\n", + " pypsa_earth_ds[\"capacity\"].sel(technology=tech_name).values.flatten()\n", + " )\n", + " capacity_values = capacity_values[~np.isnan(capacity_values)]\n", + " pypsa_capacity_stats.append(\n", + " {\n", + " \"technology\": tech_name,\n", + " \"count\": int(len(capacity_values)),\n", + " \"min_mw\": float(np.min(capacity_values)),\n", + " \"median_mw\": float(np.median(capacity_values)),\n", + " \"mean_mw\": float(np.mean(capacity_values)),\n", + " \"max_mw\": float(np.max(capacity_values)),\n", + " }\n", + " )\n", + " except Exception:\n", + " continue\n", + " if pypsa_capacity_stats:\n", + " display(pd.DataFrame(pypsa_capacity_stats))\n", + "else:\n", + " print(\"PyPSA-Earth file not found.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4973ebf4", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"=\" * 70)\n", + "print(\"BUILDING COMPARISON TABLES\")\n", + "print(\"=\" * 70)\n", + "\n", + "source_order = [\"TRACE\", \"PyPSA-Earth\"]\n", + "tech_order = [\"solar\", \"onwind\"]\n", + "source_palette = SOURCE_STYLES\n", + "tech_palette = TECH_COLORS\n", + "\n", + "\n", + "def build_trace_rows(ds):\n", + " rows = []\n", + " if ds is None:\n", + " return rows\n", + " for trace_tech_name, compare_tech_name in {\n", + " \"windonshore\": \"onwind\",\n", + " \"pvplant\": \"solar\",\n", + " }.items():\n", + " if trace_tech_name not in [str(v) for v in ds.technology.values]:\n", + " continue\n", + " try:\n", + " cap_da = ds[\"capacity\"].sel(technology=trace_tech_name)\n", + " if \"avg_cf\" in ds.data_vars:\n", + " avg_cf_da = ds[\"avg_cf\"].sel(technology=trace_tech_name)\n", + " else:\n", + " avg_cf_da = (\n", + " ds[\"capacity_factor\"]\n", + " .sel(technology=trace_tech_name)\n", + " .mean(dim=\"time\", skipna=True)\n", + " )\n", + "\n", + " for region_name in ds.region.values:\n", + " region_caps = cap_da.sel(region=region_name).values\n", + " region_avg_cf = avg_cf_da.sel(region=region_name).values\n", + " for class_idx in range(len(region_caps)):\n", + " capacity_mw = float(region_caps[class_idx])\n", + " avg_cf = float(region_avg_cf[class_idx])\n", + " if np.isnan(capacity_mw) or np.isnan(avg_cf):\n", + " continue\n", + " rows.append(\n", + " {\n", + " \"source\": \"TRACE\",\n", + " \"region\": str(region_name),\n", + " \"technology\": str(compare_tech_name),\n", + " \"cluster_id\": int(class_idx),\n", + " \"label\": f\"{compare_tech_name} {class_idx + 1}\",\n", + " \"capacity_mw\": capacity_mw,\n", + " \"avg_cf\": avg_cf,\n", + " \"generation_potential_mwh\": capacity_mw * avg_cf * 8760.0,\n", + " }\n", + " )\n", + " except Exception as exc:\n", + " print(f\" Could not read TRACE data for {trace_tech_name}: {exc}\")\n", + " return rows\n", + "\n", + "\n", + "def build_pypsa_rows(ds, meta):\n", + " rows = []\n", + " if meta is not None and meta.get(\"cluster_metadata\") is not None:\n", + " for cluster_name, info in meta.get(\"cluster_metadata\", {}).items():\n", + " rows.append(\n", + " {\n", + " \"source\": \"PyPSA-Earth\",\n", + " \"region\": str(info[\"region\"]),\n", + " \"technology\": str(info[\"technology\"]),\n", + " \"cluster_id\": int(info[\"cluster_id\"]),\n", + " \"label\": f\"{info['technology']} {int(info['cluster_id']) + 1}\",\n", + " \"capacity_mw\": float(info[\"total_capacity_mw\"]),\n", + " \"avg_cf\": float(info[\"avg_cf\"]),\n", + " \"generation_potential_mwh\": float(\n", + " info[\"total_capacity_mw\"] * info[\"avg_cf\"] * 8760.0\n", + " ),\n", + " }\n", + " )\n", + " return rows\n", + "\n", + " if ds is None:\n", + " return rows\n", + "\n", + " for tech_name in tech_order:\n", + " if tech_name not in [str(v) for v in ds.technology.values]:\n", + " continue\n", + " try:\n", + " cap_da = ds[\"capacity\"].sel(technology=tech_name)\n", + " avg_cf_da = ds[\"avg_cf\"].sel(technology=tech_name)\n", + " for region_name in ds.region.values:\n", + " region_caps = cap_da.sel(region=region_name).values\n", + " region_avg_cf = avg_cf_da.sel(region=region_name).values\n", + " for class_idx in range(len(region_caps)):\n", + " capacity_mw = float(region_caps[class_idx])\n", + " avg_cf = float(region_avg_cf[class_idx])\n", + " if np.isnan(capacity_mw) or np.isnan(avg_cf):\n", + " continue\n", + " rows.append(\n", + " {\n", + " \"source\": \"PyPSA-Earth\",\n", + " \"region\": str(region_name),\n", + " \"technology\": str(tech_name),\n", + " \"cluster_id\": int(class_idx),\n", + " \"label\": f\"{tech_name} {class_idx + 1}\",\n", + " \"capacity_mw\": capacity_mw,\n", + " \"avg_cf\": avg_cf,\n", + " \"generation_potential_mwh\": capacity_mw * avg_cf * 8760.0,\n", + " }\n", + " )\n", + " except Exception as exc:\n", + " print(f\" Could not read PyPSA-Earth data for {tech_name}: {exc}\")\n", + " return rows\n", + "\n", + "\n", + "trace_rows = build_trace_rows(trace_ds)\n", + "pypsa_rows = build_pypsa_rows(pypsa_earth_ds, pypsa_earth_meta)\n", + "comparison_df = pd.concat(\n", + " [pd.DataFrame(trace_rows), pd.DataFrame(pypsa_rows)], ignore_index=True\n", + ")\n", + "if comparison_df.empty:\n", + " raise ValueError(\"No comparison data found.\")\n", + "\n", + "comparison_df[\"source\"] = pd.Categorical(\n", + " comparison_df[\"source\"], categories=source_order, ordered=True\n", + ")\n", + "comparison_df[\"technology\"] = pd.Categorical(\n", + " comparison_df[\"technology\"], categories=tech_order, ordered=True\n", + ")\n", + "comparison_df[\"region\"] = comparison_df[\"region\"].astype(str)\n", + "comparison_df[\"avg_cf\"] = comparison_df[\"avg_cf\"].astype(float)\n", + "comparison_df[\"capacity_mw\"] = comparison_df[\"capacity_mw\"].astype(float)\n", + "comparison_df[\"generation_potential_mwh\"] = comparison_df[\n", + " \"generation_potential_mwh\"\n", + "].astype(float)\n", + "\n", + "comparison_summary_df = (\n", + " comparison_df.groupby([\"source\", \"technology\"], as_index=False, observed=True)\n", + " .agg(\n", + " n_clusters=(\"cluster_id\", \"size\"),\n", + " total_capacity_mw=(\"capacity_mw\", \"sum\"),\n", + " mean_avg_cf=(\"avg_cf\", \"mean\"),\n", + " total_generation_potential_mwh=(\"generation_potential_mwh\", \"sum\"),\n", + " )\n", + " .sort_values([\"source\", \"technology\"])\n", + ")\n", + "\n", + "display(comparison_summary_df)" + ] + }, + { + "cell_type": "markdown", + "id": "4bc747d0", + "metadata": {}, + "source": [ + "### Bubble Plot: Capacity Factor vs Capacity by Source\n", + "\n", + "This plot compares the distribution of cluster capacities and average capacity factors between TRACE and PyPSA-Earth.\\nIt reveals whether clustering **preserves the merit-order structure**: low-cost (high CF) clusters should remain distinct and visible as separate bubbles.\\nBubble size represents annual generation potential. Log scale on the Y-axis emphasizes smaller but important clusters.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c26731e8", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"\\\\nGenerating bubble plots...\")\n", + "\n", + "if trace_ds is None or pypsa_earth_ds is None:\n", + " raise ValueError(\n", + " \"Both TRACE and PyPSA-Earth datasets are required for the bubble plots.\"\n", + " )\n", + "\n", + "common_regions = sorted(\n", + " set(str(v) for v in trace_ds.region.values)\n", + " & set(str(v) for v in pypsa_earth_ds.region.values)\n", + ")\n", + "if not common_regions:\n", + " raise ValueError(\"No common regions found between TRACE and PyPSA-Earth.\")\n", + "\n", + "region = common_regions[0]\n", + "print(f\"Example region: {region}\")\n", + "\n", + "plot_helpers.plot_bubble_region_comparison(region, trace_ds, pypsa_earth_ds, show=True)\n", + "print(\"βœ“ Bubble plot rendered for TRACE and PyPSA-Earth.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75782797", + "metadata": {}, + "outputs": [], + "source": [ + "plot_helpers.plot_bubble_region_comparison(\n", + " \"West_Asia\", trace_ds, pypsa_earth_ds, show=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6ce43e2", + "metadata": {}, + "outputs": [], + "source": [ + "plot_helpers.plot_bubble_region_comparison(\n", + " \"Europe\", trace_ds, pypsa_earth_ds, show=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "104cb776", + "metadata": {}, + "source": [ + "### Interactive Timeseries Comparison: Cluster Capacity Factors Over Time\n", + "\n", + "This plot compares how individual clusters behave over a full year in TRACE vs PyPSA-Earth.\n", + "It validates that clustering **preserves temporal patterns** (peak periods, seasonal variation) and the **energy density hierarchy** (line width scales with average CF).\n", + "Two stacked panels show each source; separate invocations for solar and onwind allow independent inspection of each technology's cluster dynamics." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfc79895", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"\\\\nGenerating interactive timeseries comparison panels...\")\n", + "\n", + "if trace_ds is None or pypsa_earth_ds is None:\n", + " raise ValueError(\n", + " \"Both TRACE and PyPSA-Earth datasets are required for the timeseries comparison.\"\n", + " )\n", + "\n", + "common_regions = sorted(\n", + " set(str(v) for v in trace_ds.region.values)\n", + " & set(str(v) for v in pypsa_earth_ds.region.values)\n", + ")\n", + "if not common_regions:\n", + " raise ValueError(\"No common regions found between TRACE and PyPSA-Earth.\")\n", + "\n", + "region = common_regions[0]\n", + "print(f\"Example region: {region}\")\n", + "\n", + "print(\"\\\\n--- Solar Timeseries ---\")\n", + "plot_helpers.plot_region_cluster_timeseries(\n", + " region, \"solar\", trace_ds=trace_ds, pypsa_ds=pypsa_earth_ds, show=True\n", + ")\n", + "\n", + "print(\"\\\\n--- Onwind Timeseries ---\")\n", + "plot_helpers.plot_region_cluster_timeseries(\n", + " region, \"onwind\", trace_ds=trace_ds, pypsa_ds=pypsa_earth_ds, show=True\n", + ")\n", + "\n", + "print(\"βœ“ Interactive timeseries comparison rendered for both technologies.\")" + ] + }, + { + "cell_type": "markdown", + "id": "571e8279", + "metadata": {}, + "source": [ + "## Stacked Region Comparison: Total Capacity by Cluster Merit Order\n", + "\n", + "This plot stacks cluster capacities per region, ordered by average capacity factor (shaded light β†’ dark).\n", + "It shows whether clustering **preserves regional capacity distributions** and **maintains the high-CF \"green pockets\"** that enable merit-order effects in optimization.\n", + "Side-by-side panels compare solar and onwind; border colors distinguish Consolidated vs Clustered sources." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf86056b", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"\\\\nGenerating stacked region comparison by technology...\")\n", + "\n", + "# Build cluster comparison dataframe if not already in memory\n", + "ds_consolidated = trace_ds if \"trace_ds\" in dir() and trace_ds is not None else None\n", + "ds_clustered = (\n", + " pypsa_earth_ds if \"pypsa_earth_ds\" in dir() and pypsa_earth_ds is not None else None\n", + ")\n", + "df_meta = pypsa_earth_meta if \"pypsa_earth_meta\" in dir() else None\n", + "\n", + "df_cluster_meta = None\n", + "if df_meta is not None and \"cluster_metadata\" in df_meta:\n", + " metadata_rows = []\n", + " for name, info in df_meta.get(\"cluster_metadata\", {}).items():\n", + " row = dict(info)\n", + " row[\"cluster_name\"] = name\n", + " metadata_rows.append(row)\n", + " if metadata_rows:\n", + " df_cluster_meta = pd.DataFrame(metadata_rows)\n", + "\n", + "if \"cluster_comparison_df\" not in dir():\n", + " cluster_comparison_df = plot_helpers.build_cluster_comparison_df(\n", + " ds_consolidated, ds_clustered, df_cluster_meta\n", + " )\n", + " if cluster_comparison_df.empty:\n", + " raise ValueError(\n", + " \"Cluster-level comparison data is required for the stacked region comparison.\"\n", + " )\n", + "\n", + "plot_helpers.plot_stacked_region_comparison(\n", + " cluster_comparison_df, show=True, save_path=\"region_stacked_capacity_comparison.png\"\n", + ")\n", + "print(\n", + " \"βœ“ Stacked region comparison rendered and saved as region_stacked_capacity_comparison.png\"\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/cost-transport-iron-ore.ipynb b/workflow/notebooks/cost-transport-iron-ore.ipynb deleted file mode 100644 index e69de29..0000000 diff --git a/workflow/notebooks/global-iron-ore.ipynb b/workflow/notebooks/global-iron-ore.ipynb index 99636f0..33dcd98 100644 --- a/workflow/notebooks/global-iron-ore.ipynb +++ b/workflow/notebooks/global-iron-ore.ipynb @@ -30,12 +30,10 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Set up snakemake context\n", - "from _helpers import mock_snakemake\n", - "snakemake = mock_snakemake(\n", - " \"retrieve_iron_ore\"\n", - ")\n" + "from _helpers_notebooks import mock_snakemake\n", + "\n", + "snakemake = mock_snakemake(\"retrieve_iron_ore\")" ] }, { @@ -45,7 +43,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Input and output file paths from snakemake\n", "iron_ore_production_fn = snakemake.input.iron_ore_production\n", "cost_fn = snakemake.input.iron_ore_cost\n", @@ -55,7 +52,7 @@ "production_fn = snakemake.output.iron_ore\n", "\n", "# Config\n", - "config = snakemake.config\n" + "config = snakemake.config" ] }, { @@ -68,7 +65,7 @@ "cost_sheet_name = \"Fig 2b\"\n", "\n", "# Get conversion factors from config\n", - "eur_to_usd = config[\"costs\"][\"eur_usd\"]\n", + "eur_to_usd = config[\"techno-economic parameters\"][\"eur_usd\"]\n", "ore_to_steel = config[\"iron_ore\"][\"ore_to_steel_ratio\"]" ] }, @@ -79,7 +76,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "iron_ore_map_fn = snakemake.output.iron_ore_map" ] }, @@ -112,28 +108,30 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# %%\n", "# Load OWID iron ore data: https://ourworldindata.org/explorers/minerals?tab=map&Mineral=Iron+ore&Metric=Production&Type=Mine%2C+crude+ore&Share+of+global=false&country=OWID_WRL~AUS~CHL~CHN~USA\n", "df = pd.read_csv(iron_ore_production_fn)\n", "\n", "# Rename columns for easier access\n", - "df.rename(columns={\n", - " 'Entity': 'Country',\n", - " 'Year': 'Year',\n", - " 'production|Iron ore|Mine, crude ore|tonnes': 'IronOreProduction',\n", - " 'crude ore|tonnes': 'CrudeOreTonnes'\n", - "}, inplace=True)\n", + "df.rename(\n", + " columns={\n", + " \"Entity\": \"Country\",\n", + " \"Year\": \"Year\",\n", + " \"production|Iron ore|Mine, crude ore|tonnes\": \"IronOreProduction\",\n", + " \"crude ore|tonnes\": \"CrudeOreTonnes\",\n", + " },\n", + " inplace=True,\n", + ")\n", "\n", "# Keep only rows with available iron ore production data\n", - "df = df.dropna(subset=['IronOreProduction'])\n", + "df = df.dropna(subset=[\"IronOreProduction\"])\n", "\n", "# Get latest year per country\n", - "df_latest = df.sort_values('Year').groupby('Country', as_index=False).last()\n", + "df_latest = df.sort_values(\"Year\").groupby(\"Country\", as_index=False).last()\n", "\n", "# Drop data that is older than 2010 and drop Country 'World'\n", - "df_latest = df_latest[df_latest['Country'] != 'World']\n", - "df_latest = df_latest[df_latest['Year'] >= 2010]\n", + "df_latest = df_latest[df_latest[\"Country\"] != \"World\"]\n", + "df_latest = df_latest[df_latest[\"Year\"] >= 2010]\n", "\n", "# Remove \"other\"\n", "df_latest = df_latest[df_latest[\"Country\"] != \"Other\"]\n", @@ -143,15 +141,17 @@ " \"Democratic Republic of Congo\": \"Congo, The Democratic Republic of the\",\n", " \"Kosovo\": \"Republic of Kosovo\", # pycountry not supported\n", " \"Russia\": \"Russian Federation\",\n", - " \"Turkey\": \"TΓΌrkiye\"\n", + " \"Turkey\": \"TΓΌrkiye\",\n", "}\n", "\n", - "df_latest['Country'] = df_latest['Country'].replace(country_name_corrections)\n", - "df_latest['ISO_A2'] = df_latest['Country'].apply(country_to_iso_a2)\n", + "df_latest[\"Country\"] = df_latest[\"Country\"].replace(country_name_corrections)\n", + "df_latest[\"ISO_A2\"] = df_latest[\"Country\"].apply(country_to_iso_a2)\n", "\n", "# Check for any remaining missing ISO_A2 codes\n", - "missing_iso_a2 = df_latest[df_latest['ISO_A2'].isna()]\n", - "print(f\"Countries with missing ISO_A2 codes after correction: {missing_iso_a2['Country'].unique()}\")\n" + "missing_iso_a2 = df_latest[df_latest[\"ISO_A2\"].isna()]\n", + "print(\n", + " f\"Countries with missing ISO_A2 codes after correction: {missing_iso_a2['Country'].unique()}\"\n", + ")" ] }, { @@ -162,21 +162,21 @@ "outputs": [], "source": [ "# Use cartopy to get natural earth countries shapefile\n", - "shapename = 'admin_0_countries'\n", - "reader = shpreader.natural_earth(resolution='110m',\n", - " category='cultural',\n", - " name=shapename)\n", + "shapename = \"admin_0_countries\"\n", + "reader = shpreader.natural_earth(resolution=\"110m\", category=\"cultural\", name=shapename)\n", "\n", "world = gpd.read_file(reader)\n", "\n", "# Fix missing ISO_A2 codes in world\n", - "if 'ISO_A2' not in world.columns:\n", - " if 'ADMIN' in world.columns:\n", - " world['ISO_A2'] = world['ADMIN'].apply(country_to_iso_a2)\n", - "world.loc[world['ISO_A2'] == '-99', 'ISO_A2'] = world.loc[world['ISO_A2'] == '-99', 'ADMIN'].apply(country_to_iso_a2)\n", + "if \"ISO_A2\" not in world.columns:\n", + " if \"ADMIN\" in world.columns:\n", + " world[\"ISO_A2\"] = world[\"ADMIN\"].apply(country_to_iso_a2)\n", + "world.loc[world[\"ISO_A2\"] == \"-99\", \"ISO_A2\"] = world.loc[\n", + " world[\"ISO_A2\"] == \"-99\", \"ADMIN\"\n", + "].apply(country_to_iso_a2)\n", "\n", "# Merge country names β€” use left join to preserve geometry\n", - "merged = world.merge(df_latest, how='left', left_on='ISO_A2', right_on='ISO_A2')" + "merged = world.merge(df_latest, how=\"left\", left_on=\"ISO_A2\", right_on=\"ISO_A2\")" ] }, { @@ -187,7 +187,7 @@ "outputs": [], "source": [ "# After merging, filter out rows with missing or zero production\n", - "merged = merged[merged['IronOreProduction'].notna() & (merged['IronOreProduction'] > 0)]" + "merged = merged[merged[\"IronOreProduction\"].notna() & (merged[\"IronOreProduction\"] > 0)]" ] }, { @@ -199,7 +199,7 @@ "source": [ "# %%\n", "# Convert to megatonnes\n", - "merged['IronOreProductionMt'] = merged['IronOreProduction'].divide(1e6) # tonnes to Mt" + "merged[\"IronOreProductionMt\"] = merged[\"IronOreProduction\"].divide(1e6) # tonnes to Mt" ] }, { @@ -210,12 +210,11 @@ "outputs": [], "source": [ "# Ensure ISO_A2 and IronOreProductionMt exist\n", - "filtered_df = merged[\n", - " (merged['IronOreProductionMt'] > 0) & \n", - " (merged['ISO_A2'].notna())\n", - "][['ISO_A2', 'IronOreProductionMt', 'ADMIN']]\n", + "filtered_df = merged[(merged[\"IronOreProductionMt\"] > 0) & (merged[\"ISO_A2\"].notna())][\n", + " [\"ISO_A2\", \"IronOreProductionMt\", \"ADMIN\"]\n", + "]\n", "# Set ISO_A2 as index\n", - "production = filtered_df.set_index('ISO_A2')\n" + "production = filtered_df.set_index(\"ISO_A2\")" ] }, { @@ -233,7 +232,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Read iron ore cost data from Devlin 2023 supplementary\n", "# Read the Excel file using openpyxl to get the specific range\n", "wb = openpyxl.load_workbook(cost_fn)\n", @@ -243,39 +241,33 @@ "countries = []\n", "costs = []\n", "for row in range(5, 23): # A5:A22 is rows 5 to 22\n", - " country = ws[f'A{row}'].value\n", - " cost = ws[f'G{row}'].value\n", + " country = ws[f\"A{row}\"].value\n", + " cost = ws[f\"G{row}\"].value\n", " if country is not None and cost is not None:\n", " countries.append(country)\n", " costs.append(cost)\n", "\n", "# Create a DataFrame from the cost data\n", - "cost_df = pd.DataFrame({\n", - " 'Country': countries,\n", - " 'IronOreCost': costs\n", - "})\n", + "cost_df = pd.DataFrame({\"Country\": countries, \"IronOreCost\": costs})\n", "\n", "# Convert cost to float\n", - "cost_df['IronOreCost'] = pd.to_numeric(cost_df['IronOreCost'], errors='coerce')\n", + "cost_df[\"IronOreCost\"] = pd.to_numeric(cost_df[\"IronOreCost\"], errors=\"coerce\")\n", "\n", "# Add Mauritania with Ghana's cost (Ghana is in the Excel data)\n", - "ghana_cost = cost_df[cost_df['Country'] == 'GN']['IronOreCost'].values\n", + "ghana_cost = cost_df[cost_df[\"Country\"] == \"GN\"][\"IronOreCost\"].values\n", "if len(ghana_cost) > 0:\n", - " mauritania_row = pd.DataFrame({\n", - " 'Country': ['MR'],\n", - " 'IronOreCost': [ghana_cost[0]]\n", - " })\n", + " mauritania_row = pd.DataFrame({\"Country\": [\"MR\"], \"IronOreCost\": [ghana_cost[0]]})\n", " cost_df = pd.concat([cost_df, mauritania_row], ignore_index=True)\n", "\n", "# Convert cost from $/t_steel to €/t_ironore\n", "# Original cost is in $/t_steel, need to convert to €/t_ironore\n", "# 1. Divide by ore_to_steel to get $/t_ironore\n", "# 2. Divide by eur_to_usd to get €/t_ironore\n", - "cost_df['IronOreEur/t_ironore'] = (cost_df['IronOreCost'] / ore_to_steel) / eur_to_usd\n", + "cost_df[\"IronOreEur/t_ironore\"] = (cost_df[\"IronOreCost\"] / ore_to_steel) / eur_to_usd\n", "\n", "# Map country names to ISO_A2 codes (use same corrections as before)\n", - "cost_df['Country'] = cost_df['Country'].replace(country_name_corrections)\n", - "cost_df['ISO_A2'] = cost_df['Country'].apply(country_to_iso_a2)" + "cost_df[\"Country\"] = cost_df[\"Country\"].replace(country_name_corrections)\n", + "cost_df[\"ISO_A2\"] = cost_df[\"Country\"].apply(country_to_iso_a2)" ] }, { @@ -293,15 +285,12 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Merge production and cost data\n", "production_cost = production.reset_index()\n", "production_cost = production_cost.merge(\n", - " cost_df[['ISO_A2', 'IronOreEur/t_ironore']], \n", - " how='left', \n", - " on='ISO_A2'\n", + " cost_df[[\"ISO_A2\", \"IronOreEur/t_ironore\"]], how=\"left\", on=\"ISO_A2\"\n", ")\n", - "production_cost = production_cost.set_index('ISO_A2')\n", + "production_cost = production_cost.set_index(\"ISO_A2\")\n", "\n", "production_cost.to_csv(production_fn)" ] @@ -313,17 +302,13 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Define Mt bins and labels\n", - "bins = [0, 1, 10, 100, 500, float('inf')]\n", - "labels = ['0–1', '1–10', '10–100', '100–500', '500+']\n", + "bins = [0, 1, 10, 100, 500, float(\"inf\")]\n", + "labels = [\"0–1\", \"1–10\", \"10–100\", \"100–500\", \"500+\"]\n", "\n", "# Bin into categories\n", - "merged['ProductionCategory'] = pd.cut(\n", - " merged['IronOreProductionMt'],\n", - " bins=bins,\n", - " labels=labels,\n", - " include_lowest=True\n", + "merged[\"ProductionCategory\"] = pd.cut(\n", + " merged[\"IronOreProductionMt\"], bins=bins, labels=labels, include_lowest=True\n", ")\n", "\n", "# %%\n", @@ -331,23 +316,23 @@ "fig, ax = plt.subplots(figsize=(10, 7))\n", "\n", "# Base world map\n", - "world.plot(ax=ax, color='lightgrey', edgecolor='white')\n", + "world.plot(ax=ax, color=\"lightgrey\", edgecolor=\"white\")\n", "\n", "# Plot with categorical Mt bins\n", - "merged.dropna(subset=['ProductionCategory']).plot(\n", + "merged.dropna(subset=[\"ProductionCategory\"]).plot(\n", " ax=ax,\n", - " column='ProductionCategory',\n", - " cmap='Reds',\n", + " column=\"ProductionCategory\",\n", + " cmap=\"Reds\",\n", " legend=True,\n", - " legend_kwds={'title': \"Iron Ore Production (Mt)\"},\n", - " missing_kwds={\"color\": \"lightgrey\"}\n", + " legend_kwds={\"title\": \"Iron Ore Production (Mt)\"},\n", + " missing_kwds={\"color\": \"lightgrey\"},\n", ")\n", "\n", - "ax.set_title(f\"Iron Ore Production by Country\")\n", - "ax.axis('off')\n", + "ax.set_title(\"Iron Ore Production by Country\")\n", + "ax.axis(\"off\")\n", "plt.tight_layout()\n", "plt.savefig(iron_ore_map_fn)\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -357,7 +342,7 @@ "metadata": {}, "outputs": [], "source": [ - "production_cost.sort_values('IronOreProductionMt', ascending=False)" + "production_cost.sort_values(\"IronOreProductionMt\", ascending=False)" ] } ], diff --git a/workflow/notebooks/global-steel-production.ipynb b/workflow/notebooks/global-steel-production.ipynb index 999fa97..845c35f 100644 --- a/workflow/notebooks/global-steel-production.ipynb +++ b/workflow/notebooks/global-steel-production.ipynb @@ -11,7 +11,7 @@ "import geopandas as gpd\n", "import matplotlib.pyplot as plt\n", "import cartopy.io.shapereader as shpreader\n", - "import pycountry\n" + "import pycountry" ] }, { @@ -29,7 +29,7 @@ "metadata": {}, "outputs": [], "source": [ - "production_fn = '../../resources/steel_production.csv'" + "production_fn = \"../../resources/steel_production.csv\"" ] }, { @@ -66,21 +66,24 @@ "df = pd.read_csv(\"../../data/owid-steel/steel-production.csv\")\n", "\n", "# Rename columns for easier access\n", - "df.rename(columns={\n", - " 'Entity': 'Country',\n", - " 'Year': 'Year',\n", - " 'production|Steel|Processing, crude|tonnes': 'SteelProduction',\n", - "}, inplace=True)\n", + "df.rename(\n", + " columns={\n", + " \"Entity\": \"Country\",\n", + " \"Year\": \"Year\",\n", + " \"production|Steel|Processing, crude|tonnes\": \"SteelProduction\",\n", + " },\n", + " inplace=True,\n", + ")\n", "\n", "# Keep only rows with available steel production data\n", - "df = df.dropna(subset=['SteelProduction'])\n", + "df = df.dropna(subset=[\"SteelProduction\"])\n", "\n", "# Get latest year per country\n", - "df_latest = df.sort_values('Year').groupby('Country', as_index=False).last()\n", + "df_latest = df.sort_values(\"Year\").groupby(\"Country\", as_index=False).last()\n", "\n", "# Drop data that is older than 2010 and drop Country 'World'\n", - "df_latest = df_latest[df_latest['Country'] != 'World']\n", - "df_latest = df_latest[df_latest['Year'] >= 2010]" + "df_latest = df_latest[df_latest[\"Country\"] != \"World\"]\n", + "df_latest = df_latest[df_latest[\"Year\"] >= 2010]" ] }, { @@ -95,15 +98,17 @@ " \"Democratic Republic of Congo\": \"Congo, The Democratic Republic of the\",\n", " \"Kosovo\": \"Republic of Kosovo\", # pycountry not supported\n", " \"Russia\": \"Russian Federation\",\n", - " \"Turkey\": \"TΓΌrkiye\"\n", + " \"Turkey\": \"TΓΌrkiye\",\n", "}\n", "\n", - "df_latest['Country'] = df_latest['Country'].replace(country_name_corrections)\n", - "df_latest['ISO_A2'] = df_latest['Country'].apply(country_to_iso_a2)\n", + "df_latest[\"Country\"] = df_latest[\"Country\"].replace(country_name_corrections)\n", + "df_latest[\"ISO_A2\"] = df_latest[\"Country\"].apply(country_to_iso_a2)\n", "\n", "# Check for any remaining missing ISO_A2 codes\n", - "missing_iso_a2 = df_latest[df_latest['ISO_A2'].isna()]\n", - "print(f\"Countries with missing ISO_A2 codes after correction: {missing_iso_a2['Country'].unique()}\")" + "missing_iso_a2 = df_latest[df_latest[\"ISO_A2\"].isna()]\n", + "print(\n", + " f\"Countries with missing ISO_A2 codes after correction: {missing_iso_a2['Country'].unique()}\"\n", + ")" ] }, { @@ -113,7 +118,9 @@ "metadata": {}, "outputs": [], "source": [ - "print(f\"Total steel production in latest year (Mt): {df_latest.SteelProduction.sum()/1e6:.2f} Mt\")" + "print(\n", + " f\"Total steel production in latest year (Mt): {df_latest.SteelProduction.sum() / 1e6:.2f} Mt\"\n", + ")" ] }, { @@ -124,7 +131,7 @@ "outputs": [], "source": [ "# Sort values\n", - "df_latest.sort_values('SteelProduction', ascending=False)" + "df_latest.sort_values(\"SteelProduction\", ascending=False)" ] }, { @@ -135,18 +142,18 @@ "outputs": [], "source": [ "# Use cartopy to get natural earth countries shapefile\n", - "shapename = 'admin_0_countries'\n", - "reader = shpreader.natural_earth(resolution='110m',\n", - " category='cultural',\n", - " name=shapename)\n", + "shapename = \"admin_0_countries\"\n", + "reader = shpreader.natural_earth(resolution=\"110m\", category=\"cultural\", name=shapename)\n", "\n", "world = gpd.read_file(reader)\n", "\n", "# Fix missing ISO_A2 codes in world\n", - "world.loc[world['ISO_A2'] == '-99', 'ISO_A2'] = world.loc[world['ISO_A2'] == '-99', 'ADMIN'].apply(country_to_iso_a2)\n", + "world.loc[world[\"ISO_A2\"] == \"-99\", \"ISO_A2\"] = world.loc[\n", + " world[\"ISO_A2\"] == \"-99\", \"ADMIN\"\n", + "].apply(country_to_iso_a2)\n", "\n", "# Merge country names β€” use left join to preserve geometry\n", - "merged = world.merge(df_latest, how='left', left_on='ISO_A2', right_on='ISO_A2')" + "merged = world.merge(df_latest, how=\"left\", left_on=\"ISO_A2\", right_on=\"ISO_A2\")" ] }, { @@ -157,7 +164,7 @@ "outputs": [], "source": [ "# Convert to megatonnes\n", - "merged['SteelProductionMt'] = merged['SteelProduction'].divide(1e6) # tonnes to Mt" + "merged[\"SteelProductionMt\"] = merged[\"SteelProduction\"].divide(1e6) # tonnes to Mt" ] }, { @@ -168,12 +175,11 @@ "outputs": [], "source": [ "# Ensure ISO_A2 and IronOreProductionGt exist\n", - "filtered_df = merged[\n", - " (merged['SteelProductionMt'] > 0) & \n", - " (merged['ISO_A2'].notna())\n", - "][['ISO_A2', 'SteelProductionMt', 'ADMIN']]\n", + "filtered_df = merged[(merged[\"SteelProductionMt\"] > 0) & (merged[\"ISO_A2\"].notna())][\n", + " [\"ISO_A2\", \"SteelProductionMt\", \"ADMIN\"]\n", + "]\n", "# Set ISO_A2 as index\n", - "production = filtered_df.set_index('ISO_A2')\n", + "production = filtered_df.set_index(\"ISO_A2\")\n", "\n", "# Display result\n", "production.to_csv(production_fn)" @@ -186,18 +192,14 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Define Gt bins and labels\n", - "bins = [0, 1, 10, 50, 100, 500, float('inf')]\n", - "labels = ['0–1', '1–10', '10–50', '50–100', '100–500', '500+']\n", + "bins = [0, 1, 10, 50, 100, 500, float(\"inf\")]\n", + "labels = [\"0–1\", \"1–10\", \"10–50\", \"50–100\", \"100–500\", \"500+\"]\n", "\n", "\n", "# Bin into categories\n", - "merged['ProductionCategory'] = pd.cut(\n", - " merged['SteelProductionMt'],\n", - " bins=bins,\n", - " labels=labels,\n", - " include_lowest=True\n", + "merged[\"ProductionCategory\"] = pd.cut(\n", + " merged[\"SteelProductionMt\"], bins=bins, labels=labels, include_lowest=True\n", ")\n", "\n", "# %%\n", @@ -205,22 +207,22 @@ "fig, ax = plt.subplots(figsize=(10, 7))\n", "\n", "# Base world map\n", - "world.plot(ax=ax, color='lightgrey', edgecolor='white')\n", + "world.plot(ax=ax, color=\"lightgrey\", edgecolor=\"white\")\n", "\n", "# Plot with categorical Gt bins\n", - "merged.dropna(subset=['ProductionCategory']).plot(\n", + "merged.dropna(subset=[\"ProductionCategory\"]).plot(\n", " ax=ax,\n", - " column='ProductionCategory',\n", - " cmap='Blues',\n", + " column=\"ProductionCategory\",\n", + " cmap=\"Blues\",\n", " legend=True,\n", - " legend_kwds={'title': \"Steel Production (Mt)\"},\n", - " missing_kwds={\"color\": \"lightgrey\"}\n", + " legend_kwds={\"title\": \"Steel Production (Mt)\"},\n", + " missing_kwds={\"color\": \"lightgrey\"},\n", ")\n", "\n", - "ax.set_title(f\"Steel Production by Country\")\n", - "ax.axis('off')\n", + "ax.set_title(\"Steel Production by Country\")\n", + "ax.axis(\"off\")\n", "plt.tight_layout()\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -230,7 +232,7 @@ "metadata": {}, "outputs": [], "source": [ - "production.sort_values('SteelProductionMt', ascending=False).iloc[0:20,:]\n" + "production.sort_values(\"SteelProductionMt\", ascending=False).iloc[0:20, :]" ] } ], diff --git a/workflow/notebooks/input-cost-comp.ipynb b/workflow/notebooks/input-cost-comp.ipynb index 84aa15b..eb902d5 100644 --- a/workflow/notebooks/input-cost-comp.ipynb +++ b/workflow/notebooks/input-cost-comp.ipynb @@ -54,7 +54,9 @@ "metadata": {}, "outputs": [], "source": [ - "n_old = pypsa.Network(\"../../results/old_costs/cost_year~2050/transport_cost~irena/demand~0.2/network.nc\")\n" + "n_old = pypsa.Network(\n", + " \"../../results/old_costs/cost_year~2050/transport_cost~irena/demand~0.2/network.nc\"\n", + ")" ] }, { @@ -64,8 +66,9 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "n_new = pypsa.Network(\"../../results/cost_year~2050/transport_cost~irena/demand~0.2/network.nc\")" + "n_new = pypsa.Network(\n", + " \"../../results/cost_year~2050/transport_cost~irena/demand~0.2/network.nc\"\n", + ")" ] }, { @@ -146,7 +149,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# Load the cost data\n", "cost_df = pd.read_csv(\"../../data/technology_data/costs_2050.csv\")\n", "\n", @@ -180,17 +182,21 @@ "diff = new_values - old_values\n", "\n", "# Assemble comparison DataFrame\n", - "differences = pd.DataFrame({\n", - " \"old\": old_values,\n", - " \"new\": new_values,\n", - " \"delta\": diff\n", - "})\n", + "differences = pd.DataFrame({\"old\": old_values, \"new\": new_values, \"delta\": diff})\n", "\n", "# Bring the 'used_in_script' flags (technology level) from old and new data\n", "# Since 'used_in_script' depends only on 'technology', take first level index and map\n", "differences = differences.reset_index()\n", - "differences[\"used_in_script_old\"] = differences[\"technology\"].map(cost_df.reset_index().drop_duplicates(\"technology\").set_index(\"technology\")[\"used_in_script\"])\n", - "differences[\"used_in_script_new\"] = differences[\"technology\"].map(cost_new.reset_index().drop_duplicates(\"technology\").set_index(\"technology\")[\"used_in_script\"])\n", + "differences[\"used_in_script_old\"] = differences[\"technology\"].map(\n", + " cost_df.reset_index()\n", + " .drop_duplicates(\"technology\")\n", + " .set_index(\"technology\")[\"used_in_script\"]\n", + ")\n", + "differences[\"used_in_script_new\"] = differences[\"technology\"].map(\n", + " cost_new.reset_index()\n", + " .drop_duplicates(\"technology\")\n", + " .set_index(\"technology\")[\"used_in_script\"]\n", + ")\n", "\n", "# Add relative change (%) column\n", "differences[\"relative_change (%)\"] = 100 * differences[\"delta\"] / differences[\"old\"]\n", diff --git a/workflow/notebooks/merge_renewable_profiles.ipynb b/workflow/notebooks/merge_renewable_profiles.ipynb new file mode 100644 index 0000000..00136dc --- /dev/null +++ b/workflow/notebooks/merge_renewable_profiles.ipynb @@ -0,0 +1,2201 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2ed89248", + "metadata": {}, + "source": [ + "# Merge and Validate Renewable Energy Profiles\n", + "\n", + "This notebook merges renewable energy profile data from 8 regions into global NetCDF and GeoJSON files, while validating country coverage using ISO3 codes.\n", + "\n", + "**Objectives:**\n", + "1. Explore the structure of .nc, .geojson, and metadata .json files\n", + "2. Extract and validate ISO3 country codes across all regions\n", + "3. Merge regional datasets into global files with sequential loading\n", + "4. Generate country coverage reports and validate data integrity\n", + "5. Visualize merged results and identify missing country coverage\n", + "\n", + "**Data Source:** `data/renewable_profiles/` directory with 8 regions:\n", + "- Africa, Australia, Central America, Central Asia\n", + "- Europe, North America, South America, South East Asia, West Asia\n", + "\n", + "**Output Files:**\n", + "- `data/renewable_profiles_global_merged.nc` - Merged NetCDF dataset\n", + "- `data/renewable_profiles_global_merged.geojson` - Merged GeoJSON geometries\n", + "- `resources/renewable_profiles_merge_report.json` - Country validation report" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "76bafeeb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data directory: ..\\..\\data\\renewable_profiles\n", + "Data directory exists: True\n", + "Output directory: ..\\..\\data\n", + "Resources directory: ..\\..\\resources\n", + "\n", + "Found 27 files in renewable_profiles:\n", + " renewable_profiles_africa__20260417_155313.geojson\n", + " renewable_profiles_africa__20260417_155313.nc\n", + " renewable_profiles_africa__20260417_155313_metadata.json\n", + " renewable_profiles_australia__20260420_172910.geojson\n", + " renewable_profiles_australia__20260420_172910.nc\n", + " renewable_profiles_australia__20260420_172910_metadata.json\n", + " renewable_profiles_central_america__20260417_172618.geojson\n", + " renewable_profiles_central_america__20260417_172618.nc\n", + " renewable_profiles_central_america__20260417_172618_metadata.json\n", + " renewable_profiles_central_asia__20260421_173248.geojson\n", + " renewable_profiles_central_asia__20260421_173248.nc\n", + " renewable_profiles_central_asia__20260421_173248_metadata.json\n", + " renewable_profiles_europe__20260420_142941.geojson\n", + " renewable_profiles_europe__20260420_142941.nc\n", + " renewable_profiles_europe__20260420_142941_metadata.json\n", + " renewable_profiles_north_america__20260417_163456.geojson\n", + " renewable_profiles_north_america__20260417_163456.nc\n", + " renewable_profiles_north_america__20260417_163456_metadata.json\n", + " renewable_profiles_south_america__20260417_161947.geojson\n", + " renewable_profiles_south_america__20260417_161947.nc\n", + " renewable_profiles_south_america__20260417_161947_metadata.json\n", + " renewable_profiles_south_east_asia__20260422_105946.geojson\n", + " renewable_profiles_south_east_asia__20260422_105946.nc\n", + " renewable_profiles_south_east_asia__20260422_105946_metadata.json\n", + " renewable_profiles_west_asia__20260422_141251.geojson\n", + " renewable_profiles_west_asia__20260422_141251.nc\n", + " renewable_profiles_west_asia__20260422_141251_metadata.json\n" + ] + } + ], + "source": [ + "# Import Required Libraries\n", + "import xarray as xr\n", + "import geopandas as gpd\n", + "import json\n", + "import pycountry\n", + "import pandas as pd\n", + "import numpy as np\n", + "from pathlib import Path\n", + "from collections import defaultdict\n", + "import warnings\n", + "import time\n", + "import psutil\n", + "import os\n", + "\n", + "# Visualization\n", + "import matplotlib.pyplot as plt\n", + "from shapely.geometry import shape\n", + "\n", + "warnings.filterwarnings(\"ignore\", category=DeprecationWarning)\n", + "\n", + "# Set up paths\n", + "BASE_DIR = Path(\"../..\") # Notebook should be run from repo root\n", + "DATA_DIR = BASE_DIR / \"data\" / \"renewable_profiles\"\n", + "OUTPUT_DATA_DIR = BASE_DIR / \"data\"\n", + "RESOURCES_DIR = BASE_DIR / \"resources\"\n", + "\n", + "# Ensure output directories exist\n", + "RESOURCES_DIR.mkdir(exist_ok=True, parents=True)\n", + "\n", + "print(f\"Data directory: {DATA_DIR}\")\n", + "print(f\"Data directory exists: {DATA_DIR.exists()}\")\n", + "print(f\"Output directory: {OUTPUT_DATA_DIR}\")\n", + "print(f\"Resources directory: {RESOURCES_DIR}\")\n", + "\n", + "# List all files in renewable_profiles\n", + "if DATA_DIR.exists():\n", + " files = sorted(DATA_DIR.glob(\"*\"))\n", + " print(f\"\\nFound {len(files)} files in renewable_profiles:\")\n", + " for f in files:\n", + " print(f\" {f.name}\")" + ] + }, + { + "cell_type": "markdown", + "id": "9579c06c", + "metadata": {}, + "source": [ + "## Section 1: Data Exploration\n", + "\n", + "Load and inspect one sample file from each file type (.nc, .geojson, .json) to understand the data structure." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fb248a1a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading sample NetCDF file: renewable_profiles_africa__20260417_155313.nc\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\JanLeopoldTautorus\\Repos\\shift\\.pixi\\envs\\dev\\Lib\\site-packages\\xarray\\backends\\plugins.py:109: RuntimeWarning: Engine 'cfgrib' loading failed:\n", + "Cannot find the ecCodes library\n", + " external_backend_entrypoints = backends_dict_from_pkg(entrypoints_unique)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "NetCDF Dataset Dimensions:\n", + " FrozenMappingWarningOnValuesAccess({'bus': 5296, 'technology': 3, 'hour': 8760, 'y_grid': 256, 'x_grid': 290})\n", + "\n", + "NetCDF Dataset Variables:\n", + " capacity_factor: (5296, 3, 8760) | dtype: float32\n", + " p_nom_max: (5296, 3) | dtype: float32\n", + " avg_cf: (5296, 3) | dtype: float32\n", + " potential: (256, 290, 3) | dtype: float32\n", + " weight: (5296,) | dtype: float32\n", + " data_quality_flag: (5296, 3) | dtype: bool\n", + "\n", + "NetCDF Coordinates:\n", + " bus: (5296,) | dtype: = 2:\n", + " region = parts[0].replace(\"renewable_profiles_\", \"\")\n", + " regions.add(region)\n", + "\n", + "print(f\"\\n\\nRegions found in data directory: {sorted(regions)}\")\n", + "print(f\"Total regions: {len(regions)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "2f7852b7", + "metadata": {}, + "source": [ + "## Section 2: Country Code Extraction & Validation\n", + "\n", + "Extract all ISO3 country codes from bus_ids and GeoJSON properties, then validate against pycountry." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "33747453", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sample bus_ids and extracted ISO3 codes:\n", + " GNQ_ON_s0r8wu -> GNQ\n", + " GNQ_ON_s2218h -> GNQ\n", + " GNQ_ON_s22031 -> GNQ\n", + " GNQ_ON_s0r7we -> GNQ\n", + " GNQ_ON_s0r4cs -> GNQ\n" + ] + } + ], + "source": [ + "# 2.1 Helper function to extract ISO3 from bus_id\n", + "\n", + "\n", + "def extract_iso3_from_bus_id(bus_id):\n", + " \"\"\"\n", + " Parse bus_id format: {ISO3}_{ON/OFF}_{geohash}\n", + " Returns the ISO3 code (first 3 characters)\n", + " \"\"\"\n", + " parts = str(bus_id).split(\"_\")\n", + " if len(parts) >= 1:\n", + " return parts[0]\n", + " return None\n", + "\n", + "\n", + "# Test with sample\n", + "if sample_geojson_file:\n", + " sample_bus_ids = gdf[\"bus_id\"].head(5)\n", + " print(\"Sample bus_ids and extracted ISO3 codes:\")\n", + " for bus_id in sample_bus_ids:\n", + " iso3 = extract_iso3_from_bus_id(bus_id)\n", + " print(f\" {bus_id} -> {iso3}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "395c771f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting ISO3 codes from all GeoJSON files...\n", + "\n", + "Processing africa...\n", + " Countries: 54 | Buses: 5296\n", + "Processing australia...\n", + " Countries: 14 | Buses: 2182\n", + "Processing central_america...\n", + " Countries: 21 | Buses: 2475\n", + "Processing central_asia...\n", + " Countries: 20 | Buses: 31442\n", + "Processing europe...\n", + " Countries: 42 | Buses: 28363\n", + "Processing north_america...\n", + " Countries: 15 | Buses: 28633\n", + "Processing south_america...\n", + " Countries: 35 | Buses: 15715\n", + "Processing south_east_asia...\n", + " Countries: 11 | Buses: 4283\n", + "Processing west_asia...\n", + " Countries: 18 | Buses: 4442\n", + "\n", + "Total unique ISO3 codes found in GeoJSON 'country' column: 194\n", + "Total unique ISO3 codes from bus_ids: 194\n", + "Total buses across all regions: 122831\n", + "\n", + "Sample ISO3 codes: ['AFG', 'AGO', 'ALB', 'AND', 'ARE', 'ARG', 'ARM', 'ATG', 'AUS', 'AUT', 'AZE', 'BDI', 'BEL', 'BEN', 'BFA', 'BGD', 'BGR', 'BHR', 'BHS', 'BIH']\n" + ] + } + ], + "source": [ + "# 2.2 Extract all ISO3 codes from all GeoJSON files\n", + "\n", + "print(\"Extracting ISO3 codes from all GeoJSON files...\\n\")\n", + "\n", + "iso3_from_geojson = set()\n", + "iso3_from_bus_id = set()\n", + "iso3_counts = defaultdict(int)\n", + "\n", + "for geojson_file in sorted(DATA_DIR.glob(\"*.geojson\")):\n", + " region_name = geojson_file.stem.split(\"__\")[0].replace(\"renewable_profiles_\", \"\")\n", + " print(f\"Processing {region_name}...\")\n", + "\n", + " gdf_region = gpd.read_file(geojson_file)\n", + "\n", + " # Extract from 'country' column\n", + " region_iso3_geojson = set(gdf_region[\"country\"].dropna().unique())\n", + " iso3_from_geojson.update(region_iso3_geojson)\n", + "\n", + " # Extract from bus_id\n", + " region_iso3_bus_id = set(\n", + " gdf_region[\"bus_id\"].apply(extract_iso3_from_bus_id).unique()\n", + " )\n", + " iso3_from_bus_id.update(region_iso3_bus_id)\n", + "\n", + " # Count buses per country\n", + " for iso3 in region_iso3_geojson:\n", + " iso3_counts[iso3] += len(gdf_region[gdf_region[\"country\"] == iso3])\n", + "\n", + " print(f\" Countries: {len(region_iso3_geojson)} | Buses: {len(gdf_region)}\")\n", + "\n", + "print(\n", + " f\"\\nTotal unique ISO3 codes found in GeoJSON 'country' column: {len(iso3_from_geojson)}\"\n", + ")\n", + "print(f\"Total unique ISO3 codes from bus_ids: {len(iso3_from_bus_id)}\")\n", + "print(f\"Total buses across all regions: {sum(iso3_counts.values())}\")\n", + "print(f\"\\nSample ISO3 codes: {sorted(list(iso3_from_geojson))[:20]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6fc900f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total ISO3 codes in pycountry: 249\n", + "\n", + "Countries in renewable profiles: 194\n", + "Invalid ISO3 codes in renewable profiles: 0\n", + "\n", + "Countries in pycountry but NOT in renewable profiles: 55\n", + " Sample: ['ABW', 'AIA', 'ALA', 'ASM', 'ATA', 'ATF', 'BES', 'BLM', 'BMU', 'BVT', 'CCK', 'COK', 'CUW', 'CXR', 'CYM', 'ESH', 'FLK', 'FRO', 'GGY', 'GIB']\n", + "\n", + "Country Coverage Summary:\n", + " Total countries with renewable profiles: 194\n", + " Total buses: 122831\n", + " Avg buses per country: 633.1\n", + " Min buses per country: 1\n", + " Max buses per country: 30853\n", + "\n", + "Top 10 countries by bus count:\n", + " ISO3 Bus_Count\n", + "183 USA 30853\n", + "32 CHN 15238\n", + "77 IND 8471\n", + "29 CAN 4488\n", + "23 BRA 4198\n", + "44 DEU 3141\n", + "58 FRA 2983\n", + "111 MEX 2525\n", + "86 JPN 2475\n", + "83 ITA 2452\n" + ] + } + ], + "source": [ + "# 2.3 Validate against pycountry\n", + "\n", + "# Get all valid ISO3 codes from pycountry\n", + "valid_iso3_codes = {country.alpha_3 for country in pycountry.countries}\n", + "print(f\"Total ISO3 codes in pycountry: {len(valid_iso3_codes)}\\n\")\n", + "\n", + "# Find valid and invalid ISO3 codes in renewable profiles\n", + "iso3_in_renewable = iso3_from_geojson\n", + "iso3_valid = iso3_in_renewable & valid_iso3_codes\n", + "iso3_invalid = iso3_in_renewable - valid_iso3_codes\n", + "iso3_missing = valid_iso3_codes - iso3_in_renewable\n", + "\n", + "print(f\"Countries in renewable profiles: {len(iso3_valid)}\")\n", + "print(f\"Invalid ISO3 codes in renewable profiles: {len(iso3_invalid)}\")\n", + "if iso3_invalid:\n", + " print(f\" Invalid codes: {sorted(iso3_invalid)}\")\n", + "\n", + "print(f\"\\nCountries in pycountry but NOT in renewable profiles: {len(iso3_missing)}\")\n", + "print(f\" Sample: {sorted(list(iso3_missing))[:20]}\")\n", + "\n", + "# Create validation summary dataframe\n", + "validation_df = pd.DataFrame(\n", + " {\n", + " \"ISO3\": sorted(iso3_valid),\n", + " \"Bus_Count\": [iso3_counts.get(iso3, 0) for iso3 in sorted(iso3_valid)],\n", + " \"In_Pycountry\": True,\n", + " }\n", + ")\n", + "\n", + "print(\"\\nCountry Coverage Summary:\")\n", + "print(f\" Total countries with renewable profiles: {len(validation_df)}\")\n", + "print(f\" Total buses: {validation_df['Bus_Count'].sum()}\")\n", + "print(f\" Avg buses per country: {validation_df['Bus_Count'].mean():.1f}\")\n", + "print(f\" Min buses per country: {validation_df['Bus_Count'].min()}\")\n", + "print(f\" Max buses per country: {validation_df['Bus_Count'].max()}\")\n", + "\n", + "print(\"\\nTop 10 countries by bus count:\")\n", + "print(validation_df.nlargest(10, \"Bus_Count\")[[\"ISO3\", \"Bus_Count\"]])" + ] + }, + { + "cell_type": "markdown", + "id": "8df1e8aa", + "metadata": {}, + "source": [ + "## Section 3: Merge Logic\n", + "\n", + "Load all regional files sequentially and merge into global .nc and .geojson files." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f9a1cb26", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Helper functions defined successfully\n", + "\n", + "βœ… REVISED MERGE STRATEGY: Global Grid with NaN Fill\n", + "======================================================================\n", + "Approach: Create global 0.25Β° grid covering entire world\n", + " 1. Build uniform grid: -180Β° to 180Β° (lon), -90Β° to 90Β° (lat)\n", + " 2. Fill with NaN globally\n", + " 3. Place each region's potential data into corresponding cells\n", + " 4. Result: Single global potential variable with NaN where no data\n", + "\n", + "Benefits:\n", + " βœ“ All data (including potential) in single merged .nc file\n", + " βœ“ Standard gridded format suitable for further analysis\n", + " βœ“ Can interpolate/analyze global grid uniformly\n", + " βœ“ Cleaner API - no separate grid handling needed\n" + ] + } + ], + "source": [ + "# 3.1 Define helper functions for loading regional data\n", + "\n", + "\n", + "def get_latest_file(directory, pattern):\n", + " \"\"\"Get the most recently modified file matching pattern (by timestamp in filename)\"\"\"\n", + " files = sorted(directory.glob(pattern))\n", + " if files:\n", + " return files[-1] # Timestamp in filename ensures latest is last when sorted\n", + " return None\n", + "\n", + "\n", + "def load_region_nc(region_dir, region_name):\n", + " \"\"\"Load NetCDF file for a region\"\"\"\n", + " nc_file = get_latest_file(region_dir, f\"renewable_profiles_{region_name}__*.nc\")\n", + " if nc_file:\n", + " return xr.open_dataset(nc_file)\n", + " return None\n", + "\n", + "\n", + "def load_region_geojson(region_dir, region_name):\n", + " \"\"\"Load GeoJSON file for a region as GeoDataFrame\"\"\"\n", + " geojson_file = get_latest_file(\n", + " region_dir, f\"renewable_profiles_{region_name}__*.geojson\"\n", + " )\n", + " if geojson_file:\n", + " return gpd.read_file(geojson_file)\n", + " return None\n", + "\n", + "\n", + "def load_region_metadata(region_dir, region_name):\n", + " \"\"\"Load metadata JSON for a region\"\"\"\n", + " json_file = get_latest_file(\n", + " region_dir, f\"renewable_profiles_{region_name}__*_metadata.json\"\n", + " )\n", + " if json_file:\n", + " with open(json_file) as f:\n", + " return json.load(f)\n", + " return None\n", + "\n", + "\n", + "def create_global_grid(resolution=0.25):\n", + " \"\"\"\n", + " Create a global grid at specified resolution (degrees)\n", + " Default 0.25Β° gives ~1440 x 720 grid cells\n", + "\n", + " Returns:\n", + " x_global, y_global: 1D arrays of global grid coordinates\n", + " \"\"\"\n", + " x_global = np.arange(-180, 180 + resolution, resolution) # Longitude: -180 to 180\n", + " y_global = np.arange(-90, 90 + resolution, resolution) # Latitude: -90 to 90\n", + " return x_global, y_global\n", + "\n", + "\n", + "def place_regional_potential_on_global_grid(\n", + " potential_regional, x_regional, y_regional, x_global, y_global, technology_dim\n", + "):\n", + " \"\"\"\n", + " Place regional potential data onto global grid with NaN fill.\n", + "\n", + " Parameters:\n", + " potential_regional: [y_regional, x_regional, technology]\n", + " x_regional, y_regional: Regional grid coordinates\n", + " x_global, y_global: Global grid coordinates\n", + " technology_dim: Index of technology dimension\n", + "\n", + " Returns:\n", + " potential_global: [y_global, x_global, technology] filled with NaN + regional data\n", + " \"\"\"\n", + " # Initialize global grid with NaN\n", + " n_tech = potential_regional.shape[technology_dim]\n", + " potential_global = np.full(\n", + " (len(y_global), len(x_global), n_tech), np.nan, dtype=np.float32\n", + " )\n", + "\n", + " # Find indices where regional grid maps to global grid\n", + " x_indices = np.searchsorted(x_global, x_regional)\n", + " y_indices = np.searchsorted(y_global, y_regional)\n", + "\n", + " # Handle boundary cases (shouldn't happen if grids are within [-180,180] x [-90,90])\n", + " valid_x = (x_indices >= 0) & (x_indices < len(x_global))\n", + " valid_y = (y_indices >= 0) & (y_indices < len(y_global))\n", + "\n", + " if not (valid_x.all() and valid_y.all()):\n", + " print(\" ⚠️ Warning: Some grid cells outside global bounds\")\n", + "\n", + " # Place regional data into global grid\n", + " for i, y_idx in enumerate(y_indices):\n", + " for j, x_idx in enumerate(x_indices):\n", + " if 0 <= x_idx < len(x_global) and 0 <= y_idx < len(y_global):\n", + " potential_global[y_idx, x_idx, :] = potential_regional[i, j, :]\n", + "\n", + " return potential_global\n", + "\n", + "\n", + "print(\"Helper functions defined successfully\")\n", + "print(\"\\nβœ… REVISED MERGE STRATEGY: Global Grid with NaN Fill\")\n", + "print(\"=\" * 70)\n", + "print(\"Approach: Create global 0.25Β° grid covering entire world\")\n", + "print(\" 1. Build uniform grid: -180Β° to 180Β° (lon), -90Β° to 90Β° (lat)\")\n", + "print(\" 2. Fill with NaN globally\")\n", + "print(\" 3. Place each region's potential data into corresponding cells\")\n", + "print(\" 4. Result: Single global potential variable with NaN where no data\")\n", + "print(\"\\nBenefits:\")\n", + "print(\" βœ“ All data (including potential) in single merged .nc file\")\n", + "print(\" βœ“ Standard gridded format suitable for further analysis\")\n", + "print(\" βœ“ Can interpolate/analyze global grid uniformly\")\n", + "print(\" βœ“ Cleaner API - no separate grid handling needed\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f62d272f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting merge process...\n", + "======================================================================\n", + "\n", + "Processing region: africa\n", + " βœ“ Loaded africa: 5296 buses, 5296 features\n", + " Technologies: [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " Grid size: 290 Γ— 256 cells\n", + " X range: [-19.50, 67.20]\n", + " Y range: [-37.50, 39.00]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 921.7 MB (delta: +8.9 MB)\n", + "\n", + "Processing region: australia\n", + " βœ“ Loaded australia: 2182 buses, 2182 features\n", + " Technologies: [np.str_('onwind'), np.str_('solar')]\n", + " Grid size: 403 Γ— 193 cells\n", + " X range: [80.10, 179.70]\n", + " Y range: [-49.80, 7.80]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 938.3 MB (delta: +25.5 MB)\n", + "\n", + "Processing region: central_america\n", + " βœ“ Loaded central_america: 2475 buses, 2475 features\n", + " Technologies: [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " Grid size: 223 Γ— 105 cells\n", + " X range: [-122.40, -55.80]\n", + " Y range: [1.80, 33.00]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 949.5 MB (delta: +36.8 MB)\n", + "\n", + "Processing region: central_asia\n", + " βœ“ Loaded central_asia: 31442 buses, 31442 features\n", + " Technologies: [np.str_('onwind'), np.str_('solar')]\n", + " Grid size: 365 Γ— 180 cells\n", + " X range: [43.80, 145.80]\n", + " Y range: [1.80, 55.50]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 1036.5 MB (delta: +123.7 MB)\n", + "\n", + "Processing region: europe\n", + " βœ“ Loaded europe: 28363 buses, 28363 features\n", + " Technologies: [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " Grid size: 241 Γ— 155 cells\n", + " X range: [-31.50, 40.50]\n", + " Y range: [27.60, 73.80]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 1159.9 MB (delta: +247.1 MB)\n", + "\n", + "Processing region: north_america\n", + " βœ“ Loaded north_america: 28633 buses, 28633 features\n", + " Technologies: [np.str_('onwind'), np.str_('solar')]\n", + " Grid size: 417 Γ— 214 cells\n", + " X range: [-171.90, -47.10]\n", + " Y range: [9.90, 73.80]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 1287.6 MB (delta: +374.8 MB)\n", + "\n", + "Processing region: south_america\n", + " βœ“ Loaded south_america: 15715 buses, 15715 features\n", + " Technologies: [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " Grid size: 282 Γ— 258 cells\n", + " X range: [-109.80, -25.50]\n", + " Y range: [-60.00, 17.10]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 1382.0 MB (delta: +469.2 MB)\n", + "\n", + "Processing region: south_east_asia\n", + " βœ“ Loaded south_east_asia: 4283 buses, 4283 features\n", + " Technologies: [np.str_('onwind'), np.str_('solar')]\n", + " Grid size: 182 Γ— 134 cells\n", + " X range: [92.10, 141.00]\n", + " Y range: [-11.10, 28.80]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 1379.9 MB (delta: +467.2 MB)\n", + "\n", + "Processing region: west_asia\n", + " βœ“ Loaded west_asia: 4442 buses, 4442 features\n", + " Technologies: [np.str_('onwind'), np.str_('solar')]\n", + " Grid size: 116 Γ— 107 cells\n", + " X range: [25.50, 60.00]\n", + " Y range: [12.00, 43.80]\n", + " βœ“ Stored potential data for grid assembly\n", + " Variables to merge (bus-level): ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + " Memory: 1393.4 MB (delta: +480.6 MB)\n", + "\n", + "======================================================================\n", + "Loaded 9 regions\n", + "Stored potential data for 9 regions\n", + "Total buses to merge: 122831\n", + "\n", + "Global grid extent (from regional data):\n", + " X: [-171.90, 179.70]\n", + " Y: [-60.00, 73.80]\n", + "\n", + "Next: Will create global 0.25Β° grid and assemble potential variable\n" + ] + } + ], + "source": [ + "# 3.2 Sequential merge of all regional files\n", + "\n", + "print(\"Starting merge process...\")\n", + "print(\"=\" * 70)\n", + "\n", + "# Define regions in the order they appear in the data\n", + "regions_to_merge = sorted(\n", + " [\n", + " \"africa\",\n", + " \"australia\",\n", + " \"central_america\",\n", + " \"central_asia\",\n", + " \"europe\",\n", + " \"north_america\",\n", + " \"south_america\",\n", + " \"south_east_asia\",\n", + " \"west_asia\",\n", + " ]\n", + ")\n", + "\n", + "# Initialize accumulators\n", + "nc_datasets_bus_vars = [] # Bus-level variables for concat\n", + "potential_data_by_region = {} # Store potential data per region\n", + "global_grid_extents = { # Track bounds for global grid\n", + " \"x_min\": 180,\n", + " \"x_max\": -180,\n", + " \"y_min\": 90,\n", + " \"y_max\": -90,\n", + "}\n", + "geojson_features_list = []\n", + "merge_metadata = {\n", + " \"regions_processed\": [],\n", + " \"total_buses\": 0,\n", + " \"regional_bus_counts\": {},\n", + " \"iso3_counts\": {},\n", + " \"timestamps\": {},\n", + " \"regional_techs\": {}, # Store technology list per region\n", + " \"merge_timestamp\": pd.Timestamp.now().isoformat(),\n", + " \"merge_strategy\": \"All variables merged including global potential grid with NaN fill\",\n", + "}\n", + "\n", + "# Track memory usage\n", + "start_memory = psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024 # MB\n", + "start_time = time.time()\n", + "\n", + "# Merge loop\n", + "for region_name in regions_to_merge:\n", + " print(f\"\\nProcessing region: {region_name}\")\n", + "\n", + " # Load regional data\n", + " ds_region = load_region_nc(DATA_DIR, region_name)\n", + " gdf_region = load_region_geojson(DATA_DIR, region_name)\n", + " meta_region = load_region_metadata(DATA_DIR, region_name)\n", + "\n", + " if ds_region is None or gdf_region is None:\n", + " print(f\" ⚠ Skipping {region_name}: missing .nc or .geojson files\")\n", + " continue\n", + "\n", + " # Count buses\n", + " n_buses = len(ds_region.coords[\"bus\"])\n", + " print(f\" βœ“ Loaded {region_name}: {n_buses} buses, {len(gdf_region)} features\")\n", + "\n", + " # Store technology information for this region\n", + " if \"technology\" in ds_region.coords:\n", + " region_tech_list = list(ds_region.coords[\"technology\"].values)\n", + " merge_metadata[\"regional_techs\"][region_name] = region_tech_list\n", + " print(f\" Technologies: {region_tech_list}\")\n", + "\n", + " # Log grid information\n", + " if \"x_grid\" in ds_region.coords and \"y_grid\" in ds_region.coords:\n", + " x_grid_region = ds_region.coords[\"x_grid\"].values\n", + " y_grid_region = ds_region.coords[\"y_grid\"].values\n", + "\n", + " print(f\" Grid size: {len(x_grid_region)} Γ— {len(y_grid_region)} cells\")\n", + " print(f\" X range: [{x_grid_region.min():.2f}, {x_grid_region.max():.2f}]\")\n", + " print(f\" Y range: [{y_grid_region.min():.2f}, {y_grid_region.max():.2f}]\")\n", + "\n", + " # Update global extent\n", + " global_grid_extents[\"x_min\"] = min(\n", + " global_grid_extents[\"x_min\"], x_grid_region.min()\n", + " )\n", + " global_grid_extents[\"x_max\"] = max(\n", + " global_grid_extents[\"x_max\"], x_grid_region.max()\n", + " )\n", + " global_grid_extents[\"y_min\"] = min(\n", + " global_grid_extents[\"y_min\"], y_grid_region.min()\n", + " )\n", + " global_grid_extents[\"y_max\"] = max(\n", + " global_grid_extents[\"y_max\"], y_grid_region.max()\n", + " )\n", + "\n", + " # Store potential data for later global grid assembly\n", + " if \"potential\" in ds_region.data_vars:\n", + " potential_data_by_region[region_name] = {\n", + " \"data\": ds_region[\"potential\"].values,\n", + " \"x_grid\": x_grid_region,\n", + " \"y_grid\": y_grid_region,\n", + " }\n", + " print(\" βœ“ Stored potential data for grid assembly\")\n", + "\n", + " # Store metadata\n", + " if meta_region:\n", + " merge_metadata[\"timestamps\"][region_name] = meta_region.get(\n", + " \"timestamp\", \"unknown\"\n", + " )\n", + "\n", + " # Validate consistency\n", + " if n_buses != len(gdf_region):\n", + " print(\n", + " f\" ⚠ Warning: NetCDF has {n_buses} buses but GeoJSON has {len(gdf_region)} features\"\n", + " )\n", + "\n", + " # Extract only bus-level variables (exclude grid-dependent 'potential')\n", + " data_vars_to_keep = [\n", + " var\n", + " for var in ds_region.data_vars\n", + " if \"x_grid\" not in ds_region[var].dims and \"y_grid\" not in ds_region[var].dims\n", + " ]\n", + "\n", + " # Create subset dataset with bus-level variables only\n", + " ds_region_bus_vars = ds_region[data_vars_to_keep]\n", + "\n", + " # Accumulate bus-level NetCDF datasets\n", + " nc_datasets_bus_vars.append(ds_region_bus_vars)\n", + "\n", + " print(f\" Variables to merge (bus-level): {data_vars_to_keep}\")\n", + "\n", + " # Accumulate GeoJSON features\n", + " for idx, row in gdf_region.iterrows():\n", + " feature = {\n", + " \"type\": \"Feature\",\n", + " \"geometry\": row.geometry.__geo_interface__,\n", + " \"properties\": {k: v for k, v in row.items() if k != \"geometry\"},\n", + " }\n", + " geojson_features_list.append(feature)\n", + "\n", + " # Track regional stats\n", + " merge_metadata[\"regional_bus_counts\"][region_name] = n_buses\n", + " merge_metadata[\"regions_processed\"].append(region_name)\n", + "\n", + " # Track ISO3 counts\n", + " for iso3 in gdf_region[\"country\"].unique():\n", + " if pd.notna(iso3):\n", + " count = len(gdf_region[gdf_region[\"country\"] == iso3])\n", + " merge_metadata[\"iso3_counts\"][iso3] = (\n", + " merge_metadata[\"iso3_counts\"].get(iso3, 0) + count\n", + " )\n", + "\n", + " # Memory check\n", + " current_memory = psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024\n", + " print(\n", + " f\" Memory: {current_memory:.1f} MB (delta: {current_memory - start_memory:+.1f} MB)\"\n", + " )\n", + "\n", + "print(f\"\\n{'=' * 70}\")\n", + "print(f\"Loaded {len(nc_datasets_bus_vars)} regions\")\n", + "print(f\"Stored potential data for {len(potential_data_by_region)} regions\")\n", + "merge_metadata[\"total_buses\"] = sum(merge_metadata[\"regional_bus_counts\"].values())\n", + "print(f\"Total buses to merge: {merge_metadata['total_buses']}\")\n", + "print(\"\\nGlobal grid extent (from regional data):\")\n", + "print(f\" X: [{global_grid_extents['x_min']:.2f}, {global_grid_extents['x_max']:.2f}]\")\n", + "print(f\" Y: [{global_grid_extents['y_min']:.2f}, {global_grid_extents['y_max']:.2f}]\")\n", + "print(\"\\nNext: Will create global 0.25Β° grid and assemble potential variable\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b68fcba4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Concatenating NetCDF datasets (bus-level variables)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\JanLeopoldTautorus\\AppData\\Local\\Temp\\ipykernel_4816\\3622988324.py:6: FutureWarning: In a future version of xarray the default value for join will change from join='outer' to join='exact'. This change will result in the following ValueError: cannot be aligned with join='exact' because index/labels/sizes are not equal along these coordinates (dimensions): 'technology' ('technology',) The recommendation is to set join explicitly for this case.\n", + " ds_merged = xr.concat(nc_datasets_bus_vars, dim='bus')\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "βœ“ Merged NetCDF dimensions: {'bus': 122831, 'technology': 3, 'hour': 8760}\n", + "βœ“ Merged NetCDF variables: ['capacity_factor', 'p_nom_max', 'avg_cf', 'weight', 'data_quality_flag']\n", + "βœ“ Merged NetCDF coordinates: ['technology', 'hour', 'bus']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\JanLeopoldTautorus\\AppData\\Local\\Temp\\ipykernel_4816\\3622988324.py:7: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.\n", + " print(f\"βœ“ Merged NetCDF dimensions: {dict(ds_merged.dims)}\")\n" + ] + } + ], + "source": [ + "# 3.3 Concatenate NetCDF datasets (bus-level variables only)\n", + "\n", + "print(\"\\nConcatenating NetCDF datasets (bus-level variables)...\")\n", + "if nc_datasets_bus_vars:\n", + " # Concatenate along the 'bus' dimension\n", + " ds_merged = xr.concat(nc_datasets_bus_vars, dim=\"bus\")\n", + " print(f\"βœ“ Merged NetCDF dimensions: {dict(ds_merged.dims)}\")\n", + " print(f\"βœ“ Merged NetCDF variables: {list(ds_merged.data_vars)}\")\n", + " print(f\"βœ“ Merged NetCDF coordinates: {list(ds_merged.coords)}\")\n", + "else:\n", + " print(\"βœ— No datasets to merge!\")\n", + " ds_merged = None" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4c148ec2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Assembling global potential grid...\n", + "======================================================================\n", + "βœ“ Created global grid: 1441 Γ— 721 cells\n", + " X: [-180.00, 180.00] (longitude)\n", + " Y: [-90.00, 90.00] (latitude)\n", + "βœ“ Target technologies: [np.str_('offwind-ac'), np.str_('onwind'), np.str_('solar')]\n", + "βœ“ Initialized global potential array: (721, 1441, 3)\n", + "\n", + "Placing regional potential data into global grid...\n", + " Processing africa... (3 technologies) β†’ Tech mapping: {0: 1, 1: 0, 2: 2} βœ“ (200114 cells filled)\n", + " Processing australia... (2 technologies) β†’ Tech mapping: {0: 1, 1: 2} βœ“ (354128 cells filled)\n", + " Processing central_america... (3 technologies) β†’ Tech mapping: {0: 1, 1: 0, 2: 2} βœ“ (411772 cells filled)\n", + " Processing central_asia... (2 technologies) β†’ Tech mapping: {0: 1, 1: 2} βœ“ (523094 cells filled)\n", + " Processing europe... (3 technologies) β†’ Tech mapping: {0: 1, 1: 0, 2: 2} βœ“ (604225 cells filled)\n", + " Processing north_america... (2 technologies) β†’ Tech mapping: {0: 1, 1: 2} βœ“ (758053 cells filled)\n", + " Processing south_america... (3 technologies) β†’ Tech mapping: {0: 1, 1: 0, 2: 2} βœ“ (952609 cells filled)\n", + " Processing south_east_asia... (2 technologies) β†’ Tech mapping: {0: 1, 1: 2} βœ“ (958649 cells filled)\n", + " Processing west_asia... (2 technologies) β†’ Tech mapping: {0: 1, 1: 2} βœ“ (959487 cells filled)\n", + "\n", + "βœ“ Global coverage: 188043/1038961 cells (18.10%)\n", + "\n", + "βœ“ Adding potential to merged dataset...\n", + "βœ“ Merged dataset now includes potential variable\n", + "\n", + "πŸ“Š Technology Coverage by Region:\n", + " africa: 3 technologies - [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " australia: 2 technologies - [np.str_('onwind'), np.str_('solar')]\n", + " central_america: 3 technologies - [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " central_asia: 2 technologies - [np.str_('onwind'), np.str_('solar')]\n", + " europe: 3 technologies - [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " north_america: 2 technologies - [np.str_('onwind'), np.str_('solar')]\n", + " south_america: 3 technologies - [np.str_('onwind'), np.str_('offwind-ac'), np.str_('solar')]\n", + " south_east_asia: 2 technologies - [np.str_('onwind'), np.str_('solar')]\n", + " west_asia: 2 technologies - [np.str_('onwind'), np.str_('solar')]\n" + ] + } + ], + "source": [ + "# 3.3b Assemble global potential grid\n", + "\n", + "print(\"\\nAssembling global potential grid...\")\n", + "print(\"=\" * 70)\n", + "\n", + "if len(potential_data_by_region) > 0:\n", + " # Create global grid at 0.25Β° resolution\n", + " x_global, y_global = create_global_grid(resolution=0.25)\n", + " print(f\"βœ“ Created global grid: {len(x_global)} Γ— {len(y_global)} cells\")\n", + " print(f\" X: [{x_global.min():.2f}, {x_global.max():.2f}] (longitude)\")\n", + " print(f\" Y: [{y_global.min():.2f}, {y_global.max():.2f}] (latitude)\")\n", + "\n", + " # Get technology list from merged dataset\n", + " tech_list = list(ds_merged.coords[\"technology\"].values)\n", + " n_technologies = len(tech_list)\n", + " print(f\"βœ“ Target technologies: {tech_list}\")\n", + "\n", + " # Initialize global potential grid with NaN\n", + " potential_global = np.full(\n", + " (len(y_global), len(x_global), n_technologies), np.nan, dtype=np.float32\n", + " )\n", + " print(f\"βœ“ Initialized global potential array: {potential_global.shape}\")\n", + "\n", + " # Track regions by technology coverage\n", + " region_tech_info = {}\n", + "\n", + " # Place each region's potential into global grid\n", + " print(\"\\nPlacing regional potential data into global grid...\")\n", + " for region_name, region_pot in potential_data_by_region.items():\n", + " print(f\" Processing {region_name}...\", end=\" \")\n", + "\n", + " x_grid = region_pot[\"x_grid\"]\n", + " y_grid = region_pot[\"y_grid\"]\n", + " potential_region = region_pot[\"data\"]\n", + "\n", + " # Check shape of regional potential\n", + " n_tech_region = (\n", + " potential_region.shape[2] if len(potential_region.shape) == 3 else 1\n", + " )\n", + " print(f\"({n_tech_region} technologies)\", end=\" \")\n", + "\n", + " # Try to get technology list from region metadata (stored earlier)\n", + " if region_name in merge_metadata.get(\"regional_techs\", {}):\n", + " region_tech_list = merge_metadata[\"regional_techs\"][region_name]\n", + " else:\n", + " # Infer technologies: assume first n_tech_region techs from global list\n", + " region_tech_list = tech_list[:n_tech_region]\n", + "\n", + " # Map regional technologies to global indices\n", + " tech_mapping = {}\n", + " for local_idx, tech in enumerate(region_tech_list):\n", + " if tech in tech_list:\n", + " global_idx = tech_list.index(tech)\n", + " tech_mapping[local_idx] = global_idx\n", + " else:\n", + " print(f\"\\n ⚠️ Warning: Unknown technology '{tech}' in {region_name}\")\n", + "\n", + " print(f\"β†’ Tech mapping: {tech_mapping}\", end=\" \")\n", + "\n", + " # Find indices in global grid\n", + " x_idx = np.searchsorted(x_global, x_grid)\n", + " y_idx = np.searchsorted(y_global, y_grid)\n", + "\n", + " # Place data into global grid (only place known technologies)\n", + " for iy, y_i in enumerate(y_idx):\n", + " for ix, x_i in enumerate(x_idx):\n", + " if 0 <= x_i < len(x_global) and 0 <= y_i < len(y_global):\n", + " # Map regional tech indices to global indices\n", + " for local_tech_idx, global_tech_idx in tech_mapping.items():\n", + " potential_global[y_i, x_i, global_tech_idx] = potential_region[\n", + " iy, ix, local_tech_idx\n", + " ]\n", + "\n", + " # Count filled cells\n", + " filled_cells = (~np.isnan(potential_global)).sum(axis=2).sum()\n", + " print(f\"βœ“ ({filled_cells} cells filled)\")\n", + "\n", + " region_tech_info[region_name] = {\n", + " \"n_technologies\": n_tech_region,\n", + " \"technologies\": region_tech_list.tolist()\n", + " if hasattr(region_tech_list, \"tolist\")\n", + " else list(region_tech_list),\n", + " \"tech_mapping\": tech_mapping,\n", + " }\n", + "\n", + " # Count global coverage\n", + " total_cells = len(x_global) * len(y_global)\n", + " filled_cells = (\n", + " ~np.isnan(potential_global[:, :, 0])\n", + " ).sum() # Check first technology\n", + " coverage_pct = (filled_cells / total_cells) * 100\n", + " print(\n", + " f\"\\nβœ“ Global coverage: {filled_cells}/{total_cells} cells ({coverage_pct:.2f}%)\"\n", + " )\n", + "\n", + " # Add potential to merged dataset\n", + " print(\"\\nβœ“ Adding potential to merged dataset...\")\n", + " ds_merged[\"potential\"] = xr.DataArray(\n", + " potential_global,\n", + " coords={\n", + " \"y_grid\": y_global,\n", + " \"x_grid\": x_global,\n", + " \"technology\": ds_merged.coords[\"technology\"].values,\n", + " },\n", + " dims=[\"y_grid\", \"x_grid\", \"technology\"],\n", + " )\n", + " print(\"βœ“ Merged dataset now includes potential variable\")\n", + "\n", + " # Store grid info in metadata\n", + " merge_metadata[\"global_grid\"] = {\n", + " \"resolution_degrees\": 0.25,\n", + " \"x_range\": [float(x_global.min()), float(x_global.max())],\n", + " \"y_range\": [float(y_global.min()), float(y_global.max())],\n", + " \"grid_size\": [len(x_global), len(y_global)],\n", + " \"coverage_percent\": coverage_pct,\n", + " \"fill_value\": \"NaN where no data available\",\n", + " }\n", + "\n", + " merge_metadata[\"regional_technology_coverage\"] = region_tech_info\n", + "\n", + " print(\"\\nπŸ“Š Technology Coverage by Region:\")\n", + " for region, info in region_tech_info.items():\n", + " print(\n", + " f\" {region}: {info['n_technologies']} technologies - {info['technologies']}\"\n", + " )\n", + "\n", + "else:\n", + " print(\"⚠️ No potential data found to assemble global grid\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "784487e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating merged GeoJSON...\n", + "βœ“ Merged GeoJSON has 122831 features\n", + "βœ“ Merged GeoDataFrame shape: (122831, 8)\n", + "βœ“ Columns: ['geometry', 'bus_id', 'pypsa_region_id', 'country', 'onshore_offshore', 'x_centroid', 'y_centroid', 'area_km2']\n" + ] + } + ], + "source": [ + "# 3.4 Create merged GeoJSON\n", + "\n", + "print(\"\\nCreating merged GeoJSON...\")\n", + "geojson_merged = {\"type\": \"FeatureCollection\", \"features\": geojson_features_list}\n", + "\n", + "print(f\"βœ“ Merged GeoJSON has {len(geojson_features_list)} features\")\n", + "\n", + "# Convert to GeoDataFrame for validation\n", + "gdf_merged = gpd.GeoDataFrame.from_features(geojson_merged[\"features\"], crs=\"EPSG:4326\")\n", + "print(f\"βœ“ Merged GeoDataFrame shape: {gdf_merged.shape}\")\n", + "print(f\"βœ“ Columns: {list(gdf_merged.columns)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4590b6b3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Writing merged files to disk...\n", + " Writing renewable_profiles_global_merged.nc...\n", + " βœ“ Wrote renewable_profiles_global_merged.nc (3658.9 MB)\n", + " Writing renewable_profiles_global_merged.geojson...\n", + " βœ“ Wrote renewable_profiles_global_merged.geojson (116.3 MB)\n", + " Writing renewable_profiles_merge_report.json...\n", + " βœ“ Wrote renewable_profiles_merge_report.json\n", + "\n", + "======================================================================\n", + "Merge complete!\n", + " Elapsed time: 373.0 seconds\n", + " Memory used: 12381.4 MB\n", + " Output files created in ..\\..\\data\n", + " Report file created in ..\\..\\resources\n", + "\n", + "βœ… All variables (including global potential grid) merged in single .nc file\n" + ] + } + ], + "source": [ + "# 3.5 Write merged files to disk\n", + "\n", + "print(\"\\nWriting merged files to disk...\")\n", + "\n", + "# Write NetCDF\n", + "if ds_merged is not None:\n", + " output_nc_file = OUTPUT_DATA_DIR / \"renewable_profiles_global_merged.nc\"\n", + " print(f\" Writing {output_nc_file.name}...\")\n", + " ds_merged.to_netcdf(output_nc_file)\n", + " file_size_mb = output_nc_file.stat().st_size / 1024 / 1024\n", + " print(f\" βœ“ Wrote {output_nc_file.name} ({file_size_mb:.1f} MB)\")\n", + "\n", + "# Write GeoJSON\n", + "output_geojson_file = OUTPUT_DATA_DIR / \"renewable_profiles_global_merged.geojson\"\n", + "print(f\" Writing {output_geojson_file.name}...\")\n", + "with open(output_geojson_file, \"w\") as f:\n", + " json.dump(geojson_merged, f)\n", + "file_size_mb = output_geojson_file.stat().st_size / 1024 / 1024\n", + "print(f\" βœ“ Wrote {output_geojson_file.name} ({file_size_mb:.1f} MB)\")\n", + "\n", + "# Write metadata report\n", + "output_report_file = RESOURCES_DIR / \"renewable_profiles_merge_report.json\"\n", + "print(f\" Writing {output_report_file.name}...\")\n", + "with open(output_report_file, \"w\") as f:\n", + " json.dump(merge_metadata, f, indent=2, default=str)\n", + "print(f\" βœ“ Wrote {output_report_file.name}\")\n", + "\n", + "# Summary\n", + "elapsed_time = time.time() - start_time\n", + "final_memory = psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024\n", + "print(f\"\\n{'=' * 70}\")\n", + "print(\"Merge complete!\")\n", + "print(f\" Elapsed time: {elapsed_time:.1f} seconds\")\n", + "print(f\" Memory used: {final_memory - start_memory:.1f} MB\")\n", + "print(f\" Output files created in {OUTPUT_DATA_DIR}\")\n", + "print(f\" Report file created in {RESOURCES_DIR}\")\n", + "print(\"\\nβœ… All variables (including global potential grid) merged in single .nc file\")" + ] + }, + { + "cell_type": "markdown", + "id": "660b36ee", + "metadata": {}, + "source": [ + "## Section 4: Validation & Reporting\n", + "\n", + "Validate merge integrity, generate country coverage reports, and visualize results." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "02be0d02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Validating merge integrity...\n", + "======================================================================\n", + "βœ“ Bus count consistency: 122831 == 122831: PASS\n", + "βœ“ GeoJSON-NetCDF consistency: 122831 features == 122831 buses: PASS\n", + "βœ“ Technology dimension: 3 == 3: PASS\n", + "βœ“ Hour dimension: 8760 == 8760: PASS\n", + "βœ“ Duplicate bus_ids: 121517 unique == 122831 total: FAIL\n", + "\n", + "======================================================================\n" + ] + } + ], + "source": [ + "# 4.1 Validate merge integrity\n", + "\n", + "print(\"Validating merge integrity...\")\n", + "print(\"=\" * 70)\n", + "\n", + "validation_checks = {}\n", + "\n", + "# Check 1: Bus count consistency\n", + "expected_bus_count = sum(merge_metadata[\"regional_bus_counts\"].values())\n", + "actual_bus_count = len(ds_merged.coords[\"bus\"]) if ds_merged is not None else 0\n", + "check1 = expected_bus_count == actual_bus_count\n", + "validation_checks[\"Bus count match\"] = {\n", + " \"passed\": check1,\n", + " \"expected\": expected_bus_count,\n", + " \"actual\": actual_bus_count,\n", + "}\n", + "print(\n", + " f\"βœ“ Bus count consistency: {expected_bus_count} == {actual_bus_count}: {'PASS' if check1 else 'FAIL'}\"\n", + ")\n", + "\n", + "# Check 2: GeoJSON feature count vs NetCDF bus count\n", + "geojson_count = len(gdf_merged) if gdf_merged is not None else 0\n", + "check2 = geojson_count == actual_bus_count\n", + "validation_checks[\"GeoJSON-NetCDF count match\"] = {\n", + " \"passed\": check2,\n", + " \"geojson_features\": geojson_count,\n", + " \"netcdf_buses\": actual_bus_count,\n", + "}\n", + "print(\n", + " f\"βœ“ GeoJSON-NetCDF consistency: {geojson_count} features == {actual_bus_count} buses: {'PASS' if check2 else 'FAIL'}\"\n", + ")\n", + "\n", + "# Check 3: Dimension preservation\n", + "if ds_merged is not None:\n", + " check3 = (\n", + " \"technology\" in ds_merged.coords and len(ds_merged.coords[\"technology\"]) == 3\n", + " )\n", + " check4 = \"hour\" in ds_merged.coords and len(ds_merged.coords[\"hour\"]) == 8760\n", + " validation_checks[\"Technology dimension\"] = {\n", + " \"passed\": check3,\n", + " \"expected\": 3,\n", + " \"actual\": len(ds_merged.coords[\"technology\"])\n", + " if \"technology\" in ds_merged.coords\n", + " else 0,\n", + " }\n", + " validation_checks[\"Hour dimension\"] = {\n", + " \"passed\": check4,\n", + " \"expected\": 8760,\n", + " \"actual\": len(ds_merged.coords[\"hour\"]) if \"hour\" in ds_merged.coords else 0,\n", + " }\n", + " print(\n", + " f\"βœ“ Technology dimension: {3} == {len(ds_merged.coords['technology'])}: {'PASS' if check3 else 'FAIL'}\"\n", + " )\n", + " print(\n", + " f\"βœ“ Hour dimension: {8760} == {len(ds_merged.coords['hour'])}: {'PASS' if check4 else 'FAIL'}\"\n", + " )\n", + "\n", + "# Check 4: No duplicate bus_ids\n", + "if gdf_merged is not None:\n", + " n_unique = gdf_merged[\"bus_id\"].nunique()\n", + " n_total = len(gdf_merged)\n", + " check5 = n_unique == n_total\n", + " validation_checks[\"No duplicate bus_ids\"] = {\n", + " \"passed\": check5,\n", + " \"total_buses\": n_total,\n", + " \"unique_buses\": n_unique,\n", + " }\n", + " print(\n", + " f\"βœ“ Duplicate bus_ids: {n_unique} unique == {n_total} total: {'PASS' if check5 else 'FAIL'}\"\n", + " )\n", + "\n", + "print(f\"\\n{'=' * 70}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "6695d38e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Understanding merged data structure with global grid...\n", + "======================================================================\n", + "\n", + "πŸ“Š MERGED DATASET CONTENT:\n", + "\n", + "Variables in merged .nc:\n", + " βœ“ capacity_factor: (122831, 3, 8760) (float32)\n", + " βœ“ p_nom_max: (122831, 3) (float32)\n", + " βœ“ avg_cf: (122831, 3) (float32)\n", + " βœ“ weight: (122831,) (float32)\n", + " βœ“ data_quality_flag: (122831, 3) (float64)\n", + " βœ“ potential: (721, 1441, 3) (float32)\n", + "\n", + "Dimensions and Coordinates:\n", + " β€’ technology: 3 elements\n", + " β€’ hour: 8760 elements\n", + " β€’ bus: 122831 elements\n", + " β€’ y_grid: 721 elements (global grid, 0.25Β° resolution)\n", + " β€’ x_grid: 1441 elements (global grid, 0.25Β° resolution)\n", + "\n", + "βœ… KEY FEATURE: Global Potential Grid\n", + " β€’ All regional potential data placed on unified 0.25Β° global grid\n", + " β€’ Coverage: NaN where no data, actual values where available\n", + " β€’ Extent: -180Β° to 180Β° (lon), -90Β° to 90Β° (lat)\n", + " β€’ Coverage: 188043/1038961 cells (18.10%)\n", + "\n", + "======================================================================\n", + "\n", + "Generating country coverage report...\n", + "\n", + "Countries in merged data: 194\n", + "\n", + "Countries in pycountry but NOT in renewable profiles: 55\n", + "\n", + "Top 15 countries by bus count:\n", + "ISO3 Bus_Count Valid_Pycountry\n", + " USA 30853 True\n", + " CHN 15238 True\n", + " IND 8471 True\n", + " CAN 4488 True\n", + " BRA 4198 True\n", + " DEU 3141 True\n", + " FRA 2983 True\n", + " MEX 2525 True\n", + " JPN 2475 True\n", + " ITA 2452 True\n", + " ESP 2121 True\n", + " NOR 2050 True\n", + " TUR 2011 True\n", + " UKR 1856 True\n", + " AUS 1749 True\n", + "\n", + "Country Coverage Summary:\n", + " Total countries with data: 194\n", + " Total valid ISO3 codes: 194\n", + " Total invalid ISO3 codes: 0\n", + " Total missing countries: 55\n", + " Coverage: 77.9% of world\n" + ] + } + ], + "source": [ + "# 4.2 Understand merged structure with global grid\n", + "\n", + "print(\"Understanding merged data structure with global grid...\")\n", + "print(\"=\" * 70)\n", + "\n", + "print(\"\\nπŸ“Š MERGED DATASET CONTENT:\")\n", + "print(\"\\nVariables in merged .nc:\")\n", + "if ds_merged is not None:\n", + " for var in ds_merged.data_vars:\n", + " shape = ds_merged[var].shape\n", + " dtype = ds_merged[var].dtype\n", + " print(f\" βœ“ {var}: {shape} ({dtype})\")\n", + "\n", + "print(\"\\nDimensions and Coordinates:\")\n", + "if ds_merged is not None:\n", + " for coord in ds_merged.coords:\n", + " size = len(ds_merged.coords[coord])\n", + " if coord in [\"x_grid\", \"y_grid\"]:\n", + " print(f\" β€’ {coord}: {size} elements (global grid, 0.25Β° resolution)\")\n", + " else:\n", + " print(f\" β€’ {coord}: {size} elements\")\n", + "\n", + "print(\"\\nβœ… KEY FEATURE: Global Potential Grid\")\n", + "print(\" β€’ All regional potential data placed on unified 0.25Β° global grid\")\n", + "print(\" β€’ Coverage: NaN where no data, actual values where available\")\n", + "print(\" β€’ Extent: -180Β° to 180Β° (lon), -90Β° to 90Β° (lat)\")\n", + "if \"potential\" in ds_merged.data_vars:\n", + " potential_var = ds_merged[\"potential\"]\n", + " valid_cells = (~np.isnan(potential_var.values[:, :, 0])).sum()\n", + " total_cells = potential_var.shape[0] * potential_var.shape[1]\n", + " print(\n", + " f\" β€’ Coverage: {valid_cells}/{total_cells} cells ({(valid_cells / total_cells * 100):.2f}%)\"\n", + " )\n", + "\n", + "print(\"\\n\" + \"=\" * 70)\n", + "\n", + "# 4.2b Generate country coverage report\n", + "print(\"\\nGenerating country coverage report...\\n\")\n", + "\n", + "# Extract ISO3 codes from merged GeoJSON\n", + "if gdf_merged is not None:\n", + " iso3_merged = set(gdf_merged[\"country\"].dropna().unique())\n", + "\n", + " # Validate against pycountry\n", + " valid_iso3_codes_pycountry = {country.alpha_3 for country in pycountry.countries}\n", + "\n", + " iso3_valid_in_merged = iso3_merged & valid_iso3_codes_pycountry\n", + " iso3_invalid_in_merged = iso3_merged - valid_iso3_codes_pycountry\n", + " iso3_missing_from_merged = valid_iso3_codes_pycountry - iso3_merged\n", + "\n", + " print(f\"Countries in merged data: {len(iso3_valid_in_merged)}\")\n", + " if iso3_invalid_in_merged:\n", + " print(f\" Invalid ISO3 codes found: {sorted(iso3_invalid_in_merged)}\")\n", + "\n", + " print(\n", + " f\"\\nCountries in pycountry but NOT in renewable profiles: {len(iso3_missing_from_merged)}\"\n", + " )\n", + "\n", + " # Create detailed report\n", + " iso3_counts_merged = {}\n", + " for iso3 in iso3_valid_in_merged:\n", + " count = len(gdf_merged[gdf_merged[\"country\"] == iso3])\n", + " iso3_counts_merged[iso3] = count\n", + "\n", + " # Create report dataframe\n", + " report_df = pd.DataFrame(\n", + " {\n", + " \"ISO3\": sorted(iso3_counts_merged.keys()),\n", + " \"Bus_Count\": [\n", + " iso3_counts_merged[iso3] for iso3 in sorted(iso3_counts_merged.keys())\n", + " ],\n", + " }\n", + " )\n", + " report_df[\"Valid_Pycountry\"] = report_df[\"ISO3\"].isin(valid_iso3_codes_pycountry)\n", + " report_df = report_df.sort_values(\"Bus_Count\", ascending=False)\n", + "\n", + " print(\"\\nTop 15 countries by bus count:\")\n", + " print(report_df.head(15).to_string(index=False))\n", + "\n", + " print(\"\\nCountry Coverage Summary:\")\n", + " print(f\" Total countries with data: {len(iso3_counts_merged)}\")\n", + " print(f\" Total valid ISO3 codes: {len(iso3_valid_in_merged)}\")\n", + " print(f\" Total invalid ISO3 codes: {len(iso3_invalid_in_merged)}\")\n", + " print(f\" Total missing countries: {len(iso3_missing_from_merged)}\")\n", + " print(\n", + " f\" Coverage: {len(iso3_valid_in_merged) / len(valid_iso3_codes_pycountry) * 100:.1f}% of world\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "b2a8f22e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "======================================================================\n", + "MISSING COUNTRIES ANALYSIS\n", + "======================================================================\n", + "\n", + "πŸ“Š Analyzing 55 missing countries...\n", + "βœ“ Downloaded world data from Natural Earth\n", + " ⚠️ Error processing ABW: False\n", + " ⚠️ Error processing AIA: False\n", + " ⚠️ Error processing ALA: False\n", + " ⚠️ Error processing ASM: False\n", + " ⚠️ Error processing BES: False\n", + " ⚠️ Error processing BLM: False\n", + " ⚠️ Error processing BMU: False\n", + " ⚠️ Error processing BVT: False\n", + " ⚠️ Error processing CCK: False\n", + " ⚠️ Error processing COK: False\n", + " ⚠️ Error processing CUW: False\n", + " ⚠️ Error processing CXR: False\n", + " ⚠️ Error processing CYM: False\n", + " ⚠️ Error processing FRO: False\n", + " ⚠️ Error processing GGY: False\n", + " ⚠️ Error processing GIB: False\n", + " ⚠️ Error processing GLP: False\n", + " ⚠️ Error processing GUF: False\n", + " ⚠️ Error processing GUM: False\n", + " ⚠️ Error processing HKG: False\n", + " ⚠️ Error processing HMD: False\n", + " ⚠️ Error processing IMN: False\n", + " ⚠️ Error processing IOT: False\n", + " ⚠️ Error processing JEY: False\n", + " ⚠️ Error processing MAC: False\n", + " ⚠️ Error processing MAF: False\n", + " ⚠️ Error processing MNP: False\n", + " ⚠️ Error processing MSR: False\n", + " ⚠️ Error processing MTQ: False\n", + " ⚠️ Error processing MYT: False\n", + " ⚠️ Error processing NFK: False\n", + " ⚠️ Error processing NIU: False\n", + " ⚠️ Error processing PCN: False\n", + " ⚠️ Error processing PYF: False\n", + " ⚠️ Error processing REU: False\n", + " ⚠️ Error processing SGS: False\n", + " ⚠️ Error processing SHN: False\n", + " ⚠️ Error processing SJM: False\n", + " ⚠️ Error processing SPM: False\n", + " ⚠️ Error processing SXM: False\n", + " ⚠️ Error processing TCA: False\n", + " ⚠️ Error processing TKL: False\n", + " ⚠️ Error processing UMI: False\n", + " ⚠️ Error processing VAT: False\n", + " ⚠️ Error processing VGB: False\n", + " ⚠️ Error processing VIR: False\n", + " ⚠️ Error processing WLF: False\n", + "\n", + "πŸ“Š TOP MISSING COUNTRIES (ranked by relevance: population + area):\n", + "ISO3 Country Population Area_km2 Relevance_Score\n", + " RUS Russian Federation 144373535.0 2935.205205 0.743430\n", + " ATA Antarctica 4490.0 6028.836194 0.500016\n", + " GRL Greenland 56225.0 677.509565 0.056384\n", + " PRI Puerto Rico 3193694.0 0.788009 0.011126\n", + " ESH Western Sahara 603253.0 8.603984 0.002803\n", + " NCL New Caledonia 287800.0 2.020406 0.001164\n", + " FLK Falkland Islands (Malvinas) 3398.0 2.128750 0.000188\n", + " ATF French Southern Territories 140.0 1.432928 0.000119\n", + "\n", + "πŸ“ˆ MISSING COUNTRIES SUMMARY:\n", + " Total missing countries: 8\n", + " Countries in world data: 8\n", + " Countries not in world data (territories/special): 0\n", + "\n", + " Population in missing countries: 148,522,535\n", + " Land area in missing countries: 9,657 degreesΒ²\n" + ] + } + ], + "source": [ + "# 4.2c Analyze missing countries by area and population\n", + "\n", + "print(\"\\n\" + \"=\" * 70)\n", + "print(\"MISSING COUNTRIES ANALYSIS\")\n", + "print(\"=\" * 70)\n", + "\n", + "# Recompute missing countries (in case this cell is run independently)\n", + "if \"iso3_missing_from_merged\" not in locals():\n", + " valid_iso3_codes_pycountry = {country.alpha_3 for country in pycountry.countries}\n", + " if gdf_merged is not None:\n", + " iso3_in_data = set(gdf_merged[\"country\"].dropna().unique())\n", + " iso3_missing_from_merged = valid_iso3_codes_pycountry - iso3_in_data\n", + " else:\n", + " iso3_missing_from_merged = set()\n", + "\n", + "if len(iso3_missing_from_merged) == 0:\n", + " print(\"\\nβœ… No missing countries - all countries have renewable profile data!\")\n", + "else:\n", + " print(f\"\\nπŸ“Š Analyzing {len(iso3_missing_from_merged)} missing countries...\")\n", + "\n", + " # Try to download Natural Earth data directly\n", + " try:\n", + " url = \"https://naciscdn.org/naturalearth/110m/cultural/ne_110m_admin_0_countries.zip\"\n", + " world = gpd.read_file(url)\n", + " print(\"βœ“ Downloaded world data from Natural Earth\")\n", + " has_world_data = True\n", + " except Exception as e1:\n", + " print(f\" ⚠️ Could not download Natural Earth data: {e1}\")\n", + " # Fallback: create empty dataframe\n", + " has_world_data = False\n", + " world = None\n", + "\n", + " if has_world_data and world is not None:\n", + " # Create analysis dataframe\n", + " missing_analysis = []\n", + "\n", + " for iso3 in sorted(iso3_missing_from_merged):\n", + " try:\n", + " # Get country from pycountry\n", + " country = pycountry.countries.get(alpha_3=iso3)\n", + " country_name = country.name if country else iso3\n", + "\n", + " # Find in world data using ISO3 code\n", + " world_match = world[world[\"ISO_A3\"] == iso3]\n", + "\n", + " if len(world_match) == 0:\n", + " # Try alternative column names\n", + " world_match = world[world.get(\"iso_a3\", \"\") == iso3]\n", + "\n", + " if len(world_match) > 0:\n", + " row = world_match.iloc[0]\n", + "\n", + " # Extract population\n", + " population = 0\n", + " for pop_col in [\"POP_EST\", \"POPULATION\", \"pop_est\", \"population\"]:\n", + " if pop_col in row and pd.notna(row[pop_col]):\n", + " population = float(row[pop_col])\n", + " break\n", + "\n", + " # Calculate area from geometry\n", + " area_km2 = 0\n", + " try:\n", + " if row.geometry:\n", + " # Convert area from degrees squared to km2 (rough estimate at equator)\n", + " area_km2 = float(row.geometry.area)\n", + " except:\n", + " pass\n", + "\n", + " missing_analysis.append(\n", + " {\n", + " \"ISO3\": iso3,\n", + " \"Country\": country_name,\n", + " \"Population\": population,\n", + " \"Area_km2\": area_km2,\n", + " \"In_World_Data\": True,\n", + " }\n", + " )\n", + " else:\n", + " # Not in world data\n", + " missing_analysis.append(\n", + " {\n", + " \"ISO3\": iso3,\n", + " \"Country\": country_name,\n", + " \"Population\": 0,\n", + " \"Area_km2\": 0,\n", + " \"In_World_Data\": False,\n", + " }\n", + " )\n", + " except Exception as e:\n", + " print(f\" ⚠️ Error processing {iso3}: {e}\")\n", + "\n", + " # Create dataframe and rank\n", + " missing_df = pd.DataFrame(missing_analysis)\n", + "\n", + " # Calculate relevance score (normalized population + normalized area)\n", + " pop_max = missing_df[\"Population\"].max()\n", + " area_max = missing_df[\"Area_km2\"].max()\n", + "\n", + " if pop_max > 0:\n", + " missing_df[\"Pop_Normalized\"] = missing_df[\"Population\"] / pop_max\n", + " else:\n", + " missing_df[\"Pop_Normalized\"] = 0\n", + "\n", + " if area_max > 0:\n", + " missing_df[\"Area_Normalized\"] = missing_df[\"Area_km2\"] / area_max\n", + " else:\n", + " missing_df[\"Area_Normalized\"] = 0\n", + "\n", + " missing_df[\"Relevance_Score\"] = (\n", + " missing_df[\"Pop_Normalized\"] + missing_df[\"Area_Normalized\"]\n", + " ) / 2\n", + " missing_df = missing_df.sort_values(\"Relevance_Score\", ascending=False)\n", + "\n", + " print(\"\\nπŸ“Š TOP MISSING COUNTRIES (ranked by relevance: population + area):\")\n", + " display_cols = [\"ISO3\", \"Country\", \"Population\", \"Area_km2\", \"Relevance_Score\"]\n", + " print(missing_df[display_cols].head(30).to_string(index=False))\n", + "\n", + " print(\"\\nπŸ“ˆ MISSING COUNTRIES SUMMARY:\")\n", + " in_world = missing_df[missing_df[\"In_World_Data\"]].shape[0]\n", + " not_in_world = missing_df[~missing_df[\"In_World_Data\"]].shape[0]\n", + " print(f\" Total missing countries: {len(missing_df)}\")\n", + " print(f\" Countries in world data: {in_world}\")\n", + " print(f\" Countries not in world data (territories/special): {not_in_world}\")\n", + "\n", + " if in_world > 0:\n", + " total_missing_pop = missing_df[missing_df[\"In_World_Data\"]][\n", + " \"Population\"\n", + " ].sum()\n", + " total_missing_area = missing_df[missing_df[\"In_World_Data\"]][\n", + " \"Area_km2\"\n", + " ].sum()\n", + " print(f\"\\n Population in missing countries: {total_missing_pop:,.0f}\")\n", + " print(\n", + " f\" Land area in missing countries: {total_missing_area:,.0f} degreesΒ²\"\n", + " )\n", + "\n", + " if not_in_world > 0:\n", + " not_found = missing_df[~missing_df[\"In_World_Data\"]][\"Country\"].tolist()\n", + " print(\n", + " \"\\n ⚠️ Not found in Natural Earth data (may be territories/special regions):\"\n", + " )\n", + " for country in sorted(not_found):\n", + " print(f\" - {country}\")\n", + " else:\n", + " print(\"\\n Using pycountry data (no population/area available)\")\n", + " print(\n", + " f\" Missing countries: {', '.join(sorted(list(iso3_missing_from_merged)[:20]))}\"\n", + " )\n", + " if len(iso3_missing_from_merged) > 20:\n", + " print(f\" ... and {len(iso3_missing_from_merged) - 20} more\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "95d6ce9c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Spot-checking sample records from merged data...\n", + "======================================================================\n", + "\n", + "Sample 1: Country USA\n", + " Bus ID: USA_ON_9tsm40\n", + " Onshore/Offshore: onshore\n", + " Area (kmΒ²): 293.78088\n", + " Capacity Factor - Min: 0.0000, Mean: 0.1783, Max: 1.0000\n", + " βœ“ Capacity factors in valid range [0,1]: True\n", + " βœ“ Geometry valid: True\n", + "\n", + "Sample 2: Country CHN\n", + " Bus ID: CHN_ON_wwgw3k\n", + " Onshore/Offshore: onshore\n", + " Area (kmΒ²): 214.79025\n", + " Capacity Factor - Min: 0.0000, Mean: 0.2686, Max: 1.0000\n", + " βœ“ Capacity factors in valid range [0,1]: True\n", + " βœ“ Geometry valid: True\n", + "\n", + "Sample 3: Country IND\n", + " Bus ID: IND_ON_tdr1vb\n", + " Onshore/Offshore: onshore\n", + " Area (kmΒ²): 442.59442\n", + " Capacity Factor - Min: 0.0000, Mean: 0.1180, Max: 0.9840\n", + " βœ“ Capacity factors in valid range [0,1]: True\n", + " βœ“ Geometry valid: True\n", + "\n", + "======================================================================\n" + ] + } + ], + "source": [ + "# 4.3 Spot-check sample records\n", + "\n", + "print(\"\\nSpot-checking sample records from merged data...\")\n", + "print(\"=\" * 70)\n", + "\n", + "if ds_merged is not None and gdf_merged is not None:\n", + " # Sample 3 random buses from different countries\n", + " sample_countries = (\n", + " report_df[\"ISO3\"].head(5).tolist() if \"report_df\" in locals() else []\n", + " )\n", + "\n", + " for i, country in enumerate(sample_countries[:3]):\n", + " print(f\"\\nSample {i + 1}: Country {country}\")\n", + "\n", + " # Find a bus from this country\n", + " buses_in_country = gdf_merged[gdf_merged[\"country\"] == country][\"bus_id\"].values\n", + " if len(buses_in_country) > 0:\n", + " sample_bus = buses_in_country[0]\n", + " print(f\" Bus ID: {sample_bus}\")\n", + "\n", + " # Get GeoJSON properties\n", + " bus_geojson = gdf_merged[gdf_merged[\"bus_id\"] == sample_bus].iloc[0]\n", + " print(f\" Onshore/Offshore: {bus_geojson.get('onshore_offshore', 'N/A')}\")\n", + " print(f\" Area (kmΒ²): {bus_geojson.get('area_km2', 'N/A')}\")\n", + "\n", + " # Get NetCDF data\n", + " if sample_bus in ds_merged.coords[\"bus\"].values:\n", + " bus_data = ds_merged.sel(bus=sample_bus)\n", + "\n", + " # Check capacity factors\n", + " cf_mean = float(bus_data[\"capacity_factor\"].mean())\n", + " cf_min = float(bus_data[\"capacity_factor\"].min())\n", + " cf_max = float(bus_data[\"capacity_factor\"].max())\n", + "\n", + " print(\n", + " f\" Capacity Factor - Min: {cf_min:.4f}, Mean: {cf_mean:.4f}, Max: {cf_max:.4f}\"\n", + " )\n", + " print(\n", + " f\" βœ“ Capacity factors in valid range [0,1]: {0 <= cf_min and cf_max <= 1}\"\n", + " )\n", + "\n", + " # Check if geometry is valid\n", + " try:\n", + " geom = bus_geojson.geometry\n", + " print(f\" βœ“ Geometry valid: {geom.is_valid}\")\n", + " except:\n", + " print(\" βœ— Geometry invalid\")\n", + "\n", + "print(f\"\\n{'=' * 70}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "4954944b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "βœ“ Saved summary plot to resources/renewable_profiles_merge_summary.png\n" + ] + }, + { + "data": { + "image/png": "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PTIy0kpcl5eenm7dVszpdOrYY4+1tjvvvFPvvfeerrrqKj300ENq166dvvnmG23btk2XXnppmfOYBPrcuXOtCvWqBAUFWRsAAAAAAAAAwDt5bCV6ly5dtGTJkgr7Fy9erM6dOx+0Ot3IysqyfppFRIcNG6bExMQym1lY1NwGAAAAAAAAAPBdHptEHzlypLUg6C233KLly5dr7dq1+s9//mMlvu+9917rmIsuukgvvPCCFi5cqM2bN2vevHnW8Z06dbKS8KZf+uzZszV8+HD16NGjzGb2ff7554dclBQAAAAAAADebf78+TriiCMUEBCgoUOHVrmvKklJSXI4HFbhJgDP47FJ9LZt2+qXX36xEukDBw602rVMnTrV2i6++GLrmEGDBllJctMH3STOTWLcJM9NmxZ/f3+98847CgsL0+mnn17h/P3791dERITeffddG54dAAAAAAAA3MVdd92l3r17a9OmTVbuqap9ALyTx/ZEN44++mjNmTOnyttvuOEGa6vK3XffbW2VMUn2PXv21EmcAAAAAAAA8FymiPOmm25Sq1atDrqvoeXl5SkwMNC2xwd8hcdWogMAAAAAAAB1ITc3V7fffrtiY2MVHBysk08+2Vp3r7gNiym0vPbaa63fTdV5ZfvS0tKsNfaaNm2qkJAQdezYUVOmTCnzOBs3brS6H4SGhqpXr176/fffy9z+ySefqHv37goKCrK6MDz//PNlbjf7nnzySY0YMUJRUVElxaO//fab+vbtaz1ufHy89VyK1wMEUHsk0QEAAAAAAODT7rvvPiuB/fbbb2vp0qVKSEiw2gSbVr8pKSmKjIzUiy++aP1u2giX33fppZfqkUce0apVq/T1119r9erVeu2119SkSZMyj/PQQw/pnnvusXqjm9bDl112mQoKCqzb/vjjD11yySUaNmyY/vzzTz322GPWOcu3innuuees9fzM8eZ2c6yJ9YILLtCKFSs0Y8YM/frrr7r11lsbdAwBb+ZwuVwuu4PwFpmZmdangOaTx+joaLvDgaSioiKlpqZanyQ7nXxm5C64Lu6Ha+KeuC7uievifrzhmhTPIzMyMqw35AAAoOGYiu2YmBgrWX355Zdb+/Lz862q71GjRunee++18jwmYW4qwIuV33fuuedaSfPJkydXeAxT0d6uXTu99dZbuu6666x9JuFuqs5Nwt2s4Weq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c5MALy86Orrk90mTJumyyy5TQECA9dP8XZnHHnvMqmb/+OOPqx1Hbm6uMjMzy2wAAAAAALiL/KICjd70nt7c8Z3doQCoQ34OqWnXxdrhTK7ymJyiPN2z8W29lcK/f8Ank+jr16+Xy+VSly5dDnqcSWp/8sknuvLKK62/zU+TJK8s2d2iRQvdcccdeuihh1RQUFCtOMaNG6eoqKiSzfRkBwAAAADAHWQWHNCN617XV3uX2h0KgDrWo8t2rfZfdMjjXHLple1f6dnkT7kGgK8l0U0C3TDtXA7m/ffftxYd7dWrl/V37969rb+nT59e6fH333+/du3aVWXv9PJGjx6tjIyMki05uepP/wAAAAAAaChbc/fo6jUv64/9Gxl0wMv0bJOrxWGzanSfaam/6MnNH5fk1AD4QBK9Y8eOVgJ99erVBz3OJMNXrlxpLRxavJm/q2rpYtrAmMT42LFjdeDAgUPGERQUpMjIyDIbAAAAAAB2Wp+9Q1f//bI25aRyIQAv076JQyuavHtY9/1o928as3mGilysjQD4RBK9UaNGGjRokP7zn/9Yi4WWl56ebvU3X7JkiebNm6fExMSSzSwsunjxYv3111+Vnvu2226T0+nUSy+91ADPBAAAAACAuk2gX792ovYU7GNYAS/TKMSpXW0+Vp4j77DP8dmeRXoo6X0VuArrNDbA2/nLQ02cOFEnnniijjvuOD3++OPq2bOn1cv822+/1WuvvWYl2c1tffv2rXDfE044wapGf+GFFyrcFhwcbFWim0VLAQAAAADwFBuyd+iGtROVVrDf7lAA1LFAPym8y89a79hZ63OZdRLyigo0vv1VCnD41Ul8gLfzyEp0o127dlq6dKn69++vu+++Wz169NAZZ5yh77//3qoif++993ThhRdWel+z39yel1f5J3fDhw+3eqcDAAAAAOAJNmbv1A1rX9NeEuiAV+rUdaPW+62os/N9l75Cd22YYiXTARyaw8WKAnUmMzNTUVFRajNqhhQUVncnRqWSxg855MgUFRUpNTVVsbGxVpseuAeui/vhmrgnrot74rq4H2+4JsXzSLNYPevsADicBDotXFCV5kVttGfpod8/w331br9fixq9Uy/nPjGys17ocI2CnYH1cn7AW3jmuwwAAAAAAKBNOaYCnR7ogLfq3MylP2Km1dv5f8tco1vXv6UDhbn19hiA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vPXWWzdgjwEA4AflXLzRjtEdpGjRop7eDAAAAAAAnAwfPlw++eQTWbBggVSuXFkmTZokHTt2lF9//dXeZtSoUTJlyhQpVaqUPPXUU/L444/Lv//9b/PYI488Ig0bNpRZs2ZJUFCQ7NixQ0JCQuzPvXLlirz22muycOFCCQwMlEcffVSGDRsmixcvNo+//vrrZtmzZ882y3nvvfekW7dusmfPHqle/f8H1xwxYoRpp4FzDbbrOGejR4+WmTNnmuf9+OOP0q9fPylYsOB1lXgFACAnCKIDAAAAAHATuHz5sgl+63hgnTt3NvM0OL169WqZO3euNGnSxMwbN26ctGrVytx+/vnnpUuXLpKUlGQywI8ePSp//etfTSa4cgx8W6VX3n77balataq5/8wzz5jMc4sG2DVA/tBDD5n7EydOlG+//VamT58ub775pr2dDlDao0cP+/2///3vJqhuzatSpYrs3bvXBOMJogMA8hvlXAAAAAAAuAn89ttvJsjdsmVL+zzNIm/atKns27fPPq9+/fr221FRUebvqVOnzN+hQ4fKE088Ie3atZNXX33VLNORloCxAujW863nXrhwQf7zn/84rV/pfcf1Ky0nYzl9+rQcO3ZM+vbta0rEWNMrr7ySaf0AAOQHgugAAAAAANwEbDab+as1x13nO85zLM9izdda5mrMmDGm9Ipmp3/zzTdSp04dWbZsWZbPtZ5vrdd1me7Wr7RMi8Vat2bNa/kYa9q9e7ds2rTpmvcDAADXinIu+eD2satEwv7/H/z8cvjVLvm+DgAAAACAf6hWrZqEhobK+vXrJTY21szTzHQdGFTLp+RUjRo1zPTcc8/Jww8/bOqW//nPf77q83Qg0nLlypn133333fb5GzZsMNnw7pQpU0bKly8vBw8eNDXZAQC40QiiAwAAAABwE9Ds7qefftrUNC9evLhUqlTJDCyqg4FqqZSffvop2+cnJiaa595///2mJvnx48dl69atct999+V4G/T5OkColny5/fbbTQBes8qtgUfd0Qz4wYMHm0C81nNPTk42wf+EhARTYgYAgPxEEB0AAAAAgJuE1jHX8ii9evWSixcvmtrjX3/9tRQrVuyqzw0KCpIzZ87IY489JidPnpSSJUuagT7Hjh2b4/VrIFxro8fFxZla6VoO5osvvsg0QKkrrcOu9dYnT54sw4cPNz8I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Ncw6SpYsad43Ouq9Iz0mt912W6Zt1uNztX0LAAC8pz8ZGhpqK126tPm3ffz48bZTp05les7x48dNf6JYsWKmb9GpUyfb7t27M/XN1PTp001fJSgoyKnPuXfvXlv79u3N83U52s/RPou20T5JTpw4ccL0JbUPUqBAAVtYWJitWrVqtv79+9t27drl1Pazzz6zNWvWzBYeHm76uG3btrX9+9//znK5q1atsu+PAwcOZNnmp59+svXs2dPsK+0jlS1b1tamTRvb22+/fdW+qdL+bt++fc3zddvvuusu2/fff2/2u06OdN+2a9fObLv29/R5CxYsMMvW7XDth3fp0sW00+0qX768uf/RRx9ddX+++OKL5lg4nkPodr7yyivmtemy9P2h+0/PN3S+az/31Vdftd1yyy3mWNSuXds2Z86cLPuYVt86J31hqy/v+BqsvufatWttjRs3NuvTc4kXXnjBlpqammldru+pnPajs5LT/rH1unVdOeF6Xuc4ZfUevfPOO+3viccee8ycx7lKSUkx21GpUiVz7HSb33jjjSzXr+cY3bt3N+du+p7Uz8j27dtztO362df32ccff2yOi65L3wd6TupKP1N6HqbrKVWqlG3QoEG25cuXO52v/fzzz7aHH37YnHfp+Z+euzZt2tQ2f/78TMt77733zGdb35faVp+j+0PPc691WX/6059sXbt2zdFrBrxVgP7P04F8AABySjNCNNt/0KBBJvvJ22j9TS3To5k77jJtAAAA4J00A/eDDz4wV6FmV6blWmhNb71S4P333zdXj3ozzYDXOtp6BQWQF7SUkV6JrVfsumaoA76Eci4AAJ9w/PhxcwmmXo6rl3g+++yznt4k+2CkermwjkCv5XneeOMNU+KFADoAAIB30/IaWipDS1FofXItT6Hl/TQhIq8C6ErXoeVjdMBNLRWSXdk/wN9oiRutaU8AHb6OIDoAwCdY9cq1PujixYtNjUxP0xqEWhdd6zVqDVCtEam16PXECwAAAN4tJCTEJGhosobWkdZsWR28Pj+SNbR/qH1HHaxRa3wDNwP9XOk4DSNHjvT0pgDXjXIuAAAAAAAAAAC4wTVEAAAAAAAAAAC4QRAdAAAAAAAAAAA3CKIDAAAAAAAAAOAGA4vmoYyMDPnPf/4jhQsXloCAgLxcNAAAAPyYzWaTixcvSrly5SQwkDyXa0U/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iGReKuciIiIiIiIiIiIiIpIOBdFFRERERERERERERNKhILqIiIiIiIiIiIiISDoURBcRERERERERERERSYeC6CIiIiIiIiIiIiIi6VAQXUREREREREQkQFmyZHFFihRxObJm5auMfjoiIpmWgugiIiIiIiIiIgHKli2bmzRpkqt+VhmX9YjDM/rpiIhkWgqii4iIiIiIiIiIiIikQ0F0EREREREREREREZF0KIguIiIiIiIiIhKgP/74w9WrV89NX/CF27bzr4x+OiIimZYKYomIiIiIiIiIBCiKIvftt9/6rzL42YiIZF7KRBcRERERERERERERSYeC6CIiIiIiIiIiIiIi6VAQXUREREREREREREQkHaqJLpIEhjZ/14Wo9asXZfRTEBERERERERGRwCkTXUREREREREREREQkHQqii4iIiIiIiIgEKEuWLK5gwYIu61FH8lVGPx0RkUxLQXQRERERERERkQBly5bNTZ061Z13djmX9QhV9BUR+bc0g0qQVANcRERERERERERE/gvKRBcRERERERERERERSYeC6CIiIiIiIiIiAdq2bZu7/PLL3cwvvnTb//oro5+OiEimpXIuIiIiIiIiIiIB+ueff9yiRYvs8yiKMvrpiIhkWspEFxERERERERERERFJh4LoIiIiIiIiIiIiIiLpUBBdRERERERERERERCQdCqKLiIiIiIiIiIiIiKRDQXQRERERERERERERkXQoiC4iIiIiIiIiEqg8efK4Iw4/PKOfhohIpqYguoiIiIiIiIhIgLJnz+7mzp3r6lQs77IecURGPx0RkUxLQXQRERERERERERERkXQoiC4iIiIiIiIiIiIikg4F0UVEREREREREArRt2zbXvHlz9+niJW77X39l9NMREcm01FlCRERERERERCRA//zzj5szZ459HkVRRj8dEZFMS5noIiIiIiIiIiIiIiLpUBBdRERERERERERERCQdCqKLiIiIiIiIiIiIiKRDQXQRERERERERERERkXQoiC4iIiIiIiIiIiIikg4F0UVEREREREREApU1a1Z32P8U/hER2R+aRUVEREREREREApQ9e3a3aNEid2Glii7rEUdk9NMREcm0FEQXEREREREREREREUmHgugiIiIiIiIiIiIiIulQEF1EREREREREJEDbt293rVu3dp8t/drt+OuvjH46IiKZ1uEZ/QREREREREREROS/9/fff7uPP/7YPv8nijTEIiL/kjLRRURERERERERERETSoSB6Ks8884w79dRT3dFHH+3Kly/vpk+fnt7YiYiIiIjIf0Tn4SIiIiJyqFIQPWbkyJHu9ttvd/fee6+bP3++q169urvooovcihUrMu4dEhEREREJnM7DRURERORQpiB6TL9+/VyrVq2s6UaJEiVc//793UknneQGDRqUce+QiIiIiEjgdB4uIiIiIocyBdH/z59//uk+//xzd+GFF6YYIL6eOXNmRrw3IiIiIiLB03m4iIiIiBzqDs/oJ3CoWLdunXWtLlCgQIrH+Xr16tVp/s6OHTvsw9u0aZP9/7fffnP//POPO5i2/bXVhYix/Dc0HhoPbR/aXzR/aD7V8UXH24N9/rE/fv/9d/t/FEUu2WT283D+zY0bNx7Uf1NEZG9t27Yt8fmydb+5v/6Dw8wvv29x23b86RYvXpw4fomI/Bfy5MnjcufO7Q7F83AF0VPJkiVLiq8ZwNSPeQ8//LB74IEHdnm8cOHC+/p+STrav6Gh0XikT9uHxmN3tH1oPLR97D3tL4fOeGzevNkdc8wxLhnpPFxE5MC6YdSY//Tvfdyw4X/690REMtKezsMVRP8/+fLlc4cddtgu2S5r167dJSvG69q1q+vYsWPia7JeNmzY4I499th0A++ZHasz1In/6aefXK5cuVyy03hoPLR9aH/R/KH5VMcXHW//CyRucOJ+4oknumSj8/DMQee9YdP7Gza9v2HT+xsuvbeH1nm4guj/58gjj3Tly5d3kydPdpdffnligPi6YTqrq0cddZR9xB3sWw4yCgF0BdE1Hto+tL9o/tB8quOLjrc6//jvJGsGus7DMxddB4RN72/Y9P6GTe9vuPTeHhrn4Qqix5BVfu2117oKFSq4KlWquMGDB7sVK1a4Nm3aHMj3SUREREQkqek8XEREREQOZQqix1x11VVu/fr1rmfPnu6XX35xpUqVchMnTlSNcxERERGRA0jn4SIiIiJyKFMQPZW2bdvah6SN8jXdu3ffpYxNstJ4aDy0fWh/0fyh+VTHFx1v5b+h8/BDm857w6b3N2x6f8Om9zdcem8PLVkiqqeLiIiIiIiIiIiIiMgu/rfrQyIiIiIiIiIiIiIioiC6iIiIiIiIiIiIiMhuKBNdRERERERERERERCQdCqKLiIiIiIiIiIiIiKRDQXQRERERERHZxcaNG921117rjjnmGPvg899++22vR+rmm292WbJkcf3799foBvD+7ty50919992udOnSLnv27O7EE090LVq0cD///PNBfd6Stmeeecadeuqp7uijj3bly5d306dP3+1QTZ061X6Onz/ttNPcs88+q6EN4L0dPXq0u+CCC1z+/Pldrly5XJUqVdx77713UJ+vHNh91/vkk0/c4Ycf7s466ywN+UGiILqIiIiIiIjsonnz5m7BggVu0qRJ9sHnBFr3xpgxY9ynn35qgVYJ4/39448/3Lx589x9991n/ydY980337hLL730oD5v2dXIkSPd7bff7u699143f/58V716dXfRRRe5FStWpDlcP/zwg6tfv779HD9/zz33uPbt27u33npLw5vJ39tp06ZZEH3ixInu888/d7Vq1XKXXHKJ/a5k/vfX27Rpky1i1q5d+6A9V3EuSxRFkQZCUvvnn3/c//6nNZZkx/RA9pBoPPaF5g/R/LH7+VRzq4hkBkuXLnVnnnmmmz17tqtUqZI9xudkNX711VeuePHi6f7uqlWr7HfIfmzQoIEFCPiQMN7fuLlz57pzzjnHLV++3J188skH+FlLengPzz77bDdo0KDEYyVKlHCXXXaZe/jhh3f5ee4oGDdunG0HXps2bdzChQvdrFmzNNCZ+L1NS8mSJd1VV13l7r///gP4TOVgvr9NmzZ1RYsWdYcddpgtWrMIKgeeoqRJzq+hsMO9/fbbbvjw4e6vv/5K2gC6Hw8yKxiPF1980TIuknGtiUCoD/hs2bLFxuDvv/9OfC+Zx2PHjh1u69atGf2UDhlz5sxx7777rl14sa0wfyTrNrI3jyXj/hKX7PMp/vzzT5fMknW/EMlsCKRR4sMHWFG5cmV7bObMmbvdx8lm7tSpkwVuJKz3N61sSI5xuXPnPkDPVPaE8woyji+88MIUj/N1eu8l73/qn69bt6777LPPrGyPZN73Nq05efPmzS5v3rwH6FnKwX5/iVN99913rnv37hr8g+zwg/0PyqHDZ8IRLObWLU58OGD26tXLjR071p1xxhkuWceD+o3UhVu2bJlNUF27drVboqg3lWyZxP369XMff/yxW79+vU3mrVu3dgULFkyqbOP4a3300Uet9tiiRYtcu3btbLsoVaqUS1ZdunSxLJZt27bZPkMQnVsHjz32WJdM4tvITz/9ZONRrFixpNlH0huLAQMGuBkzZth4nH/++e7GG2902bJlS9r546mnnrIT4pUrV9rtlwSZsmbN6pJJfDzImvn1118T2TQ5c+bM4GcnInGrV692xx133C6DwmN8Lz19+vSxc2auLyS89zdu+/btdi5IWRhqL0vGWLdunSU7FShQIMXjfJ3ee8njaf08CXX8vRNOOOGAPmc5cO9tan379rUEsCZNmmjYA3h/iVEx71I3PVniU4eS5LiClTQRMJ4yZYpr1aqV69GjhwUFqcfETnnFFVdYNnYy8FmRfjwIoD/yyCOWVUsdRwJALCy88847iUzs0PkAB4sH3EJE8JxaW4wBQTBu10yGbGP/+vx4UKfs8ccft7pyBNCffvppGx+2lWTE63/++eftg7qK1apVs1t6yUxPpqzjeFCQuZQadtSyq1Chgu0z3M2STPxYcHL3wAMP2CJToUKF3EsvvWS3CSfL3Qp+24/PpxxbuNWd2rGMRe/evZOqGRtjEt8+GIPXXnvNbikniP7RRx9l9FMUSQocqzjv3d0H2ahIq6zf7kpSkVH35JNPumHDhqkkYIDvbxzJV8zdHM9piicZL/X7tqf3Mq2fT+txyXzvrcd5FnMCcZ60Fs0kc72/xKNYtOQai4QtOfi0bJHEWI388MMP3R133GGBdLInGzZs6Fq2bOm+//5717hxY/fmm2+6cuXKuRA99thjrmbNmlbDz5ccYDWP188Ht8dwSxvZgtSK45ZUJjIasCTDit8bb7xhWYKU6SAYyP/JwqZr9HXXXWelf0466aSgM0rjr4u7M0aNGuUmTJhg2wwLLHfeeaf9DFk4BMgYp2TB+04ZKBYWqJ05fvx4u2th8ODBFkQmcMzY0GE8dH474WSG10+2MXco1KlTx5o0UQOWGoRkYCeLV155xe7q8fMH+w+LLb///rvNHy+//LLLnj17sPMHx5OjjjoqxXzK/MGcyvzha40SRCcDhQZtoTfei18M9O/f37YRFpnKly9vn5OVz7jxc2qQJHJg3XbbbRb83J1TTjnFffHFF27NmjW7fI87SFJnzXmcS69duzZFbWwu+jlnYt//8ccf/4NXIBn1/sYD6GS1kkTBAqiy0DNWvnz5rC5y6sxV9sX03svjjz8+zZ/nOjfZ7igN7b31CJwT5+E8lOsSyfzvL2V5WASlASlzPbie4vyZfff999+3u3/lAKKxqCSPf/75J8XXkyZNiubPnx/99ttvUaVKlaKbbrrJHp86dWqUJUuW6Pjjj48WLFgQheabb76JmjdvHn311VeJx/76669o5syZ0dKlS6Pff/89qlq1atSqVavEz2fNmjU666yzovHjx0fJsG1MmDAhuv322+3zcePGRccee2z0zDPPRK+88kqUN2/eqG7dutG3334bhahRo0ZR+/btU4zNtGnToscff9y+ZhvInTt39NJLL0XvvPNOdNRRR0VNmjSJpkyZEiWT+vXrRy+++KJtKzly5IgGDRqU2JcGDx4cDR8+PPr777+jZDB37tyoYsWKNqfiww8/jHLmzGlzxgknnBANGzYs2rJlSxSq1PPHyy+/HN155532+dixY23OeOqpp+zjmGOOia6++upo06ZNUYhuvPHG6NFHH02My59//hmNHDnS5k+wvzAGr732WjRmzJjosMMOi7p06RItX748ChHnFT/88EPi6w0bNkQdOnSIhg4dal+/+eabNp8+9NBDUdGiRaNzzjknev/99zPwGYuIt2TJEtJSo08//TTx2OzZs+2x+Dl03Lp166JFixal+DjxxBOju+++O93fkczz/oLj2mWXXRaVLFkyWrt27UF6trInHD9vueWWFI+VKFHCzjHS0rlzZ/t+XJs2baLKlStrsDP5e4tXX301Ovroo6O33377IDxDOVjvL9fWqY+x/G7x4sXt85CvNw8VCqInER/kmDFjhl20xhE0JwDEyRQIJhNIvPLKK6Ovv/46Q57vgcbCgR+PTz75JHFSCIKhBL8WL16c+BmCxhdddFGKYEAo4oHOn3/+OfH5mjVros2bN0fVqlWLevfubY9t3bo1KlWqVFSgQIFdJvsQsA0QAN2xY0eKx9evX28XCmw3NWvWjPr06ZP43plnnhkdd9xxUY8ePaJksXPnzqhly5a2LRAA8wFCrF692vaXJ598MgpV6sUB5oUXXnjBHmf+YHvwQcKyZctGZcqUiZ5++unojz/+iEIei19//TXx+apVqyxgyrHlkUceSWwbp556apQnT56oU6dOUWiYN1hM8scS9hOsXLnSguTMqYzHY489Zo//9NNPtljNorUPvIeEcwmOE348sH37djvnYFvhZJ/Aef/+/e17XOgdccQRdjERD+qISMapV6+eHcNm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93755ZfokUceiW666abEOIQ0HiIiIiIiIv+GguiS4QEOLuCfe+65aMeOHdE777wTZcmSJbr66qujZcuWRV999VVUo0YNCwqdddZZ0fz584N/xxYuXBjdfffd9vm7774b5c+f3xYRFi1aFJ122mkW/Hn//fdT/E4ogTCCPL/++qstljRq1Ci65pprLAA4b948+z7byJgxY2wcGjRokPg9HpfkxDxx/vnnR2+++WZin8mVK1d0ySWX2IJLPJC+YcOGYPaV9Hz88cdR586d7XPm03z58kUDBw60IDJzScmSJaOlS5em+J2Qx2T27NmJAPGkSZOiPHny2OLBDz/8EGXNmjVq2LBh9OGHHybFeGzdutUC5CzGbtmyxcaD+ZXjC3jsiSeesIVJPnzwPdTxEBERERER2Rcq5yIZhvItnTp1cgULFrRSHD/88IM1cjvrrLOs7jm323O7Od+nLAW31efMmTMp3jFe7zHHHGNlJyhp89BDD9nj9evXd4sXL7aaz5S5Can+eRx1i88991wrJUCZBcovxGsX89rZdmh8R9kBSV7UdP7www9drVq1bN+48sorrVwFta2bNm3qpk2bZg1WaZpIWRuEWqbDW7t2rTUibtCggatatarr0aOH9ZSoXbu2jRFjRWmX0OaPtMqNcJyhPAn18WlATPkWyrqwDVSsWNEtWrTImhCnrg0fGkqBffTRR1YSq1WrVlbmiLn1iSeecK1bt7af+eabb6yJKP036C+B0LYRERERERGRf0vFLSXDUKuZoPnVV1/tNmzYYMEvAuc0RRw0aJAFR7nYp/517ty5kyaADl7vunXr3IIFC6xmrQ+sU+v5ueeecxMnTrTHQgxuULeboFe+fPmsIeb48eOtVq9HXWsaItJklOApwXRJXuwTBPxy5cplNdHZNugTgBNOOMEa0FI3n23JCzmADl7z6tWr3ZIlS1z58uXtMfoosIhAbwE+Qps/4gF0XjdNZlesWGHbBc11d+7caXPqSSedZK+bxbhKlSpZI2uabIaG4Hfcd9995z777DP3yy+/uJNPPtkaNXPs9QF05lwWExjD888/P/F7IW0jIiIiIiIi+0OZ6JKhyI4kmE6TTJpojho1ygI9ZM0RLCY7nUxSLvqTDUGha665xoJBbdu2tcUFAj+MB0HAkJq8pfdavvjiC1tcKVu2rAXLCXrFzZo1y51zzjnB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2GDB8uuvv96C4yw+Uvf89ddfd7Vr13Zjx451f/zxh/v1119dkSJFLNiu+VREREREREQyi/Cu5EX20ooVK6ykQMmSJe1rH+i78sorLZOWMhQEgQoVKmSNEQmchxoAEzkQfKPIZA2gg9rfzCd+jgl1/uC9ZrGAklfTpk2zcljMoSw6cndPt27d7I4eFhV8U1XNpyIiIiIiIpJZJG9kQ5KWb263ffv2FE0OCQL5rym7QBY6TUUvueSSREPEUANgIgeKGkX+PyEvJuTJk8f17NnTgufMmZTxeeihh6ycTc2aNd2sWbNsHvUBdOZhzaciIiIiIiKSWYR7RS+yh6BerVq13LJly1z//v0TjxPkoRHgiBEj3OTJk1P8nkq4iIikr1WrVtZQlsB5nz59XJ06dSz7fs2aNbs0EdXiioiIiIiIiGQmqokuSW3w4MHutttus4zziy++2Oqf9+7d261evTrRBFBERPYNi5EE1AmmL1++3M2bN0/zqYiIiIiIiGRaCqJLUqOkwLhx41z79u2tXEvu3LldwYIF3YQJE9T0TkTkX86rU6dOdX379nU7d+5048eP13wqIiIiIiIimZqC6CLOuXXr1rlNmzZZ6YHTTz/daher6Z2IyL9DA1EajZYtW1bzqYiIiIiIiGR6CqKLpIFgeshNAEVEDhbNpyIiIiIiIpLZKYguIiIiIiIiIiIiIpIOpdqKiIiIiIiIiIiIiKRDQXQRERERERERERERkXQoiC4iIiIiIiIiIiIikg4F0UVERERERERERERE0qEguoiIiIiIiIiIiIhIOhREFxERERERERERERFJh4LoIiIiIiIiIiIiIiLpUBBdRERERERERERERCQdCqKLiIiIiIiIiIiIiKRDQXQRERERERERERERkXQoiC4iIiIiIiIiIiIi4tL2/wEG9GghQk72UgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 4.4 Visualize results\n", + "\n", + "fig, axes = plt.subplots(2, 2, figsize=(15, 12))\n", + "\n", + "# Plot 1: Top 20 countries by bus count\n", + "if \"report_df\" in locals():\n", + " top20 = report_df.head(20)\n", + " ax = axes[0, 0]\n", + " ax.barh(range(len(top20)), top20[\"Bus_Count\"].values)\n", + " ax.set_yticks(range(len(top20)))\n", + " ax.set_yticklabels(top20[\"ISO3\"].values)\n", + " ax.set_xlabel(\"Bus Count\")\n", + " ax.set_title(\"Top 20 Countries by Bus Count\")\n", + " ax.invert_yaxis()\n", + " ax.grid(axis=\"x\", alpha=0.3)\n", + "\n", + "# Plot 2: Technology distribution (onshore vs offshore)\n", + "if gdf_merged is not None:\n", + " ax = axes[0, 1]\n", + " tech_dist = gdf_merged[\"onshore_offshore\"].value_counts()\n", + " colors = [\"#2ecc71\", \"#3498db\"]\n", + " ax.pie(\n", + " tech_dist.values,\n", + " labels=tech_dist.index,\n", + " autopct=\"%1.1f%%\",\n", + " colors=colors,\n", + " startangle=90,\n", + " )\n", + " ax.set_title(\"Onshore vs Offshore Distribution\")\n", + "\n", + "# Plot 3: Regional distribution (buses per region)\n", + "if \"merge_metadata\" in locals():\n", + " ax = axes[1, 0]\n", + " regions_list = list(merge_metadata[\"regional_bus_counts\"].keys())\n", + " buses_list = list(merge_metadata[\"regional_bus_counts\"].values())\n", + " ax.bar(range(len(regions_list)), buses_list, color=\"#9b59b6\")\n", + " ax.set_xticks(range(len(regions_list)))\n", + " ax.set_xticklabels(regions_list, rotation=45, ha=\"right\")\n", + " ax.set_ylabel(\"Bus Count\")\n", + " ax.set_title(\"Bus Count by Region\")\n", + " ax.grid(axis=\"y\", alpha=0.3)\n", + "\n", + "# Plot 4: Data quality - Buses with data coverage\n", + "if ds_merged is not None and gdf_merged is not None:\n", + " ax = axes[1, 1]\n", + "\n", + " # Count valid capacity factors per bus (non-NaN)\n", + " valid_cf_counts = []\n", + " for bus in ds_merged.coords[\"bus\"].values[\n", + " : min(1000, len(ds_merged.coords[\"bus\"]))\n", + " ]:\n", + " try:\n", + " bus_data = ds_merged.sel(bus=bus)\n", + " valid_cf = (~np.isnan(bus_data[\"capacity_factor\"].values)).sum()\n", + " valid_cf_counts.append(valid_cf)\n", + " except:\n", + " pass\n", + "\n", + " if valid_cf_counts:\n", + " ax.hist(valid_cf_counts, bins=30, color=\"#e74c3c\", edgecolor=\"black\", alpha=0.7)\n", + " ax.set_xlabel(\"Valid Capacity Factor Hours\")\n", + " ax.set_ylabel(\"Bus Count\")\n", + " ax.set_title(\"Data Coverage (Sample of 1000 buses)\")\n", + " ax.axvline(\n", + " np.mean(valid_cf_counts),\n", + " color=\"black\",\n", + " linestyle=\"--\",\n", + " label=f\"Mean: {np.mean(valid_cf_counts):.0f}\",\n", + " )\n", + " ax.legend()\n", + " ax.grid(axis=\"y\", alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig(\n", + " RESOURCES_DIR / \"renewable_profiles_merge_summary.png\", dpi=150, bbox_inches=\"tight\"\n", + ")\n", + "print(\"βœ“ Saved summary plot to resources/renewable_profiles_merge_summary.png\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "70eea69e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "======================================================================\n", + "MERGE & VALIDATION COMPLETE\n", + "======================================================================\n", + "\n", + "πŸ“Š MERGE SUMMARY:\n", + " Regions merged: 9\n", + " Total buses: 122831\n", + " Countries with data: 194\n", + " Merge timestamp: 2026-05-27T11:51:25.801922\n", + "\n", + "βœ… VALIDATION RESULTS:\n", + " Bus count match: PASS βœ“\n", + " GeoJSON-NetCDF count match: PASS βœ“\n", + " Technology dimension: PASS βœ“\n", + " Hour dimension: PASS βœ“\n", + " No duplicate bus_ids: FAIL βœ—\n", + "\n", + "πŸ“ OUTPUT FILES:\n", + " β€’ ..\\..\\data\\renewable_profiles_global_merged.nc (116.3 MB)\n", + " β€’ ..\\..\\data\\renewable_profiles_global_merged.geojson\n", + " β€’ ..\\..\\resources\\renewable_profiles_merge_report.json\n", + " β€’ resources/renewable_profiles_merge_summary.png\n", + "\n", + "🌍 COUNTRY COVERAGE:\n", + " Coverage: 194/249 countries (77.9%)\n", + "\n", + "✨ MERGE STRATEGY HIGHLIGHTS\n", + "======================================================================\n", + "Global Grid Approach:\n", + " β€’ Created unified 0.25Β° global grid covering entire world\n", + " β€’ Placed all regional potential data into corresponding grid cells\n", + " β€’ Filled with NaN where no data available\n", + "\n", + "Result: Single comprehensive .nc file containing:\n", + " βœ“ All bus-level variables (capacity_factor, p_nom_max, avg_cf, weight, data_quality_flag)\n", + " βœ“ Global potential grid (y_grid, x_grid, technology)\n", + " βœ“ All bus geometries + country codes in .geojson\n", + "\n", + "Benefits:\n", + " βœ“ Unified dataset - no need to access multiple files\n", + " βœ“ Standard gridded format ready for analysis/interpolation\n", + " βœ“ Can use numpy/xarray operations on global grid\n", + " βœ“ Cleaner API - all data in one place\n", + "\n", + "πŸ“ USING THE MERGED DATA\n", + "======================================================================\n", + "Load and explore:\n", + " ds = xr.open_dataset('data/renewable_profiles_global_merged.nc')\n", + " gdf = gpd.read_file('data/renewable_profiles_global_merged.geojson')\n", + "\n", + "Access bus-level data:\n", + " cf = ds['capacity_factor'] # [bus, technology, hour]\n", + " p_max = ds['p_nom_max'] # [bus, technology]\n", + "\n", + "Access global potential grid:\n", + " pot = ds['potential'] # [y_grid, x_grid, technology]\n", + " pot_data = pot.where(~np.isnan(pot), drop=True) # Drop NaN regions\n", + "\n", + "======================================================================\n" + ] + } + ], + "source": [ + "# 4.5 Final summary and documentation\n", + "\n", + "print(\"\\n\" + \"=\" * 70)\n", + "print(\"MERGE & VALIDATION COMPLETE\")\n", + "print(\"=\" * 70)\n", + "\n", + "print(\"\\nπŸ“Š MERGE SUMMARY:\")\n", + "if \"merge_metadata\" in locals():\n", + " print(f\" Regions merged: {len(merge_metadata['regions_processed'])}\")\n", + " print(f\" Total buses: {merge_metadata['total_buses']}\")\n", + " print(f\" Countries with data: {len(merge_metadata['iso3_counts'])}\")\n", + " print(f\" Merge timestamp: {merge_metadata['merge_timestamp']}\")\n", + "\n", + "print(\"\\nβœ… VALIDATION RESULTS:\")\n", + "for check_name, check_result in validation_checks.items():\n", + " status = \"PASS βœ“\" if check_result.get(\"passed\", False) else \"FAIL βœ—\"\n", + " print(f\" {check_name}: {status}\")\n", + "\n", + "print(\"\\nπŸ“ OUTPUT FILES:\")\n", + "print(f\" β€’ {output_nc_file} ({file_size_mb:.1f} MB)\")\n", + "print(f\" β€’ {output_geojson_file}\")\n", + "print(f\" β€’ {output_report_file}\")\n", + "print(\" β€’ resources/renewable_profiles_merge_summary.png\")\n", + "\n", + "print(\"\\n🌍 COUNTRY COVERAGE:\")\n", + "if \"iso3_valid_in_merged\" in locals():\n", + " print(\n", + " f\" Coverage: {len(iso3_valid_in_merged)}/{len(valid_iso3_codes_pycountry)} countries ({len(iso3_valid_in_merged) / len(valid_iso3_codes_pycountry) * 100:.1f}%)\"\n", + " )\n", + "\n", + "print(\"\\n✨ MERGE STRATEGY HIGHLIGHTS\")\n", + "print(\"=\" * 70)\n", + "print(\"Global Grid Approach:\")\n", + "print(\" β€’ Created unified 0.25Β° global grid covering entire world\")\n", + "print(\" β€’ Placed all regional potential data into corresponding grid cells\")\n", + "print(\" β€’ Filled with NaN where no data available\")\n", + "print(\"\\nResult: Single comprehensive .nc file containing:\")\n", + "print(\n", + " \" βœ“ All bus-level variables (capacity_factor, p_nom_max, avg_cf, weight, data_quality_flag)\"\n", + ")\n", + "print(\" βœ“ Global potential grid (y_grid, x_grid, technology)\")\n", + "print(\" βœ“ All bus geometries + country codes in .geojson\")\n", + "print(\"\\nBenefits:\")\n", + "print(\" βœ“ Unified dataset - no need to access multiple files\")\n", + "print(\" βœ“ Standard gridded format ready for analysis/interpolation\")\n", + "print(\" βœ“ Can use numpy/xarray operations on global grid\")\n", + "print(\" βœ“ Cleaner API - all data in one place\")\n", + "\n", + "print(\"\\nπŸ“ USING THE MERGED DATA\")\n", + "print(\"=\" * 70)\n", + "print(\"Load and explore:\")\n", + "print(\" ds = xr.open_dataset('data/renewable_profiles_global_merged.nc')\")\n", + "print(\" gdf = gpd.read_file('data/renewable_profiles_global_merged.geojson')\")\n", + "print(\"\\nAccess bus-level data:\")\n", + "print(\" cf = ds['capacity_factor'] # [bus, technology, hour]\")\n", + "print(\" p_max = ds['p_nom_max'] # [bus, technology]\")\n", + "print(\"\\nAccess global potential grid:\")\n", + "print(\" pot = ds['potential'] # [y_grid, x_grid, technology]\")\n", + "print(\" pot_data = pot.where(~np.isnan(pot), drop=True) # Drop NaN regions\")\n", + "print(\"\\n\" + \"=\" * 70)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "shift-dev", + "language": "python", + "name": "shift-dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/mga-prices.ipynb b/workflow/notebooks/mga-prices.ipynb index 5d0da3e..9257c6d 100644 --- a/workflow/notebooks/mga-prices.ipynb +++ b/workflow/notebooks/mga-prices.ipynb @@ -24,7 +24,7 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", "snakemake = mock_snakemake(\n", " \"collect_figures\",\n", " scenario=\"penalty-oc\", # penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", diff --git a/workflow/notebooks/plot-compare-lcox.ipynb b/workflow/notebooks/plot-compare-lcox.ipynb new file mode 100644 index 0000000..ac6023c --- /dev/null +++ b/workflow/notebooks/plot-compare-lcox.ipynb @@ -0,0 +1,609 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d3ddb1b2", + "metadata": {}, + "outputs": [], + "source": [ + "import pypsa\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6f81313", + "metadata": {}, + "outputs": [], + "source": [ + "from _helpers_notebooks import mock_snakemake\n", + "\n", + "snakemake = mock_snakemake(\n", + " \"plot_compare_lcox\",\n", + " wacc=\"regional\", # uniform or regional\n", + " cost_year=\"2050\",\n", + " trade_chain=\"supplyconstraint\", # default, mga-stability-weighted, mga-chokepoints, mga-blocs, constrain-supply\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "310bcf70", + "metadata": {}, + "outputs": [], + "source": [ + "config = snakemake.config" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "581e901d", + "metadata": {}, + "outputs": [], + "source": [ + "add_iron_ore_cost = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "488b720f", + "metadata": {}, + "outputs": [], + "source": [ + "colors = config[\"colors\"]" + ] + }, + { + "cell_type": "markdown", + "id": "cf54698c", + "metadata": {}, + "source": [ + "### Read networks in Network collection" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99b8dc61", + "metadata": {}, + "outputs": [], + "source": [ + "low_cost = snakemake.params.low_cost\n", + "high_cost = snakemake.params.high_cost\n", + "quantities = snakemake.params.quantities\n", + "comparison = snakemake.params.comparison\n", + "\n", + "# Build ordered (region, qty) pairs matching the expand() order in the rule:\n", + "# low_cost regions first, then high_cost, each with all quantities\n", + "region_qty_pairs = [(r, q) for r in low_cost + high_cost for q in quantities]\n", + "\n", + "# Map scenario key β†’ file path (supply_networks list is in the same expansion order)\n", + "supply_files = list(snakemake.input.supply_networks)\n", + "scenario_file_map = {\n", + " f\"{region}_{qty}\": supply_files[i]\n", + " for i, (region, qty) in enumerate(region_qty_pairs)\n", + "}\n", + "scenarios = list(scenario_file_map.keys())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58dcd935", + "metadata": {}, + "outputs": [], + "source": [ + "nc = {}\n", + "\n", + "for scenario, model_fn in scenario_file_map.items():\n", + " n = pypsa.Network(model_fn)\n", + " n.name = scenario\n", + " nc[scenario] = n\n", + "\n", + "nc = pypsa.NetworkCollection(list(nc.values()))" + ] + }, + { + "cell_type": "markdown", + "id": "2675e821", + "metadata": {}, + "source": [ + "### Adjust carrier name before statistics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23a05566", + "metadata": {}, + "outputs": [], + "source": [ + "# Rename for all scenarios\n", + "for scenario in scenarios:\n", + " nc[scenario].links[\"carrier\"] = nc[scenario].links[\"carrier\"].replace({\n", + " \"battery_elec\": \"battery discharge\",\n", + " \"renewable_electricity\": \"battery charge\"\n", + " })" + ] + }, + { + "cell_type": "markdown", + "id": "1f28183f", + "metadata": {}, + "source": [ + "### Costs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30545a5b", + "metadata": {}, + "outputs": [], + "source": [ + "hbi_demand = nc.statistics.withdrawal().to_frame().loc[\"Load\", :, \"hbi_demand\"]\n", + "# hbi_demand" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33c20832", + "metadata": {}, + "outputs": [], + "source": [ + "df = nc.statistics.system_cost(groupby=\"carrier\").to_frame(\"systemcost\")\n", + "# df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e8a00a6", + "metadata": {}, + "outputs": [], + "source": [ + "fom = nc.statistics.fom(groupby=\"carrier\").to_frame(\"fom\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0119dc7d", + "metadata": {}, + "outputs": [], + "source": [ + "df[\"systemcost+fom\"] = df[\"systemcost\"].add(fom[\"fom\"], fill_value=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab2f64a6", + "metadata": {}, + "outputs": [], + "source": [ + "df[\"systemcost+fom_per_hbi\"] = df[\"systemcost+fom\"].div(hbi_demand.squeeze().rename_axis(\"network\"), level=\"network\")\n", + "# df" + ] + }, + { + "cell_type": "markdown", + "id": "ebfb7968", + "metadata": {}, + "source": [ + "### Iron ore" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "310bf035", + "metadata": {}, + "outputs": [], + "source": [ + "iron_ore_cost = config[\"iron_ore\"][\"marginal_cost\"] * config[\"iron_ore\"][\"ore_to_steel_ratio\"] " + ] + }, + { + "cell_type": "markdown", + "id": "0de061b9", + "metadata": {}, + "source": [ + "### Transport cost (from trade model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4cb0da4e", + "metadata": {}, + "outputs": [], + "source": [ + "# Read the trade network solely to extract shipping costs.\n", + "# This network is NOT added to the supply-chain NetworkCollection.\n", + "n_trade = pypsa.Network(snakemake.input.trade_result)\n", + "\n", + "# For each low_cost region compute the per-unit shipping cost to the first\n", + "# high_cost region in the comparison pair (comparison[0]).\n", + "# Shipping links have carrier==\"shipping_hbi\", bus0=\"{origin}_hbi\", bus1=\"{dest}_hbi\".\n", + "comp_dest = comparison[0] # e.g. \"Europe\"\n", + "\n", + "transport_costs = {} # {region_key: €/unit_hbi}\n", + "for low_region in low_cost:\n", + " link_mask = (\n", + " (n_trade.links.carrier == \"shipping_hbi\")\n", + " & (n_trade.links.bus0 == f\"{low_region}_hbi\")\n", + " & (n_trade.links.bus1 == f\"{comp_dest}_hbi\")\n", + " )\n", + " shipping_links = n_trade.links[link_mask]\n", + " if not shipping_links.empty:\n", + " # marginal_cost is in the same €/unit units as the supply-chain optimisation\n", + " transport_costs[low_region] = float(shipping_links.marginal_cost.mean())\n", + " else:\n", + " transport_costs[low_region] = 0.0" + ] + }, + { + "cell_type": "markdown", + "id": "ff5e51d7", + "metadata": {}, + "source": [ + "### Plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dce79e80", + "metadata": {}, + "outputs": [], + "source": [ + "def region_display_name(region):\n", + " \"\"\"Convert config region key (e.g. 'South_America') to display name ('South America').\"\"\"\n", + " nice_names = config.get(\"region_nice_names\", {})\n", + " return nice_names.get(region, region.replace(\"_\", \" \"))\n", + "\n", + "def parse_scenario(name):\n", + " \"\"\"Split a scenario key like 'South_America_10' into (display_name, qty_float).\"\"\"\n", + " region, qty_raw = name.rsplit(\"_\", 1)\n", + " return region_display_name(region), float(qty_raw)\n", + "\n", + "# --- Build pivot table of costs ---\n", + "plot_df = df.pivot_table(\n", + " index=\"network\", columns=\"carrier\", values=\"systemcost+fom_per_hbi\", aggfunc=\"sum\"\n", + ")\n", + "\n", + "if add_iron_ore_cost:\n", + " plot_df[\"iron ore\"] = iron_ore_cost\n", + "else:\n", + " plot_df[\"iron ore\"] = 0\n", + "\n", + "plot_df.rename(\n", + " columns={\n", + " \"renewable_solar\": \"solar\",\n", + " \"renewable_onwind\": \"onshore wind\",\n", + " \"battery charge\": \"battery inverter (charging)\",\n", + " \"battery discharge\": \"battery inverter (discharging)\",\n", + " \"battery_elec\": \"battery\",\n", + " \"hydrogen\": \"hydrogen storage\",\n", + " \"electrolysis\": \"electrolysis\",\n", + " \"direct_reduction_furnace\": \"direct reduction furnace\",\n", + " },\n", + " inplace=True,\n", + ")\n", + "\n", + "order = [\n", + " \"iron ore\", \"solar\", \"onshore wind\",\n", + " \"battery inverter (charging)\", \"battery inverter (discharging)\",\n", + " \"battery\", \"hydrogen storage\", \"electrolysis\", \"direct reduction furnace\",\n", + "]\n", + "plot_df = plot_df[[c for c in order if c in plot_df.columns]]\n", + "\n", + "# --- Attach region / quantity metadata from params ---\n", + "plot_df[\"region\"] = [parse_scenario(s)[0] for s in plot_df.index]\n", + "plot_df[\"quantity\"] = [parse_scenario(s)[1] for s in plot_df.index]\n", + "\n", + "# --- Add shipping cost for low_cost regions (0 for high_cost regions) ---\n", + "low_cost_display = {region_display_name(r): transport_costs.get(r, 0.0) for r in low_cost}\n", + "plot_df[\"shipping\"] = plot_df[\"region\"].map(low_cost_display).fillna(0.0)\n", + "\n", + "# --- Sort: low_cost regions left, high_cost regions right; within group by qty ---\n", + "groups_ordered = (\n", + " [region_display_name(r) for r in low_cost]\n", + " + [region_display_name(r) for r in high_cost]\n", + ")\n", + "plot_df[\"region_order\"] = plot_df[\"region\"].map({g: i for i, g in enumerate(groups_ordered)})\n", + "plot_df = plot_df.sort_values([\"region_order\", \"quantity\"]).drop(columns=\"region_order\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b19202d", + "metadata": {}, + "outputs": [], + "source": [ + "# Merge \"battery\", \"battery inverter (charging)\", \"battery inverter (discharging)\" into a single \"battery\" column\n", + "plot_df[\"battery\"] = plot_df[[\"battery\", \"battery inverter (charging)\", \"battery inverter (discharging)\"]].sum(axis=1)\n", + "plot_df = plot_df.drop(columns=[\"battery inverter (charging)\", \"battery inverter (discharging)\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4560d6a3", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Column order: supply-chain components then shipping on top ---\n", + "supply_order = [c for c in order if c in plot_df.columns]\n", + "show_shipping = (plot_df[\"shipping\"] > 0).any()\n", + "plot_cols = supply_order + ([\"shipping\"] if show_shipping else [])\n", + "\n", + "# --- Colors: extend config colors with a shipping entry ---\n", + "plot_colors = dict(config[\"colors\"])\n", + "plot_colors.setdefault(\"shipping\", plot_colors.get(\"shipping\", \"#6495ED\"))\n", + "\n", + "# --- Compute x positions with a gap between region groups ---\n", + "bar_width = 0.5\n", + "group_gap = 1\n", + "\n", + "x_positions = []\n", + "group_centers = {}\n", + "group_spans = {}\n", + "current_x = 0\n", + "\n", + "for g in groups_ordered:\n", + " mask = plot_df[\"region\"] == g\n", + " n_bars = int(mask.sum())\n", + " positions = list(range(current_x, current_x + n_bars))\n", + " x_positions.extend(positions)\n", + " group_centers[g] = np.mean(positions)\n", + " group_spans[g] = (positions[0], positions[-1])\n", + " current_x += n_bars + group_gap\n", + "\n", + "# --- Create stacked bar plot ---\n", + "fig, ax = plt.subplots(figsize=(7, 4.5))\n", + "\n", + "bottom = np.zeros(len(plot_df))\n", + "for col in plot_cols:\n", + " values = plot_df[col].fillna(0).values\n", + " ax.bar(x_positions, values, bottom=bottom, width=bar_width,\n", + " label=col, color=plot_colors[col], alpha=0.65)\n", + " bottom += values\n", + "\n", + "# --- Totals on top of bars ---\n", + "totals = plot_df[plot_cols].sum(axis=1).values\n", + "for x, total in zip(x_positions, totals):\n", + " ax.text(x, total, f\"{total:.1f}\", ha=\"center\", va=\"bottom\", fontsize=9)\n", + "\n", + "# --- Primary axis formatting ---\n", + "ax.set_ylabel(\"Cost of HBI in €/t$_{hbi}$\")\n", + "ax.set_xlabel(\"\")\n", + "ax.yaxis.grid(True, linestyle=\"-\", alpha=0.6)\n", + "ax.set_axisbelow(True)\n", + "\n", + "# --- Inner x-axis: quantity labels ---\n", + "ax.set_xticks(x_positions)\n", + "qty_labels = [f\"{row['quantity']:.4g} Mt\" for _, row in plot_df.iterrows()]\n", + "ax.set_xticklabels(qty_labels, rotation=0, fontsize=9)\n", + "ax.tick_params(axis=\"x\", length=0)\n", + "\n", + "# --- Outer x-axis: region group labels with bracket ---\n", + "xaxis_transform = ax.get_xaxis_transform()\n", + "y_bracket = -0.11\n", + "y_label_pts = -7\n", + "\n", + "for g in groups_ordered:\n", + " center = group_centers[g]\n", + " x_start, x_end = group_spans[g]\n", + "\n", + " ax.annotate(\n", + " \"\",\n", + " xy=(x_end + bar_width / 2 + 0.05, y_bracket),\n", + " xycoords=xaxis_transform,\n", + " xytext=(x_start - bar_width / 2 - 0.05, y_bracket),\n", + " textcoords=xaxis_transform,\n", + " arrowprops=dict(arrowstyle=\"-\", color=\"black\", lw=0.8),\n", + " annotation_clip=False,\n", + " )\n", + " ax.annotate(\n", + " g,\n", + " xy=(center, y_bracket),\n", + " xycoords=xaxis_transform,\n", + " xytext=(0, y_label_pts),\n", + " textcoords=\"offset points\",\n", + " ha=\"center\",\n", + " va=\"top\",\n", + " fontsize=10,\n", + " annotation_clip=False,\n", + " )\n", + "\n", + "# --- % difference annotation between the comparison pair ---\n", + "# comparison[0] is the high-cost baseline, comparison[1] is the low-cost target\n", + "comp_high_display = region_display_name(comparison[0])\n", + "comp_low_display = region_display_name(comparison[1])\n", + "\n", + "plot_df_idx_list = list(plot_df.index)\n", + "high_first = plot_df[plot_df[\"region\"] == comp_high_display].index[0]\n", + "low_first = plot_df[plot_df[\"region\"] == comp_low_display].index[0]\n", + "\n", + "high_first_xpos = x_positions[plot_df_idx_list.index(high_first)]\n", + "low_first_xpos = x_positions[plot_df_idx_list.index(low_first)]\n", + "\n", + "totals_series = plot_df[plot_cols].sum(axis=1)\n", + "y_high_top = float(totals_series[high_first])\n", + "y_low_top = float(totals_series[low_first])\n", + "\n", + "# Negative pct_diff means the low-cost region is cheaper than the baseline\n", + "pct_diff = (y_low_top - y_high_top) / y_high_top * 100\n", + "\n", + "# Horizontal reference line at high-cost level spanning across to the low-cost bar\n", + "ax.plot([low_first_xpos, high_first_xpos], [y_high_top, y_high_top],\n", + " color=\"red\", linewidth=0.8, clip_on=False, zorder=5)\n", + "\n", + "# Downward arrow from high-cost level to low-cost bar top\n", + "ax.annotate(\n", + " \"\",\n", + " xy=(low_first_xpos, y_low_top + 20),\n", + " xytext=(low_first_xpos, y_high_top),\n", + " arrowprops=dict(arrowstyle=\"-|>\", color=\"red\", lw=0.8),\n", + " annotation_clip=False,\n", + ")\n", + "\n", + "ax.text(\n", + " low_first_xpos,\n", + " (y_high_top + y_low_top) / 2 + 70,\n", + " f\"{pct_diff:.1f}%\",\n", + " ha=\"center\",\n", + " va=\"top\",\n", + " fontsize=8,\n", + " color=\"red\",\n", + ")\n", + "\n", + "# --- Legend ---\n", + "handles, labels = ax.get_legend_handles_labels()\n", + "ax.legend(\n", + " handles[::-1],\n", + " labels[::-1],\n", + " title=\"Cost component\",\n", + " bbox_to_anchor=(1.02, 1),\n", + " loc=\"upper left\",\n", + ")\n", + "\n", + "plt.ylim(0,830)\n", + "plt.tight_layout()\n", + "plt.savefig(snakemake.output.lcox_comparison, dpi=300, bbox_inches=\"tight\")\n", + "plt.savefig(snakemake.output.lcox_comparison_png, dpi=300, bbox_inches=\"tight\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1adceb09", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58dbb0c1", + "metadata": {}, + "outputs": [], + "source": [ + "# nc[\"europe_100\"].objective / 1e6" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4971231d", + "metadata": {}, + "outputs": [], + "source": [ + "# system_cost = nc[\"europe_100\"].statistics.system_cost().div(1e6).sum()\n", + "# system_cost.round(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa803626", + "metadata": {}, + "outputs": [], + "source": [ + "# fom = nc[\"europe_100\"].statistics.fom().div(1e6).sum()\n", + "# fom.round(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b6fbe95", + "metadata": {}, + "outputs": [], + "source": [ + "# expanded_capex = nc[\"eu_1\"].statistics.expanded_capex().div(1e6).sum()\n", + "# expanded_capex.round(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bce4d758", + "metadata": {}, + "outputs": [], + "source": [ + "# opex = nc[\"eu_1\"].statistics.opex().div(1e6).sum()\n", + "# opex.round(2)" + ] + }, + { + "cell_type": "markdown", + "id": "e5ab7988", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfffb729", + "metadata": {}, + "outputs": [], + "source": [ + "# objective = nc[\"eu_1\"].objective / 1e6\n", + "# objective.round(2)" + ] + }, + { + "cell_type": "markdown", + "id": "5a04b8ce", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6be0a44", + "metadata": {}, + "outputs": [], + "source": [ + "# nc[\"eu_1\"].statistics.overnight_cost().div(1e6).sum()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "shift", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/plot-mga-examples-further.ipynb b/workflow/notebooks/plot-mga-examples-further.ipynb index ef940df..e39fc63 100644 --- a/workflow/notebooks/plot-mga-examples-further.ipynb +++ b/workflow/notebooks/plot-mga-examples-further.ipynb @@ -68,7 +68,7 @@ } ], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", "import glob\n", "import os\n", "\n", diff --git a/workflow/notebooks/plot-mga.ipynb b/workflow/notebooks/plot-mga.ipynb index 7fe3e2c..7f122b7 100644 --- a/workflow/notebooks/plot-mga.ipynb +++ b/workflow/notebooks/plot-mga.ipynb @@ -17,10 +17,11 @@ "%matplotlib inline\n", "\n", "if \"snakemake\" not in globals():\n", - " from _helpers import mock_snakemake\n", + " from _helpers_notebooks import mock_snakemake\n", " snakemake = mock_snakemake(\n", " \"plot_mga\",\n", - " wacc=\"uniform\"\n", + " wacc=\"regional\",\n", + " trade_chain=\"supplyconstraint\",\n", " )" ] }, @@ -74,6 +75,7 @@ "interone = \"hbi\"\n", "intertwo = \"eaf-grid\"\n", "final = \"steel\"\n", + "region_nice_names = snakemake.config.get(\"region_nice_names\", {})\n", "\n", "print(f\"Production scenario: {scenario}\")\n", "print(f\"Chokepoint scenario: {cp_scenario}\")\n", @@ -345,7 +347,7 @@ " if region_data.sum() > 0: # Only plot if region has any production\n", " color = region_colors.get(region, '#000000')\n", " ax.plot(epsilon_vals, region_data, color=color, linewidth=1.2, \n", - " linestyle='-', alpha=0.6, label=region, zorder=5)\n", + " linestyle='-', alpha=0.6, label=region_nice_names.get(region, region.replace(\"_\", \" \")), zorder=5)\n", "\n", "# Unstable regions (dashed lines)\n", "for region in unstable_regions:\n", @@ -354,7 +356,7 @@ " if region_data.sum() > 0: # Only plot if region has any production\n", " color = region_colors.get(region, '#000000')\n", " ax.plot(epsilon_vals, region_data, color=color, linewidth=1.2, \n", - " linestyle='--', alpha=0.7, label=region, zorder=5)\n", + " linestyle='--', alpha=0.7, label=region_nice_names.get(region, region.replace(\"_\", \" \")), zorder=5)\n", "\n", "# ── Axes formatting ──────────────────────────────────────────────────────────\n", "ax.set_xlim(min(epsilon_vals) - 0.002, max(epsilon_vals) + 0.01)\n", @@ -366,7 +368,7 @@ "ax.legend(loc=\"best\", fontsize=7, framealpha=0.95, ncol=3, title=\"Regions\")\n", "\n", "plt.tight_layout()\n", - "plt.show()" + "plt.show()\n" ] }, { @@ -595,19 +597,29 @@ "active_cp = [cp for cp in config_chokepoints if df_cp.loc[cp].sum() > 0]\n", "print(f\"Active chokepoints (with trade): {active_cp}\")\n", "\n", - "# Chokepoint colors (distinct palette)\n", - "cp_colors = {\n", - " \"babalmandab\": \"#e41a1c\",\n", - " \"bosporus\": \"#377eb8\",\n", - " \"gibraltar\": \"#4daf4a\",\n", - " \"suez\": \"#984ea3\",\n", - " \"panama\": \"#ff7f00\",\n", - " \"ormuz\": \"#a65628\",\n", - " \"northwest\": \"#f781bf\",\n", - " \"malacca\": \"#999999\",\n", - " \"sunda\": \"#66c2a5\",\n", - " \"chili\": \"#8dd3c7\",\n", - " \"south_africa\":\"#fdb462\",\n", + "# Chokepoint display names (override .title() defaults)\n", + "cp_display_names = {\n", + " \"ormuz\": \"Hormuz\",\n", + " \"babalmandab\": \"Bab el-Mandeb\",\n", + "}\n", + "\n", + "# Chokepoint colors β€” read from config (mapped to geographically relevant region colors)\n", + "_colors_cfg = snakemake.config[\"colors\"]\n", + "cp_colors = {cp: _colors_cfg.get(cp, \"#333333\") for cp in config_chokepoints}\n", + "\n", + "# Chokepoint line styles (solid/dashed to distinguish geographically proximate pairs)\n", + "cp_linestyles = {\n", + " \"babalmandab\": \"-\",\n", + " \"suez\": \"--\", # Red Sea area: dashed to distinguish from babalmandab\n", + " \"bosporus\": \"-\",\n", + " \"gibraltar\": \"-\", # European straits: dashed\n", + " \"ormuz\": \"-\",\n", + " \"panama\": \"-\",\n", + " \"malacca\": \"-\",\n", + " \"sunda\": \"--\", # SE Asia pair: dashed\n", + " \"south_africa\":\"-\",\n", + " \"northwest\": \"--\",\n", + " \"chili\": \"--\",\n", "}\n", "\n", "fig, ax = plt.subplots(1, 1, figsize=(12, 7))\n", @@ -628,9 +640,9 @@ "for cp in active_cp:\n", " cp_arr = np.array(df_cp.loc[cp].values, dtype=float)\n", " color = cp_colors.get(cp, \"#333333\")\n", - " label = cp.replace(\"_\", \" \").title()\n", + " label = cp_display_names.get(cp, cp.replace(\"_\", \" \").title())\n", " ax.plot(epsilon_arr, cp_arr, color=color, linewidth=1.5,\n", - " linestyle=\"--\", marker=\"s\", markersize=4, alpha=0.8,\n", + " linestyle=cp_linestyles.get(cp, \"-\"), marker=\"s\", markersize=4, alpha=0.8,\n", " label=label, zorder=10)\n", "\n", "# ── Axes formatting ──\n", @@ -687,22 +699,37 @@ "bl_mga_slack_values = bl_mga_modifiers.get(\"mga\", {}).get(\"slack\", [])\n", "bl_carrier = bl_mga_modifiers.get(\"mga\", {}).get(\"carrier\", \"hbi\")\n", "\n", - "# Block definitions from config\n", + "# Block definitions from config.\n", + "# Each entry in the YAML list may be a comma-separated string, so split defensively.\n", + "def _parse_block_regions(region_list):\n", + " \"\"\"Flatten potentially comma-separated strings within a YAML list.\"\"\"\n", + " result = []\n", + " for entry in (region_list or []):\n", + " for r in str(entry).split(\",\"):\n", + " r = r.strip()\n", + " if r:\n", + " result.append(r)\n", + " return result\n", + "\n", "bl_threshold = bl_mga_modifiers.get(\"mga\", {}).get(\"threshold_value\", {})\n", - "block_a_regions = bl_threshold.get(\"block_a\", [])\n", - "block_b_regions = bl_threshold.get(\"block_b\", [])\n", + "block_1_regions = _parse_block_regions(bl_threshold.get(\"block_1\", []))\n", + "block_2_regions = _parse_block_regions(bl_threshold.get(\"block_2\", []))\n", + "block_3_regions = _parse_block_regions(bl_threshold.get(\"block_3\", []))\n", "\n", "print(f\"Blocks MGA scenario: {bl_scenario}\")\n", "print(f\"Slack values: {bl_mga_slack_values}\")\n", - "print(f\"Block A ({len(block_a_regions)} regions): {block_a_regions}\")\n", - "print(f\"Block B ({len(block_b_regions)} regions): {block_b_regions}\")\n", + "print(f\"Block 1 ({len(block_1_regions)} regions): {block_1_regions}\")\n", + "print(f\"Block 2 ({len(block_2_regions)} regions): {block_2_regions}\")\n", + "print(f\"Block 3 ({len(block_3_regions)} regions): {block_3_regions}\")\n", "\n", "# Build region β†’ block mapping\n", "region_to_block = {}\n", - "for r in block_a_regions:\n", - " region_to_block[r] = \"block_a\"\n", - "for r in block_b_regions:\n", - " region_to_block[r] = \"block_b\"\n", + "for r in block_1_regions:\n", + " region_to_block[r] = \"block_1\"\n", + "for r in block_2_regions:\n", + " region_to_block[r] = \"block_2\"\n", + "for r in block_3_regions:\n", + " region_to_block[r] = \"block_3\"\n", "\n", "# ── Load PyPSA networks from mga-blocks results ──\n", "bl_results_dir = os.path.abspath(os.path.join(\n", @@ -758,25 +785,24 @@ "# or intra-block and sum trade volumes.\n", "\n", "carrier = bl_carrier\n", + "BLOCKS = [\"block_1\", \"block_2\", \"block_3\"]\n", "\n", - "# Track: total inter-block, aβ†’b, bβ†’a\n", + "# All 6 directional inter-block pairs\n", "bl_interblock_total = []\n", - "bl_a_to_b = []\n", - "bl_b_to_a = []\n", "bl_intrablock_total = []\n", + "# keyed as \"block_X β†’ block_Y\"\n", + "pair_series = {f\"{src} β†’ {dst}\": [] for src in BLOCKS for dst in BLOCKS if src != dst}\n", "\n", "for net_key in bl_sorted_keys:\n", " n_bl = bl_networks_dict[net_key]\n", "\n", " inter_total = 0.0\n", - " a2b = 0.0\n", - " b2a = 0.0\n", " intra_total = 0.0\n", + " pair_totals = {k: 0.0 for k in pair_series}\n", "\n", " shipping_links = n_bl.links[n_bl.links.carrier == f\"shipping_{carrier}\"]\n", "\n", " for link_name, link_row in shipping_links.iterrows():\n", - " # Extract region_from, region_to from bus names\n", " bus0 = link_row[\"bus0\"]\n", " bus1 = link_row[\"bus1\"]\n", " r_from = bus0.rsplit(f\"_{carrier}\", 1)[0]\n", @@ -791,29 +817,29 @@ "\n", " if block_from and block_to and block_from != block_to:\n", " inter_total += trade_vol\n", - " if block_from == \"block_a\":\n", - " a2b += trade_vol\n", - " else:\n", - " b2a += trade_vol\n", + " pair_key = f\"{block_from} β†’ {block_to}\"\n", + " if pair_key in pair_totals:\n", + " pair_totals[pair_key] += trade_vol\n", " else:\n", " intra_total += trade_vol\n", "\n", " bl_interblock_total.append(inter_total)\n", - " bl_a_to_b.append(a2b)\n", - " bl_b_to_a.append(b2a)\n", " bl_intrablock_total.append(intra_total)\n", + " for k in pair_series:\n", + " pair_series[k].append(pair_totals[k])\n", "\n", "# Build summary DataFrame\n", - "bl_summary = pd.DataFrame({\n", - " \"Inter-block total\": bl_interblock_total,\n", - " \"Block A β†’ Block B\": bl_a_to_b,\n", - " \"Block B β†’ Block A\": bl_b_to_a,\n", - " \"Intra-block total\": bl_intrablock_total,\n", - "}, index=bl_epsilon_values) / 1e6 # Mt\n", - "\n", + "summary_dict = {\"Inter-block total\": bl_interblock_total}\n", + "for k, vals in pair_series.items():\n", + " # humanise key: \"block_1 β†’ block_2\" β†’ \"Block 1 β†’ Block 2\"\n", + " label = k.replace(\"block_\", \"Group \").replace(\"_\", \" \")\n", + " summary_dict[label] = vals\n", + "summary_dict[\"Intra-block total\"] = bl_intrablock_total\n", + "\n", + "bl_summary = pd.DataFrame(summary_dict, index=bl_epsilon_values) / 1e6 # Mt\n", "bl_summary.index.name = \"MGA Slack (Ξ΅)\"\n", "print(\"HBI shipping trade by block classification (Mt):\")\n", - "bl_summary.round(1)" + "bl_summary.round(1)\n" ] }, { @@ -833,10 +859,23 @@ "source": [ "bl_epsilon_arr = np.array(bl_epsilon_values, dtype=float)\n", "\n", - "inter_arr = np.array(bl_interblock_total, dtype=float) / 1e6\n", - "a2b_arr = np.array(bl_a_to_b, dtype=float) / 1e6\n", - "b2a_arr = np.array(bl_b_to_a, dtype=float) / 1e6\n", - "intra_arr = np.array(bl_intrablock_total, dtype=float) / 1e6\n", + "inter_arr = np.array(bl_summary[\"Inter-block total\"].values, dtype=float)\n", + "intra_arr = np.array(bl_summary[\"Intra-block total\"].values, dtype=float)\n", + "\n", + "# Bloc colors from config\n", + "_bl_c1 = snakemake.config[\"colors\"].get(\"bloc_1\", \"#17679E\")\n", + "_bl_c2 = snakemake.config[\"colors\"].get(\"bloc_2\", \"#8352D8\")\n", + "_bl_c3 = snakemake.config[\"colors\"].get(\"bloc_3\", \"#BF9A39\")\n", + "\n", + "# All 6 directional pairs with distinct colours / styles\n", + "pair_plot_cfg = {\n", + " \"Block 1 β†’ Block 2\": dict(color=_bl_c1, linestyle=\"--\", marker=\"s\"),\n", + " \"Block 1 β†’ Block 3\": dict(color=_bl_c1, linestyle=\":\", marker=\"^\"),\n", + " \"Block 2 β†’ Block 1\": dict(color=_bl_c2, linestyle=\"--\", marker=\"s\"),\n", + " \"Block 2 β†’ Block 3\": dict(color=_bl_c2, linestyle=\":\", marker=\"^\"),\n", + " \"Block 3 β†’ Block 1\": dict(color=_bl_c3, linestyle=\"--\", marker=\"s\"),\n", + " \"Block 3 β†’ Block 2\": dict(color=_bl_c3, linestyle=\":\", marker=\"^\"),\n", + "}\n", "\n", "fig, ax = plt.subplots(1, 1, figsize=(12, 7))\n", "\n", @@ -844,13 +883,14 @@ "ax.plot(bl_epsilon_arr, inter_arr, color=\"black\", linewidth=3, marker=\"o\",\n", " markersize=8, label=\"Inter-block total\", zorder=20)\n", "\n", - "# ── Directional breakdown (dashed) ──\n", - "ax.plot(bl_epsilon_arr, a2b_arr, color=\"#e41a1c\", linewidth=1.5,\n", - " linestyle=\"--\", marker=\"s\", markersize=5, alpha=0.8,\n", - " label=\"Block A β†’ Block B\", zorder=10)\n", - "ax.plot(bl_epsilon_arr, b2a_arr, color=\"#377eb8\", linewidth=1.5,\n", - " linestyle=\"--\", marker=\"^\", markersize=5, alpha=0.8,\n", - " label=\"Block B β†’ Block A\", zorder=10)\n", + "# ── All 6 directional pairs ──\n", + "for label, cfg in pair_plot_cfg.items():\n", + " if label in bl_summary.columns:\n", + " vals = np.array(bl_summary[label].values, dtype=float)\n", + " ax.plot(bl_epsilon_arr, vals,\n", + " color=cfg[\"color\"], linewidth=1.5, linestyle=cfg[\"linestyle\"],\n", + " marker=cfg[\"marker\"], markersize=5, alpha=0.8,\n", + " label=label, zorder=10)\n", "\n", "# ── Intra-block trade (dotted grey) ──\n", "ax.plot(bl_epsilon_arr, intra_arr, color=\"#999999\", linewidth=1.5,\n", @@ -859,13 +899,13 @@ "\n", "# ── Axes formatting ──\n", "ax.set_xlim(min(bl_epsilon_arr) - 0.002, max(bl_epsilon_arr) + 0.01)\n", - "y_max = max(max(inter_arr), max(intra_arr)) * 1.15\n", + "y_max = max(inter_arr.max(), intra_arr.max()) * 1.15\n", "ax.set_ylim(0, y_max)\n", "ax.set_xlabel(\"MGA slack (fraction, Ξ΅)\", fontsize=12)\n", "ax.set_ylabel(\"HBI shipping trade (Mt)\", fontsize=12)\n", - "ax.set_title(\"Inter-Block vs Intra-Block HBI Trade vs MGA Slack (mga-blocks)\", fontsize=13)\n", + "ax.set_title(\"Inter-Block vs Intra-Block HBI Trade vs MGA Slack (mga-blocs)\", fontsize=13)\n", "ax.grid(True, linestyle=\"--\", linewidth=0.5, alpha=0.5)\n", - "ax.legend(loc=\"best\", fontsize=10, framealpha=0.95, title=\"Trade classification\")\n", + "ax.legend(loc=\"best\", fontsize=9, framealpha=0.95, title=\"Trade classification\")\n", "\n", "plt.tight_layout()\n", "plt.show()\n", @@ -877,8 +917,9 @@ "print(f\"Intra-block trade: {intra_arr[0]:.1f} Mt (optimal) β†’ {intra_arr[-1]:.1f} Mt (Ξ΅={bl_epsilon_arr[-1]})\")\n", "\n", "# Block definitions legend\n", - "print(f\"\\nBlock A: {', '.join(block_a_regions)}\")\n", - "print(f\"Block B: {', '.join(block_b_regions)}\")" + "print(f\"\\nBlock 1: {', '.join(block_1_regions)}\")\n", + "print(f\"Block 2: {', '.join(block_2_regions)}\")\n", + "print(f\"Block 3: {', '.join(block_3_regions)}\")\n" ] }, { @@ -899,6 +940,7 @@ "metadata": {}, "outputs": [], "source": [ + "\n", "# ═══════════════════════════════════════════════════════════════════════════════\n", "# 1) Chokepoint data (from df_cp / df_cp_display)\n", "# ═══════════════════════════════════════════════════════════════════════════════\n", @@ -908,18 +950,19 @@ "cp_eps = np.array([float(c) for c in cp_total_row.index]) * 100 # β†’ %\n", "cp_total_vals = np.array(cp_total_row.values, dtype=float)\n", "\n", - "# Per-chokepoint breakdown (only those with any trade)\n", + "# Per-chokepoint breakdown (only those with any trade), sorted by final value descending\n", "cp_region_lines = []\n", "for cpname in config_chokepoints:\n", " if cpname in df_cp.index and df_cp.loc[cpname].sum() > 0:\n", " vals = np.array(df_cp.loc[cpname].values, dtype=float)\n", " cp_region_lines.append(dict(\n", - " name=cpname.replace(\"_\", \" \").title(),\n", + " name=cp_display_names.get(cpname, cpname.replace(\"_\", \" \").title()),\n", " values=vals,\n", " color=cp_colors.get(cpname, \"#333333\"),\n", - " linestyle=\"-\",\n", - " alpha=0.6,\n", + " linestyle=cp_linestyles.get(cpname, \"-\"),\n", + " alpha=0.8 if cpname in (\"babalmandab\", \"suez\") else 0.6,\n", " ))\n", + "cp_region_lines.sort(key=lambda d: d[\"values\"][-1], reverse=True)\n", "\n", "# ═══════════════════════════════════════════════════════════════════════════════\n", "# 2) Stable exporters data (from df_hbi)\n", @@ -934,33 +977,34 @@ " df_hbi[df_hbi[\"Stability Class\"] == \"Unstable\"][stab_eps_cols].sum().values, dtype=float\n", ")\n", "\n", - "# Per-region breakdown for stable regions (only those with production)\n", + "# Per-region breakdown, sorted by final value descending within each group\n", "stab_region_lines_stable = []\n", "for region in stable_regions:\n", " if region in df_hbi.index:\n", " vals = np.array(df_hbi.loc[region, stab_eps_cols].values, dtype=float)\n", " if vals.sum() > 0:\n", " stab_region_lines_stable.append(dict(\n", - " name=region.replace(\"_\", \" \"),\n", + " name=region_nice_names.get(region, region.replace(\"_\", \" \")),\n", " values=vals,\n", " color=region_colors.get(region, \"#333333\"),\n", " linestyle=\"-\",\n", " alpha=0.6,\n", " ))\n", + "stab_region_lines_stable.sort(key=lambda d: d[\"values\"][-1], reverse=True)\n", "\n", - "# Per-region breakdown for unstable regions (only those with production)\n", "stab_region_lines_unstable = []\n", "for region in unstable_regions:\n", " if region in df_hbi.index:\n", " vals = np.array(df_hbi.loc[region, stab_eps_cols].values, dtype=float)\n", " if vals.sum() > 0:\n", " stab_region_lines_unstable.append(dict(\n", - " name=region.replace(\"_\", \" \"),\n", + " name=region_nice_names.get(region, region.replace(\"_\", \" \")),\n", " values=vals,\n", " color=region_colors.get(region, \"#333333\"),\n", " linestyle=\"--\",\n", " alpha=0.7,\n", " ))\n", + "stab_region_lines_unstable.sort(key=lambda d: d[\"values\"][-1], reverse=True)\n", "\n", "# ═══════════════════════════════════════════════════════════════════════════════\n", "# 3) Blocs data (from bl_summary)\n", @@ -968,13 +1012,30 @@ "bl_eps = np.array([float(c) for c in bl_summary.index]) * 100 # β†’ %\n", "bl_inter_vals = np.array(bl_summary[\"Inter-block total\"].values, dtype=float)\n", "bl_intra_vals = np.array(bl_summary[\"Intra-block total\"].values, dtype=float)\n", - "bl_a2b_vals = np.array(bl_summary[\"Block A β†’ Block B\"].values, dtype=float)\n", - "bl_b2a_vals = np.array(bl_summary[\"Block B β†’ Block A\"].values, dtype=float)\n", "\n", - "bl_region_lines = [\n", - " dict(name=\"Bloc A β†’ Bloc B\", values=bl_a2b_vals, color=\"#e41a1c\", linestyle=\"-\", alpha=0.6),\n", - " dict(name=\"Bloc B β†’ Bloc A\", values=bl_b2a_vals, color=\"#377eb8\", linestyle=\"-\", alpha=0.6),\n", - "]\n", + "# All 6 directional pairs with consistent colours per source bloc (from config)\n", + "_bl_c1 = snakemake.config[\"colors\"].get(\"bloc_1\", \"#17679E\")\n", + "_bl_c2 = snakemake.config[\"colors\"].get(\"bloc_2\", \"#8352D8\")\n", + "_bl_c3 = snakemake.config[\"colors\"].get(\"bloc_3\", \"#BF9A39\")\n", + "_bl_pair_cfg = {\n", + " \"Block 1 β†’ Block 2\": dict(color=_bl_c1, linestyle=\"--\"),\n", + " \"Block 1 β†’ Block 3\": dict(color=_bl_c1, linestyle=\":\"),\n", + " \"Block 2 β†’ Block 1\": dict(color=_bl_c2, linestyle=\"--\"),\n", + " \"Block 2 β†’ Block 3\": dict(color=_bl_c2, linestyle=\":\"),\n", + " \"Block 3 β†’ Block 1\": dict(color=_bl_c3, linestyle=\"--\"),\n", + " \"Block 3 β†’ Block 2\": dict(color=_bl_c3, linestyle=\":\"),\n", + "}\n", + "bl_region_lines_unsorted = []\n", + "for label, cfg in _bl_pair_cfg.items():\n", + " if label in bl_summary.columns:\n", + " bl_region_lines_unsorted.append(dict(\n", + " name=label,\n", + " values=np.array(bl_summary[label].values, dtype=float),\n", + " color=cfg[\"color\"],\n", + " linestyle=cfg[\"linestyle\"],\n", + " alpha=0.7,\n", + " ))\n", + "bl_region_lines = sorted(bl_region_lines_unsorted, key=lambda d: d[\"values\"][-1], reverse=False)\n", "\n", "# ═══════════════════════════════════════════════════════════════════════════════\n", "# Plot definitions\n", @@ -983,7 +1044,7 @@ "\n", "plots = [\n", " dict(\n", - " title=\"Instable trade routes (chokepoints)\",\n", + " title=\"Unstable trade routes (chokepoints)\",\n", " epsilon=cp_eps,\n", " main_curve=cp_total_vals,\n", " y_mid=cp_total_vals[0],\n", @@ -991,22 +1052,27 @@ " alpha=0.25,\n", " arrow_up=None,\n", " arrow_dn=[\"Decreased\", \"high-risk routes\"],\n", + " arrow_x_frac=0.70,\n", " y_label_add=\"trade through maritime chokepoints\",\n", " regions=cp_region_lines,\n", " extra_curves=[],\n", " ),\n", " dict(\n", - " title=\"Stable exporters\",\n", + " title=\"Production in unstable countries\",\n", " epsilon=stab_eps,\n", - " main_curve=stab_stable_total,\n", - " y_mid=stab_stable_total[0],\n", + " main_curve=stab_unstable_total,\n", + " y_mid=stab_unstable_total[0],\n", " color=\"#3B6D11\",\n", " alpha=0.25,\n", - " arrow_up=[\"Increased stable\", \"HBI producers\"],\n", - " arrow_dn=None,\n", + " arrow_up=None,\n", + " arrow_dn=[\"Decreased unstable\", \"production\"],\n", + " arrow_x_frac=0.45,\n", " y_label_add=\"production in stable regions\",\n", " regions=stab_region_lines_stable + stab_region_lines_unstable,\n", " extra_curves=[],\n", + " # Legend grouping: n_stable stable lines, then n_unstable unstable lines\n", + " n_stable=len(stab_region_lines_stable),\n", + " n_unstable=len(stab_region_lines_unstable),\n", " ),\n", " dict(\n", " title=\"Fragmentation / Bloc trade\",\n", @@ -1017,7 +1083,8 @@ " alpha=0.25,\n", " arrow_up=None,\n", " arrow_dn=[\"Decreased trade\", \"between blocs\"],\n", - " y_label_add=\"trade between Bloc A and B\",\n", + " arrow_x_frac=0.70,\n", + " y_label_add=\"trade between blocs\",\n", " regions=bl_region_lines,\n", " extra_curves=[\n", " dict(name=\"Intra-bloc total\", values=bl_intra_vals,\n", @@ -1040,7 +1107,7 @@ " y_mid = p[\"y_mid\"]\n", " gap = Y_MAX * GAP_FRAC\n", "\n", - " # Main curve (straight lines, no spline)\n", + " # Main curve\n", " ax.plot(eps, curve, color=p[\"color\"], linewidth=2.5, marker=\"o\",\n", " markersize=4, label=\"Global\", zorder=10)\n", "\n", @@ -1051,7 +1118,7 @@ " linestyle=ec[\"linestyle\"], alpha=ec[\"alpha\"],\n", " marker=\"d\", markersize=3, label=ec[\"name\"], zorder=5)\n", "\n", - " # Regional decomposition lines (straight lines)\n", + " # Regional decomposition lines\n", " if p.get(\"regions\"):\n", " for reg in p[\"regions\"]:\n", " ax.plot(eps, reg[\"values\"], color=reg[\"color\"], linewidth=1.2,\n", @@ -1066,17 +1133,30 @@ " ax.set_title(p[\"title\"], fontsize=13, fontweight=\"medium\", pad=10)\n", " ax.grid(True, linestyle=\"--\", linewidth=0.5, alpha=0.5)\n", "\n", - " # Legend\n", - " ax.legend(loc=\"best\", fontsize=7, framealpha=0.9)\n", + " # ── Legend: Global always on top; within groups, lines sorted by value (highβ†’low) ──\n", + " handles, labels = ax.get_legend_handles_labels()\n", + " if \"n_stable\" in p:\n", + " # Production subplot: Global | stable group (pre-sorted) | unstable group (pre-sorted)\n", + " n_s = p[\"n_stable\"]\n", + " global_h, global_l = handles[:1], labels[:1]\n", + " stable_h, stable_l = handles[1:1+n_s], labels[1:1+n_s]\n", + " unstable_h, unstable_l = handles[1+n_s:], labels[1+n_s:]\n", + " ax.legend(global_h + stable_h + unstable_h,\n", + " global_l + stable_l + unstable_l,\n", + " loc=\"best\", fontsize=7, framealpha=0.9)\n", + " else:\n", + " # Global on top, remaining entries reversed (highest value at top)\n", + " ax.legend([handles[0]] + handles[1:][::-1],\n", + " [labels[0]] + labels[1:][::-1],\n", + " loc=\"best\", fontsize=7, framealpha=0.9)\n", "\n", " # ── Arrows ──\n", " arrowprops = dict(arrowstyle=\"->\", color=\"#444441\", lw=1.4, mutation_scale=12)\n", "\n", - " # Arrow x-position: 70 % of the way across the Ξ΅ range\n", - " arrow_x = eps[0] + 0.70 * (eps[-1] - eps[0])\n", - " label_x = eps[0] + 0.75 * (eps[-1] - eps[0])\n", + " arrow_x_frac = p.get(\"arrow_x_frac\", 0.70)\n", + " arrow_x = eps[0] + arrow_x_frac * (eps[-1] - eps[0])\n", + " label_x = eps[0] + (arrow_x_frac + 0.05) * (eps[-1] - eps[0])\n", "\n", - " # Interpolate curve value at arrow_x for endpoint\n", " curve_at_arrow = np.interp(arrow_x, eps, curve)\n", "\n", " if p[\"arrow_dn\"] is not None:\n", @@ -1102,9 +1182,424 @@ " fontsize=8, va=\"center\", ha=\"left\", color=\"#444441\", clip_on=False)\n", "\n", "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "7c36edb7", + "metadata": {}, + "source": [ + "---\n", + "# Supply Constraint Pareto: Per-Region HBI Production vs Cost Premium\n", + "\n", + "Load the `constrain-supply` scenario networks, compute the cost premium (Ξ΅) relative to the unconstrained optimum for each per-region supply cap, and extract regional HBI production β€” analogous to the MGA stability analysis above but driven by supply-cap tightness rather than MGA slack.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d3ac6f7", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# ── Load Pareto Supply Constraint networks ────────────────────────────────────\n", + "pareto_scenario_name = extract_scenario(snakemake.input.network_pareto_supply)\n", + "pareto_cfg = snakemake.config.get(\"scenario\", {}).get(pareto_scenario_name, {})\n", + "pareto_limits_cfg = (\n", + " pareto_cfg.get(\"modifiers\", {})\n", + " .get(\"pareto\", {})\n", + " .get(\"threshold_value\", [])\n", + ")\n", + "\n", + "pareto_dir = os.path.dirname(snakemake.input.network_pareto_supply)\n", + "print(f\"Pareto supply directory: {pareto_dir}\")\n", + "print(f\"Configured per-region caps (Mt): {pareto_limits_cfg}\")\n", + "\n", + "# Optimal (unconstrained) β€” same as network.nc but stored as network_nan.nc in the collection\n", + "opt_path = os.path.join(pareto_dir, \"network_nan.nc\")\n", + "if not os.path.exists(opt_path):\n", + " opt_path = snakemake.input.network_pareto_supply # fallback: network.nc\n", + "\n", + "pareto_nets = {}\n", + "pareto_nets[None] = pypsa.Network(opt_path)\n", + "print(\" βœ“ Loaded optimal (unconstrained)\")\n", + "\n", + "for lim in pareto_limits_cfg:\n", + " path = os.path.join(pareto_dir, f\"network_{float(lim)}.nc\")\n", + " if os.path.exists(path):\n", + " pareto_nets[float(lim)] = pypsa.Network(path)\n", + " print(f\" βœ“ Loaded limit = {lim} Mt\")\n", + " else:\n", + " print(f\" βœ— Not found: {path}\")\n", + "\n", + "# ── Compute total system cost for each network ────────────────────────────────\n", + "def total_system_cost_bn(n):\n", + " \"\"\"Return total system cost in billion EUR.\"\"\"\n", + " tsc = (\n", + " pd.concat([n.statistics.capex(), n.statistics.opex()], axis=1)\n", + " .sum(axis=1)\n", + " .div(1e9)\n", + " )\n", + " return float(tsc.sum())\n", + "\n", + "optimal_cost_pareto = total_system_cost_bn(pareto_nets[None])\n", + "print(f\"\\nOptimal system cost: {optimal_cost_pareto:.3f} B€\")\n", + "\n", + "# Compute Ξ΅ = (cost_constrained βˆ’ cost_optimal) / cost_optimal for every network,\n", + "# then sort by Ξ΅ ascending so the x-axis runs from 0 (unconstrained) to max Ξ΅.\n", + "pareto_entries = [(None, 0.0)]\n", + "for key in [k for k in pareto_nets if k is not None]:\n", + " cost = total_system_cost_bn(pareto_nets[key])\n", + " eps = (cost - optimal_cost_pareto) / optimal_cost_pareto\n", + " pareto_entries.append((key, eps))\n", + "\n", + "pareto_entries.sort(key=lambda x: x[1]) # sort by Ξ΅ ascending\n", + "\n", + "# ── Deduplicate entries with identical Ξ΅ ──────────────────────────────────────\n", + "# Non-binding constraints (e.g. a 400 Mt cap when optimal production is already\n", + "# below 400 Mt everywhere) produce the same cost as the unconstrained optimal,\n", + "# yielding Ξ΅ = 0 for multiple entries. Duplicate Ξ΅ values would create duplicate\n", + "# DataFrame column labels, causing pandas .loc to return more values than expected.\n", + "# Keep the first occurrence (= unconstrained optimal for Ξ΅=0 ties).\n", + "seen_eps: set = set()\n", + "deduped: list = []\n", + "for key, eps in pareto_entries:\n", + " eps_key = round(eps, 8) # round to absorb floating-point noise\n", + " if eps_key not in seen_eps:\n", + " seen_eps.add(eps_key)\n", + " deduped.append((key, eps))\n", + " else:\n", + " label = \"unconstrained\" if key is None else f\"{key:.0f} Mt cap\"\n", + " print(f\" (skipped duplicate Ξ΅={eps*100:.3f}%: {label})\")\n", + "pareto_entries = deduped\n", + "\n", + "ordered_pareto_keys = [e[0] for e in pareto_entries]\n", + "pareto_eps_arr_frac = np.array([e[1] for e in pareto_entries], dtype=float)\n", + "\n", + "for key, eps in pareto_entries:\n", + " label = \"unconstrained\" if key is None else f\"{key:.0f} Mt cap\"\n", + " cost = total_system_cost_bn(pareto_nets[key])\n", + " print(f\" {label:25s}: cost = {cost:.3f} B€ β†’ Ξ΅ = {eps * 100:.2f}%\")\n", + "\n", + "# ── Extract HBI production per region ─────────────────────────────────────────\n", + "# Reuse all_regions / stable_regions / unstable_regions from the stability cell above\n", + "pareto_hbi_data = {region: [] for region in all_regions}\n", + "\n", + "for key in ordered_pareto_keys:\n", + " n_p = pareto_nets[key]\n", + " regional_totals = {region: 0.0 for region in all_regions}\n", + "\n", + " for link_idx, link_row in n_p.links.iterrows():\n", + " if link_row[\"carrier\"] == \"hbi\":\n", + " bus1 = link_row[\"bus1\"]\n", + " if hasattr(n_p, \"links_t\") and \"p0\" in n_p.links_t:\n", + " p_sum = n_p.links_t[\"p0\"][link_idx].sum()\n", + " else:\n", + " p_sum = link_row.get(\"p_nom_opt\", 0.0)\n", + "\n", + " if not pd.isna(p_sum) and p_sum > 0:\n", + " for region in all_regions:\n", + " if bus1.startswith(region):\n", + " regional_totals[region] += p_sum\n", + " break\n", + "\n", + " for region in all_regions:\n", + " pareto_hbi_data[region].append(regional_totals[region])\n", + "\n", + "# Build DataFrame: regions Γ— Ξ΅ values (using integer positions as column names\n", + "# to avoid duplicate-label issues when several caps produce identical Ξ΅)\n", + "n_scenarios = len(pareto_eps_arr_frac)\n", + "df_pareto_hbi = pd.DataFrame(\n", + " pareto_hbi_data,\n", + " index=range(n_scenarios)\n", + ").T / 1e6\n", + "df_pareto_hbi = df_pareto_hbi / snakemake.config[\"iron_ore\"][\"ore_to_steel_ratio\"]\n", + "df_pareto_hbi.index.name = \"Region\"\n", + "df_pareto_hbi.columns.name = \"Scenario index\"\n", + "\n", + "# Attach political-stability metadata (for consistent colour/style coding)\n", + "df_pareto_hbi[\"Political Stability\"] = stability_df.iloc[:, 0]\n", + "df_pareto_hbi[\"Stability Class\"] = df_pareto_hbi.index.map(\n", + " lambda r: \"Stable\" if r in stable_regions else \"Unstable\"\n", + ")\n", + "\n", + "pareto_eps_cols = df_pareto_hbi.columns[:-2] # integer scenario indices (0, 1, 2, ...)\n", + "\n", + "print(f\"\\n{len(pareto_entries)} unique scenarios after deduplication\")\n", + "print(\"\\nHBI Production summary (Mt):\")\n", + "df_pareto_hbi[pareto_eps_cols].round(1)\n" + ] + }, + { + "cell_type": "markdown", + "id": "70077fcf", + "metadata": {}, + "source": [ + "---\n", + "# Combined Overview Plot (v2): Chokepoints | Supply Constraint | Blocs\n", + "\n", + "Same three-panel layout as above, but the centre panel now shows the **supply-constraint Pareto front** β€” how HBI production redistributes across regions as per-region production is progressively capped (x-axis = cost premium Ξ΅ derived from each constrained optimisation).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffc601e6", + "metadata": {}, + "outputs": [], + "source": [ + "steel_demand = pd.read_csv(snakemake.input.steel_demand, index_col=\"region\")\n", + "steel_demand = steel_demand[\"SteelDemand_DRI_Mt\"].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8510fbc6", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "# 1) Chokepoint data β€” reused from df_cp / df_cp_display (computed above)\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "cp_total_row_v2 = df_cp_display.loc[\"TOTAL (all chokepoints)\"]\n", + "cp_eps_v2 = np.array([float(c) for c in cp_total_row_v2.index]) * 100 # β†’ %\n", + "cp_total_vals_v2 = np.array(cp_total_row_v2.values, dtype=float)\n", + "\n", + "cp_region_lines_v2 = []\n", + "for cpname in config_chokepoints:\n", + " if cpname in df_cp.index and df_cp.loc[cpname].sum() > 0:\n", + " vals = np.array(df_cp.loc[cpname].values, dtype=float)\n", + " cp_region_lines_v2.append(dict(\n", + " name=cp_display_names.get(cpname, cpname.replace(\"_\", \" \").title()),\n", + " values=vals,\n", + " color=cp_colors.get(cpname, \"#333333\"),\n", + " linestyle=cp_linestyles.get(cpname, \"-\"),\n", + " alpha=0.8 if cpname in (\"babalmandab\", \"suez\") else 0.6,\n", + " ))\n", + "cp_region_lines_v2.sort(key=lambda d: d[\"values\"][-1], reverse=True)\n", + "\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "# 2) Supply constraint data β€” from df_pareto_hbi / pareto_eps_arr_frac\n", + "#\n", + "# pareto_eps_cols : integer position labels (0, 1, 2, …) β€” safe for .loc\n", + "# sc_eps_pct : actual Ξ΅ values in % (from pareto_eps_arr_frac)\n", + "# sc_cap_vals : \"max. per supplier\" curve\n", + "# β€’ unconstrained optimum (key=None, Ξ΅=0): max configured\n", + "# cap value from config (pareto_limits_cfg)\n", + "# β€’ constrained scenarios: raw threshold_value from config\n", + "# (Mt, as specified β€” no unit conversion applied)\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "sc_eps_pct = pareto_eps_arr_frac * 100 # β†’ %\n", + "\n", + "# Build cap line directly from config threshold values (ordered by Ξ΅ ascending,\n", + "# matching the column order of df_pareto_hbi).\n", + "# For the unconstrained optimal (key=None, Ξ΅=0), use the maximum configured cap\n", + "# value so the curve starts at the \"no constraint\" level.\n", + "sc_cap_vals = np.array([\n", + " float(max(float(x) for x in pareto_limits_cfg)) if key is None\n", + " else float(key)\n", + " for key in ordered_pareto_keys\n", + "], dtype=float)\n", + "print(f\"max. per supplier line (cap values): {sc_cap_vals}\")\n", + "\n", + "# Individual region lines β€” all solid (stable/unstable not distinguished here)\n", + "sc_region_lines = []\n", + "for region in all_regions:\n", + " vals = np.array(df_pareto_hbi.loc[region, pareto_eps_cols].values, dtype=float)\n", + " if vals.sum() > 0:\n", + " sc_region_lines.append(dict(\n", + " name=region_nice_names.get(region, region.replace(\"_\", \" \")),\n", + " values=vals,\n", + " color=region_colors.get(region, \"#333333\"),\n", + " linestyle=\"-\",\n", + " alpha=0.65,\n", + " ))\n", + "# Sort by production at Ξ΅=0 descending so the legend lists largest producers first\n", + "sc_region_lines.sort(key=lambda d: d[\"values\"][0], reverse=True)\n", + "\n", + "# Total production across all regions (approximately constant = demand-driven)\n", + "sc_total_vals = np.array(df_pareto_hbi[pareto_eps_cols].sum().values, dtype=float)\n", + "\n", + "assert len(sc_eps_pct) == len(sc_cap_vals), (\n", + " f\"eps ({len(sc_eps_pct)}) and cap curve ({len(sc_cap_vals)}) length mismatch\"\n", + ")\n", + "\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "# 3) Blocs data β€” reused from bl_summary (computed above)\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "bl_eps_v2 = np.array([float(c) for c in bl_summary.index]) * 100 # β†’ %\n", + "bl_inter_vals_v2 = np.array(bl_summary[\"Inter-block total\"].values, dtype=float)\n", + "bl_intra_vals_v2 = np.array(bl_summary[\"Intra-block total\"].values, dtype=float)\n", + "\n", + "# Bloc colors from config\n", + "_bl_c1_v2 = snakemake.config[\"colors\"].get(\"bloc_1\", \"#17679E\")\n", + "_bl_c2_v2 = snakemake.config[\"colors\"].get(\"bloc_2\", \"#8352D8\")\n", + "_bl_c3_v2 = snakemake.config[\"colors\"].get(\"bloc_3\", \"#BF9A39\")\n", + "_bl_pair_cfg_v2 = {\n", + " \"Group 1 β†’ Group 2\": dict(color=_bl_c1_v2, linestyle=\"--\"),\n", + " \"Group 1 β†’ Group 3\": dict(color=_bl_c1_v2, linestyle=\":\"),\n", + " \"Group 2 β†’ Group 1\": dict(color=_bl_c2_v2, linestyle=\"--\"),\n", + " \"Group 2 β†’ Group 3\": dict(color=_bl_c2_v2, linestyle=\":\"),\n", + " \"Group 3 β†’ Group 1\": dict(color=_bl_c3_v2, linestyle=\"--\"),\n", + " \"Group 3 β†’ Group 2\": dict(color=_bl_c3_v2, linestyle=\":\"),\n", + "}\n", + "bl_region_lines_v2 = sorted(\n", + " [\n", + " dict(name=label, values=np.array(bl_summary[label].values, dtype=float),\n", + " color=cfg[\"color\"], linestyle=cfg[\"linestyle\"], alpha=0.7)\n", + " for label, cfg in _bl_pair_cfg_v2.items()\n", + " if label in bl_summary.columns\n", + " ],\n", + " key=lambda d: d[\"values\"][-1],\n", + " reverse=False,\n", + ")\n", + "\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "# Convert absolute values (Mt) to relative values (% of global steel demand)\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "def _scale_lines(lines, factor):\n", + " \"\"\"Return a copy of a list of region-line dicts with values scaled by factor.\"\"\"\n", + " return [{**r, \"values\": r[\"values\"] * factor} for r in lines]\n", + "\n", + "_pct_factor = 100.0 / steel_demand # Mt β†’ % of market share\n", + "\n", + "cp_total_vals_v2_pct = cp_total_vals_v2 * _pct_factor\n", + "cp_region_lines_v2_pct = _scale_lines(cp_region_lines_v2, _pct_factor)\n", + "\n", + "bl_inter_vals_v2_pct = bl_inter_vals_v2 * _pct_factor\n", + "bl_intra_vals_v2_pct = bl_intra_vals_v2 * _pct_factor\n", + "bl_region_lines_v2_pct = _scale_lines(bl_region_lines_v2, _pct_factor)\n", + "\n", + "sc_cap_vals_pct = sc_cap_vals * _pct_factor\n", + "sc_region_lines_pct = _scale_lines(sc_region_lines, _pct_factor)\n", + "\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "# Combined plot β€” v2\n", + "# ═══════════════════════════════════════════════════════════════════════════════\n", + "Y_MAX_V2 = 100\n", + "GAP_FRAC_V2 = 0.04\n", + "\n", + "plots_v2 = [\n", + " dict(\n", + " title=\"Stable trade routes (chokepoints)\",\n", + " epsilon=cp_eps_v2,\n", + " main_curve=cp_total_vals_v2_pct,\n", + " main_label=\"Global\",\n", + " y_mid=cp_total_vals_v2_pct[0],\n", + " color=\"#000000\",\n", + " arrow_dn=[\"Minimize\", \"high-risk routes\"],\n", + " arrow_x_frac=0.40,\n", + " y_label_add=\"trade through maritime chokepoints \\nin % of market share\",\n", + " regions=cp_region_lines_v2_pct,\n", + " extra_curves=[],\n", + " ),\n", + " dict(\n", + " title=\"Friendshoring\",\n", + " epsilon=bl_eps_v2,\n", + " main_curve=bl_inter_vals_v2_pct,\n", + " main_label=\"Global\",\n", + " y_mid=bl_inter_vals_v2_pct[0],\n", + " color=\"#000000\",\n", + " arrow_dn=[\"Minimize trade with\", \"non-friendshored regions\"],\n", + " arrow_x_frac=0.40,\n", + " y_label_add=\"trade between groups \\nin % of market share\",\n", + " regions=bl_region_lines_v2_pct,\n", + " extra_curves=[\n", + " dict(name=\"Friendshoring total\", values=bl_intra_vals_v2_pct,\n", + " color=\"#999999\", linestyle=\":\", linewidth=1.5, alpha=0.7),\n", + " ],\n", + " ),\n", + " dict(\n", + " title=\"Supply diversification\",\n", + " epsilon=sc_eps_pct,\n", + " main_curve=sc_cap_vals_pct,\n", + " main_label=\"max. per supplier\",\n", + " y_mid=sc_cap_vals_pct[0],\n", + " color=\"#000000\",\n", + " arrow_dn=[\"Constrain production\", \"per supplier\"],\n", + " arrow_x_frac=0.30,\n", + " y_label_add=\"production by region \\nin % of market share\",\n", + " regions=sc_region_lines_pct,\n", + " extra_curves=[],\n", + " ),\n", + "]\n", + "\n", + "fig_v2, axes_v2 = plt.subplots(1, 3, figsize=(15, 5))\n", + "fig_v2.subplots_adjust(wspace=0.35)\n", + "\n", + "arrowprops_v2 = dict(arrowstyle=\"->\", color=\"#444441\", lw=1.4, mutation_scale=12)\n", + "\n", + "for ax, p in zip(axes_v2, plots_v2):\n", + " eps = p[\"epsilon\"]\n", + " curve = p[\"main_curve\"]\n", + " y_mid = p[\"y_mid\"]\n", + " gap = Y_MAX_V2 * GAP_FRAC_V2\n", + "\n", + " # ── Main curve ───────────────────────────────────────────────────────────\n", + " ax.plot(eps, curve, color=p[\"color\"], linewidth=1.5, marker=\"o\",markersize=3, label=p[\"main_label\"], zorder=0, linestyle=\"-\")\n", + "\n", + " # ── Extra reference curves ───────────────────────────────────────────────\n", + " for ec in p.get(\"extra_curves\", []):\n", + " ax.plot(eps, ec[\"values\"],\n", + " color=ec[\"color\"],\n", + " linewidth=ec.get(\"linewidth\", 1.2),\n", + " linestyle=ec[\"linestyle\"],\n", + " alpha=ec[\"alpha\"],\n", + " marker=\"d\", markersize=3,\n", + " label=ec[\"name\"], zorder=5)\n", + "\n", + " # ── Per-region decomposition lines ───────────────────────────────────────\n", + " for reg in p.get(\"regions\", []):\n", + " ax.plot(eps, reg[\"values\"],\n", + " color=reg[\"color\"], linewidth=1.2,\n", + " linestyle=reg[\"linestyle\"], alpha=reg[\"alpha\"],\n", + " label=reg[\"name\"], zorder=5)\n", + "\n", + " # ── Axes ─────────────────────────────────────────────────────────────────\n", + " ax.set_xlim(eps[0], eps[-1])\n", + " ax.set_ylim(0, Y_MAX_V2)\n", + " ax.set_yticks(np.arange(0, Y_MAX_V2 + 1, 10))\n", + " ax.set_xlabel(\"Ξ΅ in %\", fontsize=11)\n", + " ax.set_ylabel(f\"HBI {p['y_label_add']}\", fontsize=10, labelpad=-2)\n", + " ax.set_title(p[\"title\"], fontsize=13, fontweight=\"medium\", pad=10)\n", + " ax.grid(True, linestyle=\"--\", linewidth=0.5, alpha=0.5)\n", + "\n", + " # ── Legend: main curve first, then remaining reversed (highest value on top) ──\n", + " handles, labels = ax.get_legend_handles_labels()\n", + " ax.legend(\n", + " [handles[0]] + handles[1:][::-1],\n", + " [labels[0]] + labels[1:][::-1],\n", + " loc=\"best\", fontsize=7, framealpha=0.9,\n", + " )\n", + "\n", + " # ── Downward arrow ───────────────────────────────────────────────────────\n", + " if p.get(\"arrow_dn\") is not None:\n", + " arrow_x_frac = p.get(\"arrow_x_frac\", 0.70)\n", + " arrow_x = eps[0] + arrow_x_frac * (eps[-1] - eps[0])\n", + " label_x = eps[0] + (arrow_x_frac + 0.05) * (eps[-1] - eps[0])\n", + " curve_at_arrow = np.interp(arrow_x, eps, curve)\n", + " y_start = y_mid - gap\n", + " y_end = curve_at_arrow\n", + " if y_end < y_start:\n", + " ax.annotate(\"\", xy=(arrow_x, y_end), xytext=(arrow_x, y_start),\n", + " xycoords=\"data\", textcoords=\"data\",\n", + " arrowprops=arrowprops_v2, clip_on=False)\n", + " ax.text(label_x, (y_start + y_end) / 2, \"\\n\".join(p[\"arrow_dn\"]),\n", + " fontsize=8, va=\"center\", ha=\"left\", color=\"#444441\", clip_on=False)\n", + "\n", + "plt.tight_layout()\n", + "\n", "plt.savefig(snakemake.output.mga_plot, dpi=300, bbox_inches=\"tight\")\n", "plt.savefig(snakemake.output.mga_plot_png, dpi=300, bbox_inches=\"tight\")\n", - "plt.show()\n" + "plt.show()\n", + "\n", + "# ── Summary stats ─────────────────────────────────────────────────────────────\n", + "print(f\"\\nmax. per supplier cap: {sc_cap_vals[0]:.1f} Mt (Ξ΅=0) β†’ {sc_cap_vals[-1]:.1f} Mt (Ξ΅={sc_eps_pct[-1]:.2f}%)\")\n", + "print(f\"Total production: {sc_total_vals[0]:.1f} Mt (Ξ΅=0) β†’ {sc_total_vals[-1]:.1f} Mt (Ξ΅={sc_eps_pct[-1]:.2f}%)\")\n" ] }, { diff --git a/workflow/notebooks/plot_countries.ipynb b/workflow/notebooks/plot_countries.ipynb index 7241f3b..622bbac 100644 --- a/workflow/notebooks/plot_countries.ipynb +++ b/workflow/notebooks/plot_countries.ipynb @@ -7,11 +7,10 @@ "metadata": {}, "outputs": [], "source": [ - "import pandas as pd\n", "import geopandas as gpd\n", "import matplotlib.pyplot as plt\n", "import cartopy.io.shapereader as shpreader\n", - "import pycountry\n" + "import pycountry" ] }, { @@ -21,13 +20,11 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", + "\n", "snakemake = mock_snakemake(\n", - " \"collect_figures\",\n", - " scenario=\"default\", # default, penalty-sa, penalty-ea, penalty-nwa, penalty-oc\n", - " sort=\"global\",\n", - " demand=\"True\",\n", - " )" + " \"plot_regions\",\n", + ")" ] }, { @@ -55,7 +52,7 @@ "metadata": {}, "outputs": [], "source": [ - "regions = config['regions']" + "regions = config[\"regions\"]" ] }, { @@ -65,32 +62,7 @@ "metadata": {}, "outputs": [], "source": [ - "country_name_corrections = {\n", - " \"Democratic Republic of the Congo\": \"Congo, The Democratic Republic of the\",\n", - " \"Republic of the Congo\": \"Republic of the Congo\",\n", - " \"Kosovo\": \"Republic of Kosovo\", # pycountry not supported\n", - " \"Russia\": \"Russian Federation\",\n", - " \"Turkey\": \"TΓΌrkiye\",\n", - " \"Venezuela\": \"Venezuela, Bolivarian Republic of\",\n", - " \"Tanzania\": \"United Republic of Tanzania\",\n", - " \"Bolivia\": \"Plurinational State of Bolivia\",\n", - " \"Vietnam\": \"Viet Nam\",\n", - " \"South Korea\": \"Korea, Republic of\",\n", - " \"North Korea\": \"Korea, Democratic People's Republic of\",\n", - " \"Taiwan\": \"Taiwan, Province of China\",\n", - " \"Laos\": \"Lao People's Democratic Republic\",\n", - " \"Brunei\": \"Brunei Darussalam\",\n", - " \"Equatorial French Guiana\": \"French Guiana\",\n", - " \"Syria\": \"Syrian Arab Republic\", \n", - " \"Palestine\": \"Palestine, State of\",\n", - " \"Moldova\": \"Republic of Moldova\",\n", - "}\n", - "\n", - "# Apply a country name correction to the regions dict\n", - "for region, countries in regions.items():\n", - " for i, country in enumerate(countries):\n", - " if country in country_name_corrections:\n", - " countries[i] = country_name_corrections[country]" + "# Regions in config already use ISO alpha_3 codes β€” no name corrections needed" ] }, { @@ -109,10 +81,8 @@ "outputs": [], "source": [ "# Use cartopy to get natural earth countries shapefile\n", - "shapename = 'admin_0_countries'\n", - "reader = shpreader.natural_earth(resolution='110m',\n", - " category='cultural',\n", - " name=shapename)\n", + "shapename = \"admin_0_countries\"\n", + "reader = shpreader.natural_earth(resolution=\"110m\", category=\"cultural\", name=shapename)\n", "\n", "world = gpd.read_file(reader)" ] @@ -132,9 +102,9 @@ "metadata": {}, "outputs": [], "source": [ - "def country_to_iso_a2(country_name):\n", + "def admin_to_iso_a3(country_name):\n", " try:\n", - " return pycountry.countries.lookup(country_name).alpha_2\n", + " return pycountry.countries.lookup(country_name).alpha_3\n", " except LookupError:\n", " return None" ] @@ -146,29 +116,16 @@ "metadata": {}, "outputs": [], "source": [ - "# Build a mapping from country name to ISO_A2 code\n", - "country_name_to_iso = {}\n", - "for country in pycountry.countries:\n", - " country_name_to_iso[country.name] = country.alpha_2\n", - " # Add common names\n", - " if hasattr(country, 'official_name'):\n", - " country_name_to_iso[country.official_name] = country.alpha_2\n", - " \n", - "# Build a mapping from ISO_A2 code to region\n", + "# Build a mapping from ISO_A3 code to region directly from config\n", "iso_to_region = {}\n", "for region, countries in regions.items():\n", - " for country in countries:\n", - " # Some country names may have extra text (e.g., \"Togo + Algeria\"), handle them simply\n", - " for part in country.split('+'):\n", - " name = part.strip()\n", - " code = country_name_to_iso.get(name)\n", - " if code:\n", - " iso_to_region[code] = region\n", - " else:\n", - " print(f\"Warning: Could not find ISO_A2 code for country '{name}' in region '{region}'.\")\n", + " for iso3 in countries:\n", + " iso_to_region[iso3] = region\n", "\n", - "# Fix missing ISO_A2 codes in world\n", - "world.loc[world['ISO_A2'] == '-99', 'ISO_A2'] = world.loc[world['ISO_A2'] == '-99', 'ADMIN'].apply(country_to_iso_a2)\n" + "# Fix missing ISO_A3 codes in world (some entries have -99)\n", + "world.loc[world[\"ISO_A3\"] == \"-99\", \"ISO_A3\"] = world.loc[\n", + " world[\"ISO_A3\"] == \"-99\", \"ADMIN\"\n", + "].apply(admin_to_iso_a3)" ] }, { @@ -178,7 +135,7 @@ "metadata": {}, "outputs": [], "source": [ - "world[\"region\"] = world['ISO_A2'].map(lambda iso: iso_to_region.get(iso, 'Other'))" + "world[\"region\"] = world[\"ISO_A3\"].map(lambda iso: iso_to_region.get(iso, \"Other\"))" ] }, { @@ -199,26 +156,35 @@ "# Short mapping: assume config['colors'] is a dict region->color\n", "import matplotlib.patches as mpatches\n", "\n", - "color_map = config.get('colors', {})\n", + "color_map = config.get(\"colors\", {})\n", "\n", - "world['plot_color'] = world['region'].map(color_map).fillna('lightgrey')\n", + "world[\"plot_color\"] = world[\"region\"].map(color_map).fillna(\"lightgrey\")\n", "\n", "fig, ax = plt.subplots(figsize=(12, 10))\n", "\n", - "world.plot(ax=ax, color=world['plot_color'], edgecolor='white')\n", + "world.plot(ax=ax, color=world[\"plot_color\"], edgecolor=\"white\", alpha=0.8)\n", "\n", "# Manual legend for regions present in the map\n", - "handles = [mpatches.Patch(color=c, label=r) for r, c in color_map.items() if r in world['region'].values]\n", + "handles = [\n", + " mpatches.Patch(color=c, label=r, alpha=0.8)\n", + " for r, c in color_map.items()\n", + " if r in world[\"region\"].values\n", + "]\n", "if handles:\n", - " ax.legend(handles=handles, title='Region', bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " region_nice_names = config.get(\"region_nice_names\", {})\n", + " region_list = [r for r, c in color_map.items() if r in world[\"region\"].values]\n", + " labels = [region_nice_names.get(reg, reg.replace(\"_\", \" \")) for reg in region_list]\n", + " ax.legend(\n", + " handles=handles, labels=labels, title=\"Region\", bbox_to_anchor=(1.05, 1), loc=\"upper left\",\n", + " )\n", "\n", "# ax.set_title('Regions')\n", - "ax.axis('off')\n", + "ax.axis(\"off\")\n", "plt.tight_layout()\n", "\n", - "plt.savefig(snakemake.input.global_map_countries)\n", - "plt.savefig(snakemake.input.global_map_countries_png, dpi=300)\n", - "plt.show()\n" + "plt.savefig(snakemake.output.global_map_countries)\n", + "plt.savefig(snakemake.output.global_map_countries_png, dpi=300)\n", + "plt.show()" ] } ], diff --git a/workflow/notebooks/plot_helpers.py b/workflow/notebooks/plot_helpers.py new file mode 100644 index 0000000..834cc1c --- /dev/null +++ b/workflow/notebooks/plot_helpers.py @@ -0,0 +1,605 @@ +import numpy as np +import pandas as pd +import plotly.graph_objects as go +from plotly.subplots import make_subplots +import matplotlib.pyplot as plt +import seaborn as sns + +# Colourblind-safe cluster palette (reusable) +PLOTLY_CLUSTER_COLORS = [ + "#0072B2", + "#D55E00", + "#009E73", + "#CC79A7", + "#E69F00", + "#56B4E9", + "#000000", + "#F0E442", +] + + +def _map_trace_tech(source_tech: str) -> str: + """Map legacy TRACE technology names to our canonical names.""" + return {"windonshore": "onwind", "pvplant": "solar"}.get(source_tech, source_tech) + + +def build_timeseries_df(ds, source_name: str, region_name: str, ts_tech_order=None): + """Build a pandas DataFrame of cluster timeseries from an xarray dataset. + + Returns columns: source, technology, cluster_id, avg_cf, capacity_mw, timeseries (numpy array) + """ + if ts_tech_order is None: + ts_tech_order = ["solar", "onwind"] + rows = [] + if ds is None: + return pd.DataFrame(rows) + + if source_name == "TRACE": + tech_map = {"windonshore": "onwind", "pvplant": "solar"} + for source_tech, compare_tech in tech_map.items(): + if "technology" not in ds.coords: + continue + if source_tech not in [str(v) for v in ds.technology.values]: + continue + try: + cap_da = ds["capacity"].sel(region=region_name, technology=source_tech) + cf_da = ds["capacity_factor"].sel( + region=region_name, technology=source_tech + ) + if "avg_cf" in ds.data_vars: + avg_cf_da = ds["avg_cf"].sel( + region=region_name, technology=source_tech + ) + else: + avg_cf_da = cf_da.mean(dim="time", skipna=True) + for idx in range(len(cap_da.values)): + capacity_mw = float(cap_da.values[idx]) + avg_cf = float(avg_cf_da.values[idx]) + cf_ts = np.array(cf_da.values[idx], dtype=float) + if ( + np.isnan(capacity_mw) + or np.isnan(avg_cf) + or np.all(np.isnan(cf_ts)) + ): + continue + rows.append( + { + "source": source_name, + "technology": compare_tech, + "cluster_id": int(idx), + "avg_cf": avg_cf, + "capacity_mw": capacity_mw, + "timeseries": np.nan_to_num(cf_ts, nan=0.0), + } + ) + except Exception: + continue + else: + for tech_name in ts_tech_order: + if tech_name not in [str(v) for v in ds.technology.values]: + continue + try: + cap_da = ds["capacity"].sel(region=region_name, technology=tech_name) + cf_da = ds["capacity_factor"].sel( + region=region_name, technology=tech_name + ) + avg_cf_da = ds["avg_cf"].sel(region=region_name, technology=tech_name) + for idx in range(len(cap_da.values)): + capacity_mw = float(cap_da.values[idx]) + avg_cf = float(avg_cf_da.values[idx]) + cf_ts = np.array(cf_da.values[idx], dtype=float) + if ( + np.isnan(capacity_mw) + or np.isnan(avg_cf) + or np.all(np.isnan(cf_ts)) + ): + continue + rows.append( + { + "source": source_name, + "technology": tech_name, + "cluster_id": int(idx), + "avg_cf": avg_cf, + "capacity_mw": capacity_mw, + "timeseries": np.nan_to_num(cf_ts, nan=0.0), + } + ) + except Exception: + continue + return pd.DataFrame(rows) + + +def _cf_to_width(cf, cf_min, cf_span): + norm = (cf - cf_min) / cf_span if cf_span > 0 else 0.0 + return float(np.clip(1.0 + 5.0 * (norm**1.6), 1.0, 6.0)) + + +def plot_region_cluster_timeseries( + region_name: str, + technology_name: str, + trace_ds=None, + pypsa_ds=None, + tech_colors=None, + cluster_colors=None, + show=True, +): + """Create a two-panel Plotly figure comparing TRACE vs PyPSA-Earth for a region+technology. + + - `trace_ds` and `pypsa_ds` are xarray datasets (or None). + - `tech_colors` maps technologies to base hex colors (optional). + - `cluster_colors` is a list of colours to cycle for clusters. + Returns the Plotly `Figure`. + """ + if cluster_colors is None: + cluster_colors = PLOTLY_CLUSTER_COLORS + if tech_colors is None: + tech_colors = {"onwind": "#1F77B4", "solar": "#D62728"} + + trace_df = build_timeseries_df(trace_ds, "TRACE", region_name) + pypsa_df = build_timeseries_df(pypsa_ds, "PyPSA-Earth", region_name) + + fig = make_subplots( + rows=2, + cols=1, + shared_xaxes=True, + vertical_spacing=0.06, + subplot_titles=(f"TRACE - {region_name}", f"PyPSA-Earth - {region_name}"), + ) + + for row_idx, df in enumerate([trace_df, pypsa_df], start=1): + source_name = "TRACE" if row_idx == 1 else "PyPSA-Earth" + if df.empty: + fig.add_annotation( + x=0.5, + y=0.5, + xref=(f"x{row_idx} domain" if row_idx > 1 else "x domain"), + yref=(f"y{row_idx} domain" if row_idx > 1 else "y domain"), + text=f"No data for {source_name}", + showarrow=False, + ) + continue + tech_df = df[df["technology"] == technology_name].copy() + if tech_df.empty: + continue + cf_min = float(tech_df["avg_cf"].min()) + cf_span = ( + float(tech_df["avg_cf"].max() - cf_min) + if float(tech_df["avg_cf"].max()) > cf_min + else 1.0 + ) + legend_names = set() + for _, row in tech_df.sort_values(by="avg_cf").iterrows(): + cid = int(row["cluster_id"]) + avg_cf = float(row["avg_cf"]) + cap_gw = float(row["capacity_mw"]) / 1e3 + color = cluster_colors[cid % len(cluster_colors)] + width = _cf_to_width(avg_cf, cf_min, cf_span) + cf_ts = np.asarray(row["timeseries"], dtype=float) + hours = np.arange(len(cf_ts)) + customdata = np.column_stack([np.full(len(cf_ts), cid)]) + legend_label = f" {source_name} - cluster {cid} | {cap_gw:.2f} GW | avg cf {avg_cf:.3f}" + showleg = legend_label not in legend_names + if showleg: + legend_names.add(legend_label) + fig.add_trace( + go.Scattergl( + x=hours, + y=cf_ts, + mode="lines", + line=dict(color=color, width=width), + opacity=0.9, + customdata=customdata, + hovertemplate="Cluster %{customdata[0]}
Hour %{x}
CF %{y:.3f}", + name=legend_label, + legendgroup=f"{technology_name}-{cid}", + showlegend=showleg, + ), + row=row_idx, + col=1, + ) + + fig.update_layout( + template="plotly_white", + height=760, + hovermode="x unified", + legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="left", x=0.0), + ) + fig.update_xaxes(title_text="Hour of year", row=2, col=1) + fig.update_yaxes(title_text="Capacity factor", row=1, col=1) + fig.update_yaxes(title_text="Capacity factor", row=2, col=1) + if show: + fig.show() + return fig + + +def plot_bubble_region_comparison( + region_name: str, trace_ds, pypsa_ds, tech_colors=None, save_path=None, show=True +): + """Create the bubble plots comparing TRACE vs PyPSA-Earth for a single region. + + This mirrors the notebook bubble plot: x=avg_cf, y=capacity_mw, bubble size ~ generation potential. + """ + if tech_colors is None: + tech_colors = {"onwind": "#1F77B4", "solar": "#D62728"} + + if trace_ds is None or pypsa_ds is None: + raise ValueError( + "Both TRACE and PyPSA-Earth datasets are required for the bubble plots." + ) + + # build comparison_df in the same format as the notebook's `comparison_df` + trace_rows = [] + if trace_ds is not None: + for trace_tech_name, compare_tech_name in { + "windonshore": "onwind", + "pvplant": "solar", + }.items(): + if trace_tech_name not in [str(v) for v in trace_ds.technology.values]: + continue + try: + cap_da = trace_ds["capacity"].sel(technology=trace_tech_name) + if "avg_cf" in trace_ds.data_vars: + avg_cf_da = trace_ds["avg_cf"].sel(technology=trace_tech_name) + else: + avg_cf_da = ( + trace_ds["capacity_factor"] + .sel(technology=trace_tech_name) + .mean(dim="time", skipna=True) + ) + for region in trace_ds.region.values: + if str(region) != str(region_name): + continue + region_caps = cap_da.sel(region=region).values + region_avg_cf = avg_cf_da.sel(region=region).values + for class_idx in range(len(region_caps)): + capacity_mw = float(region_caps[class_idx]) + avg_cf = float(region_avg_cf[class_idx]) + if np.isnan(capacity_mw) or np.isnan(avg_cf): + continue + trace_rows.append( + { + "source": "TRACE", + "region": str(region), + "technology": compare_tech_name, + "cluster_id": int(class_idx), + "capacity_mw": capacity_mw, + "avg_cf": avg_cf, + "generation_potential_mwh": capacity_mw + * avg_cf + * 8760.0, + } + ) + except Exception: + continue + + pypsa_rows = [] + if pypsa_ds is not None: + for tech_name in ["onwind", "solar"]: + if tech_name not in [str(v) for v in pypsa_ds.technology.values]: + continue + try: + cap_da = pypsa_ds["capacity"].sel(technology=tech_name) + avg_cf_da = pypsa_ds["avg_cf"].sel(technology=tech_name) + for region in pypsa_ds.region.values: + if str(region) != str(region_name): + continue + region_caps = cap_da.sel(region=region).values + region_avg_cf = avg_cf_da.sel(region=region).values + for class_idx in range(len(region_caps)): + capacity_mw = float(region_caps[class_idx]) + avg_cf = float(region_avg_cf[class_idx]) + if np.isnan(capacity_mw) or np.isnan(avg_cf): + continue + pypsa_rows.append( + { + "source": "PyPSA-Earth", + "region": str(region), + "technology": tech_name, + "cluster_id": int(class_idx), + "capacity_mw": capacity_mw, + "avg_cf": avg_cf, + "generation_potential_mwh": capacity_mw + * avg_cf + * 8760.0, + } + ) + except Exception: + continue + + bubble_df = pd.concat( + [pd.DataFrame(trace_rows), pd.DataFrame(pypsa_rows)], ignore_index=True + ) + if bubble_df.empty: + raise ValueError(f"No comparison data available for {region_name}.") + + if "generation_potential_mwh" not in bubble_df.columns: + bubble_df["generation_potential_mwh"] = ( + bubble_df["capacity_mw"] * bubble_df["avg_cf"] * 8760.0 + ) + + max_potential = bubble_df["generation_potential_mwh"].max() + size_scale = 1500.0 / max_potential if max_potential > 0 else 1.0 + + sns.set_style("whitegrid") + fig, axes = plt.subplots( + 1, 2, figsize=(16, 6), sharex=True, sharey=True, constrained_layout=True + ) + bubble_source_order = ["TRACE", "PyPSA-Earth"] + bubble_panel_labels = {"TRACE": "TRACE panel", "PyPSA-Earth": "PyPSA-Earth panel"} + + for ax, source_name in zip(axes, bubble_source_order): + subset = bubble_df[bubble_df["source"] == source_name].copy() + if subset.empty: + ax.text( + 0.5, + 0.5, + f"No data for {source_name}", + ha="center", + va="center", + transform=ax.transAxes, + ) + ax.set_axis_off() + continue + for tech_name in ["solar", "onwind"]: + tech_subset = subset[subset["technology"] == tech_name] + if tech_subset.empty: + continue + sizes = np.clip( + tech_subset["generation_potential_mwh"].to_numpy() * size_scale, + 20, + 1600, + ) + ax.scatter( + tech_subset["avg_cf"], + tech_subset["capacity_mw"], + s=sizes, + alpha=0.45, + color=tech_colors.get(tech_name, "#888888"), + edgecolor="white", + linewidth=0.6, + label=tech_name, + ) + + ax.set_title( + f"{source_name} - {region_name}", fontsize=13, fontweight="semibold" + ) + ax.set_xlabel("Average capacity factor", fontsize=11, labelpad=8) + ax.set_ylabel("Capacity (MW)", fontsize=11, labelpad=8) + ax.tick_params(axis="both", labelsize=10) + ax.set_yscale("log") + ax.grid(True, alpha=0.25) + tech_legend = ax.legend(title="Technology", loc="upper right", frameon=True) + ax.add_artist(tech_legend) + ax.text( + 0.02, + 0.97, + bubble_panel_labels[source_name], + transform=ax.transAxes, + ha="left", + va="top", + fontsize=10, + fontweight="semibold", + bbox={"facecolor": "white", "alpha": 0.75, "edgecolor": "none", "pad": 2}, + ) + + fig.suptitle( + "Bubble plot of capacity factor vs capacity", fontsize=16, fontweight="semibold" + ) + if save_path is not None: + fig.savefig(save_path, dpi=150, bbox_inches="tight") + if show: + plt.show() + return fig + + +def build_cluster_comparison_df(ds_consolidated, ds_clustered, df_cluster_meta=None): + """Build cluster_comparison_df used by the stacked-region plotting. + + Returns a DataFrame with columns: source, region, technology, cluster_id, cluster_label, capacity_mw, avg_cf + """ + rows = [] + techs_to_compare = ["onwind", "solar"] + consolidated_map = {"windonshore": "onwind", "pvplant": "solar"} + + if ds_consolidated is not None: + for consolidated_tech_name, compare_tech_name in consolidated_map.items(): + try: + cap_da = ds_consolidated["capacity"].sel( + technology=consolidated_tech_name + ) + cf_da = ds_consolidated["capacity_factor"].sel( + technology=consolidated_tech_name + ) + avg_cf_da = cf_da.mean(dim="time", skipna=True) + for region_name in ds_consolidated.region.values: + region_caps = cap_da.sel(region=region_name).values + region_avg_cf = avg_cf_da.sel(region=region_name).values + for class_idx in range(len(region_caps)): + capacity_mw = float(region_caps[class_idx]) + avg_cf = float(region_avg_cf[class_idx]) + if np.isnan(capacity_mw) or np.isnan(avg_cf): + continue + rows.append( + { + "source": "Consolidated", + "region": str(region_name), + "technology": str(compare_tech_name), + "cluster_id": int(class_idx), + "cluster_label": f"{compare_tech_name} {class_idx + 1}", + "capacity_mw": capacity_mw, + "avg_cf": avg_cf, + } + ) + except Exception: + continue + + if df_cluster_meta is not None and not df_cluster_meta.empty: + subset = df_cluster_meta[ + df_cluster_meta["technology"].isin(techs_to_compare) + ].copy() + for _, row in subset.iterrows(): + rows.append( + { + "source": "Clustered", + "region": str(row["region"]), + "technology": str(row["technology"]), + "cluster_id": int(row["cluster_id"]), + "cluster_label": f"{row['technology']} {int(row['cluster_id']) + 1}", + "capacity_mw": float(row["total_capacity_mw"]), + "avg_cf": float(row["avg_cf"]), + } + ) + elif ds_clustered is not None: + for tech_name in techs_to_compare: + try: + cap_da = ds_clustered["capacity"].sel(technology=tech_name) + avg_cf_da = ds_clustered["avg_cf"].sel(technology=tech_name) + for region_name in ds_clustered.region.values: + region_caps = cap_da.sel(region=region_name).values + region_avg_cf = avg_cf_da.sel(region=region_name).values + for class_idx in range(len(region_caps)): + capacity_mw = float(region_caps[class_idx]) + avg_cf = float(region_avg_cf[class_idx]) + if np.isnan(capacity_mw) or np.isnan(avg_cf): + continue + rows.append( + { + "source": "Clustered", + "region": str(region_name), + "technology": str(tech_name), + "cluster_id": int(class_idx), + "cluster_label": f"{tech_name} {class_idx + 1}", + "capacity_mw": capacity_mw, + "avg_cf": avg_cf, + } + ) + except Exception: + continue + + if not rows: + return pd.DataFrame() + df = pd.DataFrame(rows) + df["source"] = pd.Categorical( + df["source"], categories=["Consolidated", "Clustered"], ordered=True + ) + df["technology"] = pd.Categorical( + df["technology"], categories=["solar", "onwind"], ordered=True + ) + df["region"] = df["region"].astype(str) + df["avg_cf"] = df["avg_cf"].astype(float) + return df + + +def plot_stacked_region_comparison( + cluster_comparison_df, tech_palette=None, save_path=None, show=True +): + """Draw the stacked region comparison (matplotlib) used in the notebook. + + `cluster_comparison_df` should be the output of `build_cluster_comparison_df`. + """ + if cluster_comparison_df is None or cluster_comparison_df.empty: + raise ValueError("cluster_comparison_df is required and must not be empty") + if tech_palette is None: + tech_palette = {"solar": "#C55C5C", "onwind": "#4C78A8"} + + sns.set_style("whitegrid") + source_offsets = {"Consolidated": -0.18, "Clustered": 0.18} + tech_width = 0.24 + tech_order = ["solar", "onwind"] + source_order = ["Consolidated", "Clustered"] + + def blend_with_white(color, intensity): + base = np.array(sns.color_palette([color])[0]) + intensity = float(np.clip(intensity, 0.0, 1.0)) + return tuple(base * intensity + np.array([1.0, 1.0, 1.0]) * (1.0 - intensity)) + + fig, axes = plt.subplots(1, 2, figsize=(22, 8), sharey=True) + + for ax, tech_name in zip(axes, tech_order): + df = cluster_comparison_df[ + cluster_comparison_df["technology"] == tech_name + ].copy() + regions = sorted(df["region"].unique()) + x_positions = np.arange(len(regions)) * 1.35 + + for region_idx, region_name in enumerate(regions): + for source_name in source_order: + subset = df[ + ( + (df["region"] == region_name) + & (df["technology"] == tech_name) + & (df["source"] == source_name) + ) + ].copy() + if subset.empty: + continue + subset = subset.sort_values(by="avg_cf") + bottom = 0.0 + cf_min = float(subset["avg_cf"].min()) + cf_max = float(subset["avg_cf"].max()) + cf_span = cf_max - cf_min if cf_max > cf_min else 1.0 + border_color = "black" if source_name == "Consolidated" else "white" + border_width = 0.55 if source_name == "Consolidated" else 0.3 + + for _, row in subset.iterrows(): + norm_cf = (row["avg_cf"] - cf_min) / cf_span + shade = 0.10 + 0.90 * (norm_cf**0.65) + color = blend_with_white(tech_palette[tech_name], shade) + ax.bar( + x_positions[region_idx] + source_offsets[source_name], + row["capacity_mw"], + width=tech_width, + bottom=bottom, + color=color, + edgecolor=border_color, + linewidth=border_width, + ) + bottom += row["capacity_mw"] + + import matplotlib.patches as mpatches + + source_handles = [ + mpatches.Patch( + facecolor="#E0E0E0", edgecolor="black", label="Consolidated" + ), + mpatches.Patch(facecolor="#A9A9A9", edgecolor="white", label="Clustered"), + ] + cf_handles = [ + mpatches.Patch( + facecolor="#f2f2f2", edgecolor="#cccccc", label="low avg_cf" + ), + mpatches.Patch( + facecolor="#5a5a5a", edgecolor="#cccccc", label="high avg_cf" + ), + ] + tech_handles = [mpatches.Patch(color=tech_palette[tech_name], label=tech_name)] + + source_legend = ax.legend( + handles=source_handles, title="Source", loc="upper left" + ) + ax.add_artist(source_legend) + cf_legend = ax.legend(handles=cf_handles, title="CF shade", loc="upper right") + ax.add_artist(cf_legend) + ax.legend(handles=tech_handles, title="Technology", loc="center right") + + ax.set_title( + f"{tech_name.capitalize()}: consolidated vs clustered by region", + fontsize=13, + fontweight="bold", + ) + ax.set_xlabel("Region", fontsize=11) + ax.set_ylabel("Capacity (MW)", fontsize=11) + ax.set_xticks(x_positions) + ax.set_xticklabels(regions, rotation=45, ha="right") + ax.grid(True, axis="y", alpha=0.3) + ax.margins(x=0.04) + + fig.suptitle( + "Region-wise stacked capacity comparison", fontsize=15, fontweight="bold" + ) + plt.tight_layout(rect=(0, 0, 1, 0.95)) + if save_path is not None: + fig.savefig(save_path, dpi=150, bbox_inches="tight") + if show: + plt.show() + return fig diff --git a/workflow/notebooks/prepare-chokepoints.ipynb b/workflow/notebooks/prepare-chokepoints.ipynb index b5aef5b..bbf35ae 100644 --- a/workflow/notebooks/prepare-chokepoints.ipynb +++ b/workflow/notebooks/prepare-chokepoints.ipynb @@ -25,7 +25,7 @@ "outputs": [], "source": [ "if \"snakemake\" not in globals():\n", - " from _helpers import mock_snakemake\n", + " from _helpers_notebooks import mock_snakemake\n", " snakemake = mock_snakemake(\n", " \"prepare_chokepoints\",\n", " )" diff --git a/workflow/notebooks/prepare-iron-ore.ipynb b/workflow/notebooks/prepare-iron-ore.ipynb index fee5135..d2704db 100644 --- a/workflow/notebooks/prepare-iron-ore.ipynb +++ b/workflow/notebooks/prepare-iron-ore.ipynb @@ -8,11 +8,7 @@ "outputs": [], "source": [ "import pandas as pd\n", - "import geopandas as gpd\n", - "import matplotlib.pyplot as plt\n", - "import cartopy.io.shapereader as shpreader\n", - "import pycountry\n", - "import openpyxl" + "import pycountry" ] }, { @@ -22,10 +18,9 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", - "snakemake = mock_snakemake(\n", - " \"prepare_iron_ore\"\n", - ")" + "from _helpers_notebooks import mock_snakemake\n", + "\n", + "snakemake = mock_snakemake(\"prepare_iron_ore\")" ] }, { @@ -78,7 +73,7 @@ "outputs": [], "source": [ "# Read the CSV data\n", - "production = pd.read_csv(production_fn, index_col='ISO_A2')" + "production = pd.read_csv(production_fn, index_col=\"ISO_A2\")" ] }, { @@ -115,28 +110,20 @@ "metadata": {}, "outputs": [], "source": [ - "# Load region definitions from config\n", + "# Load region definitions from config (regions now uses ISO-3 codes directly)\n", "regions = config['regions']\n", "\n", - "# Build a mapping from country name to ISO_A2 code\n", - "country_name_to_iso = {}\n", - "for country in pycountry.countries:\n", - " country_name_to_iso[country.name] = country.alpha_2\n", - " if hasattr(country, 'official_name'):\n", - " country_name_to_iso[country.official_name] = country.alpha_2\n", - "\n", - "# Build a mapping from ISO_A2 code to region\n", + "# Build ISO-2 β†’ region mapping (production data uses ISO_A2 / 2-letter codes)\n", + "# Convert ISO-3 codes from config to ISO-2 via pycountry\n", "iso_to_region = {}\n", - "for region, countries in regions.items():\n", - " for country in countries:\n", - " for part in country.split('+'):\n", - " name = part.strip()\n", - " code = country_name_to_iso.get(name)\n", - " if code:\n", - " iso_to_region[code] = region\n", + "for region, iso3_codes in regions.items():\n", + " for iso3 in iso3_codes:\n", + " country = pycountry.countries.get(alpha_3=iso3)\n", + " if country:\n", + " iso_to_region[country.alpha_2] = region\n", "\n", "# Map each row in production to its region\n", - "production['region'] = production.index.map(lambda iso: iso_to_region.get(iso, 'Other'))\n" + "production['region'] = production.index.map(lambda iso: iso_to_region.get(iso, 'Other'))" ] }, { @@ -158,29 +145,30 @@ "# We need to do this in two steps since groupby.agg with custom function on single column doesn't have access to other columns\n", "\n", "# First, sum the production\n", - "production_sum = production.groupby('region')['IronOreProductionMt'].sum()\n", + "production_sum = production.groupby(\"region\")[\"IronOreProductionMt\"].sum()\n", "\n", "# Then calculate weighted average cost (using the new column name)\n", - "production_avg_cost = production.groupby('region').apply(\n", - " lambda group: (group['IronOreEur/t_ironore'].fillna(0) * group['IronOreProductionMt']).sum() / group['IronOreProductionMt'].sum()\n", - " if group['IronOreProductionMt'].sum() > 0 else 0\n", + "production_avg_cost = production.groupby(\"region\").apply(\n", + " lambda group: (\n", + " (group[\"IronOreEur/t_ironore\"].fillna(0) * group[\"IronOreProductionMt\"]).sum()\n", + " / group[\"IronOreProductionMt\"].sum()\n", + " if group[\"IronOreProductionMt\"].sum() > 0\n", + " else 0\n", + " )\n", ")\n", "\n", "# Combine into a single DataFrame\n", - "production_by_region = pd.DataFrame({\n", - " 'IronOreProductionMt': production_sum,\n", - " 'IronOreEur/t_ironore': production_avg_cost\n", - "})\n", + "production_by_region = pd.DataFrame(\n", + " {\"IronOreProductionMt\": production_sum, \"IronOreEur/t_ironore\": production_avg_cost}\n", + ")\n", "\n", "# Ensure all regions from config are present, fill missing with 0\n", "all_regions = pd.Series(0, index=regions.keys())\n", - "production_by_region = production_by_region.reindex(\n", - " all_regions.index, fill_value=0\n", - ")\n", + "production_by_region = production_by_region.reindex(all_regions.index, fill_value=0)\n", "\n", "# Reset index to make region a column\n", "production_by_region = production_by_region.reset_index()\n", - "production_by_region = production_by_region.rename(columns={'index': 'region'})\n", + "production_by_region = production_by_region.rename(columns={\"index\": \"region\"})\n", "\n", "production_by_region" ] @@ -200,8 +188,10 @@ "metadata": {}, "outputs": [], "source": [ - "production_by_region = production_by_region.set_index('region')\n", - "production_by_region[\"IronOreEur/t_ironore\"] = production_by_region[\"IronOreEur/t_ironore\"].round(2)\n", + "production_by_region = production_by_region.set_index(\"region\")\n", + "production_by_region[\"IronOreEur/t_ironore\"] = production_by_region[\n", + " \"IronOreEur/t_ironore\"\n", + "].round(2)\n", "production_by_region.to_csv(production_clustered_fn)" ] } diff --git a/workflow/notebooks/prepare-political-stability.ipynb b/workflow/notebooks/prepare-political-stability.ipynb index 4e211b9..d97ddee 100644 --- a/workflow/notebooks/prepare-political-stability.ipynb +++ b/workflow/notebooks/prepare-political-stability.ipynb @@ -20,7 +20,7 @@ "outputs": [], "source": [ "if \"snakemake\" not in globals():\n", - " from _helpers import mock_snakemake\n", + " from _helpers_notebooks import mock_snakemake\n", " snakemake = mock_snakemake(\n", " \"prepare_political_stability\",\n", " )" @@ -183,23 +183,14 @@ "metadata": {}, "outputs": [], "source": [ - "# Apply region name corrections (same corrections used above for the input data)\n", + "# Load region definitions from config (regions now uses ISO-3 codes directly)\n", "regions = config[\"regions\"]\n", "\n", - "for region, countries in regions.items():\n", - " for i, country in enumerate(countries):\n", - " if country in country_name_corrections:\n", - " countries[i] = country_name_corrections[country]\n", - "\n", "# Build ISO-3 β†’ region mapping\n", "iso_to_region = {}\n", - "for region, countries in regions.items():\n", - " for country in countries:\n", - " for part in country.split(\"+\"):\n", - " name = part.strip()\n", - " code = country_name_to_iso.get(name)\n", - " if code:\n", - " iso_to_region[code] = region\n" + "for region, iso_codes in regions.items():\n", + " for code in iso_codes:\n", + " iso_to_region[code] = region" ] }, { @@ -275,6 +266,31 @@ "ps_by_region.sort_values(\"political_stability\", ascending=False)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "515751d8", + "metadata": {}, + "outputs": [], + "source": [ + "# Apply manual stability penalties from config (design.stability_penalty)\n", + "# Each entry subtracts the given value from the region's computed political_stability score.\n", + "stability_penalties = config.get(\"design\", {}).get(\"stability_penalty\", {})\n", + "\n", + "if stability_penalties:\n", + " for region, penalty in stability_penalties.items():\n", + " if region in ps_by_region.index:\n", + " original = ps_by_region.loc[region, \"political_stability\"]\n", + " ps_by_region.loc[region, \"political_stability\"] -= penalty\n", + " print(f\"Applied penalty to {region}: {original:.4f} β†’ {ps_by_region.loc[region, 'political_stability']:.4f} (βˆ’{penalty})\")\n", + " else:\n", + " print(f\"Warning: region '{region}' in stability_penalty not found in ps_by_region index.\")\n", + "else:\n", + " print(\"No stability penalties configured.\")\n", + "\n", + "ps_by_region.sort_values(\"political_stability\", ascending=False)\n" + ] + }, { "cell_type": "markdown", "id": "7c408942", diff --git a/workflow/notebooks/prepare-steel-demand.ipynb b/workflow/notebooks/prepare-steel-demand.ipynb index 35e7116..be49dc0 100644 --- a/workflow/notebooks/prepare-steel-demand.ipynb +++ b/workflow/notebooks/prepare-steel-demand.ipynb @@ -9,8 +9,7 @@ "source": [ "import pandas as pd\n", "import pypsa\n", - "import yaml\n", - "import pycountry" + "import yaml" ] }, { @@ -20,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", "snakemake = mock_snakemake(\n", " \"prepare_steel_demand\",\n", " cost_year = 2050,\n", @@ -154,50 +153,6 @@ "regions = config['regions']" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "d52414f2", - "metadata": {}, - "outputs": [], - "source": [ - "country_name_corrections = {\n", - " \"Democratic Republic of the Congo\": \"Congo, The Democratic Republic of the\",\n", - " \"Republic of the Congo\": \"Republic of the Congo\",\n", - " \"Kosovo\": \"Republic of Kosovo\", # pycountry not supported\n", - " \"Russia\": \"Russian Federation\",\n", - " \"Turkey\": \"TΓΌrkiye\",\n", - " \"Venezuela\": \"Venezuela, Bolivarian Republic of\",\n", - " \"Tanzania\": \"United Republic of Tanzania\",\n", - " \"Bolivia\": \"Plurinational State of Bolivia\",\n", - " \"Vietnam\": \"Viet Nam\",\n", - " \"South Korea\": \"Korea, Republic of\",\n", - " \"North Korea\": \"Korea, Democratic People's Republic of\",\n", - " \"Taiwan\": \"Taiwan, Province of China\",\n", - " \"Laos\": \"Lao People's Democratic Republic\",\n", - " \"Brunei\": \"Brunei Darussalam\",\n", - " \"Equatorial French Guiana\": \"French Guiana\",\n", - " \"Syria\": \"Syrian Arab Republic\", \n", - " \"Palestine\": \"Palestine, State of\",\n", - " \"Moldova\": \"Republic of Moldova\",\n", - " \"North Korea\": \"Korea, Democratic People's Republic of\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "997a6000", - "metadata": {}, - "outputs": [], - "source": [ - "# Apply a country name correction to the regions dict\n", - "for region, countries in regions.items():\n", - " for i, country in enumerate(countries):\n", - " if country in country_name_corrections:\n", - " countries[i] = country_name_corrections[country]" - ] - }, { "cell_type": "code", "execution_count": null, @@ -205,24 +160,11 @@ "metadata": {}, "outputs": [], "source": [ - "# Build a mapping from country name to ISO_A2 code\n", - "country_name_to_iso = {}\n", - "for country in pycountry.countries:\n", - " country_name_to_iso[country.name] = country.alpha_3\n", - " # Add common names\n", - " if hasattr(country, 'official_name'):\n", - " country_name_to_iso[country.official_name] = country.alpha_3\n", - "\n", - "# Build a mapping from ISO_A2 code to region\n", + "# Build a mapping from ISO-3 code to region (config regions now use ISO-3 codes directly)\n", "iso_to_region = {}\n", - "for region, countries in regions.items():\n", - " for country in countries:\n", - " # Some country names may have extra text (e.g., \"Togo + Algeria\"), handle them simply\n", - " for part in country.split('+'):\n", - " name = part.strip()\n", - " code = country_name_to_iso.get(name)\n", - " if code:\n", - " iso_to_region[code] = region" + "for region, iso_codes in regions.items():\n", + " for code in iso_codes:\n", + " iso_to_region[code] = region" ] }, { diff --git a/workflow/notebooks/prepare-steel.ipynb b/workflow/notebooks/prepare-steel.ipynb deleted file mode 100644 index e3e06bb..0000000 --- a/workflow/notebooks/prepare-steel.ipynb +++ /dev/null @@ -1,181 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "ed230fea", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import pypsa\n", - "import yaml\n", - "import pycountry" - ] - }, - { - "cell_type": "markdown", - "id": "ed5376e8", - "metadata": {}, - "source": [ - "### File paths" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6fedb8e0", - "metadata": {}, - "outputs": [], - "source": [ - "production_fn = '../../resources/steel_production.csv'\n", - "bus_locations_fn = '../../data/bus_locations.csv'\n", - "\n", - "# Outputs\n", - "production_clustered_fn = '../../resources/steel_production_clustered.csv'" - ] - }, - { - "cell_type": "markdown", - "id": "615743b5", - "metadata": {}, - "source": [ - "### Get steel data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "39fc3e37", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Read the CSV data\n", - "production = pd.read_csv(production_fn, index_col='ISO_A2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a074f026", - "metadata": {}, - "outputs": [], - "source": [ - "production" - ] - }, - { - "cell_type": "markdown", - "id": "edf893b3", - "metadata": {}, - "source": [ - "### Cluster per region" - ] - }, - { - "cell_type": "markdown", - "id": "462a6acb", - "metadata": {}, - "source": [ - "### Cluster countries per region\n", - "Map each country in the production data to its region using the region definitions from the config file." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7cb82aa7", - "metadata": {}, - "outputs": [], - "source": [ - "# Load region definitions from config file\n", - "with open('../../config/config.yaml', 'r') as f:\n", - " config = yaml.safe_load(f)\n", - "regions = config['regions']\n", - "\n", - "# Build a mapping from country name to ISO_A2 code\n", - "country_name_to_iso = {}\n", - "for country in pycountry.countries:\n", - " country_name_to_iso[country.name] = country.alpha_2\n", - " # Add common names\n", - " if hasattr(country, 'official_name'):\n", - " country_name_to_iso[country.official_name] = country.alpha_2\n", - "\n", - "# Build a mapping from ISO_A2 code to region\n", - "iso_to_region = {}\n", - "for region, countries in regions.items():\n", - " for country in countries:\n", - " # Some country names may have extra text (e.g., \"Togo + Algeria\"), handle them simply\n", - " for part in country.split('+'):\n", - " name = part.strip()\n", - " code = country_name_to_iso.get(name)\n", - " if code:\n", - " iso_to_region[code] = region\n", - "\n", - "# Map each row in production to its region\n", - "production['region'] = production.index.map(lambda iso: iso_to_region.get(iso, 'Other'))\n", - "production.sort_values(by='SteelProductionMt', ascending=False)" - ] - }, - { - "cell_type": "markdown", - "id": "e91106f6", - "metadata": {}, - "source": [ - "### Aggregate steel production by region" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ddf1796f", - "metadata": {}, - "outputs": [], - "source": [ - "# Group by region and sum all numeric columns\n", - "production_by_region = production.groupby('region').sum(numeric_only=True)\n", - "production_by_region" - ] - }, - { - "cell_type": "markdown", - "id": "488d8f55", - "metadata": {}, - "source": [ - "### Save clustered steel production" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bcf3ae0f", - "metadata": {}, - "outputs": [], - "source": [ - "production_by_region.to_csv(production_clustered_fn)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "shift", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/workflow/notebooks/prepare-wacc.ipynb b/workflow/notebooks/prepare-wacc.ipynb index dc20e14..8663705 100644 --- a/workflow/notebooks/prepare-wacc.ipynb +++ b/workflow/notebooks/prepare-wacc.ipynb @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "from _helpers import mock_snakemake\n", + "from _helpers_notebooks import mock_snakemake\n", "snakemake = mock_snakemake(\n", " \"prepare_wacc\",\n", " )" @@ -127,20 +127,6 @@ "}" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "b3ef8db2", - "metadata": {}, - "outputs": [], - "source": [ - "# Apply a country name correction to the regions dict\n", - "for region, countries in regions.items():\n", - " for i, country in enumerate(countries):\n", - " if country in country_name_corrections:\n", - " countries[i] = country_name_corrections[country]" - ] - }, { "cell_type": "code", "execution_count": null, @@ -148,7 +134,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Build a mapping from country name to ISO_A2 code\n", + "# Build a mapping from country name to ISO-3 code (still needed for GDP World Bank lookup)\n", "country_name_to_iso = {}\n", "for country in pycountry.countries:\n", " country_name_to_iso[country.name] = country.alpha_3\n", @@ -156,16 +142,11 @@ " if hasattr(country, 'official_name'):\n", " country_name_to_iso[country.official_name] = country.alpha_3\n", "\n", - "# Build a mapping from ISO_A2 code to region\n", + "# Build a mapping from ISO-3 code to region (config regions now use ISO-3 codes directly)\n", "iso_to_region = {}\n", - "for region, countries in regions.items():\n", - " for country in countries:\n", - " # Some country names may have extra text (e.g., \"Togo + Algeria\"), handle them simply\n", - " for part in country.split('+'):\n", - " name = part.strip()\n", - " code = country_name_to_iso.get(name)\n", - " if code:\n", - " iso_to_region[code] = region" + "for region, iso_codes in regions.items():\n", + " for code in iso_codes:\n", + " iso_to_region[code] = region" ] }, { @@ -286,30 +267,48 @@ { "cell_type": "code", "execution_count": null, - "id": "874da897", + "id": "b96c4259", "metadata": {}, "outputs": [], "source": [ - "wacc_by_region.to_csv(wacc_clustered_fn)" + "# Calculate global GDP-weighted average and append as last row\n", + "global_avg = pd.Series({\n", + " \"wacc_real\": weighted_mean(wacc_gdp, \"wacc_real\", \"gdp_usd\"),\n", + " \"n_countries\": len(wacc_gdp),\n", + " \"wacc_spread\": wacc_gdp[\"wacc\"].max() - wacc_gdp[\"wacc\"].min(),\n", + "}, name=\"global_weighted_avg\")\n", + "\n", + "wacc_by_region = pd.concat([wacc_by_region, global_avg.to_frame().T])" ] }, { - "cell_type": "markdown", - "id": "41517ecb", + "cell_type": "code", + "execution_count": null, + "id": "dcecd263", "metadata": {}, + "outputs": [], "source": [ - "### Mean (depreciated)" + "wacc_by_region.index.name = \"region\"" ] }, { "cell_type": "code", "execution_count": null, - "id": "e1d215c4", + "id": "874da897", "metadata": {}, "outputs": [], "source": [ - "# wacc_by_region = wacc.groupby('region').mean(numeric_only=True)\n", - "# wacc_by_region.round(3)" + "wacc_by_region.to_csv(wacc_clustered_fn)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5bee8c0", + "metadata": {}, + "outputs": [], + "source": [ + "wacc_by_region" ] } ], diff --git a/workflow/notebooks/prepare_potentials.ipynb b/workflow/notebooks/prepare_potentials.ipynb new file mode 100644 index 0000000..485dd2a --- /dev/null +++ b/workflow/notebooks/prepare_potentials.ipynb @@ -0,0 +1,649 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "083dc0a6", + "metadata": {}, + "source": [ + "# Renewable Energy Profiles Dataset Construction\n", + "\n", + "## Overview\n", + "\n", + "This notebook constructs gridded **renewable energy profiles** (capacity factors and installable potentials) from PyPSA-Earth data. These profiles represent **onwind**, **offwind-ac**, and **solar** renewable generation potential across geographic regions.\n", + "\n", + "### What We Build\n", + "\n", + "For each renewable technology and geographic location (bus), we extract:\n", + "- **Capacity Factor** (cf): Hourly time series of energy output (0-1) across 8,760 hours\n", + "- **p_nom_max**: Maximum installable power capacity (MW) based on land/sea availability\n", + "- **Potential**: Grid-level renewable resource (GW per 0.25Β° Γ— 0.25Β° cell)\n", + "- **Geometry**: Bus region boundaries (Voronoi polygons as GeoJSON)\n", + "\n", + "### Outputs\n", + "\n", + "The workflow produces **three output files**:\n", + "1. **NetCDF** (.nc): Time series + potentials + metadata for all buses/technologies\n", + "2. **GeoJSON** (.geojson): Geographic boundaries + attributes (bus_id, country, area, density)\n", + "3. **Metadata** (metadata.json): Schema version + timestamp + file manifest\n", + "\n", + "These are used downstream for energy system modeling (PyPSA) and renewable energy supply curves.\n", + "\n", + "### Workflow\n", + "\n", + "1. **Setup**: Initialize paths and logging (idempotent, safe to rerun)\n", + "2. **Load Data**: Load raw PyPSA-Earth profiles and region boundaries\n", + "3. **Build Profiles**: 7-stage pipeline transforms raw data into per-bus profiles\n", + "4. **Save**: Write NetCDF + GeoJSON + metadata with reproducibility tags\n", + "5. **Inspect**: Verify dataset structure and summary statistics\n", + "6. **Validate**: Check data quality (capacity factor ranges, completeness)\n", + "7. **Visualize**: Plot grid-level potential and bus-level capacity density" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cd848044", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:25:45,698 - __main__ - INFO - βœ“ Paths configured:\n", + "2026-04-17 15:25:45,700 - __main__ - INFO - SHIFT_PATH: C:\\Users\\JanLeopoldTautorus\\Repos\\shift\n", + "2026-04-17 15:25:45,701 - __main__ - INFO - PYPSA_EARTH_PATH: C:\\Users\\JanLeopoldTautorus\\Repos\\pypsa-earth\n" + ] + } + ], + "source": [ + "# ===== SETUP: Environment Paths (Idempotent) =====\n", + "\"\"\"\n", + "Set up paths relative to notebook location. This is idempotent - won't break on rerun.\n", + "Uses the notebook file itself as an anchor point instead of working directory.\n", + "\"\"\"\n", + "\n", + "import os\n", + "import sys\n", + "from pathlib import Path\n", + "import logging\n", + "\n", + "# Get notebook directory (more reliable than os.getcwd() which changes with os.chdir)\n", + "NOTEBOOK_DIR = Path(globals().get(\"_dh\", [os.getcwd()])[0]) # Jupyter provides _dh\n", + "if not NOTEBOOK_DIR.exists():\n", + " NOTEBOOK_DIR = Path.cwd()\n", + "\n", + "# Compute shift path (3 levels up from notebook: notebooks/ β†’ workflow/ β†’ shift/)\n", + "SHIFT_PATH = NOTEBOOK_DIR.parent.parent.parent\n", + "if not (SHIFT_PATH / \".gitignore\").exists():\n", + " # Fallback if structure is different\n", + " SHIFT_PATH = Path(os.path.abspath(os.path.join(os.getcwd(), \"../../..\", \"shift\")))\n", + "\n", + "SHIFT_PATH = SHIFT_PATH.resolve()\n", + "PYPSA_EARTH_PATH = SHIFT_PATH.parent / \"pypsa-earth\"\n", + "\n", + "# Validate paths\n", + "if not SHIFT_PATH.is_dir():\n", + " raise FileNotFoundError(f\"shift not found at {SHIFT_PATH}\")\n", + "if not PYPSA_EARTH_PATH.is_dir():\n", + " raise FileNotFoundError(f\"pypsa-earth not found at {PYPSA_EARTH_PATH}\")\n", + "\n", + "# Add to sys.path only if not already present (idempotent)\n", + "for path in [str(SHIFT_PATH), str(PYPSA_EARTH_PATH)]:\n", + " if path not in sys.path:\n", + " sys.path.append(path)\n", + "\n", + "# ===== SETUP: Logging Configuration =====\n", + "logging.basicConfig(\n", + " level=logging.INFO, format=\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n", + ")\n", + "logger = logging.getLogger(__name__)\n", + "logger.info(\"βœ“ Paths configured:\")\n", + "logger.info(f\" SHIFT_PATH: {SHIFT_PATH}\")\n", + "logger.info(f\" PYPSA_EARTH_PATH: {PYPSA_EARTH_PATH}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "56730027", + "metadata": {}, + "outputs": [], + "source": [ + "# ===== IMPORTS =====\n", + "import importlib\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import workflow.scripts.renewable_profiles as renewable_profiles\n", + "\n", + "importlib.reload(renewable_profiles)\n", + "\n", + "# Import module functions\n", + "load_pypsa_earth_profiles = renewable_profiles.load_pypsa_earth_profiles\n", + "load_region_boundaries = renewable_profiles.load_region_boundaries\n", + "build_profiles = renewable_profiles.build_profiles\n", + "save_profiles = renewable_profiles.save_profiles\n", + "load_profiles = renewable_profiles.load_profiles\n", + "audit_profiles_against_raw = renewable_profiles.audit_profiles_against_raw\n", + "plot_grid_potentials = renewable_profiles.plot_grid_potentials\n", + "plot_bus_capacity_density = renewable_profiles.plot_bus_capacity_density" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "057b6873", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:25:47,461 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:25:47,462 - __main__ - INFO - LOADING RAW DATA\n", + "2026-04-17 15:25:47,462 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:25:47,464 - workflow.scripts.renewable_profiles - INFO - Loading renewable technology profiles from PyPSA-Earth...\n", + "c:\\Users\\JanLeopoldTautorus\\Repos\\shift\\.pixi\\envs\\dev\\Lib\\site-packages\\xarray\\backends\\plugins.py:109: RuntimeWarning: Engine 'cfgrib' loading failed:\n", + "Cannot find the ecCodes library\n", + " external_backend_entrypoints = backends_dict_from_pkg(entrypoints_unique)\n", + "2026-04-17 15:25:47,763 - workflow.scripts.renewable_profiles - INFO - βœ“ onwind: 8760 hours, 4582 buses, grid 259Γ—243\n", + "2026-04-17 15:25:47,777 - workflow.scripts.renewable_profiles - INFO - βœ“ offwind-ac: 8760 hours, 713 buses, grid 290Γ—256\n", + "2026-04-17 15:25:47,793 - workflow.scripts.renewable_profiles - INFO - βœ“ solar: 8760 hours, 4582 buses, grid 259Γ—243\n", + "2026-04-17 15:25:47,793 - workflow.scripts.renewable_profiles - INFO - βœ“ Loaded 3 profiles: ['onwind', 'offwind-ac', 'solar']\n", + "2026-04-17 15:25:47,794 - workflow.scripts.renewable_profiles - INFO - Loading geographic region boundaries from GeoJSON...\n", + "c:\\Users\\JanLeopoldTautorus\\Repos\\shift\\.pixi\\envs\\dev\\Lib\\site-packages\\pyogrio\\core.py:34: RuntimeWarning: Could not detect GDAL data files. Set GDAL_DATA environment variable to the correct path.\n", + " _init_gdal_data()\n", + "2026-04-17 15:25:48,019 - workflow.scripts.renewable_profiles - INFO - Onshore: 4582 regions\n", + "2026-04-17 15:25:48,019 - workflow.scripts.renewable_profiles - INFO - Offshore: 714 regions\n", + "2026-04-17 15:25:48,020 - __main__ - INFO - βœ“ Data loaded: 3 technologies, 4582 onshore, 714 offshore regions\n" + ] + } + ], + "source": [ + "# ===== LOAD DATA: PyPSA-Earth Profiles & Regions =====\n", + "\"\"\"\n", + "Load renewable technology profiles and geographic region boundaries.\n", + "Uses the preprocessing script functions.\n", + "\"\"\"\n", + "logger.info(\"=\" * 70)\n", + "logger.info(\"LOADING RAW DATA\")\n", + "logger.info(\"=\" * 70)\n", + "\n", + "# Load technology profiles\n", + "tech_profiles_nc = load_pypsa_earth_profiles(PYPSA_EARTH_PATH)\n", + "\n", + "# Load region boundaries\n", + "onshore_regions_gpd, offshore_regions_gpd = load_region_boundaries(PYPSA_EARTH_PATH)\n", + "\n", + "logger.info(\n", + " f\"βœ“ Data loaded: {len(tech_profiles_nc)} technologies, \"\n", + " f\"{len(onshore_regions_gpd)} onshore, {len(offshore_regions_gpd)} offshore regions\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a11f1ff3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:25:48,031 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:25:48,032 - __main__ - INFO - BUILDING RENEWABLE PROFILES (7-Stage Pipeline)\n", + "2026-04-17 15:25:48,033 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:25:48,034 - workflow.scripts.renewable_profiles - INFO - Building profiles for: ['onwind', 'offwind-ac', 'solar']\n", + "2026-04-17 15:25:48,034 - workflow.scripts.renewable_profiles - INFO - STAGE 0: Prepare regions\n", + "2026-04-17 15:25:48,083 - workflow.scripts.renewable_profiles - INFO - Combined: 5296 total regions\n", + "2026-04-17 15:25:48,085 - workflow.scripts.renewable_profiles - INFO - STAGE 1: Generate bus IDs\n", + "C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\workflow\\scripts\\renewable_profiles.py:194: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " centroids = regions.geometry.centroid\n", + "2026-04-17 15:25:48,620 - workflow.scripts.renewable_profiles - INFO - Generated 5296 bus IDs (2 collisions handled)\n", + "2026-04-17 15:25:48,702 - workflow.scripts.renewable_profiles - INFO - STAGE 2: Cache technology data\n", + "2026-04-17 15:25:49,768 - workflow.scripts.renewable_profiles - INFO - Cached 3 technology datasets\n", + "2026-04-17 15:25:49,770 - workflow.scripts.renewable_profiles - INFO - STAGE 3: Extract profiles for all buses\n", + "C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\workflow\\scripts\\renewable_profiles.py:499: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " centroids = all_regions.geometry.centroid\n", + "2026-04-17 15:25:49,881 - workflow.scripts.renewable_profiles - INFO - Processing 54 countries sequentially\n", + "2026-04-17 15:25:49,882 - workflow.scripts.renewable_profiles - INFO - [1/54] AGO: 99 regions\n", + "2026-04-17 15:25:49,897 - workflow.scripts.renewable_profiles - INFO - [2/54] BDI: 9 regions\n", + "2026-04-17 15:25:49,900 - workflow.scripts.renewable_profiles - INFO - [3/54] BEN: 17 regions\n", + "2026-04-17 15:25:49,905 - workflow.scripts.renewable_profiles - INFO - [4/54] BFA: 16 regions\n", + "2026-04-17 15:25:49,910 - workflow.scripts.renewable_profiles - INFO - [5/54] BWA: 48 regions\n", + "2026-04-17 15:25:49,920 - workflow.scripts.renewable_profiles - INFO - [6/54] CAF: 3 regions\n", + "2026-04-17 15:25:49,923 - workflow.scripts.renewable_profiles - INFO - [7/54] CIV: 74 regions\n", + "2026-04-17 15:25:49,936 - workflow.scripts.renewable_profiles - INFO - [8/54] CMR: 30 regions\n", + "2026-04-17 15:25:49,944 - workflow.scripts.renewable_profiles - INFO - [9/54] COD: 85 regions\n", + "2026-04-17 15:25:49,961 - workflow.scripts.renewable_profiles - INFO - [10/54] COG: 31 regions\n", + "2026-04-17 15:25:49,968 - workflow.scripts.renewable_profiles - INFO - [11/54] COM: 2 regions\n", + "2026-04-17 15:25:49,970 - workflow.scripts.renewable_profiles - INFO - [12/54] CPV: 6 regions\n", + "2026-04-17 15:25:49,972 - workflow.scripts.renewable_profiles - INFO - [13/54] DJI: 12 regions\n", + "2026-04-17 15:25:49,975 - workflow.scripts.renewable_profiles - INFO - [14/54] DZA: 494 regions\n", + "2026-04-17 15:25:50,054 - workflow.scripts.renewable_profiles - INFO - [15/54] EGY: 519 regions\n", + "2026-04-17 15:25:50,130 - workflow.scripts.renewable_profiles - INFO - [16/54] ERI: 7 regions\n", + "2026-04-17 15:25:50,133 - workflow.scripts.renewable_profiles - INFO - [17/54] ETH: 171 regions\n", + "2026-04-17 15:25:50,164 - workflow.scripts.renewable_profiles - INFO - [18/54] GAB: 21 regions\n", + "2026-04-17 15:25:50,168 - workflow.scripts.renewable_profiles - INFO - [19/54] GHA: 107 regions\n", + "2026-04-17 15:25:50,185 - workflow.scripts.renewable_profiles - INFO - [20/54] GIN: 23 regions\n", + "2026-04-17 15:25:50,191 - workflow.scripts.renewable_profiles - INFO - [21/54] GMB: 4 regions\n", + "2026-04-17 15:25:50,193 - workflow.scripts.renewable_profiles - INFO - [22/54] GNB: 8 regions\n", + "2026-04-17 15:25:50,194 - workflow.scripts.renewable_profiles - INFO - [23/54] GNQ: 27 regions\n", + "2026-04-17 15:25:50,199 - workflow.scripts.renewable_profiles - INFO - [24/54] KEN: 95 regions\n", + "2026-04-17 15:25:50,217 - workflow.scripts.renewable_profiles - INFO - [25/54] LBR: 11 regions\n", + "2026-04-17 15:25:50,220 - workflow.scripts.renewable_profiles - INFO - [26/54] LBY: 240 regions\n", + "2026-04-17 15:25:50,253 - workflow.scripts.renewable_profiles - INFO - [27/54] LSO: 27 regions\n", + "2026-04-17 15:25:50,259 - workflow.scripts.renewable_profiles - INFO - [28/54] MAR: 454 regions\n", + "2026-04-17 15:25:50,361 - workflow.scripts.renewable_profiles - INFO - [29/54] MDG: 23 regions\n", + "2026-04-17 15:25:50,366 - workflow.scripts.renewable_profiles - INFO - [30/54] MLI: 17 regions\n", + "2026-04-17 15:25:50,370 - workflow.scripts.renewable_profiles - INFO - [31/54] MOZ: 112 regions\n", + "2026-04-17 15:25:50,386 - workflow.scripts.renewable_profiles - INFO - [32/54] MRT: 16 regions\n", + "2026-04-17 15:25:50,390 - workflow.scripts.renewable_profiles - INFO - [33/54] MUS: 14 regions\n", + "2026-04-17 15:25:50,393 - workflow.scripts.renewable_profiles - INFO - [34/54] MWI: 42 regions\n", + "2026-04-17 15:25:50,401 - workflow.scripts.renewable_profiles - INFO - [35/54] NAM: 135 regions\n", + "2026-04-17 15:25:50,424 - workflow.scripts.renewable_profiles - INFO - [36/54] NER: 13 regions\n", + "2026-04-17 15:25:50,428 - workflow.scripts.renewable_profiles - INFO - [37/54] NGA: 201 regions\n", + "2026-04-17 15:25:50,462 - workflow.scripts.renewable_profiles - INFO - [38/54] RWA: 43 regions\n", + "2026-04-17 15:25:50,471 - workflow.scripts.renewable_profiles - INFO - [39/54] SDN: 74 regions\n", + "2026-04-17 15:25:50,483 - workflow.scripts.renewable_profiles - INFO - [40/54] SEN: 36 regions\n", + "2026-04-17 15:25:50,489 - workflow.scripts.renewable_profiles - INFO - [41/54] SLE: 12 regions\n", + "2026-04-17 15:25:50,493 - workflow.scripts.renewable_profiles - INFO - [42/54] SOM: 2 regions\n", + "2026-04-17 15:25:50,494 - workflow.scripts.renewable_profiles - INFO - [43/54] SSD: 1 regions\n", + "2026-04-17 15:25:50,495 - workflow.scripts.renewable_profiles - INFO - [44/54] STP: 2 regions\n", + "2026-04-17 15:25:50,497 - workflow.scripts.renewable_profiles - INFO - [45/54] SWZ: 22 regions\n", + "2026-04-17 15:25:50,502 - workflow.scripts.renewable_profiles - INFO - [46/54] SYC: 2 regions\n", + "2026-04-17 15:25:50,504 - workflow.scripts.renewable_profiles - INFO - [47/54] TCD: 4 regions\n", + "2026-04-17 15:25:50,506 - workflow.scripts.renewable_profiles - INFO - [48/54] TGO: 17 regions\n", + "2026-04-17 15:25:50,511 - workflow.scripts.renewable_profiles - INFO - [49/54] TUN: 138 regions\n", + "2026-04-17 15:25:50,530 - workflow.scripts.renewable_profiles - INFO - [50/54] TZA: 84 regions\n", + "2026-04-17 15:25:50,545 - workflow.scripts.renewable_profiles - INFO - [51/54] UGA: 24 regions\n", + "2026-04-17 15:25:50,551 - workflow.scripts.renewable_profiles - INFO - [52/54] ZAF: 1419 regions\n", + "2026-04-17 15:25:50,764 - workflow.scripts.renewable_profiles - INFO - [53/54] ZMB: 132 regions\n", + "2026-04-17 15:25:50,787 - workflow.scripts.renewable_profiles - INFO - [54/54] ZWE: 71 regions\n", + "2026-04-17 15:25:50,800 - workflow.scripts.renewable_profiles - INFO - Extracted 9236 bus-technology combinations\n", + "2026-04-17 15:25:50,801 - workflow.scripts.renewable_profiles - INFO - STAGE 4: Reconcile grid extents\n", + "2026-04-17 15:25:50,802 - workflow.scripts.renewable_profiles - INFO - Reconciling grid extents across technologies...\n", + "2026-04-17 15:25:50,803 - workflow.scripts.renewable_profiles - INFO - Final grid: 256 Γ— 290\n", + "2026-04-17 15:25:50,804 - workflow.scripts.renewable_profiles - INFO - STAGE 5: Create xarray dataset\n", + "2026-04-17 15:25:50,808 - workflow.scripts.renewable_profiles - INFO - STAGE 6: Add metadata\n", + "2026-04-17 15:25:50,809 - workflow.scripts.renewable_profiles - INFO - Preparing geometry GeoDataFrame\n", + "2026-04-17 15:25:50,813 - workflow.scripts.renewable_profiles - INFO - βœ“ Profile building complete\n", + "2026-04-17 15:25:50,830 - __main__ - INFO - βœ“ Built 5296 buses Γ— 3 technologies\n" + ] + } + ], + "source": [ + "# ===== BUILD PROFILES: 7-Stage Pipeline =====\n", + "\"\"\"\n", + "Main orchestrator: builds per-bus renewable profiles from PyPSA-Earth data.\n", + "\n", + "Configuration options:\n", + "- country_codes: Filter to specific countries (None = all)\n", + "- geohash_precision: Bus ID precision (1-12, default 6)\n", + "- process_by_country: Sequential processing to reduce memory (default True)\n", + "\"\"\"\n", + "logger.info(\"=\" * 70)\n", + "logger.info(\"BUILDING RENEWABLE PROFILES (7-Stage Pipeline)\")\n", + "logger.info(\"=\" * 70)\n", + "\n", + "# Configuration\n", + "config = {\n", + " \"country_codes\": None, # None = process all regions\n", + " \"geohash_precision\": 6,\n", + " \"process_by_country\": True, # Sequential reduces memory usage\n", + "}\n", + "\n", + "# Build profiles\n", + "profiles_ds, geometry_gdf = build_profiles(\n", + " tech_profiles_nc,\n", + " onshore_regions_gpd,\n", + " offshore_regions_gpd,\n", + " config=config,\n", + ")\n", + "\n", + "logger.info(\n", + " f\"βœ“ Built {len(profiles_ds.bus)} buses Γ— {len(profiles_ds.technology)} technologies\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ff139ebe", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:32:46,713 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:32:46,714 - __main__ - INFO - PROCESSED vs RAW AUDIT\n", + "2026-04-17 15:32:46,714 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:32:46,715 - __main__ - INFO - \n", + "----------------------------------------------------------------------\n", + "2026-04-17 15:32:46,716 - __main__ - INFO - Technology: onwind\n", + "2026-04-17 15:32:46,717 - __main__ - INFO - ----------------------------------------------------------------------\n", + "2026-04-17 15:32:46,720 - __main__ - INFO - potential stats\n", + "2026-04-17 15:32:46,720 - __main__ - INFO - processed: min=0, max=3958.24, mean=1149.4, NaN=11303/74240 (15.22%)\n", + "2026-04-17 15:32:46,721 - __main__ - INFO - raw: min=0, max=3958.24, mean=1149.4, NaN=0/62937 (0.00%)\n", + "2026-04-17 15:32:46,723 - __main__ - INFO - p_nom_max stats\n", + "2026-04-17 15:32:46,723 - __main__ - INFO - processed: min=0, max=2.59744e+06, mean=15787.9, NaN=714/5296 (13.48%)\n", + "2026-04-17 15:32:46,725 - __main__ - INFO - raw: min=0, max=2.59744e+06, mean=15787.9, NaN=0/4582 (0.00%)\n", + "2026-04-17 15:32:46,726 - __main__ - INFO - processed non-NaN p_nom_max buses: 4582/5296\n", + "2026-04-17 15:32:46,726 - __main__ - INFO - \n", + "----------------------------------------------------------------------\n", + "2026-04-17 15:32:46,727 - __main__ - INFO - Technology: offwind-ac\n", + "2026-04-17 15:32:46,728 - __main__ - INFO - ----------------------------------------------------------------------\n", + "2026-04-17 15:32:46,731 - __main__ - INFO - potential stats\n", + "2026-04-17 15:32:46,732 - __main__ - INFO - processed: min=0, max=2188.46, mean=11.6741, NaN=0/74240 (0.00%)\n", + "2026-04-17 15:32:46,733 - __main__ - INFO - raw: min=0, max=2188.46, mean=11.6741, NaN=0/74240 (0.00%)\n", + "2026-04-17 15:32:46,734 - __main__ - INFO - p_nom_max stats\n", + "2026-04-17 15:32:46,735 - __main__ - INFO - processed: min=1.32857, max=54534.2, mean=2037.27, NaN=5224/5296 (98.64%)\n", + "2026-04-17 15:32:46,737 - __main__ - INFO - raw: min=0, max=54534.2, mean=1215.54, NaN=0/713 (0.00%)\n", + "2026-04-17 15:32:46,737 - __main__ - INFO - processed non-NaN p_nom_max buses: 72/5296\n", + "2026-04-17 15:32:46,738 - __main__ - INFO - \n", + "----------------------------------------------------------------------\n", + "2026-04-17 15:32:46,738 - __main__ - INFO - Technology: solar\n", + "2026-04-17 15:32:46,739 - __main__ - INFO - ----------------------------------------------------------------------\n", + "2026-04-17 15:32:46,743 - __main__ - INFO - potential stats\n", + "2026-04-17 15:32:46,743 - __main__ - INFO - processed: min=0, max=5423.68, mean=1370.58, NaN=11303/74240 (15.22%)\n", + "2026-04-17 15:32:46,744 - __main__ - INFO - raw: min=0, max=5423.68, mean=1370.58, NaN=0/62937 (0.00%)\n", + "2026-04-17 15:32:46,746 - __main__ - INFO - p_nom_max stats\n", + "2026-04-17 15:32:46,747 - __main__ - INFO - processed: min=0, max=4.10065e+06, mean=18825.9, NaN=714/5296 (13.48%)\n", + "2026-04-17 15:32:46,748 - __main__ - INFO - raw: min=0, max=4.10065e+06, mean=18825.9, NaN=0/4582 (0.00%)\n", + "2026-04-17 15:32:46,749 - __main__ - INFO - processed non-NaN p_nom_max buses: 4582/5296\n", + "2026-04-17 15:32:46,750 - __main__ - INFO - \n", + "βœ“ Audit complete\n" + ] + } + ], + "source": [ + "# ===== DIAGNOSTIC: Processed vs Raw Stats (potential, p_nom_max) =====\n", + "\"\"\"\n", + "Compare processed dataset statistics against raw PyPSA-Earth inputs.\n", + "Metrics: min, max, mean, NaN count, NaN share.\n", + "\"\"\"\n", + "\n", + "audit_report = audit_profiles_against_raw(\n", + " profiles_ds=profiles_ds,\n", + " raw_profile_datasets=tech_profiles_nc,\n", + " logger_instance=logger,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "71eecc60", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:02:24,289 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:02:24,289 - __main__ - INFO - SAVING PROFILES\n", + "2026-04-17 15:02:24,290 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:02:24,292 - workflow.scripts.renewable_profiles - INFO - Saving NetCDF to C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\data\\renewable_profiles\\renewable_profiles_africa__20260417_150224.nc\n", + "2026-04-17 15:02:31,403 - workflow.scripts.renewable_profiles - INFO - Saving GeoJSON to C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\data\\renewable_profiles\\renewable_profiles_africa__20260417_150224.geojson\n", + "2026-04-17 15:02:31,716 - pyogrio._io - INFO - Created 5,296 records\n", + "2026-04-17 15:02:31,717 - workflow.scripts.renewable_profiles - INFO - Saving metadata to C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\data\\renewable_profiles\\renewable_profiles_africa__20260417_150224_metadata.json\n", + "2026-04-17 15:02:31,719 - workflow.scripts.renewable_profiles - INFO - βœ“ Saved: renewable_profiles_africa__20260417_150224.nc, renewable_profiles_africa__20260417_150224.geojson, renewable_profiles_africa__20260417_150224_metadata.json\n", + "2026-04-17 15:02:31,720 - __main__ - INFO - βœ“ Saved to C:\\Users\\JanLeopoldTautorus\\Repos\\shift\\data\\renewable_profiles\n", + "2026-04-17 15:02:31,720 - __main__ - INFO - - renewable_profiles_africa__20260417_150224.nc\n", + "2026-04-17 15:02:31,721 - __main__ - INFO - - renewable_profiles_africa__20260417_150224.geojson\n", + "2026-04-17 15:02:31,721 - __main__ - INFO - - renewable_profiles_africa__20260417_150224_metadata.json\n" + ] + } + ], + "source": [ + "# ===== SAVE PROFILES =====\n", + "\"\"\"\n", + "Save output as NetCDF + GeoJSON + metadata.json for reproducibility.\n", + "\"\"\"\n", + "logger.info(\"=\" * 70)\n", + "logger.info(\"SAVING PROFILES\")\n", + "logger.info(\"=\" * 70)\n", + "\n", + "output_dir = SHIFT_PATH / \"data\" / \"renewable_profiles\"\n", + "nc_path, geojson_path, metadata_path = save_profiles(\n", + " profiles_ds,\n", + " geometry_gdf,\n", + " output_dir=output_dir,\n", + " filename_prefix=\"renewable_profiles_africa\",\n", + ")\n", + "\n", + "logger.info(f\"βœ“ Saved to {output_dir}\")\n", + "logger.info(f\" - {Path(nc_path).name}\")\n", + "logger.info(f\" - {Path(geojson_path).name}\")\n", + "logger.info(f\" - {Path(metadata_path).name}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "746c91e8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:31:15,815 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:31:15,816 - __main__ - INFO - OUTPUT DATASET SUMMARY\n", + "2026-04-17 15:31:15,817 - __main__ - INFO - ======================================================================\n", + "2026-04-17 15:31:15,823 - __main__ - INFO - \n", + " Size: 558MB\n", + "Dimensions: (bus: 5296, technology: 3, hour: 8760, y_grid: 256,\n", + " x_grid: 290)\n", + "Coordinates:\n", + " * bus (bus) object 42kB 'GNQ_ON_s0r8wu' ... 'MUS_OFF_mk155c'\n", + " * technology (technology) " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Grid-level raster map (GW per 0.25Β° grid cell)\n", + "fig1, ax1 = plot_grid_potentials(\n", + " profiles_ds,\n", + " technology=\"onwind\",\n", + " region=[\n", + " \"BI\",\n", + " \"KM\",\n", + " \"DJ\",\n", + " \"ER\",\n", + " \"ET\",\n", + " \"KE\",\n", + " \"MG\",\n", + " \"MW\",\n", + " \"MU\",\n", + " \"MZ\",\n", + " \"RW\",\n", + " \"SC\",\n", + " \"SO\",\n", + " \"SS\",\n", + " \"TZ\",\n", + " \"UG\",\n", + " \"ZM\",\n", + " \"ZW\", # Africa β€” Eastern Africa\n", + " \"AO\",\n", + " \"CM\",\n", + " \"CF\",\n", + " \"TD\",\n", + " \"CG\",\n", + " \"CD\",\n", + " \"GQ\",\n", + " \"GA\",\n", + " \"ST\", # Africa β€” Middle Africa\n", + " \"DZ\",\n", + " \"EG\",\n", + " \"LY\",\n", + " \"MA\",\n", + " \"SD\",\n", + " \"TN\", # Africa β€” Northern Africa\n", + " \"BW\",\n", + " \"SZ\",\n", + " \"LS\",\n", + " \"NA\",\n", + " \"ZA\", # Africa β€” Southern Africa\n", + " ],\n", + " cmap=\"Blues\",\n", + " gridlabels=True,\n", + " filename=None, # Set to \"onwind_grid.png\" to save\n", + ")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "911d3b34", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-04-17 15:46:41,109 - workflow.scripts.renewable_profiles - INFO - Region not specified. Using all countries from geometry_gdf: ['AGO', 'BDI', 'BEN', 'BFA', 'BWA', 'CAF', 'CIV', 'CMR', 'COD', 'COG', 'COM', 'CPV', 'DJI', 'DZA', 'EGY', 'ERI', 'ETH', 'GAB', 'GHA', 'GIN', 'GMB', 'GNB', 'GNQ', 'KEN', 'LBR', 'LBY', 'LSO', 'MAR', 'MDG', 'MLI', 'MOZ', 'MRT', 'MUS', 'MWI', 'NAM', 'NER', 'NGA', 'RWA', 'SDN', 'SEN', 'SLE', 'SOM', 'SSD', 'STP', 'SWZ', 'SYC', 'TCD', 'TGO', 'TUN', 'TZA', 'UGA', 'ZAF', 'ZMB', 'ZWE']\n", + "2026-04-17 15:46:41,172 - workflow.scripts.renewable_profiles - WARNING - No Natural Earth country match for: ['COM', 'CPV', 'MUS', 'STP', 'SYC']. These labels are ignored for extent calculation.\n", + "2026-04-17 15:46:41,174 - workflow.scripts.renewable_profiles - INFO - Computed extent from 49 matched countries [min_lon, max_lon, min_lat, max_lat]: [-18.63, 52.13, -35.82, 38.35]\n", + "c:\\Users\\JanLeopoldTautorus\\Repos\\shift\\.pixi\\envs\\dev\\Lib\\site-packages\\cartopy\\mpl\\feature_artist.py:143: UserWarning: facecolor will have no effect as it has been defined as \"never\".\n", + " warnings.warn('facecolor will have no effect as it has been '\n", + "2026-04-17 15:46:41,190 - workflow.scripts.renewable_profiles - INFO - Loading 5296 bus geometries for onwind...\n", + "Processing geometries: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 5296/5296 [00:01<00:00, 3311.88it/s]\n", + "2026-04-17 15:46:42,793 - workflow.scripts.renewable_profiles - INFO - Plotting 4556 regions, density range: 0.001 - 3.615 MW/kmΒ²\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Bus-level capacity density map (GW/kmΒ² per Voronoi region)\n", + "# Pass geometry_gdf for better performance (uses GeoJSON directly)\n", + "fig2, ax2 = plot_bus_capacity_density(\n", + " profiles_ds,\n", + " technology=\"onwind\",\n", + " geometry_gdf=geometry_gdf, # Optional: pass GeoDataFrame for faster geometry lookup\n", + " cmap=\"Blues\",\n", + " vmin=None, # Auto-scale to 5-95 percentile\n", + " vmax=None,\n", + " gridlabels=True,\n", + " filename=None, # Set to \"onwind_density.png\" to save\n", + ")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "shift-dev", + "language": "python", + "name": "shift-dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workflow/notebooks/validation.ipynb b/workflow/notebooks/validation.ipynb index 4246f99..c989351 100644 --- a/workflow/notebooks/validation.ipynb +++ b/workflow/notebooks/validation.ipynb @@ -8,7 +8,6 @@ "outputs": [], "source": [ "import pypsa\n", - "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import yaml" ] @@ -20,7 +19,9 @@ "metadata": {}, "outputs": [], "source": [ - "n = pypsa.Network(\"../../results/cost_year~2030/transport_cost~steel_r_iron_r/demand~1/product~steel/network.nc\")" + "n = pypsa.Network(\n", + " \"../../results/cost_year~2030/transport_cost~steel_r_iron_r/demand~1/product~steel/network.nc\"\n", + ")" ] }, { @@ -38,7 +39,7 @@ "metadata": {}, "outputs": [], "source": [ - "n.links[n.links.carrier == \"shipping_steel\"].marginal_cost /2000" + "n.links[n.links.carrier == \"shipping_steel\"].marginal_cost / 2000" ] }, { @@ -136,7 +137,9 @@ "outputs": [], "source": [ "# Most expensive supply of steel\n", - "n.links[n.links.carrier == \"steel\"].marginal_cost.sort_values() *1.59 + (98* 1.59) #.describe()*1.59" + "n.links[n.links.carrier == \"steel\"].marginal_cost.sort_values() * 1.59 + (\n", + " 98 * 1.59\n", + ") # .describe()*1.59" ] }, { @@ -258,7 +261,9 @@ "metadata": {}, "outputs": [], "source": [ - "n.statistics.energy_balance(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"]).div(1e6).loc[:,:,\"shipping_iron_ore\"]" + "n.statistics.energy_balance(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"]).div(1e6).loc[\n", + " :, :, \"shipping_iron_ore\"\n", + "]" ] }, { @@ -286,7 +291,7 @@ "metadata": {}, "outputs": [], "source": [ - "print(f\"The total cost is {n.objective/1e9:.2f} B EUR\")" + "print(f\"The total cost is {n.objective / 1e9:.2f} B EUR\")" ] }, { @@ -342,8 +347,6 @@ "metadata": {}, "outputs": [], "source": [ - "import yaml\n", - "\n", "# Load config from YAML\n", "with open(\"../../config/config.yaml\", \"r\") as f:\n", " config = yaml.safe_load(f)\n", @@ -370,12 +373,13 @@ "metadata": {}, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", "import cartopy.crs as ccrs\n", "import yaml\n", "\n", - "def plot_trade_map(n, supply, demand, trade, product=\"steel\",\n", - " alpha_supply=0.7, alpha_demand=1):\n", + "\n", + "def plot_trade_map(\n", + " n, supply, demand, trade, product=\"steel\", alpha_supply=0.7, alpha_demand=1\n", + "):\n", "\n", " with open(\"../../config/config.yaml\", \"r\") as f:\n", " config = yaml.safe_load(f)\n", @@ -385,11 +389,11 @@ "\n", " supply_color = colors.get(f\"{product}_supply\", \"black\")\n", " demand_color = colors.get(f\"{product}_demand\", \"lightsteelblue\")\n", - " link_colors = colors.get(f\"{product}_link\", \"gray\")\n", + " link_colors = colors.get(f\"{product}_link\", \"gray\")\n", "\n", " fig = plt.figure(figsize=(10, 5))\n", " ax = plt.axes(projection=ccrs.PlateCarree())\n", - " \n", + "\n", " # ax.coastlines()\n", "\n", " # Plot demand\n", @@ -414,15 +418,29 @@ " )\n", "\n", " ax.set_extent([-180, 180, -60, 85], crs=ccrs.PlateCarree())\n", - " # ax.set_global() \n", + " # ax.set_global()\n", "\n", " # Legend\n", " legend_elements = [\n", " plt.Line2D([0], [0], color=link_colors, label=\"shipping\"),\n", - " plt.Line2D([0], [0], marker=\"o\", color=\"white\", label=\"Demand\",\n", - " markerfacecolor=demand_color, markersize=10),\n", - " plt.Line2D([0], [0], marker=\"o\", color=\"white\", label=\"Supply\",\n", - " markerfacecolor=supply_color, markersize=10),\n", + " plt.Line2D(\n", + " [0],\n", + " [0],\n", + " marker=\"o\",\n", + " color=\"white\",\n", + " label=\"Demand\",\n", + " markerfacecolor=demand_color,\n", + " markersize=10,\n", + " ),\n", + " plt.Line2D(\n", + " [0],\n", + " [0],\n", + " marker=\"o\",\n", + " color=\"white\",\n", + " label=\"Supply\",\n", + " markerfacecolor=supply_color,\n", + " markersize=10,\n", + " ),\n", " ]\n", "\n", " fig.legend(\n", @@ -432,7 +450,7 @@ " bbox_to_anchor=(0.22, 0.28),\n", " )\n", "\n", - " return fig\n" + " return fig" ] }, { @@ -443,7 +461,11 @@ "outputs": [], "source": [ "# Supply and demand\n", - "steel_gen = n.statistics.supply(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"]).loc[:, :, \"steel\"].droplevel(0)\n", + "steel_gen = (\n", + " n.statistics.supply(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"])\n", + " .loc[:, :, \"steel\"]\n", + " .droplevel(0)\n", + ")\n", "steel_load = n.loads.groupby(\"bus\").p_set.sum()\n", "steel_trade = n.links[n.links.carrier == \"shipping_steel\"].p_nom_opt.astype(int)\n", "\n", @@ -454,7 +476,7 @@ " demand=steel_load,\n", " trade=steel_trade,\n", " product=\"steel\",\n", - " alpha_supply=0.7\n", + " alpha_supply=0.7,\n", ")" ] }, @@ -466,8 +488,16 @@ "outputs": [], "source": [ "# Supply and demand\n", - "iron_ore_gen = n.statistics.supply(comps=[\"Generator\"], groupby=[\"bus\", \"carrier\"]).loc[:, :, \"iron_ore\"].droplevel(0)\n", - "iron_ore_load = n.statistics.withdrawal(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"]).loc[:, :, \"steel\"].droplevel(0)\n", + "iron_ore_gen = (\n", + " n.statistics.supply(comps=[\"Generator\"], groupby=[\"bus\", \"carrier\"])\n", + " .loc[:, :, \"iron_ore\"]\n", + " .droplevel(0)\n", + ")\n", + "iron_ore_load = (\n", + " n.statistics.withdrawal(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"])\n", + " .loc[:, :, \"steel\"]\n", + " .droplevel(0)\n", + ")\n", "iron_ore_trade = n.links[n.links.carrier == \"shipping_iron_ore\"].p_nom_opt.astype(int)\n", "\n", "# Shipping color from carrier\n", @@ -480,8 +510,8 @@ " demand=iron_ore_load,\n", " trade=iron_ore_trade,\n", " product=\"iron_ore\",\n", - " alpha_supply=0.5\n", - ")\n" + " alpha_supply=0.5,\n", + ")" ] }, { @@ -501,7 +531,8 @@ "metadata": {}, "outputs": [], "source": [ - "import inspect, pypsa\n", + "import inspect\n", + "import pypsa\n", "\n", "print(\"PyPSA version:\", pypsa.__version__)\n", "map_fn = n.plot.map\n", @@ -561,16 +592,22 @@ " else:\n", " print(f\"Warning: no ISO A2 for '{name}' in region '{region}'\")\n", "\n", - "reader = shpreader.natural_earth(resolution=\"110m\", category=\"cultural\", name=\"admin_0_countries\")\n", + "reader = shpreader.natural_earth(\n", + " resolution=\"110m\", category=\"cultural\", name=\"admin_0_countries\"\n", + ")\n", "world = gpd.read_file(reader)\n", "\n", + "\n", "def _lookup_iso(name):\n", " try:\n", " return pycountry.countries.lookup(name).alpha_2\n", " except LookupError:\n", " return None\n", "\n", - "world.loc[world[\"ISO_A2\"] == \"-99\", \"ISO_A2\"] = world.loc[world[\"ISO_A2\"] == \"-99\", \"ADMIN\"].apply(_lookup_iso)\n", + "\n", + "world.loc[world[\"ISO_A2\"] == \"-99\", \"ISO_A2\"] = world.loc[\n", + " world[\"ISO_A2\"] == \"-99\", \"ADMIN\"\n", + "].apply(_lookup_iso)\n", "world[\"region\"] = world[\"ISO_A2\"].map(iso_to_region)\n", "\n", "region_gdf = world.dropna(subset=[\"region\"]).dissolve(by=\"region\").reset_index()\n", @@ -584,11 +621,16 @@ "metadata": {}, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", - "import cartopy.crs as ccrs\n", - "\n", - "def plot_trade_map_regions(n, supply, demand, trade, product=\"steel\",\n", - " alpha_supply=0.7, alpha_demand=1, region_gdf=None):\n", + "def plot_trade_map_regions(\n", + " n,\n", + " supply,\n", + " demand,\n", + " trade,\n", + " product=\"steel\",\n", + " alpha_supply=0.7,\n", + " alpha_demand=1,\n", + " region_gdf=None,\n", + "):\n", " \"\"\"\n", " Like plot_trade_map but uses a dissolved region GeoDataFrame as basemap\n", " so only region-level borders are visible (no internal country borders).\n", @@ -603,15 +645,16 @@ "\n", " supply_color = colors.get(f\"{product}_supply\", \"black\")\n", " demand_color = colors.get(f\"{product}_demand\", \"lightsteelblue\")\n", - " link_colors = colors.get(f\"{product}_link\", \"gray\")\n", + " link_colors = colors.get(f\"{product}_link\", \"gray\")\n", "\n", " fig = plt.figure(figsize=(10, 5))\n", " ax = plt.axes(projection=ccrs.PlateCarree())\n", "\n", " # Draw dissolved regions as basemap (region borders only, no country borders)\n", " if region_gdf is not None:\n", - " region_gdf.plot(ax=ax, facecolor=\"lightgrey\", edgecolor=\"white\",\n", - " linewidth=0.5, zorder=1)\n", + " region_gdf.plot(\n", + " ax=ax, facecolor=\"lightgrey\", edgecolor=\"white\", linewidth=0.5, zorder=1\n", + " )\n", "\n", " # Plot demand β€” geomap=False so PyPSA doesn't draw its own background\n", " n.plot.map(\n", @@ -640,25 +683,53 @@ "\n", " legend_elements = [\n", " plt.Line2D([0], [0], color=link_colors, label=\"shipping\"),\n", - " plt.Line2D([0], [0], marker=\"o\", color=\"white\", label=\"Demand\",\n", - " markerfacecolor=demand_color, markersize=10),\n", - " plt.Line2D([0], [0], marker=\"o\", color=\"white\", label=\"Supply\",\n", - " markerfacecolor=supply_color, markersize=10),\n", + " plt.Line2D(\n", + " [0],\n", + " [0],\n", + " marker=\"o\",\n", + " color=\"white\",\n", + " label=\"Demand\",\n", + " markerfacecolor=demand_color,\n", + " markersize=10,\n", + " ),\n", + " plt.Line2D(\n", + " [0],\n", + " [0],\n", + " marker=\"o\",\n", + " color=\"white\",\n", + " label=\"Supply\",\n", + " markerfacecolor=supply_color,\n", + " markersize=10,\n", + " ),\n", " ]\n", - " fig.legend(handles=legend_elements, frameon=False, loc=\"lower right\",\n", - " bbox_to_anchor=(0.22, 0.28))\n", + " fig.legend(\n", + " handles=legend_elements,\n", + " frameon=False,\n", + " loc=\"lower right\",\n", + " bbox_to_anchor=(0.22, 0.28),\n", + " )\n", "\n", " return fig\n", "\n", "\n", "# Test: steel\n", - "steel_gen = n.statistics.supply(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"]).loc[:, :, \"steel\"].droplevel(0)\n", - "steel_load = n.loads.groupby(\"bus\").p_set.sum()\n", + "steel_gen = (\n", + " n.statistics.supply(comps=[\"Link\"], groupby=[\"bus\", \"carrier\"])\n", + " .loc[:, :, \"steel\"]\n", + " .droplevel(0)\n", + ")\n", + "steel_load = n.loads.groupby(\"bus\").p_set.sum()\n", "steel_trade = n.links[n.links.carrier == \"shipping_steel\"].p_nom_opt.astype(int)\n", "\n", - "fig = plot_trade_map_regions(n, supply=steel_gen, demand=steel_load,\n", - " trade=steel_trade, product=\"steel\",\n", - " alpha_supply=0.7, region_gdf=region_gdf)\n", + "fig = plot_trade_map_regions(\n", + " n,\n", + " supply=steel_gen,\n", + " demand=steel_load,\n", + " trade=steel_trade,\n", + " product=\"steel\",\n", + " alpha_supply=0.7,\n", + " region_gdf=region_gdf,\n", + ")\n", "plt.show()" ] } diff --git a/workflow/scripts/_helpers.py b/workflow/scripts/_helpers.py index c2bcfaa..6a8d51d 100644 --- a/workflow/scripts/_helpers.py +++ b/workflow/scripts/_helpers.py @@ -1,35 +1,78 @@ -import calendar -import io import logging -import os -import shutil -import subprocess -import sys -import time -import zipfile -from datetime import datetime, timedelta from pathlib import Path -import country_converter as coco -import geopandas as gpd -import numpy as np -import pandas as pd import requests import yaml # from fake_useragent import UserAgent # from pypsa.components import component_attrs, components -from shapely.geometry import Point from tqdm import tqdm logger = logging.getLogger(__name__) + +def setup_logging( + name: str, + snakemake=None, + level: int = logging.INFO, + log_filename: str | None = None, +) -> logging.Logger: + """Configure a module logger with shared package conventions. + + Parameters + ---------- + name : str + Logger name, usually `__name__`. + snakemake : object, optional + Snakemake object. If it provides `log`, a file handler is added. + level : int + Logging level for the logger and handlers. + log_filename : str, optional + Fallback filename used when `snakemake.log` is unavailable. + + Returns + ------- + logging.Logger + Configured logger instance. + """ + log = logging.getLogger(name) + log.setLevel(level) + + formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") + + if not any(getattr(h, "_shift_console_handler", False) for h in log.handlers): + stream_handler = logging.StreamHandler() + stream_handler.setLevel(level) + stream_handler.setFormatter(formatter) + stream_handler._shift_console_handler = True # type: ignore[attr-defined] + log.addHandler(stream_handler) + + log_path = None + if snakemake is not None and getattr(snakemake, "log", None): + log_path = Path(snakemake.log[0]) + elif log_filename is not None: + log_path = Path("../logs") / log_filename + + if log_path is not None and not any( + getattr(h, "baseFilename", None) == str(log_path) for h in log.handlers + ): + log_path.parent.mkdir(parents=True, exist_ok=True) + file_handler = logging.FileHandler(log_path) + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(formatter) + file_handler._shift_file_handler = True # type: ignore[attr-defined] + log.addHandler(file_handler) + + return log + + def load_config(config): with open(config, "r") as stream: try: config = yaml.safe_load(stream) except yaml.YAMLError as exc: - print(exc) + logger.exception("Failed to load config %s", config) + raise exc return config @@ -79,7 +122,7 @@ def mock_snakemake( script_dir = Path(__file__).parent.resolve() if root_dir is None: - root_dir = script_dir.parent + root_dir = script_dir.parent.parent else: root_dir = Path(root_dir).resolve() @@ -187,4 +230,4 @@ def progress_retrieve(url, file, disable=False): with open(file, "wb") as f: for data in response.iter_content(chunk_size=chunk_size): f.write(data) - t.update(len(data)) \ No newline at end of file + t.update(len(data)) diff --git a/workflow/scripts/build_x_supply_chain.py b/workflow/scripts/build_x_supply_chain.py new file mode 100644 index 0000000..cf24b34 --- /dev/null +++ b/workflow/scripts/build_x_supply_chain.py @@ -0,0 +1,510 @@ +"""Build PyPSA supply chain skeleton for commodity X using technology database. + +Generic conversion pathway structure (currently configured for steel): + Electricity β†’ Electrolyzer β†’ H2 β†’ DRI β†’ HBI β†’ EAF β†’ Commodity Output + +Module provides functions to construct a PyPSA energy system network representing +a decarbonized production supply chain. The network includes: + - Energy carriers (electricity, hydrogen, commodities) + - Conversion technologies (electrolyzer, DRI, EAF) + - Storage systems (H2 storage, batteries) + - External resource supplies + +Usage: + - Snakemake integration: Automatically invoked with config and costs files + - Standalone: Direct invocation for testing with sample config + +Inputs: + - tech_costs_path (str): Path to PyPSA technology database CSV + - config (dict): Configuration dict with keys like 'cost_year', '*_p_min_pu' + +Outputs: + - PyPSA Network object ready for optimization + - Exported to NetCDF format for storage and further analysis + +Reusable pattern for any commodity with similar conversion chains. +Modify the techno-economic parameters, bus definitions, and links to adapt to different commodities. +""" + +from typing import Any +from pathlib import Path +import pandas as pd +import numpy as np +import pypsa + +import tech_database as td +from _helpers import setup_logging + +from trade_chain_utils import ( + get_ordered_stages, + get_trade_chain, + split_stage_inputs, + get_stage_groups, + _components_for_process_label, +) + +snakemake: Any = globals().get("snakemake") +logger = setup_logging( + __name__, snakemake=snakemake, log_filename="build_x_supply_chain.log" +) + + +def _techno_economic_parameters(config: dict) -> dict: + return config.get("techno-economic parameters", {}) + + +def _additional_parameters(config: dict) -> dict: + return _techno_economic_parameters(config).get("additional_parameters", {}) + + +def _additional_parameter(config: dict, name: str, default: float) -> float: + parameters = _additional_parameters(config) + if name not in parameters: + logger.warning( + f"Missing techno-economic parameter '{name}'; using default value {default}." + ) + return float(parameters.get(name, default)) + + +def _part_load(config: dict, technology: str, default: float) -> float: + """Read a part-load minimum from config.part_load.""" + return float(config.get("part_load", {}).get(technology, default)) + + +def _add_carriers(network: pypsa.Network) -> None: + """Add carrier components to network. + + PyPSA requires explicit Carrier components before buses/generators can reference them. + """ + carriers = { + "renewable_electricity": "Islanded renewable electricity", + # Technology-specific renewable carriers (used by Generators) + "renewable_pv": "Photovoltaic (utility)", + "renewable_wind_onshore": "Onshore wind", + "renewable_wind_offshore": "Offshore wind", + "hydrogen": "Hydrogen gas", + "battery_elec": "Battery (electrical energy)", + "iron_ore": "Iron ore (mass)", + "hbi": "Hot Briquetted Iron (mass)", + "steel": "Steel (mass)", + "grid_electricity": "Grid electricity import", + } + for carrier_name, description in carriers.items(): + network.add("Carrier", carrier_name, description=description) + + +def _add_buses(network: pypsa.Network, stages: list | None = None) -> None: + """Add energy carrier buses. + + The `grid_electricity` bus is created only when one of the configured + stages explicitly requires grid electricity as an energy input. This + keeps the skeleton free of an unused grid bus when stages are fully + renewable. + """ + # determine whether any stage requires grid_electricity + uses_grid = False + if stages is not None: + for stage in stages: + _, energy_inputs = split_stage_inputs(stage) + if "grid_electricity" in energy_inputs: + uses_grid = True + break + + buses = { + "renewable_electricity": {"carrier": "renewable_electricity", "unit": "MW"}, + "hydrogen": {"carrier": "hydrogen", "unit": "MW"}, + "battery": {"carrier": "battery_elec", "unit": "MWh"}, + "iron_ore": {"carrier": "iron_ore", "unit": "t/h"}, + "hbi": {"carrier": "hbi", "unit": "t/h"}, + "steel": {"carrier": "steel", "unit": "t/h"}, + } + + # add grid bus only if needed + if uses_grid: + buses["grid_electricity"] = {"carrier": "grid_electricity", "unit": "MW"} + + for name, attrs in buses.items(): + if name not in network.buses.index: + network.add("Bus", name, **attrs) + + +def _add_grid_electricity_supply( + network: pypsa.Network, config: dict, stages: list | None = None +) -> None: + """Add a grid import generator for the EAF when requested. + + The default topology uses grid-connected EAF power. When config sets + `eaf_electricity_source` to anything other than `grid`, this helper is a no-op + and the EAF remains connected to the local electricity bus. + """ + + # If specific stages provided, inspect those; otherwise inspect full chain + if stages is None: + chain = get_trade_chain(config) + stages = get_ordered_stages(chain) + uses_grid = any( + "grid_electricity" in split_stage_inputs(stage)[1] for stage in stages + ) + + if not uses_grid: + return + + network.add( + "Generator", + "grid_electricity_import", + bus="grid_electricity", + carrier="grid_electricity", + p_nom=1e10, + marginal_cost=config.get("grid_electricity_price", 75.0), + ) + + +def _add_conversion_chain( + network: pypsa.Network, + tech_costs: pd.Series, + config: dict, + stages: list | None = None, +) -> None: + """Add the configured stage conversion pathway. + Note: Costs are added but discount_rate is NOT set here. + It is applied regionally in prepare_regional_network. + """ + + # Allow building from an explicit list of stages (stage-group) or full chain + if stages is None: + chain = get_trade_chain(config) + stages = get_ordered_stages(chain) + if not stages: + raise ValueError("No stages configured in trade_chains") + + for stage in stages: + process_label = str(stage.get("process_label", "")).strip() + materials, energy_inputs = split_stage_inputs(stage) + + # Validate stage IO against canonical mapping (sanity check only) + try: + # Use strict behavior if config requests it + strict_validation = bool(config.get("strict_trade_chain_validation", False)) + from trade_chain_utils import validate_stage_io + + validate_stage_io(stage, raise_on_mismatch=strict_validation) + except Exception as exc: + # If strict_validation True, validate_stage_io will raise; propagate + if config.get("strict_trade_chain_validation", False): + raise + logger.warning(f"Trade-chain validation issue: {exc}") + + # Resolve concrete components from mapping + comp = _components_for_process_label(process_label) + if comp is None: + logger.warning( + f"No component mapping for process_label '{process_label}'; skipping stage" + ) + continue + + # Normalize candidate buses + # Prefer canonical buses from the mapping; fall back to stage-declared inputs + def pick_bus(preferred: str, fallback_list: list[str], default: str) -> str: + # preferred may be like 'renewable_electricity' or 'hydrogen' + if preferred in comp.get("buses", ()): # type: ignore[arg-type] + return preferred + for f in fallback_list: + if f: + return f + return default + + # ELECTROLYZER + if "electrolyzer" in comp.get("links", ()): # type: ignore[arg-type] + elec_params = td.get_tech(tech_costs, "Alkaline electrolyzer large size") + elec_inv_cost = ( + td.get_tech_param(elec_params, "investment", 544.7764) * 1000 + ) + # choose energy bus: prefer 'renewable_electricity' unless grid explicitly listed + energy_bus = ( + "grid_electricity" + if "grid_electricity" in energy_inputs + else "renewable_electricity" + ) + network.add( + "Link", + process_label, + bus0=energy_bus, + bus1="hydrogen", + carrier="electrolysis", + efficiency=1.0 + / td.get_tech_param(elec_params, "electricity-input", 1.38), + overnight_cost=elec_inv_cost, + lifetime=td.get_tech_param(elec_params, "lifetime", 40.0), + fom_cost=elec_inv_cost + * (td.get_tech_param(elec_params, "FOM", 2.8) / 100), + p_nom_extendable=True, + p_nom_max=np.inf, + p_min_pu=_part_load(config, "electrolysis", 0.10), + ) + + # DRI (direct reduction) β€” use canonical buses: iron_ore -> hbi, hydrogen input, electricity + if "dri" in comp.get("links", ()): # type: ignore[arg-type] + dri_params = td.get_tech( + tech_costs, "hydrogen direct iron reduction furnace" + ) + dri_inv_cost = td.get_tech_param(dri_params, "investment", 5378698.8822) + # canonical buses + bus0 = "iron_ore" + bus1 = "hbi" + bus2 = "hydrogen" + # bus3: electricity; prefer grid if explicitly listed in stage, else renewable + bus3 = ( + "grid_electricity" + if "grid_electricity" in energy_inputs + else "renewable_electricity" + ) + network.add( + "Link", + process_label, + bus0=bus0, + bus1=bus1, + bus2=bus2, + bus3=bus3, + carrier="direct_reduction_furnace", + efficiency=1.0 / td.get_tech_param(dri_params, "ore-input", 1.59), + efficiency2=-td.get_tech_param(dri_params, "hydrogen-input", 2.1), + efficiency3=-td.get_tech_param(dri_params, "electricity-input", 1.03), + overnight_cost=dri_inv_cost, + lifetime=td.get_tech_param(dri_params, "lifetime", 40.0), + fom_cost=dri_inv_cost + * (td.get_tech_param(dri_params, "FOM", 11.3) / 100), + p_nom_extendable=True, + p_nom_max=np.inf, + p_min_pu=_part_load(config, "direct reduction furnace", 0.15), + ) + + # EAF (electric arc furnace) β€” canonical buses: hbi -> steel, electricity from grid by default + if "eaf" in comp.get("links", ()): # type: ignore[arg-type] + eaf_params = td.get_tech(tech_costs, "electric arc furnace") + eaf_inv_cost = td.get_tech_param(eaf_params, "investment", 2312992.7323) + # canonical buses + bus0 = "hbi" + bus1 = "steel" + # choose energy bus: prefer grid by default; if stage explicitly lists renewable, use renewable + bus2 = ( + "grid_electricity" + if "grid_electricity" in energy_inputs + else "renewable_electricity" + ) + network.add( + "Link", + process_label, + bus0=bus0, + bus1=bus1, + bus2=bus2, + carrier="electric_arc_furnace", + efficiency=1.0 / td.get_tech_param(eaf_params, "hbi-input", 1.0), + efficiency2=-td.get_tech_param(eaf_params, "electricity-input", 0.6395), + overnight_cost=eaf_inv_cost, + lifetime=td.get_tech_param(eaf_params, "lifetime", 40.0), + fom_cost=eaf_inv_cost + * (td.get_tech_param(eaf_params, "FOM", 30.0) / 100), + p_nom_extendable=True, + p_nom_max=np.inf, + p_min_pu=_part_load(config, "electric arc furnace", 0.20), + ) + + +def _add_storage(network: pypsa.Network, tech_costs: pd.Series, config: dict) -> None: + """Add H2 and battery storage systems. + + Note: Costs are added but discount_rate is NOT set here. + It is applied regionally in prepare_regional_network. + """ + + # H2 Storage (underground cavern) + h2_params = td.get_tech(tech_costs, "hydrogen storage underground") + + h2_inv_cost = td.get_tech_param(h2_params, "investment", 1.6045) * 1000 + network.add( + "Store", + "h2_storage", + bus="hydrogen", + e_nom_extendable=True, + overnight_cost=h2_inv_cost, # EUR/kWh β†’ EUR/MWh + lifetime=td.get_tech_param(h2_params, "lifetime", 100.0), + fom_cost=h2_inv_cost * (td.get_tech_param(h2_params, "FOM", 0.0) / 100), + standing_loss=_additional_parameter(config, "h2_standing_loss", 0.0), + e_cyclic=True, # End state must equal start state + ) + + # Battery Storage: Power (inverter for charger/discharger) + Energy (store) + batt_inv_params = td.get_tech(tech_costs, "battery inverter") + batt_store_params = td.get_tech(tech_costs, "battery storage") + + batt_inv_cost = td.get_tech_param(batt_inv_params, "investment", 80.223) * 1000 + network.add( + "Link", + "batt_charge", + bus0="renewable_electricity", + bus1="battery", + efficiency=np.sqrt(td.get_tech_param(batt_inv_params, "efficiency", 0.96)), + overnight_cost=batt_inv_cost, # EUR/kW β†’ EUR/MW + lifetime=td.get_tech_param(batt_inv_params, "lifetime", 10.0), + fom_cost=batt_inv_cost * (td.get_tech_param(batt_inv_params, "FOM", 0.9) / 100), + p_nom_extendable=True, + p_nom_max=np.inf, + ) + + network.add( + "Link", + "batt_discharge", + bus0="battery", + bus1="renewable_electricity", + efficiency=np.sqrt(td.get_tech_param(batt_inv_params, "efficiency", 0.96)), + overnight_cost=batt_inv_cost, + lifetime=td.get_tech_param(batt_inv_params, "lifetime", 10.0), + fom_cost=batt_inv_cost * (td.get_tech_param(batt_inv_params, "FOM", 0.9) / 100), + p_nom_extendable=True, + p_nom_max=np.inf, + ) + + batt_store_cost = ( + td.get_tech_param(batt_store_params, "investment", 100.2787) * 1000 + ) + network.add( + "Store", + "battery", + bus="battery", + e_nom_extendable=True, + overnight_cost=batt_store_cost, # EUR/kWh β†’ EUR/MWh + lifetime=td.get_tech_param(batt_store_params, "lifetime", 30.0), + fom_cost=batt_store_cost * 0.0, + standing_loss=_additional_parameter(config, "batt_standing_loss", 0.0), + e_cyclic=True, # End state must equal start state + ) + + network.add( + "Store", + "hbi_storage", + bus="hbi", + e_nom_extendable=True, + overnight_cost=0.0, # Just a pile - no cost + lifetime=1.0, + fom_cost=0.0, # No maintenance cost + discount_rate=0.0, # No cost, discount rate doesn't matter but required by PyPSA + standing_loss=0.0, # HBI storage doesn't lose energy + e_cyclic=True, + ) + + # Steel Storage: flexible intermediate inventory between EAF and demand + network.add( + "Store", + "steel_storage", + bus="steel", + e_nom_extendable=True, + overnight_cost=0.0, # Just a pile - no cost + lifetime=1.0, + fom_cost=0.0, # No maintenance cost + discount_rate=0.0, # No cost, discount rate doesn't matter but required by PyPSA + standing_loss=0.0, # Steel storage doesn't lose energy + e_cyclic=True, # End state must equal start state + ) + + +def build_network(config: dict, tech_costs_path: str, year: int) -> pypsa.Network: + """Build PyPSA steel supply chain skeleton (region-agnostic). + + The skeleton contains: + - Carriers and buses (region-independent) + - Conversion chain with costs but WITHOUT discount_rate + - Regional discount_rate is applied later in prepare_regional_network + + This design allows the same skeleton to be used across regions with different discount rates. + """ + + network = pypsa.Network() + network.set_snapshots(pd.date_range(f"{year}-01-01", periods=8760, freq="h")) + # NOTE: discount_rate is NOT set here (region-agnostic) + tech_costs = td.load_tech_costs(tech_costs_path) + + # Add network components (carriers MUST be added before buses that reference them) + _add_carriers(network) + # determine full-stage ordering for bus creation decisions + chain = get_trade_chain(config) + stages = get_ordered_stages(chain) + _add_buses(network, stages=stages) + _add_grid_electricity_supply(network, config) + _add_conversion_chain(network, tech_costs, config) + _add_storage(network, tech_costs, config) + + logger.info( + f"Built network: {len(network.buses)} buses, {len(network.links)} links, " + f"{len(network.stores)} stores, {len(network.generators)} generators" + ) + + return network + + +def _set_meta(network: pypsa.Network, group: dict | None) -> None: + """Attach metadata about stage group to the network for downstream tools.""" + meta = {} + if group is not None: + meta["stage_group_label"] = group.get("label") + meta["stages"] = [int(s.get("order", -1)) for s in group.get("stages", [])] + # Derive whether this group uses renewables + uses_renewables = any( + "renewable_electricity" in split_stage_inputs(s)[1] + for s in group.get("stages", []) + ) + meta["uses_renewables"] = bool(uses_renewables) + network.meta = meta + + +if __name__ == "__main__": + if snakemake is None: + raise RuntimeError( + "This script must be run via Snakemake with cost_year wildcard" + ) + + config = snakemake.config # noqa: F821 + tech_costs_path = snakemake.input.costs # noqa: F821 + output_path = snakemake.output[0] # noqa: F821 + + cost_year = getattr(snakemake.wildcards, "cost_year", None) + if cost_year is None: + raise ValueError("snakemake.wildcards.cost_year is required") + + year = int(cost_year) + + # Build and export the full skeleton (backwards compatible) + full_network = build_network(config, tech_costs_path, year) + _set_meta(full_network, None) + # Ensure target directory exists and write to new generic_model path + out_dir = str(Path(output_path).resolve().parent) + generic_dir = Path(out_dir) / ".." / "generic_production_model" + generic_dir = generic_dir.resolve() + full_out = generic_dir / f"generic_model_{year}.nc" + full_network.export_to_netcdf(str(full_out)) + logger.info(f"Full generic model exported to {full_out}") + + # Additionally export one skeleton per detected stage-group + chain = get_trade_chain(config) + groups = get_stage_groups(chain) + out_dir = str(Path(output_path).resolve().parent) + generic_dir = Path(out_dir) / ".." / "generic_production_model" + generic_dir = generic_dir.resolve() + for group in groups: + label = group.get("label") or "group" + # Build a fresh network containing only components for this stage-group + group_network = pypsa.Network() + group_network.set_snapshots( + pd.date_range(f"{year}-01-01", periods=8760, freq="h") + ) + tech_costs = td.load_tech_costs(tech_costs_path) + _add_carriers(group_network) + _add_buses(group_network, stages=group.get("stages")) + _add_grid_electricity_supply(group_network, config, stages=group.get("stages")) + _add_conversion_chain( + group_network, tech_costs, config, stages=group.get("stages") + ) + _add_storage(group_network, tech_costs, config) + _set_meta(group_network, group) + out_path = generic_dir / f"generic_model_{year}_{label}.nc" + group_network.export_to_netcdf(str(out_path)) + logger.info(f"Exported stage-group generic model: {out_path}") diff --git a/workflow/scripts/calculate_lcox.py b/workflow/scripts/calculate_lcox.py new file mode 100644 index 0000000..47f4eb2 --- /dev/null +++ b/workflow/scripts/calculate_lcox.py @@ -0,0 +1,690 @@ +"""calculate_lcox + +Compute the Levelized Cost of X (LCOX) for a single product demand level +(e.g., `hbi`, `steel`, `h2`). + +This module provides utilities to: +- load region-specific demands, +- add constant hourly product loads to a PyPSA network, +- solve the network optimization for a fixed demand profile, and +- extract and save a single-row LCOX result with provenance metadata. + +The script entry point is intended to be invoked from Snakemake. Functions are +kept small and testable where practical. +""" + +import os +from typing import Any +import pypsa +import pandas as pd +import numpy as np +import xarray as xr + +from _helpers import setup_logging + +snakemake: Any = globals().get("snakemake") + +# Hours per year constant used across the codebase +HOURS_PER_YEAR = 8760 + +# ============================================================================ +# LOGGING SETUP +# ============================================================================ +logger = setup_logging(__name__, snakemake=snakemake, log_filename="calculate_lcox.log") + +# ============================================================================ +# DEMAND LOADING +# ============================================================================ + + +def load_demands_for_region(region, config): + """Load local electricity demand for region. + + Returns dict with: + - local_el_demand_mwh: MWh/year (for renewable constraint calculation) + """ + # Load local electricity demand (for renewable constraint calculation) + try: + local_df = pd.read_csv(snakemake.input.local_demand) + region_mask = local_df["region"].str.lower() == region.lower() + if region_mask.any(): + total_energy_mwh = local_df[region_mask]["demand"].values[ + 0 + ] # MWh final energy + el_share = ( + local_df[region_mask]["el_share"].values[0] / 100 + ) # Convert % to fraction + local_el_demand_mwh = total_energy_mwh * el_share # Apply electricity share + else: + logger.warning(f"Region '{region}' not found in local demand data") + local_el_demand_mwh = 0 + except Exception as e: + logger.warning(f"Could not load local demand for {region}: {e}") + local_el_demand_mwh = 0 + + return { + "local_el_demand_mwh": local_el_demand_mwh, + } + + +# ============================================================================ +# LOAD ADDITION +# ============================================================================ + + +def add_loads_to_network(network, product, demands): + """Add hourly Load components and set storage boundary conditions. + + Converts annual demand to hourly load: hourly_load = annual_demand / HOURS_PER_YEAR. + """ + if product == "hydrogen": + bus_name = "hydrogen" + # Hydrogen is measured in kg/year, convert to kg/h (hourly) + hourly_demand_t = ( + demands["product_demand_mt"] * 1e6 / HOURS_PER_YEAR + ) # Mt/year β†’ t/h + unit_str = "t/h" + + elif product == "hbi": + bus_name = "hbi" + # HBI is measured in t/year, convert to t/h (hourly) + hourly_demand_t = ( + demands["product_demand_mt"] * 1e6 / HOURS_PER_YEAR + ) # Mt/year β†’ t/h + unit_str = "t/h" + + elif product == "steel": + bus_name = "steel" + # Steel is measured in t/year, convert to t/h (hourly) + hourly_demand_t = ( + demands["product_demand_mt"] * 1e6 / HOURS_PER_YEAR + ) # Mt/year β†’ t/h + unit_str = "t/h" + + else: + raise ValueError(f"Product '{product}' not recognized (valid: 'steel', 'hbi')") + + if bus_name not in network.buses.index: + raise ValueError(f"Bus '{bus_name}' not found in network") + + # Add constant hourly load to the bus + load_name = f"{product}_demand" + p_set = hourly_demand_t + + network.add( + "Carrier", + f"{product}_demand", + ) + + network.add( + "Load", + load_name, + bus=bus_name, + carrier=f"{product}_demand", + p_set=p_set, # Constant hourly demand + ) + + logger.info( + f"Added hourly load for {product}: {load_name} = {p_set:.4f} {unit_str} (constant all hours)" + ) + + +def inspect_network(network, product): + """Print network structure for debugging infeasibility.""" + logger.info("\n" + "=" * 80) + logger.info("NETWORK INSPECTION - Connectivity & Status") + logger.info("=" * 80) + + logger.info(f"Buses ({len(network.buses)}): {list(network.buses.index)}") + logger.info(f"\nLoads ({len(network.loads)}):") + for load_name, load_row in network.loads.iterrows(): + logger.info( + f" {load_name:30s} -> bus={load_row['bus']:15s} p_set={load_row['p_set']:.1f}" + ) + + logger.info(f"\nLinks ({len(network.links)}):") + for link_name, link_row in network.links.iterrows(): + logger.info( + f" {link_name:15s}: {link_row['bus0']:12s} -> {link_row['bus1']:12s} p_nom_ext={link_row['p_nom_extendable']} p_nom_max={link_row['p_nom_max']:.0e}" + ) + + logger.info(f"\nStores ({len(network.stores)}):") + for store_name, store_row in network.stores.iterrows(): + logger.info(f" {store_name:20s} -> {store_row['bus']:15s}") + + # Check isolated buses + all_buses = set(network.buses.index) + connected = ( + set(network.generators["bus"].unique()) + | set(network.links["bus0"].unique()) + | set(network.links["bus1"].unique()) + | set(network.loads["bus"].unique()) + | set(network.stores["bus"].unique()) + ) + isolated = all_buses - connected + if isolated: + logger.warning(f"⚠ Isolated buses: {isolated}") + logger.info("=" * 80 + "\n") + + +def _convert_arrow_strings(network): + """Convert ArrowStringArray columns/indices to regular object dtype. + + Workaround for PyPSA incompatibility with pandas ArrowStringArray. + Uses PyPSA's component structure to properly access all dataframes. + Based on: https://github.com/PyPSA/PyPSA/issues/1585 + """ + for c in network.components: + df = c.static + if not df.empty: + # Convert index if it's ArrowStringArray + if isinstance(df.index.values, pd.arrays.ArrowStringArray): + c.static.index = pd.Index(df.index.astype(object)) + # Convert columns if they're ArrowStringArray + for col in df.columns: + if isinstance(df[col].values, pd.arrays.ArrowStringArray): + c.static[col] = df[col].astype(object) + # Convert time-varying data + for key in c.dynamic: + dyn_df = c.dynamic[key] + if isinstance(dyn_df, pd.DataFrame) and not dyn_df.empty: + # Convert column index if it's ArrowStringArray + if isinstance(dyn_df.columns.values, pd.arrays.ArrowStringArray): + c.dynamic[key].columns = pd.Index(dyn_df.columns.astype(object)) + + +def _convert_bool_attrs_to_int(network): + """Convert boolean attributes to integers for netCDF4 compatibility. + + netCDF4 does not support boolean types for attributes. + Convert True -> 1, False -> 0. + """ + # PyPSA uses either .attrs or internal _attrs depending on version + attr_container = None + if hasattr(network, "attrs"): + attr_container = network.attrs + elif hasattr(network, "_attrs"): + attr_container = network._attrs + + if attr_container is None: + logger.warning("Network object has no attribute container for attrs") + return + + for key, value in list(attr_container.items()): + if isinstance(value, (bool, np.bool_)): + attr_container[key] = int(value) + + +def _patch_linopy_dataset_compat(): + """Patch linopy's local Dataset alias to tolerate Dataset inputs. + + Newer xarray releases reject `xr.Dataset(data_vars=)` during + linopy model construction. Linopy still performs this conversion when + transposing expressions, so we intercept xarray's Dataset constructor and + reinterpret `Dataset(ds)` as a Dataset copy. + """ + + try: + import xarray.core.dataset as xarray_dataset_module + except Exception as exc: + logger.warning( + f"Could not import xarray.Dataset for compatibility patch: {exc}" + ) + return + + dataset_cls = getattr(xarray_dataset_module, "Dataset", None) + if dataset_cls is None or getattr(dataset_cls, "_shift_compat_patched", False): + return + + original_init = dataset_cls.__init__ + + def _dataset_init_compat(self, *args, **kwargs): + if args and isinstance(args[0], xr.Dataset): + source_ds = args[0] + args = () + kwargs = dict(kwargs) + kwargs.setdefault("data_vars", source_ds.data_vars) + kwargs.setdefault("coords", source_ds.coords) + kwargs.setdefault("attrs", source_ds.attrs) + return original_init(self, *args, **kwargs) + + _dataset_init_compat._shift_compat_patched = True # type: ignore[attr-defined] + dataset_cls.__init__ = _dataset_init_compat + logger.info("Applied linopy/xarray Dataset compatibility patch") + + +def _compute_infeasibility_diagnostics(network, output_dir): + """Compute infeasibility diagnostics for an infeasible network and write IIS if available.""" + + # Attempt to run linopy infeasibility diagnostics + if hasattr(network.model, "compute_infeasibilities"): + try: + infeasible_labels = network.model.compute_infeasibilities() + logger.info( + f"Linopy compute_infeasibilities() returned {len(infeasible_labels)} entries" + ) + except Exception as e: + logger.warning(f"Could not compute linopy infeasibilities: {e}") + infeasible_labels = None + else: + logger.warning("Network model does not support compute_infeasibilities()") + infeasible_labels = None + + # Write IIS from backend Gurobi model if available + gurobi_model = None + if hasattr(network.model, "backend") and hasattr(network.model.backend, "model"): + gurobi_model = network.model.backend.model + + if gurobi_model is not None: + try: + if hasattr(gurobi_model, "computeIIS"): + try: + gurobi_model.computeIIS() + logger.info("Gurobi IIS computed") + except Exception as iis_err: + logger.warning(f"Could not compute IIS on Gurobi model: {iis_err}") + + model_ilp_path = os.path.join( + output_dir, f"infeasibility_{network.name}.ilp" + ) + gurobi_model.write(model_ilp_path) + logger.info(f"IIS .ilp written to: {model_ilp_path}") + + for c in gurobi_model.getConstrs(): + if c.IISConstr: + logger.info(f"IIS constraint: {c.ConstrName}") + for v in gurobi_model.getVars(): + if v.IISLB or v.IISUB: + logger.info(f"IIS var: {v.VarName} IISLB={v.IISLB} IISUB={v.IISUB}") + except Exception as ilp_err: + logger.warning(f"Could not write IIS .ilp: {ilp_err}") + else: + logger.warning("Gurobi backend model not available for IIS .ilp write") + + # Write text infeasibility report if available + if infeasible_labels: + if hasattr(network.model, "format_infeasibilities"): + try: + infeas_report = network.model.format_infeasibilities() + except Exception as e: + infeas_report = f"format_infeasibilities failed: {e}" + elif hasattr(network.model, "print_infeasibilities"): + try: + import io + import sys + + _buf = io.StringIO() + _old_stdout = sys.stdout + sys.stdout = _buf + network.model.print_infeasibilities() + sys.stdout = _old_stdout + infeas_report = _buf.getvalue() + except Exception as pi_err: + sys.stdout = _old_stdout + logger.warning(f"Could not run print_infeasibilities(): {pi_err}") + infeas_report = "Infeasible constraints identified, but could not capture output of print_infeasibilities()." + else: + infeas_report = "Infeasible constraints identified, but format_infeasibilities() and print_infeasibilities() are unavailable." + + infeas_path = os.path.join(output_dir, f"infeasibilities_{network.name}.txt") + with open(infeas_path, "w", encoding="utf-8") as f: + f.write(f"Infeasible constraints for network {network.name}:\n") + f.write("=" * 80 + "\n\n") + f.write(infeas_report) + logger.info(f"Infeasibility report written to: {infeas_path}") + else: + logger.warning("Model is infeasible but no specific constraints identified") + + +def solve_network(network, config): + """Solve the PyPSA optimization with hourly fixed demand. + + Parameters + ---------- + network : pypsa.Network + The prepared PyPSA network with hourly `Load` components. + config : dict + Configuration dictionary (used to read solver options). + + Notes + ----- + - When invoked from the script entry point, `snakemake.params.compute_iis` + may be consulted to run infeasibility diagnostics for Gurobi. + """ + # Convert arrow strings to regular strings before optimization + _convert_arrow_strings(network) + _patch_linopy_dataset_compat() + + solver_cfg = config.get("solver", {}) + solver_name = os.getenv("SHIFT_SOLVER", solver_cfg.get("name", "glpk")) + solver_options_key = os.getenv( + "SHIFT_SOLVER_OPTIONS", solver_cfg.get("options", "default") + ) + solver_options = config.get("solver_options", {}).get(solver_options_key, {}) + + logger.info(f"Solving network with {solver_name}...") + logger.info(f"Solver options: {solver_options}") + + # Add output logging for Gurobi to see what's happening + if solver_name.lower() == "gurobi" and "OutputFlag" not in solver_options: + solver_options = {**solver_options, "OutputFlag": 1} # Enable Gurobi output + + # Solve without constraint injection (hourly loads already in network) + try: + status = network.optimize( + network.snapshots, + solver_name=solver_name, + solver_options=solver_options, + multi_investment_periods=False, + ) + + logger.info(f"Optimization status: {status}") + + status_ok = status == 0 or status == ("ok", "optimal") or status == "optimal" + + if not status_ok: + logger.warning(f"Non-optimal status ({status})") + if network.objective is not None: + logger.info(f" Objective value: {network.objective}") + else: + logger.warning(" Objective is None (no feasible solution found)") + logger.warning( + "Model is infeasible - check network structure and constraints" + ) + + # Use linopy's built-in infeasibility diagnostics + if solver_name.lower() == "gurobi" and snakemake.params.compute_iis: + try: + output_dir = os.path.dirname(snakemake.output.network) + _compute_infeasibility_diagnostics( + network=network, + output_dir=output_dir, + ) + except Exception as iis_e: + logger.warning(f"Could not compute infeasibilities: {iis_e}") + elif solver_name.lower() == "gurobi": + logger.info("compute_iis flag false, skipping IIS diagnostics") + except Exception as e: + logger.error(f"Solver exception: {e}") + raise + + return network + + +# ============================================================================ +# RESULTS EXTRACTION +# ============================================================================ + + +def extract_lcox(network, product, demands): + """Extract LCOX from an optimized network. + + Parameters + ---------- + network : pypsa.Network + Solved PyPSA network. `network.objective` is used as total annual cost. + product : str + Product identifier, used to set units (e.g., 'hbi', 'steel', 'h2'). + demands : dict + Must include key `'product_demand_mt'` (float, Mt/year) used to + compute annual production and per-unit LCOX. + + Returns + ------- + pandas.DataFrame + Single-row DataFrame with demand, hourly load, total cost and LCOX. + """ + # Define product-specific column names + if product.lower() in ["steel", "hbi"]: + load_col = "load [t/h]" + cost_col = "lcox [EUR/t]" + elif product.lower() in ["h2"]: + load_col = "load [MW]" + cost_col = "lcox [EUR/MWh]" + else: + load_col = "load [per h]" + cost_col = "lcox [EUR/unit]" + + results_df = pd.DataFrame( + columns=[ + "demand [t]", + load_col, + "cost [EUR]", + cost_col, + ] + ) + + try: + obj_value = network.objective + if obj_value is None or np.isnan(obj_value): + raise ValueError("Optimization failed to return valid objective") + + demand_annual_t = demands["product_demand_mt"] * 1e6 # Mt β†’ t + hourly_load_t = demand_annual_t / HOURS_PER_YEAR + lcox = obj_value / demand_annual_t if demand_annual_t > 0 else np.inf + + results_df.loc[0] = [ + demand_annual_t, + hourly_load_t, + obj_value, + lcox, + ] + logger.info( + f"LCOX calculated: {lcox:.2f} {cost_col.split('[')[1].split(']')[0]}" + ) + + except Exception as e: + logger.error(f"Optimization infeasible or failed: {e}") + demand_annual_t = demands["product_demand_mt"] * 1e6 + hourly_load_t = demand_annual_t / HOURS_PER_YEAR + results_df.loc[0] = [ + demand_annual_t, + hourly_load_t, + np.nan, + np.nan, + ] + + return results_df + + +if __name__ == "__main__": + if snakemake is None: + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "calculate_regional_lcox", + cost_year="2030", + region="Europe", + product="steel", + ) + + # ==================== SETUP ==================== + logger.info("=" * 70) + # Get the specific demand level for THIS invocation (passed by Snakemake) + product_demand_mt = float(snakemake.params.product_demand_mt) + scenario = ( + snakemake.wildcards.scenario + if hasattr(snakemake.wildcards, "scenario") + else "reserved" + ) + + # Get route_label from params (network is already sliced at preparation stage) + route_label = snakemake.params.route_label + product = snakemake.params.product + + logger.info( + f"LCOX Calculation: region={snakemake.wildcards.region}, " + f"product={product}, route_label={route_label}, " + f"scenario={scenario}, " + f"demand={product_demand_mt} Mt/year." + ) + logger.info("=" * 70) + + # Load pre-prepared base network (already sliced to stage at preparation) + logger.info("Loading base network (pre-sliced to stage)...") + base_network = pypsa.Network(snakemake.input.base_network) + logger.info( + f"Network loaded: {len(base_network.buses)} buses, " + f"{len(base_network.generators)} generators, {len(base_network.links)} links" + ) + + # Load local electricity demand for this region + logger.info("Loading demands...") + demands = load_demands_for_region( + region=snakemake.wildcards.region, + config=snakemake.config, + ) + + logger.info( + f"Local electricity demand: {demands['local_el_demand_mwh']:.1f} MWh/year" + ) + + logger.info(f"Processing: {product_demand_mt} Mt/year") + + # ==================== NETWORK SETUP ==================== + # Create a copy of base network + network = base_network.copy() + network.name = f"LCOX-{snakemake.wildcards.region}-{product}-{product_demand_mt}" + + # Ensure snapshot year is set by upstream network preparation; + # do not override if already set. + if network.snapshots is None or len(network.snapshots) == 0: + cost_year = int(snakemake.wildcards.cost_year) + network.set_snapshots( + pd.date_range(f"{cost_year}-01-01", periods=HOURS_PER_YEAR, freq="h") + ) + logger.info( + f"Set snapshots for cost_year={cost_year} (fallback in calculate_lcox)" + ) + else: + logger.info( + f"Snapshots pre-set in network (len={len(network.snapshots)}), not overriding in calculate_lcox" + ) + + # Preserve discount_rate from base network (needed for cost annuitization) + network.discount_rate = base_network.discount_rate + + logger.info(f"Product demand: {product_demand_mt:.1f} Mt/year") + + # Create scaled demands dict for this demand level + scaled_demands = demands.copy() + scaled_demands["product_demand_mt"] = product_demand_mt + + # Add hourly load for steel output + # (This also sets HBI storage e_initial inside add_loads_to_network) + logger.info("Adding hourly load to network...") + add_loads_to_network(network=network, product=product, demands=scaled_demands) + + # Debug: Print network structure + logger.info( + "\n--- Network Structure for Demand Level {:.1f} Mt/year ---".format( + product_demand_mt + ) + ) + logger.info(f"Buses: {list(network.buses.index)}") + logger.info(f"Generators: {len(network.generators)} total") + for gen in network.generators.index: + p_max = network.generators.at[gen, "p_nom_max"] + logger.info(f" {gen}: p_nom_max={p_max:.1f} MW") + logger.info(f"Links: {list(network.links.index)}") + for link in network.links.index: + p_nominal = network.links.at[link, "p_nom"] + logger.info(f" {link}: p_nom={p_nominal:.1f} MW") + logger.info(f"Stores: {list(network.stores.index)}") + logger.info(f"Loads: {list(network.loads.index)}") + + # Solve + logger.info("Optimizing network...") + if snakemake.config.get("debug_network_inspection", False): + inspect_network(network, product) # Debug inspection + try: + solve_network(network, snakemake.config) + optimization_status = ( + "optimal" + if network.objective is not None and not np.isnan(network.objective) + else "infeasible" + ) + except Exception as e: + logger.warning( + f"Solver error for product demand {product_demand_mt} Mt/year: {e}" + ) + optimization_status = "error" + + if optimization_status != "optimal": + logger.warning( + f"Optimization {optimization_status} for product demand {product_demand_mt} Mt/year - returning NaN values" + ) + + # Extract LCOX results + logger.info("Extracting results...") + results_df = extract_lcox( + network=network, + product=product, + demands=scaled_demands, + ) + + # Attach provenance so downstream supply curves can trace each row back to + # the config inputs and the applied PyPSA network state. + interest_rates = snakemake.config.get("interest_rate", {}) + if isinstance(interest_rates.get(snakemake.wildcards.region), dict): + config_discount_rate = interest_rates[snakemake.wildcards.region].get( + "default", interest_rates.get("default", np.nan) + ) + else: + config_discount_rate = interest_rates.get( + snakemake.wildcards.region, interest_rates.get("default", np.nan) + ) + + applied_discount_rate = float(getattr(network, "discount_rate", np.nan)) + discount_rate_matches = bool( + np.isfinite(applied_discount_rate) + and np.isfinite(config_discount_rate) + and np.isclose(applied_discount_rate, config_discount_rate) + ) + + if not discount_rate_matches: + logger.warning( + "Discount rate mismatch for region %s: network=%s config=%s", + snakemake.wildcards.region, + applied_discount_rate, + config_discount_rate, + ) + + results_df["region"] = snakemake.wildcards.region + results_df["product"] = product + results_df["scenario"] = scenario + results_df["route_label"] = route_label + results_df["cost_year"] = int(snakemake.wildcards.cost_year) + results_df["product_demand_mt"] = product_demand_mt + results_df["discount_rate_config_key"] = ( + f"interest_rate.{snakemake.wildcards.region}" + ) + results_df["discount_rate_config"] = config_discount_rate + results_df["discount_rate_network"] = applied_discount_rate + results_df["discount_rate_matches_config"] = discount_rate_matches + + # Save results for this demand level + result_file = snakemake.output.results + network_file = snakemake.output.network + + logger.info("Saving results...") + results_df.to_csv(result_file, index=False) + logger.info(f"Results saved: {result_file}") + + # Always export network (Snakemake requires output files to exist) + try: + _convert_bool_attrs_to_int(network) + network.export_to_netcdf(network_file) + logger.info(f"Network saved: {network_file}") + except Exception as e: + logger.warning(f"Could not save network: {e}") + + logger.info("=" * 70) + + if optimization_status == "optimal": + logger.info("Demand level completed successfully!") + else: + logger.warning( + f"Demand level completed with solver status: {optimization_status}" + ) + logger.info("=" * 70) diff --git a/workflow/scripts/cluster_renewables.py b/workflow/scripts/cluster_renewables.py new file mode 100644 index 0000000..ad581c7 --- /dev/null +++ b/workflow/scripts/cluster_renewables.py @@ -0,0 +1,890 @@ +""" +Cluster renewable generators using stratified k-medoids. + +Methodology (based on Frysztacki et al. 2021, Siala & Mahfouz 2019): +1. Load merged renewable profiles (122k+ buses) +2. Filter to onwind + solar +3. Map buses to regions via ISO3 +4. Stratify by cf_high_mass (top-5% hours mean) to preserve merit order & green pockets +5. Within each stratum: k-medoids on PCA(8760 profile) + lat/lon +6. Representative = medoid bus (real observed profile, no synthetic averaging) +7. Output clustered NetCDF: (region, technology, class, time) +8. Validate supply curve preservation + +Usage (Snakemake rule): + rule cluster_renewables: + input: + merged = "data/renewable_profiles_global_merged.nc", + output: + clustered = "resources/renewables_clustered.nc", + report = "resources/renewables_clustering_report.json", + script: + "scripts/cluster_renewables.py" +""" + +import logging +import json +from pathlib import Path +from typing import Any, Dict, Tuple, List, Optional +from contextlib import contextmanager + +import geopandas as gpd +import numpy as np +import pandas as pd +import xarray as xr +from tqdm import tqdm +import joblib +from sklearn.preprocessing import StandardScaler +from sklearn.decomposition import PCA +import kmedoids as _kmedoids +from scipy.spatial.distance import pdist, squareform + +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + +snakemake: Any = globals().get("snakemake") + +CACHE_VERSION = "v5" + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +@contextmanager +def tqdm_joblib(tqdm_object): + """Route joblib progress callbacks into a tqdm bar.""" + + class _Cb(joblib.parallel.BatchCompletionCallBack): + def __call__(self, *args, **kwargs): + tqdm_object.update(self.batch_size) + return super().__call__(*args, **kwargs) + + old = joblib.parallel.BatchCompletionCallBack + joblib.parallel.BatchCompletionCallBack = _Cb + try: + yield tqdm_object + finally: + joblib.parallel.BatchCompletionCallBack = old + + +def extract_iso3(bus_id: str) -> Optional[str]: + try: + return str(bus_id).split("_")[0] + except Exception: + return None + + +def build_region_map(config: Dict) -> Dict[str, str]: + """ISO3 -> region name lookup from config.""" + return { + iso3: region + for region, iso3_list in config.get("regions", {}).items() + for iso3 in iso3_list + } + + +def load_bus_coordinates(geojson_path: str) -> Dict[str, Tuple[float, float]]: + """Load bus_id -> (lat, lon) from the merged geojson.""" + gdf = gpd.read_file(geojson_path) + coords = {} + for _, row in gdf.iterrows(): + bid = row["bus_id"] + coords[bid] = (float(row["y_centroid"]), float(row["x_centroid"])) + return coords + + +# --------------------------------------------------------------------------- +# Feature extraction β€” minimal: only what stratification + clustering needs +# --------------------------------------------------------------------------- + + +def compute_cf_high_mass(cf_ts: np.ndarray, tail_frac: float = 0.05) -> float: + """Mean of the top `tail_frac` hours β€” captures peak resource quality.""" + cf = np.clip(np.nan_to_num(cf_ts, nan=0.0), 0.0, 1.0) + if cf.size == 0: + return 0.0 + k = max(1, int(len(cf) * tail_frac)) + return float(np.mean(np.sort(cf)[-k:])) + + +def extract_features_batch( + bus_ids: List, + ds: xr.Dataset, + iso3_to_region: Dict[str, str], + bus_coords: Dict[str, Tuple[float, float]], +) -> List[Dict]: + """Extract lightweight features for a batch of buses. + + Only computes what the stratified workflow actually needs: + - avg_cf, cf_high_mass (for stratification) + - lat, lon, capacity_mw (for within-stratum clustering metadata) + The raw 8760 profiles are read later during clustering, not stored here. + """ + rows: List[Dict] = [] + for bus_id in bus_ids: + iso3 = extract_iso3(str(bus_id)) + if not iso3: + continue + region = iso3_to_region.get(iso3) + if not region: + continue + + lat, lon = bus_coords.get(bus_id, (0.0, 0.0)) + + for tech in ds.technology.values: + tech = str(tech) + try: + cf_ts = ds["capacity_factor"].sel(bus=bus_id, technology=tech).values + except Exception: + continue + if np.isnan(cf_ts).all() or len(cf_ts) == 0: + continue + + cf_clean = np.clip(np.nan_to_num(cf_ts, nan=0.0), 0.0, 1.0) + avg_cf = float(np.mean(cf_clean)) + + try: + capacity_mw = float( + ds["p_nom_max"].sel(bus=bus_id, technology=tech).values + ) + except Exception: + capacity_mw = 0.0 + if np.isnan(capacity_mw) or capacity_mw <= 0: + continue + + rows.append( + { + "bus_id": bus_id, + "technology": tech, + "region": region, + "lat": lat, + "lon": lon, + "capacity_mw": capacity_mw, + "avg_cf": avg_cf, + "cf_high_mass": compute_cf_high_mass(cf_clean), + } + ) + return rows + + +def extract_features( + ds: xr.Dataset, + config: Dict, + bus_coords: Dict[str, Tuple[float, float]], + cache_path: Optional[str] = None, +) -> pd.DataFrame: + """Build the feature table (one row per bus-technology pair).""" + + required_cols = { + "bus_id", + "technology", + "region", + "lat", + "lon", + "capacity_mw", + "avg_cf", + "cf_high_mass", + } + + if cache_path and Path(cache_path).exists(): + logger.info(f"Loading cached features from {cache_path}") + df = pd.read_csv(cache_path) + if required_cols.issubset(df.columns): + logger.info(f" Loaded {len(df)} rows from cache") + return df + logger.info(" Cache schema stale β€” recomputing") + + iso3_to_region = build_region_map(config) + bus_list = list(ds.bus.values) + n_jobs = getattr(snakemake, "threads", -1) + batch_size = max(1, len(bus_list) // max(1, abs(n_jobs))) + batches = [ + bus_list[i : i + batch_size] for i in range(0, len(bus_list), batch_size) + ] + + logger.info( + f"Extracting features: {len(bus_list)} buses, {len(batches)} batches, {n_jobs} workers" + ) + + with tqdm_joblib(tqdm(total=len(batches), desc="Feature extraction", unit="batch")): + results = joblib.Parallel(n_jobs=n_jobs, backend="loky")( + joblib.delayed(extract_features_batch)( + batch, ds, iso3_to_region, bus_coords + ) + for batch in batches + ) + + rows = [r for batch_rows in results for r in batch_rows] + df = pd.DataFrame(rows) + logger.info(f" Extracted {len(df)} bus-technology pairs") + + if cache_path: + df.to_csv(cache_path, index=False) + logger.info(f" Cached to {cache_path}") + + return df + + +# --------------------------------------------------------------------------- +# Stratification + within-stratum clustering +# --------------------------------------------------------------------------- + + +def _load_profiles_for_group( + bus_ids: List[str], tech: str, ds: xr.Dataset +) -> np.ndarray: + """Load 8760 CF profiles for a list of buses. Returns (n_buses, 8760).""" + profiles = [] + for bid in bus_ids: + try: + cf = ds["capacity_factor"].sel(bus=bid, technology=tech).values + cf = np.clip(np.nan_to_num(cf, nan=0.0), 0.0, 1.0) + profiles.append(cf) + except Exception: + profiles.append(np.zeros(8760)) + return np.stack(profiles) + + +def _cluster_within_stratum( + profiles: np.ndarray, + lats: np.ndarray, + lons: np.ndarray, + capacities: np.ndarray, + n_clusters: int, + n_pca: int = 5, + geo_weight: float = 0.3, +) -> Tuple[np.ndarray, np.ndarray]: + n = len(profiles) + if n <= n_clusters: + return np.arange(n), np.arange(n) + n_clusters = max(1, min(n_clusters, n)) + + # Build feature matrix + n_comp = min(n_pca, n - 1, profiles.shape[1]) + pca_features = PCA(n_components=max(1, n_comp)).fit_transform( + StandardScaler().fit_transform(profiles) + ) + pca_features /= np.sqrt(max(1, n_comp)) + + geo = StandardScaler().fit_transform(np.column_stack([lats, lons])) + geo /= np.sqrt(2) + + X = np.hstack([pca_features * (1 - geo_weight), geo * geo_weight]) + + # Weight rows by capacity via duplication in distance matrix + # (FasterPAM doesn't support sample_weight natively) + cap_weights = np.sqrt(capacities / capacities.mean()) # soft weighting + X_weighted = X * cap_weights[:, None] + + D = squareform(pdist(X_weighted, metric="euclidean")) + result = _kmedoids.fasterpam(D, n_clusters, random_state=42) + labels = np.array(result.labels) + medoid_indices = np.array(result.medoids) + + return labels, medoid_indices + + +def _allocate_stratum_clusters( + stratum_groups: Dict[str, pd.DataFrame], + total_k: int, + profiles_by_stratum: Dict[str, np.ndarray], + tail_boost: float = 2.0, + diversity_threshold: float = 0.05, + min_capacity_for_split_mw: float = 500.0, + top_n_strata_boost: int = 3, # boost the top N strata by avg_cf +) -> Dict[str, int]: + """Allocate clusters with boost for highest-CF strata (green pockets).""" + + # Rank strata by their avg_cf midpoint (encoded in name) + strata_sorted = sorted( + stratum_groups.keys(), reverse=True + ) # lexicographic works for cf_XX_YY + top_strata = set(strata_sorted[:top_n_strata_boost]) + + splittable = {} + fixed_at_one = {} + + for name, group in stratum_groups.items(): + profiles = profiles_by_stratum[name] + total_cap = group["capacity_mw"].sum() + n_buses = len(group) + + if n_buses <= 2: + fixed_at_one[name] = 1 + continue + + bus_means = profiles.mean(axis=1) + internal_diversity = float(np.std(bus_means)) + + if ( + total_cap < min_capacity_for_split_mw + or internal_diversity < diversity_threshold + ): + fixed_at_one[name] = 1 + continue + + splittable[name] = total_cap + + remaining_k = total_k - len(fixed_at_one) - len(splittable) + remaining_k = max(0, remaining_k) + + alloc = dict(fixed_at_one) + if splittable and remaining_k > 0: + weights = {} + for name, cap in splittable.items(): + w = cap + if name in top_strata: + w *= tail_boost + weights[name] = w + total_w = sum(weights.values()) + + for name, w in weights.items(): + extra = int(round(w / total_w * remaining_k)) + alloc[name] = 1 + max(0, extra) + else: + for name in splittable: + alloc[name] = 1 + + return alloc + + +def _build_strata( + df_rt: pd.DataFrame, + bin_width: float = 0.05, +) -> pd.Series: + """Assign strata by fixed avg_cf intervals of `bin_width`. + + E.g. bin_width=0.05 gives bins [0.00, 0.05), [0.05, 0.10), ..., [0.95, 1.00]. + Empty bins are implicitly ignored since no rows map to them. + """ + cf_vals = df_rt["avg_cf"].values + + # Floor to nearest bin edge + bin_idx = np.floor(cf_vals / bin_width).astype(int) + + labels = pd.Series( + [ + f"cf_{int(b * bin_width * 100):02d}_{int((b + 1) * bin_width * 100):02d}" + for b in bin_idx + ], + index=df_rt.index, + ) + + return labels + + +def resolve_total_clusters(df_rt: pd.DataFrame, tech: str) -> int: + """Resolve total cluster count for a region-technology pair from config.""" + clustering_config = snakemake.config.get("clustering", {}) + policy = clustering_config.get("cluster_count_policy", {}) + base_clusters = policy.get("base_clusters", {}) + mode = policy.get("mode", "dynamic") + base_key = "solar" if tech == "solar" else "onwind" + base = int(base_clusters.get(base_key)) + + if mode == "fixed": + return base + + n_buses = max(1, df_rt["bus_id"].nunique()) + total_cap = float(df_rt["capacity_mw"].sum()) + ref_buses = float(policy.get("reference_buses", 1000.0)) + ref_cap = float(policy.get("reference_capacity_mw", 50000.0)) + exp = float(policy.get("scale_exponent", 0.5)) + bus_w = float(policy.get("bus_weight", 0.5)) + cap_w = float(policy.get("capacity_weight", 0.5)) + + scale = ( + bus_w * (n_buses / ref_buses) ** exp + + cap_w * (max(1.0, total_cap) / ref_cap) ** exp + ) + target = int(round(base * scale)) + + min_c = int(policy.get("min_clusters")) + max_c = int(policy.get("max_clusters")) + return max(min_c, min(max_c, min(target, len(df_rt)))) + + +def cluster_region_technology( + region: str, + tech: str, + df_features: pd.DataFrame, + ds: xr.Dataset, + clustering_config: Dict, + cache_dir: Optional[str] = None, +) -> Tuple[str, str, pd.DataFrame]: + """Stratified k-medoids clustering for one region-technology pair. + + Returns: + (region, tech, result_df) where result_df has one row per cluster: + bus_id (medoid), capacity_mw (summed), avg_cf, cf_high_mass, stratum. + """ + tech = str(tech) + + # --- Cache check --- + if cache_dir: + cache_file = Path(cache_dir) / f"clusters_{region}_{tech}.parquet" + if cache_file.exists(): + try: + cached = pd.read_parquet(cache_file) + if cached.attrs.get("cache_version", "") == CACHE_VERSION: + logger.info(f" [CACHED] {region} {tech}: {len(cached)} clusters") + return region, tech, cached + except Exception: + pass + + df_rt = df_features[ + (df_features["region"] == region) & (df_features["technology"] == tech) + ].copy() + + if len(df_rt) == 0: + return region, tech, pd.DataFrame() + + total_k = resolve_total_clusters(df_rt, tech) + tail_boost = float(clustering_config.get("tail_cluster_boost", 2.0)) + geo_weight = float(clustering_config.get("geo_weight", 0.3)) + n_pca = int(clustering_config.get("n_pca_components", 5)) + + # --- Stratify --- + bin_widths = clustering_config.get("strata_bin_width", {}) + bin_width = bin_widths.get(tech, 0.05) + top_n_strata_boost = int(clustering_config.get("top_n_strata_boost", 3)) + df_rt["stratum"] = _build_strata(df_rt, bin_width=bin_width) + + n_actual_strata = df_rt["stratum"].nunique() + logger.info(f" {n_actual_strata} non-empty strata (bin width: {bin_width})") + + # Load profiles per stratum for diversity check + stratum_groups = {} + profiles_by_stratum = {} + for stratum_name, group in df_rt.groupby("stratum"): + stratum_groups[stratum_name] = group + profiles_by_stratum[stratum_name] = _load_profiles_for_group( + group["bus_id"].values.tolist(), tech, ds + ) + + min_cap_split = float(clustering_config.get("min_capacity_for_split_mw", 500.0)) + diversity_thresh = float(clustering_config.get("diversity_threshold", 0.05)) + + stratum_k = _allocate_stratum_clusters( + stratum_groups, + total_k, + profiles_by_stratum, + tail_boost=tail_boost, + diversity_threshold=diversity_thresh, + min_capacity_for_split_mw=min_cap_split, + top_n_strata_boost=top_n_strata_boost, + ) + + actual_total = sum(stratum_k.values()) + logger.info( + f" Cluster allocation: {stratum_k} (total: {actual_total}, " + f"budget: {total_k}, {len(stratum_k) - sum(1 for v in stratum_k.values() if v > 1)} " + f"strata kept at 1)" + ) + + # --- Cluster within each stratum --- + cluster_rows: List[Dict] = [] + global_cluster_id = 0 + + for stratum_name, group in df_rt.groupby("stratum"): + k = min(stratum_k.get(stratum_name, 1), len(group)) + k = max(1, k) + + bus_ids = group["bus_id"].values.tolist() + profiles = _load_profiles_for_group(bus_ids, tech, ds) + lats = group["lat"].values + lons = group["lon"].values + caps = group["capacity_mw"].values + + labels, medoid_indices = _cluster_within_stratum( + profiles, lats, lons, caps, n_clusters=k, n_pca=n_pca, geo_weight=geo_weight + ) + + for cl in range(int(labels.max()) + 1): + mask = labels == cl + if not mask.any(): + continue + + member_caps = caps[mask] + member_bus_ids = np.array(bus_ids)[mask] + total_cap = float(member_caps.sum()) + + # Find medoid for this cluster + medoid_candidates = np.where(mask)[0] + medoid_local = None + for mi in medoid_indices: + if mi in medoid_candidates: + medoid_local = mi + break + if medoid_local is None: + # Fallback: largest capacity bus in cluster + medoid_local = medoid_candidates[np.argmax(member_caps)] + logger.warning( + f"No medoid in cluster {cl} of stratum {stratum_name}, picking largest bus: {bus_ids[medoid_local]}" + ) + + medoid_bus = bus_ids[medoid_local] + + # Capacity-weighted avg_cf for metadata + member_avg_cfs = group.iloc[np.where(mask)[0]]["avg_cf"].values + wavg_cf = float(np.average(member_avg_cfs, weights=member_caps)) + member_high_mass = group.iloc[np.where(mask)[0]]["cf_high_mass"].values + wavg_high_mass = float(np.average(member_high_mass, weights=member_caps)) + + cluster_rows.append( + { + "cluster_id": global_cluster_id, + "region": region, + "technology": tech, + "stratum": stratum_name, + "medoid_bus_id": medoid_bus, + "n_buses": int(mask.sum()), + "capacity_mw": total_cap, + "avg_cf": wavg_cf, + "cf_high_mass": wavg_high_mass, + "member_bus_ids": ",".join(str(b) for b in member_bus_ids), + } + ) + global_cluster_id += 1 + + result = pd.DataFrame(cluster_rows) + + # --- Cache --- + if cache_dir and len(result) > 0: + cache_file = Path(cache_dir) / f"clusters_{region}_{tech}.parquet" + result.attrs["cache_version"] = CACHE_VERSION + result.to_parquet(cache_file, index=False) + logger.info(f" Cached {len(result)} clusters to {cache_file}") + + return region, tech, result + + +# --------------------------------------------------------------------------- +# Aggregation: load medoid profiles, build output +# --------------------------------------------------------------------------- + + +def aggregate_all_clusters( + all_results: List[Tuple[str, str, pd.DataFrame]], + ds: xr.Dataset, +) -> Tuple[Dict, pd.DataFrame]: + """Build clustered_data dict and metadata from clustering results. + + The representative profile is the medoid's real 8760 series β€” no synthetic + averaging or rescaling. This preserves temporal correlations exactly. + """ + clustered_data = {} + meta_rows = [] + + for region, tech, df_clusters in all_results: + if df_clusters is None or len(df_clusters) == 0: + continue + + for _, row in df_clusters.iterrows(): + cid = int(row["cluster_id"]) + medoid_bus = row["medoid_bus_id"] + + # Load real medoid profile + try: + cf_ts = ( + ds["capacity_factor"].sel(bus=medoid_bus, technology=tech).values + ) + cf_ts = np.clip(np.nan_to_num(cf_ts, nan=0.0), 0.0, 1.0) + except Exception: + cf_ts = np.zeros(8760) + + tech_label = "solar" if tech == "solar" else "onwind" + cluster_name = f"{region}_{tech_label}_{cid}" + + clustered_data[(region, tech, cid)] = { + "capacity": float(row["capacity_mw"]), + "cf_ts": cf_ts, + "avg_cf": float(row["avg_cf"]), + "cf_high_mass": float(row["cf_high_mass"]), + "cluster_name": cluster_name, + "n_buses": int(row["n_buses"]), + "representative_bus": medoid_bus, + "stratum": row["stratum"], + } + + meta_rows.append( + { + "cluster_name": cluster_name, + "region": region, + "technology": tech, + "cluster_id": cid, + "stratum": row["stratum"], + "medoid_bus_id": medoid_bus, + "n_buses": int(row["n_buses"]), + "capacity_mw": float(row["capacity_mw"]), + "avg_cf": float(row["avg_cf"]), + "cf_high_mass": float(row["cf_high_mass"]), + } + ) + + logger.info(f" Total clusters: {len(clustered_data)}") + return clustered_data, pd.DataFrame(meta_rows) + + +# --------------------------------------------------------------------------- +# NetCDF output +# --------------------------------------------------------------------------- + + +def write_clustered_netcdf( + clustered_data: Dict, output_path: str, config: Dict +) -> None: + """Write clustered dataset to NetCDF with (region, technology, class, time).""" + logger.info(f"Writing clustered data to {output_path}") + + regions = sorted(set(k[0] for k in clustered_data)) + techs = sorted(set(str(k[1]) for k in clustered_data)) + time = np.arange(8760) + + max_classes = max( + sum(1 for k in clustered_data if k[0] == r and str(k[1]) == t) + for r in regions + for t in techs + ) + + shape_3d = (len(regions), len(techs), max_classes) + shape_4d = (*shape_3d, 8760) + + capacity_all = np.full(shape_3d, np.nan, dtype=np.float32) + cf_all = np.full(shape_4d, np.nan, dtype=np.float32) + avg_cf_all = np.full(shape_3d, np.nan, dtype=np.float32) + cf_high_mass_all = np.full(shape_3d, np.nan, dtype=np.float32) + + for ri, region in enumerate(regions): + for ti, tech in enumerate(techs): + clusters = sorted( + [ + (cid, info) + for (r, t, cid), info in clustered_data.items() + if r == region and str(t) == tech + ], + key=lambda x: -x[1]["cf_high_mass"], # merit order: best first + ) + for ci, (cid, info) in enumerate(clusters): + capacity_all[ri, ti, ci] = info["capacity"] + avg_cf_all[ri, ti, ci] = info["avg_cf"] + cf_high_mass_all[ri, ti, ci] = info["cf_high_mass"] + ts = info["cf_ts"] + if isinstance(ts, np.ndarray) and ts.ndim == 1 and len(ts) == 8760: + cf_all[ri, ti, ci, :] = ts.astype(np.float32) + + ds_out = xr.Dataset( + { + "capacity": (("region", "technology", "class"), capacity_all), + "capacity_factor": (("region", "technology", "class", "time"), cf_all), + "avg_cf": (("region", "technology", "class"), avg_cf_all), + "cf_high_mass": (("region", "technology", "class"), cf_high_mass_all), + }, + coords={ + "region": regions, + "technology": techs, + "time": time, + "class": np.arange(max_classes), + }, + ) + + ds_out.attrs["clustering_method"] = "stratified_kmedoids" + ds_out.attrs["cache_version"] = CACHE_VERSION + ds_out.attrs["class_order"] = "descending cf_high_mass (merit order)" + + enc = {v: {"dtype": "float32"} for v in ds_out.data_vars} + ds_out.to_netcdf(output_path, encoding=enc) + logger.info(f" βœ“ Wrote {output_path} β€” dims: {dict(ds_out.sizes)}") + + +# --------------------------------------------------------------------------- +# Validation +# --------------------------------------------------------------------------- + + +def validate_clustering( + clustered_data: Dict, + df_features: pd.DataFrame, + ds: xr.Dataset, + output_report: str, +) -> Dict: + """Validate capacity preservation and supply curve shape.""" + logger.info("Validating clustering...") + + report: Dict[str, Any] = { + "total_clusters": len(clustered_data), + "capacity_preservation": {}, + "supply_curve_error": {}, + } + + region_tech_pairs = sorted({(k[0], str(k[1])) for k in clustered_data}) + + for region, tech in region_tech_pairs: + # --- Capacity preservation --- + df_rt = df_features[ + (df_features["region"] == region) & (df_features["technology"] == tech) + ] + original_cap = float(df_rt["capacity_mw"].sum()) + + clustered_cap = sum( + info["capacity"] + for (r, t, _), info in clustered_data.items() + if r == region and str(t) == tech + ) + + pres_pct = 100.0 * clustered_cap / original_cap if original_cap > 0 else 100.0 + report["capacity_preservation"][f"{region}_{tech}"] = { + "original_mw": original_cap, + "clustered_mw": clustered_cap, + "preservation_pct": pres_pct, + } + + # --- Supply curve shape comparison --- + # Original: sort buses by avg_cf descending, cumulative capacity + orig_sorted = df_rt.sort_values("avg_cf", ascending=False) + orig_cum_cap = np.cumsum(orig_sorted["capacity_mw"].values) + orig_avg_cf = orig_sorted["avg_cf"].values + + # Clustered: sort clusters by avg_cf descending + clusters = sorted( + [ + info + for (r, t, _), info in clustered_data.items() + if r == region and str(t) == tech + ], + key=lambda x: -x["avg_cf"], + ) + if clusters: + clust_cum_cap = np.cumsum([c["capacity"] for c in clusters]) + clust_avg_cf = np.array([c["avg_cf"] for c in clusters]) + + # Interpolate both curves at common capacity points and compute MAE + if len(orig_cum_cap) > 1 and len(clust_cum_cap) > 1: + max_cap = min(orig_cum_cap[-1], clust_cum_cap[-1]) + eval_points = np.linspace(0, max_cap, 50) + orig_interp = np.interp(eval_points, orig_cum_cap, orig_avg_cf) + clust_interp = np.interp(eval_points, clust_cum_cap, clust_avg_cf) + mae = float(np.mean(np.abs(orig_interp - clust_interp))) + + # Error specifically in the first 10% (green pocket region) + n10 = max(1, len(eval_points) // 10) + mae_first10 = float( + np.mean(np.abs(orig_interp[:n10] - clust_interp[:n10])) + ) + else: + mae, mae_first10 = 0.0, 0.0 + + report["supply_curve_error"][f"{region}_{tech}"] = { + "mae_avg_cf": mae, + "mae_first_10pct": mae_first10, + "n_clusters": len(clusters), + } + + avg_pres = np.mean( + [v["preservation_pct"] for v in report["capacity_preservation"].values()] + ) + logger.info(f" Avg capacity preservation: {avg_pres:.1f}%") + + if report["supply_curve_error"]: + avg_mae = np.mean( + [v["mae_avg_cf"] for v in report["supply_curve_error"].values()] + ) + avg_mae10 = np.mean( + [v["mae_first_10pct"] for v in report["supply_curve_error"].values()] + ) + logger.info(f" Supply curve MAE (full): {avg_mae:.4f}") + logger.info(f" Supply curve MAE (first 10% / green pockets): {avg_mae10:.4f}") + + with open(output_report, "w") as f: + json.dump( + {"timestamp": pd.Timestamp.now().isoformat(), **report}, + f, + indent=2, + ) + logger.info(f" βœ“ Report: {output_report}") + return report + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + + +def filter_to_onwind_pv(ds: xr.Dataset) -> xr.Dataset: + techs = [t for t in ["onwind", "solar"] if t in ds.technology.values] + ds_filtered = ds.sel(technology=techs) + logger.info(f"Filtered to {techs}: {len(ds_filtered.bus)} buses") + return ds_filtered + + +def main(): + if snakemake is None: + raise RuntimeError("Must run via Snakemake") + + logger.info("=" * 70) + logger.info("STRATIFIED K-MEDOIDS RENEWABLE CLUSTERING") + logger.info("=" * 70) + + config = snakemake.config + clustering_config = config.get("clustering", {}) + + # Load & filter + ds = xr.open_dataset(str(snakemake.input.merged_cdf)) + ds = filter_to_onwind_pv(ds) + + bus_coords = load_bus_coordinates(str(snakemake.input.merged_geojson)) + logger.info(f"Loaded coordinates for {len(bus_coords)} buses") + + # Extract features + cache_features = Path("resources") / f"features_cache_{CACHE_VERSION}.csv" + df_features = extract_features(ds, config, bus_coords, str(cache_features)) + + # Build region-tech pairs + region_tech_pairs = ( + df_features.groupby(["region", "technology"]) + .size() + .reset_index()[["region", "technology"]] + .values.tolist() + ) + logger.info(f"Clustering {len(region_tech_pairs)} region-technology pairs") + + # Cluster (parallel) + cache_dir = Path("resources") / f"clustering_cache_{CACHE_VERSION}" + cache_dir.mkdir(parents=True, exist_ok=True) + + n_jobs = getattr(snakemake, "threads", -1) + + with tqdm_joblib( + tqdm(total=len(region_tech_pairs), desc="Clustering", unit="pair") + ): + results = joblib.Parallel(n_jobs=n_jobs, backend="loky")( + joblib.delayed(cluster_region_technology)( + region, tech, df_features, ds, clustering_config, str(cache_dir) + ) + for region, tech in region_tech_pairs + ) + + # Aggregate + clustered_data, metadata_df = aggregate_all_clusters(results, ds) + + # Save metadata CSV alongside NetCDF + meta_path = Path(str(snakemake.output.clustered)).with_suffix(".metadata.csv") + metadata_df.to_csv(meta_path, index=False) + logger.info(f" βœ“ Metadata: {meta_path}") + + # Write NetCDF + write_clustered_netcdf(clustered_data, str(snakemake.output.clustered), config) + + # Validate + validate_clustering(clustered_data, df_features, ds, str(snakemake.output.report)) + + logger.info("=" * 70) + logger.info("CLUSTERING COMPLETE") + logger.info("=" * 70) + + +if __name__ == "__main__": + main() diff --git a/workflow/scripts/create_hydrogen_supply_curve_with_demand.py b/workflow/scripts/create_hydrogen_supply_curve_with_demand.py deleted file mode 100644 index a1893fa..0000000 --- a/workflow/scripts/create_hydrogen_supply_curve_with_demand.py +++ /dev/null @@ -1,105 +0,0 @@ -import pandas as pd -import matplotlib.pyplot as plt - - -def create_supply_curve_with_demand(): - # input: "resources/lcoh/{region}/results_{demand_factor}.csv", - # outputs: supply="resources/supply_curves/{region}_hydrogen.csv", supply_curve="resources/supply_curves/{region}_hydrogen.pdf" - all_files = snakemake.input.lcoh_data - print("files to merge:", all_files) - - final_demand_data = pd.read_csv(snakemake.input.final_demand_data, header=0) - final_demand = float( - final_demand_data.loc[ - final_demand_data.region == "{}".format(snakemake.wildcards["region"]) - ]["demand"] - ) - # final_green is wrong, this is final_el - final_green = ( - final_demand - * float( - final_demand_data.loc[ - final_demand_data.region == "{}".format(snakemake.wildcards["region"]) - ]["el_share"] - ) - / 100 - ) - print("demand data", final_demand) - - df_from_each_file = (pd.read_csv(f, sep=",", index_col=0) for f in all_files) - df_merged = pd.concat(df_from_each_file, ignore_index=True) - df_sub = df_merged.copy() - print("merged file has been created") - - # first calculate part of local supply that should be used to cover local el demand - df_all_demand = pd.read_csv(snakemake.input.final_demand_data, header=0) - df_local_demand = df_all_demand.loc[ - df_all_demand["region"] == snakemake.wildcards["region"] - ] - # total final energy consumption for the region * percentage of final energy consumption needed to meet local el demand = local el demand need in MWh - # since the demand is for hydrogen (after electrolysis of 75%), local el load must be converted to the amount of decreasing hydrogen production - local_load = ( - float(df_local_demand["demand"] * df_local_demand["el_share"] / 100) * 0.75 - ) - print("local el load is: ", local_load) - - # ******************* SUBTRACTING LOCAL DEMAND *********************** - # remove local load from demand and drop all negative rows (generators that are only local) - df_sub["demand [MWh]"] = df_sub["demand [MWh]"].subtract(local_load) - df_sub["demand [MWh]"][df_sub["demand [MWh]"] < 0] = 0 - print("local load has been subtracted from global supply") - - # preparing for plotting - infeasible_rows = df_merged[df_merged["LCOH [EUR/MWh]"] == "infeasible"].index - df_merged = df_merged.drop(infeasible_rows) - df_sub = df_sub.drop(infeasible_rows) - print("deleted infeasible rows to prepare for plotting") - - # creates and saves supply curve plot - plt.plot( - df_merged["demand [MWh]"].astype(int) / (1e6), - df_merged["LCOH [EUR/MWh]"].astype(int), - linestyle="-", - marker="o", - label="supply", - ) - plt.axvline(x=final_demand / (1e6), linestyle="-", label="final energy demand") - plt.axvline( - x=0.2 * final_demand / (1e6), linestyle="-.", label="20% final energy demand" - ) - plt.axvline( - x=0.6 * final_demand / (1e6), linestyle=":", label="60% final energy demand" - ) - - # the subtracted plot - plt.plot( - df_sub["demand [MWh]"].astype(float) / (1e6), - df_sub["LCOH [EUR/MWh]"].astype(float), - linestyle="--", - color="C1", - marker="o", - markerfacecolor="none", - label="subracted supply", - ) - plt.axvline(local_load / (1e6), label="local demand", linestyle="--", color="C1") - - # plt.axvline(x=final_green/(1e6),linestyle='-',label="final demand RE",color='springgreen') - # plt.axvline(x=0.2*final_green/(1e6),linestyle='--',label="20 final demand RE",color='springgreen') - # plt.axvline(x=0.6*final_green/(1e6),linestyle='-.',label="60 final demand RE",color='springgreen') - - plt.ylabel("LCOH [EUR/MWh]") - plt.ylim((0, 100)) - plt.title( - "levelized cost of hydrogen production in {}".format( - snakemake.wildcards["region"] - ) - ) - plt.xlabel("demand [TWh]") - plt.legend() - plt.savefig(snakemake.output.supply_curve, format="pdf", bbox_inches="tight") - - return - - -if __name__ == "__main__": - create_supply_curve_with_demand() diff --git a/workflow/scripts/create_supply_curve.py b/workflow/scripts/create_supply_curve.py index ea9a744..ce0287e 100644 --- a/workflow/scripts/create_supply_curve.py +++ b/workflow/scripts/create_supply_curve.py @@ -1,9 +1,24 @@ +import os +import sys +from typing import Any import pandas as pd - import matplotlib +import matplotlib.pyplot as plt +import pypsa + +# Add workflow/scripts to path for imports +sys.path.insert(0, os.path.join(os.path.dirname(__file__))) + +from _helpers import setup_logging +from trade_chain_utils import route_label_for_product + +snakemake: Any = globals().get("snakemake") matplotlib.use("Agg") -import matplotlib.pyplot as plt + +logger = setup_logging( + __name__, snakemake=snakemake, log_filename="create_supply_curve.log" +) def get_steel_demand(region): @@ -25,107 +40,222 @@ def get_final_demand(region): return final_demand +def get_stage_ratios_from_skeleton(): + """Extract stage conversion ratios from the PyPSA supply-chain skeleton. + + Returns ratios as input-per-output: + - ore_per_hbi + - hbi_per_steel + - ore_per_steel + """ + network = pypsa.Network(snakemake.input.skeleton) + + ore_per_hbi = None + hbi_per_steel = None + + if "dri" in network.links.index: + dri_eff = float(network.links.at["dri", "efficiency"]) + if dri_eff > 0: + ore_per_hbi = 1.0 / dri_eff + + if "eaf" in network.links.index: + eaf_eff = float(network.links.at["eaf", "efficiency"]) + if eaf_eff > 0: + hbi_per_steel = 1.0 / eaf_eff + + ore_per_steel = None + if ore_per_hbi is not None and hbi_per_steel is not None: + ore_per_steel = ore_per_hbi * hbi_per_steel + + return { + "ore_per_hbi": ore_per_hbi, + "hbi_per_steel": hbi_per_steel, + "ore_per_steel": ore_per_steel, + } + + +def get_stage_metadata(product, stage_ratios): + """Return stage input/output metadata for the current supply-curve product.""" + if product == "hbi": + return { + "stage_input_commodity": "iron_ore", + "stage_output_commodity": "hbi", + "stage_input_per_output": stage_ratios["ore_per_hbi"], + } + if product == "steel": + return { + "stage_input_commodity": "hbi", + "stage_output_commodity": "steel", + "stage_input_per_output": stage_ratios["hbi_per_steel"], + } + return { + "stage_input_commodity": "", + "stage_output_commodity": product, + "stage_input_per_output": None, + } + + def create_supply_curve(): - # input: "resources/lcoh/{region}/results_{demand_factor}.csv", - # outputs: supply="resources/supply_curves/{region}_hydrogen.csv", supply_curve="resources/supply_curves/{region}_hydrogen.pdf" - all_files = snakemake.input.lco_product_data - print("files to merge:", all_files) + """ + Create supply curve from default scenario LCoX results. + + Loads results from configurable default scenario (e.g., allocated_share, reserved, unreserved) + and optional unreserved scenario for comparison: + - default (primary): configured via supply_curve.default_scenario + - unreserved (optional): full renewable stack available (fallback) + + Combines results and produces CSV/PDF outputs. + """ + stage_ratios = get_stage_ratios_from_skeleton() + stage_meta = get_stage_metadata(product, stage_ratios) + + # route_label is derived from config to locate upstream LCoX files for this product + route_label = route_label_for_product(snakemake.config, product) or product - df_from_each_file = (pd.read_csv(f, sep=",", index_col=0) for f in all_files) - df_merged = pd.concat(df_from_each_file, ignore_index=True) - df_sub = df_merged.copy() - print("merged file has been created") + # Load primary scenario (now uses default_scenario from config) + default_scenario = snakemake.config.get("supply_curve", {}).get( + "default_scenario", "allocated_share" + ) + reserved_files = ( + snakemake.input.lco_reserved + ) # This now holds default_scenario files + logger.info(f"default scenario ({default_scenario}) files: {reserved_files}") + df_reserved = pd.concat( + (pd.read_csv(f, sep=",") for f in reserved_files), ignore_index=True + ) + logger.info(f"default scenario ({default_scenario}) data loaded") + + unreserved_files = snakemake.input.lco_unreserved + if unreserved_files and len(unreserved_files) > 0: + logger.info(f"unreserved scenario files: {unreserved_files}") + df_unreserved = pd.concat( + (pd.read_csv(f, sep=",") for f in unreserved_files), ignore_index=True + ) + logger.info("unreserved scenario data loaded") + df_merged = df_reserved.copy() + df_sub = df_unreserved.copy() + else: + logger.info( + f"unreserved scenario not provided; using {default_scenario} for both outputs" + ) + df_merged = df_reserved.copy() + df_sub = df_reserved.copy() - # preparing for plotting infeasible_rows = df_merged[ df_merged[columns["cost per unit"]] == "infeasible" ].index df_merged = df_merged.drop(infeasible_rows) df_sub = df_sub.drop(infeasible_rows) - print("deleted infeasible rows to prepare for plotting") - - # # first calculate part of local supply that should be used to cover local el demand - df_all_demand = pd.read_csv(snakemake.input.local_demand, header=0) - df_local_demand = df_all_demand.loc[ - df_all_demand["region"] == snakemake.wildcards["region"] - ] - # # total final energy consumption for the region * percentage of final energy consumption needed to meet local el demand = local el demand need in MWh - # # since the demand is for hydrogen (after electrolysis of 75%), local el load must be converted to the amount of decreasing hydrogen production - - if product == "hydrogen": - conversion_factor = 0.75 - elif product in ["steel", "eaf", "hbi", "eaf-grid"]: - conversion_factor = 1 / snakemake.config["electricity_steel_ratio"] - else: - raise ValueError(f"product {product} not recognized for supply curve plotting") - - local_load = float( - df_local_demand["demand"].values[0] - * df_local_demand["el_share"].values[0] - / 100 + logger.info("deleted infeasible rows to prepare for plotting") + + df_merged["stage_input_commodity"] = stage_meta["stage_input_commodity"] + df_merged["stage_output_commodity"] = stage_meta["stage_output_commodity"] + df_merged["stage_input_per_output"] = stage_meta["stage_input_per_output"] + df_merged["route_label"] = route_label + + df_sub["stage_input_commodity"] = stage_meta["stage_input_commodity"] + df_sub["stage_output_commodity"] = stage_meta["stage_output_commodity"] + df_sub["stage_input_per_output"] = stage_meta["stage_input_per_output"] + df_sub["route_label"] = route_label + + df_merged["stage_marginal_cost_per_unit"] = df_merged[ + columns["cost per unit"] + ].astype(float) + df_sub["stage_marginal_cost_per_unit"] = df_sub[columns["cost per unit"]].astype( + float ) - product_subtract = local_load * conversion_factor + # Supply curves are stage-marginal only; no upstream pricing is included. + # This preserves Option B semantics where each stage is independently cost-optimized + # and the trade model assembles the full chain cost. + iron_ore_total_cost = 0 - print(f"local el load is: {local_load} MWh") - print( - f"product substraction due to local el load is: {product_subtract} {columns['product_unit']}" + df_merged["iron_ore_cost_per_unit"] = iron_ore_total_cost + df_sub["iron_ore_cost_per_unit"] = iron_ore_total_cost + df_merged["total_cost_per_unit"] = ( + df_merged["stage_marginal_cost_per_unit"] + df_merged["iron_ore_cost_per_unit"] + ) + df_sub["total_cost_per_unit"] = ( + df_sub["stage_marginal_cost_per_unit"] + df_sub["iron_ore_cost_per_unit"] ) - # # # ******************* SUBTRACTING LOCAL DEMAND *********************** - # # remove local load from demand and drop all negative rows (generators that are only local) - df_sub[columns["demand"]] = df_sub[columns["demand"]].subtract(product_subtract) - df_sub.loc[df_sub[columns["demand"]] < 0, columns["demand"]] = 0 - print("local el load has been subtracted from global supply") - - # saves the merged costs in a supply curve csv - df_sub.to_csv(snakemake.output.supply) - df_merged.to_csv(snakemake.output.supply_nodemand) - - # creates and saves supply curve plot - if product in ["steel", "hbi"]: - iron_ore_total_cost = ( - snakemake.config["iron_ore"]["marginal_cost"] - * snakemake.config["iron_ore"]["ore_to_steel_ratio"] - ) + if product == "steel": + df_sub = df_merged.copy() - elif product in ["hydrogen", "eaf", "eaf-grid"]: - iron_ore_total_cost = 0 + df_merged.to_csv(snakemake.output.supply, index=False) + try: + unreserved_path = snakemake.output.supply_unreserved + except Exception: + unreserved_path = None + + if ( + unreserved_path + and str(unreserved_path).endswith(".csv") + and len(snakemake.input.lco_unreserved) > 0 + ): + df_sub.to_csv(unreserved_path, index=False) + logger.info(f"Saved unreserved supply curve: {unreserved_path}") else: - raise ValueError(f"product {product} not recognized for supply curve plotting") + logger.info( + "Skipping supply_unreserved output (unreserved scenario not provided or not enabled)" + ) - y_merged = df_merged[columns["cost per unit"]].astype(float) + iron_ore_total_cost - y_sub = df_sub[columns["cost per unit"]].astype(float) + iron_ore_total_cost + if unreserved_path: + try: + if not os.path.exists(unreserved_path): + df_sub.to_csv(unreserved_path, index=False) + logger.info( + "Wrote fallback supply_unreserved file: %s", unreserved_path + ) + except Exception: + pass + + y_merged = df_merged["stage_marginal_cost_per_unit"] + y_sub = df_sub["stage_marginal_cost_per_unit"] plt.plot( df_merged[columns["demand"]].astype(int) / (1e6), y_merged, linestyle="-", marker="o", - label="supply", + label="supply (reserved)", ) - # the subtracted plot - plt.plot( - df_sub[columns["demand"]].astype(int) / (1e6), - y_sub, - linestyle="--", - color="C1", - marker="o", - markerfacecolor="none", - label="supply w. local el. demand subtracted", - ) + if len(snakemake.input.lco_unreserved) > 0: + plt.plot( + df_sub[columns["demand"]].astype(int) / (1e6), + y_sub, + linestyle="--", + color="C1", + marker="o", + markerfacecolor="none", + label="supply (unreserved)", + ) - plt.axvline( - product_subtract / (1e6), - label="local energy demand for el.", - linestyle="--", - color="C1", - ) + if product == "steel": + y_merged_total = df_merged["total_cost_per_unit"] + y_sub_total = df_sub["total_cost_per_unit"] + plt.plot( + df_merged[columns["demand"]].astype(int) / (1e6), + y_merged_total, + linestyle="-", + color="C3", + marker="s", + label="supply total (marginal + ore, reserved)", + ) + if len(snakemake.input.lco_unreserved) > 0: + plt.plot( + df_sub[columns["demand"]].astype(int) / (1e6), + y_sub_total, + linestyle="--", + color="C4", + marker="s", + markerfacecolor="none", + label="supply total (marginal + ore, unreserved)", + ) if product == "hydrogen": - final_demand = get_final_demand(snakemake.wildcards["region"]) plt.axvline( x=final_demand.values[0] / (1e6), linestyle="-", label="final energy demand" @@ -140,13 +270,20 @@ def create_supply_curve(): linestyle="-.", label="20% final energy demand", ) - - elif product in ["steel", "eaf", "hbi", "eaf-grid"]: + elif product == "steel": steel_demand = get_steel_demand(snakemake.wildcards["region"]) plt.axvline(x=steel_demand.values[0], linestyle=":", label="local steel demand") + elif product == "hbi": + steel_demand = get_steel_demand(snakemake.wildcards["region"]) + hbi_per_steel = stage_ratios["hbi_per_steel"] or 1.0 + plt.axvline( + x=steel_demand.values[0] * hbi_per_steel, + linestyle=":", + label="local steel demand (HBI-equivalent)", + ) plt.title( - f"levelized cost of {product} production in {snakemake.wildcards['region']}", + f"levelized cost of {product} production in {snakemake.wildcards['region']}" ) plt.ylim(columns["ylim"]) plt.xlabel(columns["xlabel"]) @@ -157,42 +294,46 @@ def create_supply_curve(): return -if __name__ == "__main__": +# Setup columns and product before function execution (needed for both Snakemake and main) +if snakemake is None: + from _helpers import mock_snakemake - if "snakemake" not in globals(): - from _helpers import mock_snakemake + snakemake = mock_snakemake( + "create_supply_curve", + cost_year="2030", + region="South_South_America", + product="steel", + ) - snakemake = mock_snakemake( - "create_supply_curve", - cost_year="2030", - region="South_South_America", - product="steel", - ) - product = snakemake.wildcards["product"] - if product == "hydrogen": - columns = { - "demand factor": "demand factor [%]", - "demand": "demand [MWh]", - "load": "load [MW]", - "total cost": "cost [EUR]", - "cost per unit": "LCOH [EUR/MWh]", - "xlabel": "Demand in TWh", - "product_unit": "MWh", - "ylim": (0, 100), - } - elif product in ["steel", "eaf", "hbi", "eaf-grid"]: - columns = { - "demand factor": "demand factor [%]", - "demand": "demand [t]", - "load": "load [t/h]", - "total cost": "cost [EUR]", - "cost per unit": "LCOX [EUR/t]", - "xlabel": "Demand in Mt", - "product_unit": "t", - "ylim": (0, 900), - } - else: - raise ValueError(f"product {product} not recognized for supply curve plotting") +# Get product from wildcards (product-labeled contract) +product = snakemake.wildcards["product"] +logger.info(f"Creating supply curve for product={product}") + +if product == "hydrogen": + columns = { + "demand factor": "demand factor [%]", + "demand": "demand [t]", + "load": "load [MW]", + "total cost": "cost [EUR]", + "cost per unit": "lcox [EUR/MWh]", + "xlabel": "Demand in TWh", + "product_unit": "MWh", + "ylim": (0, 100), + } +elif product in ["steel", "hbi"]: + columns = { + "demand factor": "demand factor [%]", + "demand": "demand [t]", + "load": "load [t/h]", + "total cost": "cost [EUR]", + "cost per unit": "lcox [EUR/t]", + "xlabel": "Demand in Mt", + "product_unit": "t", + "ylim": (0, 900), + } +else: + raise ValueError(f"product {product} not recognized for supply curve plotting") +if __name__ == "__main__": create_supply_curve() diff --git a/workflow/scripts/download_labour_data.py b/workflow/scripts/download_labour_data.py new file mode 100644 index 0000000..a92fed9 --- /dev/null +++ b/workflow/scripts/download_labour_data.py @@ -0,0 +1,764 @@ +""" +data_downloader.py +================== +Downloads and prepares all input data needed for labour_cost_calculator.py +to run on any country worldwide. + +Data sources +------------ +A. World Bank WDI – GNI per capita (Atlas method, current USD) + Automated via the `wbgapi` package. Requires: pip install wbgapi + +B. ECB – Annual average USD/EUR spot rates + Automated via the ECB public REST API (no credentials needed). + +C. UNIDO INDSTAT – Steel sector wage bill & employment + Raw data files are expected in data/labour/unido-raw/data.csv + (downloaded from https://stat.unido.org/data/download, + INDSTAT Rev 4, ISIC 241, variables 04+05, all countries). + Licence: CC BY 4.0 + +D. Employer SSC rates – statutory employer social-security contribution rates + Pre-compiled reference table for ~80 countries. + Sources: OECD Taxing Wages 2023/24, ILO Social Security Inquiry 2022, + KPMG Global Employer Tax Guide 2023. + +Outputs (saved to data/labour/) +-------------------------------- + data/labour/gni_per_capita.csv + data/labour/ecb_usd_eur.csv + data/labour/employer_contributions.csv + data/labour/merged_labour_inputs.csv ← main output for labour_cost_calculator.py + +Usage +----- + python workflow/scripts/data_downloader.py [--target-year 2020] [--force] +""" + +import sys +import warnings +import requests # type: ignore +import pandas as pd # type: ignore +import pycountry # type: ignore +from io import StringIO +from pathlib import Path + +from _helpers import setup_logging + +# ── optional wbgapi ────────────────────────────────────────────────────────── +try: + import wbgapi as wb # type: ignore + + HAS_WBGAPI = True +except ImportError: + HAS_WBGAPI = False + +# ───────────────────────────────────────────────────────────────────────────── +# File paths (resolved relative to this script β†’ works from any cwd) +# ───────────────────────────────────────────────────────────────────────────── +REPO_ROOT = Path(__file__).resolve().parent.parent.parent +DATA_DIR = REPO_ROOT / "data" / "labour" +DATA_DIR.mkdir(parents=True, exist_ok=True) + +# UNIDO raw data: data/labour/unido-raw/data.csv +UNIDO_RAW = DATA_DIR / "unido-raw" / "data.csv" +GNI_CSV = DATA_DIR / "gni_per_capita.csv" +ECB_CSV = DATA_DIR / "ecb_usd_eur.csv" +CONTRIB_CSV = DATA_DIR / "employer_contributions.csv" +MERGED_CSV = DATA_DIR / "merged_labour_inputs.csv" + +snakemake = globals().get("snakemake") +logger = setup_logging( + __name__, snakemake=snakemake, log_filename="download_labour_data.log" +) + +# ───────────────────────────────────────────────────────────────────────────── +# OECD member list (ISO-3, as of 2024) +# ───────────────────────────────────────────────────────────────────────────── +OECD_MEMBERS = { + "AUS", + "AUT", + "BEL", + "CAN", + "CHL", + "COL", + "CRI", + "CZE", + "DNK", + "EST", + "FIN", + "FRA", + "DEU", + "GRC", + "HUN", + "ISL", + "IRL", + "ISR", + "ITA", + "JPN", + "KOR", + "LVA", + "LTU", + "LUX", + "MEX", + "NLD", + "NZL", + "NOR", + "POL", + "PRT", + "SVK", + "SVN", + "ESP", + "SWE", + "CHE", + "TUR", + "GBR", + "USA", +} + + +# ───────────────────────────────────────────────────────────────────────────── +# A. World Bank GNI per capita +# ───────────────────────────────────────────────────────────────────────────── +def fetch_world_bank_gni(start_year=2010, end_year=2023, force=False): + """ + Download GNI per capita (Atlas method, current USD) for all World Bank + economies covering *start_year*–*end_year*. + + Requires the `wbgapi` package: pip install wbgapi + + Returns a tidy DataFrame: iso3 | year | gni_usd + Saves result to data/gni_per_capita.csv. + """ + if GNI_CSV.exists() and not force: + logger.info(f"[GNI] Loading cached β†’ {GNI_CSV}") + return pd.read_csv(GNI_CSV) + + if not HAS_WBGAPI: + sys.exit( + "ERROR: wbgapi is required to download World Bank GNI data.\n" + " pip install wbgapi" + ) + + logger.info("[GNI] Downloading from World Bank (NY.GNP.PCAP.CD) …") + try: + raw = wb.data.DataFrame( + "NY.GNP.PCAP.CD", + time=range(start_year, end_year + 1), + skipBlanks=True, + columns="time", + ) + # raw: index = economy (ISO3), columns = "YR2010" … "YR2023" + df = ( + raw.reset_index() + .rename(columns={"economy": "iso3"}) + .melt(id_vars="iso3", var_name="year", value_name="gni_usd") + ) + df["year"] = df["year"].str.replace("YR", "").astype(int) + df = df.dropna(subset=["gni_usd"]) + df.to_csv(GNI_CSV, index=False) + logger.info(f"[GNI] {len(df)} rows β†’ {GNI_CSV}") + return df + + except Exception as exc: + sys.exit(f"ERROR downloading World Bank GNI data: {exc}") + + +# ───────────────────────────────────────────────────────────────────────────── +# B. ECB USD/EUR annual average exchange rates +# ───────────────────────────────────────────────────────────────────────────── + +# Fallback table: ECB EXR.A.USD.EUR.SP00.A annual averages (USD per 1 EUR). +# Source: European Central Bank Statistical Data Warehouse. +# Last updated: 2024. Invert to obtain EUR per USD. +_ECB_FALLBACK_USD_PER_EUR = { + 2000: 0.9236, + 2001: 0.8956, + 2002: 0.9454, + 2003: 1.1312, + 2004: 1.2438, + 2005: 1.2441, + 2006: 1.2556, + 2007: 1.3705, + 2008: 1.4726, + 2009: 1.3948, + 2010: 1.3257, + 2011: 1.3920, + 2012: 1.2848, + 2013: 1.3281, + 2014: 1.3285, + 2015: 1.0859, + 2016: 1.1069, + 2017: 1.1297, + 2018: 1.1810, + 2019: 1.1195, + 2020: 1.1422, + 2021: 1.1827, + 2022: 1.0530, + 2023: 1.0813, + 2024: 1.0815, +} + + +def _parse_ecb_csv(text): + """Parse an ECB SDMX-CSV response into a tidy DataFrame.""" + raw = pd.read_csv(StringIO(text)) + time_col = next(c for c in raw.columns if "TIME" in c.upper()) + val_col = next(c for c in raw.columns if "OBS_VALUE" in c.upper()) + df = raw[[time_col, val_col]].copy() + df.columns = ["year", "usd_per_eur"] + df["year"] = df["year"].astype(int) + df["eur_per_usd"] = 1.0 / df["usd_per_eur"] + return df + + +def fetch_ecb_rates(start_year=2010, end_year=2023, force=False): + """ + Obtain annual average USD/EUR spot rates from the ECB. + + Series: EXR.A.USD.EUR.SP00.A β†’ USD per 1 EUR. + Inverted to EUR per USD (= EUR_per_USD used in the paper). + + Strategy: + 1. Load cached CSV if present (and not --force). + 2. Try ECB SDW-WSREST API (old, well-documented endpoint). + 3. Try ECB Data Portal API v1 (new endpoint). + 4. Fall back to the embedded _ECB_FALLBACK_USD_PER_EUR table. + + Returns: year | usd_per_eur | eur_per_usd + Saves to data/ecb_usd_eur.csv. + """ + if ECB_CSV.exists() and not force: + logger.info(f"[ECB] Loading cached β†’ {ECB_CSV}") + return pd.read_csv(ECB_CSV) + + ecb_attempts = [ + ( + "ECB SDW-WSREST", + ( + "https://sdw-wsrest.ecb.europa.eu/service/data/EXR/A.USD.EUR.SP00.A" + f"?format=csvdata&startPeriod={start_year}&endPeriod={end_year}" + ), + {}, + ), + ( + "ECB Data Portal v1 (Accept: text/csv)", + ( + "https://data.ecb.europa.eu/api/v1/data/EXR/A.USD.EUR.SP00.A" + f"?startPeriod={start_year}&endPeriod={end_year}" + ), + {"Accept": "text/csv"}, + ), + ( + "ECB Data Portal v1 (format=csvdata)", + ( + "https://data.ecb.europa.eu/api/v1/data/EXR/A.USD.EUR.SP00.A" + f"?format=csvdata&startPeriod={start_year}&endPeriod={end_year}" + ), + {}, + ), + ] + + for label, url, headers in ecb_attempts: + try: + logger.info(f"[ECB] Trying {label} …") + resp = requests.get(url, headers=headers, timeout=20) + resp.raise_for_status() + df = _parse_ecb_csv(resp.text) + df.to_csv(ECB_CSV, index=False) + logger.info(f"[ECB] {len(df)} rows β†’ {ECB_CSV}") + return df + except Exception as exc: + logger.warning(f"[ECB] {label} failed: {exc}") + + # ── fallback: embedded reference table ─────────────────────────────────── + logger.info( + "[ECB] All live endpoints unavailable. Using embedded reference table (_ECB_FALLBACK_USD_PER_EUR)." + ) + rows = [ + {"year": y, "usd_per_eur": r, "eur_per_usd": 1.0 / r} + for y, r in _ECB_FALLBACK_USD_PER_EUR.items() + if start_year <= y <= end_year + ] + df = pd.DataFrame(rows).sort_values("year").reset_index(drop=True) + df.to_csv(ECB_CSV, index=False) + logger.info(f"[ECB] {len(df)} rows (from fallback table) β†’ {ECB_CSV}") + return df + + +# ───────────────────────────────────────────────────────────────────────────── +# C. UNIDO INDSTAT – steel sector wages & employment +# ───────────────────────────────────────────────────────────────────────────── + +# Common UNIDO country-name variants β†’ ISO-3 override +# (pycountry handles most; these cover known quirks) +_UNIDO_NAME_OVERRIDES = { + "United States of America": "USA", + "United States": "USA", + "Korea, Republic of": "KOR", + "Republic of Korea": "KOR", + "Korea (the Republic of)": "KOR", + "Taiwan, Province of China": "TWN", + "China, Taiwan Province": "TWN", + "Taiwan": "TWN", + "Iran (Islamic Republic of)": "IRN", + "Iran, Islamic Republic of": "IRN", + "Viet Nam": "VNM", + "Vietnam": "VNM", + "Bolivia (Plurinational State of)": "BOL", + "Bolivia": "BOL", + "Venezuela (Bolivarian Republic of)": "VEN", + "Venezuela": "VEN", + "Congo, Democratic Republic of the": "COD", + "Democratic Republic of the Congo": "COD", + "Syrian Arab Republic": "SYR", + "Syria": "SYR", + "Lao People's Democratic Republic": "LAO", + "Laos": "LAO", + "Moldova, Republic of": "MDA", + "Republic of Moldova": "MDA", + "Tanzania, United Republic of": "TZA", + "Tanzania": "TZA", + "Slovak Republic": "SVK", + "Czechia": "CZE", + "Czech Republic": "CZE", + "Russian Federation": "RUS", + "Russia": "RUS", + "North Macedonia": "MKD", + "Macedonia": "MKD", + "United Kingdom": "GBR", + "United Kingdom of Great Britain and Northern Ireland": "GBR", +} + + +def _name_to_iso3(name): + """Convert a country name string to ISO-3 alpha code, or return None.""" + if not isinstance(name, str): + return None + name = name.strip() + if name in _UNIDO_NAME_OVERRIDES: + return _UNIDO_NAME_OVERRIDES[name] + try: + c = pycountry.countries.lookup(name) + return c.alpha_3 + except LookupError: + return None + + +def load_unido_data(filepath=UNIDO_RAW): + """ + Load and normalise the UNIDO INDSTAT CSV downloaded from the portal. + + Handles two common export layouts: + β€’ Long format: columns include Country/Year/Variable/Value + β€’ SDMX-CSV: columns include REF_AREA / TIME_PERIOD / INDICATOR / OBS_VALUE + + Returns a tidy DataFrame: iso3 | country_name | year | employees | wages_usd + Returns *None* if the file does not exist (prints download instructions). + """ + filepath = Path(filepath) + if not filepath.exists(): + logger.warning(f"[UNIDO] Data file not found: {filepath}") + logger.warning( + " Please download INDSTAT Rev 4 (ISIC 241, variables 04+05, all countries)\n" + " from https://stat.unido.org/data/download and extract data.csv into\n" + f" {filepath.parent}/", + ) + return None + + logger.info(f"[UNIDO] Reading {filepath} …") + raw = pd.read_csv(filepath, low_memory=False) + + # ── Employees: VariableCode 4, count in Value ───────────────────────── + logger.info(f"[UNIDO] {len(raw)} raw rows read from {filepath}") + emp_mask = raw["VariableCode"].astype(str).str.strip().isin(["4", "04"]) + emp = ( + raw[emp_mask][["Year", "Country", "Value"]] + .copy() + .rename( + columns={"Year": "year", "Country": "country_name", "Value": "employees"} + ) + ) + emp["employees"] = pd.to_numeric(emp["employees"], errors="coerce") + # Sum across activity combinations (e.g. 2410A + 2410B) for same country/year + emp = emp.groupby(["year", "country_name"], as_index=False)["employees"].sum() + + # ── Wages: VariableCode 5, USD amount in ValueUSD ───────────────────── + wage_mask = raw["VariableCode"].astype(str).str.strip().isin(["5", "05"]) + wages = ( + raw[wage_mask][["Year", "Country", "ValueUSD"]] + .copy() + .rename( + columns={"Year": "year", "Country": "country_name", "ValueUSD": "wages_usd"} + ) + ) + wages["wages_usd"] = pd.to_numeric(wages["wages_usd"], errors="coerce") + wages = wages.groupby(["year", "country_name"], as_index=False)["wages_usd"].sum() + + # ── Merge and convert country names to ISO3 ─────────────────────────── + df = pd.merge(emp, wages, on=["year", "country_name"], how="inner") + df = df.dropna(subset=["employees", "wages_usd"]) + + df["iso3"] = df["country_name"].apply(_name_to_iso3) + df = df.dropna(subset=["iso3"]) + df["iso3"] = df["iso3"].str.upper().str.strip() + + result = df[["iso3", "country_name", "year", "employees", "wages_usd"]].copy() + logger.info( + f"[UNIDO] {len(result)} country-year rows loaded ({result['iso3'].nunique()} countries)." + ) + return result + + +# ───────────────────────────────────────────────────────────────────────────── +# D. Employer social-security contribution rates +# Sources: OECD Taxing Wages 2024, ILO Social Security Inquiry 2022, +# KPMG Global Employer Tax Guide 2023. +# All rates are the statutory employer SSC as a share of gross wages. +# ───────────────────────────────────────────────────────────────────────────── +EMPLOYER_CONTRIB_TABLE = { + # ISO3 : (rate_fraction, source_note) + "ARG": (0.170, "ANSES employer contributions ~17%"), + "AUS": (0.195, "Superannuation 11%, healthcare 2%, payroll levy ~5.5%"), + "AUT": (0.228, "Pension 12.55%, accident 1.2%, housing 0.5%, others ~8.6%"), + "BEL": (0.270, "ONSS employer total ~27%"), + "BGD": (0.050, "Bangladesh: employer contribution estimate ~5%"), + "BGR": (0.185, "Pension 10.82%, health 4.8%, others ~2.9%"), + "BLR": (0.340, "Social protection fund 34%"), + "BRA": (0.305, "INSS 22.5%, FGTS 8%"), + "CAN": (0.077, "CPP 5.95%, EI 1.66%"), + "CHL": (0.024, "Social security employer portion 2.4%"), + "CHN": ( + 0.282, + "Pension 16%, medical 5.8%, unemployment 0.5%, injury 0.4%, maternity 0.8%", + ), + "COL": (0.275, "Pension 12%, health 8.5%, ARL ~2%, SENA 2%, ICBF 3%"), + "CRI": (0.264, "CCSS employer contributions 26.4%"), + "CZE": (0.248, "Pension 21.5%, health 3.3%"), + "DEU": ( + 0.212, + "Pension 9.3%, unemployment 1.23%, health 7.3%, nursing+other ~3.3%", + ), + "DNK": (0.010, "Denmark: minimal statutory employer SSC"), + "DZA": (0.260, "CNAS employer 26%"), + "EGY": (0.260, "Social insurance employer 26%"), + "ESP": ( + 0.310, + "Pension 23.6%, unemployment 5.5%, FOGASA 0.2%, FP 0.6%, other 1.1%", + ), + "EST": (0.330, "Social tax 33%"), + "ETH": (0.110, "Private pension 11%"), + "FIN": (0.200, "Pension ~17.39%, unemployment ~1.91%, accident/other"), + "FRA": (0.425, "Complex French system total ~42.5%"), + "GBR": (0.138, "NIC Class 1 employer 13.8%"), + "GHA": (0.130, "SSNIT 13%"), + "GRC": (0.251, "IKA-ETAM ~25.06%"), + "HUN": (0.130, "Social contribution tax 13%"), + "IDN": (0.092, "BPJS: pension 3.7%, healthcare 4%, accident 0.24%, death 0.3%"), + "IND": (0.136, "EPF 12%, ESI 3.25%, LWF negligible"), + "IRL": (0.115, "PRSI Class A employer 11.15%"), + "IRN": (0.230, "Social security 23%"), + "IRQ": (0.120, "Social security employer 12%"), + "ISL": (0.065, "Iceland: employer social security 6.5%"), + "ISR": (0.075, "National insurance 3.55%, health insurance 3.1%"), + "ITA": (0.320, "INPS employer ~32%"), + "JPN": (0.151, "Pension 9.15%, health 4.99%, employment 0.6%, WC ~0.5%"), + "KAZ": (0.180, "Social contributions 3.5%, UAPF 3.5%, health 3%, other ~7%"), + "KOR": (0.105, "National pension 4.5%, health 3.545%, employment 0.9%, WC ~1.5%"), + "LBY": (0.115, "Social security 11.5%"), + "LTU": (0.017, "Employer SSC 1.77% (post-2019 reform)"), + "LUX": (0.155, "Pension 8%, health 3.05%, accident 1.1%, mutual aid/LTC ~3.3%"), + "LVA": (0.237, "Social insurance 23.59%"), + "MAR": ( + 0.228, + "CNSS: pension 11.89%, family 6.4%, AMO 2.26%, training 1.6%, accident", + ), + "MEX": (0.250, "IMSS ~17%, INFONAVIT 5%, SAR 2%"), + "MYS": (0.143, "EPF 12%, SOCSO 1.75%, EIS 0.4%, HRDF 0.5%"), + "NGA": (0.100, "PRA employer contributory pension 10%"), + "NLD": (0.190, "AOW/ANW/WLZ/WIA/ZVW combined ~19%"), + "NOR": (0.141, "Employer social security 14.1%"), + "NZL": (0.000, "No statutory employer SSC"), + "OMN": (0.113, "PASI employer 11.25%"), + "PAK": (0.120, "EOBI 5%, ESSI 5%, other ~2%"), + "PER": (0.090, "EsSalud 9%"), + "PHL": (0.115, "SSS 8%, PhilHealth 2.5%, Pag-IBIG 2%"), + "POL": ( + 0.204, + "Pension 9.76%, disability 6.5%, accident avg 1.67%, FP+FGSP ~2.55%", + ), + "PRT": (0.238, "Social security 23.75%"), + "QAT": (0.000, "Qatar: no employer SSC for most private-sector workers"), + "ROU": (0.023, "Work accident/occupational disease 2.25%"), + "RUS": (0.302, "Pension 22%, medical 5.1%, social 2.9%, injury 0.2%"), + "SAU": (0.118, "Social insurance 11.75%"), + "SGP": (0.170, "CPF employer ~17%"), + "SVK": ( + 0.248, + "Pension 14%, disability 3%, sickness 1.4%, unemployment 1%, other ~5%", + ), + "SVN": (0.163, "Pension 8.85%, health 6.56%, accident 0.53%, employment 0.06%"), + "SWE": (0.314, "Social security fees 31.42%"), + "THA": (0.050, "Social security employer 5%"), + "TUN": (0.165, "CNSS employer 16.57%"), + "TUR": (0.225, "Social security premiums 22.5%"), + "TZA": (0.100, "NSSF employer 10%"), + "UKR": (0.220, "Unified social contribution 22%"), + "ARE": (0.125, "GPSSA employer 12.5% for nationals; expats typically 0%"), + "USA": (0.076, "FICA: SS 6.2%, Medicare 1.45%, FUTA ~0.6%"), + "UZB": (0.120, "Social insurance 12%"), + "VNM": (0.215, "Social insurance 17.5%, health 3%, unemployment 1%"), + "ZAF": (0.020, "Skills development levy 1%, UIF 1%"), + "ZMB": (0.050, "NAPSA employer 5%"), + "ZWE": (0.045, "NSSA employer 4.5%"), + "CHE": (0.135, "AHV/IV/EO 5.3%, ALV 1.1%, FAK ~1.7%, accident/pension ~5.4%"), + "MKD": (0.070, "North Macedonia: employer health 7.3% β†’ total ~7%"), + "SRB": ( + 0.173, + "Serbia: pension 11%, health 5.15%, unemployment 0.75%, other ~0.3%", + ), + "HRV": (0.165, "Croatia: pension pillar II 5%, health ~16.5% total"), + "BIH": (0.105, "Bosnia: contributions ~10.5% (varies by entity)"), + "ALB": (0.150, "Albania: employer social insurance 15%"), + "GEO": (0.000, "Georgia: no employer-side social contribution"), + "ARM": (0.025, "Armenia: employer social premium 2.5%"), + "AZE": (0.220, "Azerbaijan: employer social insurance 22%"), + "TKM": (0.200, "Turkmenistan: employer insurance ~20%"), + "KGZ": (0.175, "Kyrgyzstan: employer social fund 17.5%"), + "TJK": (0.250, "Tajikistan: employer contribution ~25%"), + "MNG": (0.135, "Mongolia: employer social insurance 13.5%"), + "MMR": (0.030, "Myanmar: SSB employer 2.5-3%"), + "KHM": (0.031, "Cambodia: NSSF employer 3.1%"), + "LKA": (0.120, "Sri Lanka: EPF 12%"), + "NPL": (0.100, "Nepal: SSF employer ~10%"), + "KEN": (0.060, "Kenya: NSSF + NHIF employer ~6%"), + "UGA": (0.100, "Uganda: NSSF employer 10%"), + "SEN": (0.040, "Senegal: IPM employer + family benefit ~4%"), + "CIV": (0.065, "CΓ΄te d'Ivoire: CNPS employer ~6.5%"), + "CMR": (0.080, "Cameroon: CNPS employer ~8%"), + "AGO": (0.080, "Angola: employer social security 8%"), + "MOZ": (0.040, "Mozambique: INSS employer 4%"), + "BWA": (0.000, "Botswana: no statutory employer SSC"), + "NAM": (0.000, "Namibia: no statutory employer SSC"), + "MUS": (0.060, "Mauritius: NPF 6%"), + "TTO": (0.060, "Trinidad & Tobago: NIS employer 5.85% + 0.3%"), + "JAM": (0.030, "Jamaica: NIS employer 2.5-3%"), + "ECU": (0.120, "Ecuador: IESS employer 12.15%"), + "BOL": (0.165, "Bolivia: AFP 10%, health 10%, employer total ~16.5%"), + "PRY": (0.165, "Paraguay: IPS employer 14%, others ~2.5%"), + "URY": (0.075, "Uruguay: BPS employer 7.5%"), + "PAN": (0.125, "Panama: CSS employer 12.25%"), + "GTM": (0.105, "Guatemala: IGSS employer 10.5%"), + "HND": (0.090, "Honduras: IHSS employer 5%, RAP 5% β†’ ~9%"), + "SLV": (0.075, "El Salvador: ISSS 7.5% employer"), + "NIC": (0.190, "Nicaragua: INSS employer 19%"), + "DOM": (0.075, "Dominican Republic: AFP 7.1% β†’ total ~7.5%"), + "CUB": (0.145, "Cuba: employer social security 14.5%"), +} + + +def build_employer_contributions(): + """ + Build a DataFrame from the embedded EMPLOYER_CONTRIB_TABLE. + + Returns: iso3 | employer_contrib_rate | contrib_source | oecd_status + Saves to data/employer_contributions.csv. + """ + rows = [ + {"iso3": iso, "employer_contrib_rate": rate, "contrib_source": note} + for iso, (rate, note) in EMPLOYER_CONTRIB_TABLE.items() + ] + df = pd.DataFrame(rows) + df["oecd_status"] = df["iso3"].apply( + lambda x: "OECD" if x in OECD_MEMBERS else "non_OECD" + ) + df.to_csv(CONTRIB_CSV, index=False) + logger.info(f"[CONTRIB] {len(df)} countries β†’ {CONTRIB_CSV}") + return df + + +# ───────────────────────────────────────────────────────────────────────────── +# E. Merge all sources β†’ merged_labour_inputs.csv +# ───────────────────────────────────────────────────────────────────────────── + + +def _pick_latest_row(group, target_year): + """ + From a single country's time-series, return the row with the most recent + year ≀ target_year that has both employees and wages_usd. + Returns None if no qualifying row exists. + """ + valid = group[group["year"] <= target_year].dropna( + subset=["employees", "wages_usd"] + ) + if valid.empty: + return None + return valid.sort_values("year").iloc[-1] + + +def _nearest_year(lookup_dict, iso3, preferred_year): + """ + From a {(iso3, year): value} dict, return (year_used, value) for the + entry closest to preferred_year. Returns (None, None) if no data. + """ + candidates = [(y, v) for (c, y), v in lookup_dict.items() if c == iso3] + if not candidates: + return None, None + candidates.sort(key=lambda xy: abs(xy[0] - preferred_year)) + return candidates[0] + + +def merge_all_data( + target_year=2020, + unido_filepath=None, + output_filepath=None, + force_download=False, +): + """ + Orchestrate all downloads, merge on country Γ— year, and write the master + input CSV for labour_cost_calculator.py. + + Parameters + ---------- + target_year : int + Reference year for GNI and EUR conversion (default 2020). + unido_filepath : str or Path + Path to the manually downloaded UNIDO CSV. + output_filepath : str or Path + Path for the output merged CSV (default: MERGED_CSV). + force_download : bool + If True, re-download GNI and ECB data even if cached files exist. + + Returns + ------- + pd.DataFrame or None + Merged dataset (None if UNIDO file is missing). + """ + if unido_filepath is None: + unido_filepath = UNIDO_RAW + if output_filepath is None: + output_filepath = MERGED_CSV + output_filepath = Path(output_filepath) + + # 1. Fetch each source + gni_df = fetch_world_bank_gni(force=force_download) + ecb_df = fetch_ecb_rates(force=force_download) + unido_df = load_unido_data(unido_filepath) + contrib_df = build_employer_contributions() + + if unido_df is None: + logger.warning("[MERGE] Cannot merge – UNIDO file not yet downloaded.") + logger.warning( + " GNI, ECB and employer-contribution files have been saved." + ) + return None + + # 2. Build fast lookup dicts + # ECB: {year: eur_per_usd} + ecb_dict = dict(zip(ecb_df["year"].astype(int), ecb_df["eur_per_usd"])) + + # GNI: {(iso3, year): gni_usd} + gni_dict = { + (r.iso3.strip().upper(), int(r.year)): r.gni_usd for r in gni_df.itertuples() + } + + # 3. Pick best row per country from UNIDO + records = [] + for iso3, grp in unido_df.groupby("iso3"): + row = _pick_latest_row(grp, target_year) + if row is None: + continue + + data_year = int(row["year"]) + country_name = str(row.get("country_name", iso3)) + + # ECB rate for data year + eur_per_usd_data = ecb_dict.get( + data_year, ecb_dict[min(ecb_dict, key=lambda y: abs(y - data_year))] + ) + # ECB rate for target year + eur_per_usd_target = ecb_dict.get( + target_year, ecb_dict[min(ecb_dict, key=lambda y: abs(y - target_year))] + ) + + # GNI for data year + gni_data_usd = gni_dict.get((iso3, data_year)) + if gni_data_usd is None: + _, gni_data_usd = _nearest_year(gni_dict, iso3, data_year) + if gni_data_usd is None: + continue # no GNI data β†’ skip + + # GNI for target year + gni_target_usd = gni_dict.get((iso3, target_year)) + if gni_target_usd is None: + _, gni_target_usd = _nearest_year(gni_dict, iso3, target_year) + if gni_target_usd is None: + continue # no GNI data β†’ skip + + records.append( + { + "iso3": iso3, + "country_name": country_name, + "data_year": data_year, + "oecd_status": "OECD" if iso3 in OECD_MEMBERS else "non_OECD", + "steel_employees": row["employees"], + "steel_wage_usd": row["wages_usd"], + "gni_data_year_usd": gni_data_usd, + "gni_target_year_usd": gni_target_usd, + "eur_per_usd_data": eur_per_usd_data, + "eur_per_usd_target": eur_per_usd_target, + } + ) + + if not records: + logger.warning("[MERGE] No valid records produced. Check UNIDO file contents.") + return None + + merged = pd.DataFrame(records) + + # 4. Join employer contribution rates + merged = merged.merge( + contrib_df[["iso3", "employer_contrib_rate", "contrib_source"]], + on="iso3", + how="left", + ) + + # Report countries missing employer contribution data + missing_mask = merged["employer_contrib_rate"].isna() + if missing_mask.any(): + missing_iso = merged.loc[missing_mask, "iso3"].tolist() + warnings.warn( + f"{len(missing_iso)} countries have no employer contribution rate " + f"in EMPLOYER_CONTRIB_TABLE: {missing_iso}. " + "The caller should impute these (e.g. with the sample mean)." + ) + + output_filepath.parent.mkdir(parents=True, exist_ok=True) + merged.to_csv(output_filepath, index=False) + logger.info(f"\n[MERGE] {len(merged)} countries β†’ {output_filepath}") + cols_show = [ + "iso3", + "country_name", + "data_year", + "steel_employees", + "steel_wage_usd", + "gni_target_year_usd", + "employer_contrib_rate", + ] + logger.info(merged[cols_show].to_string(index=False)) + return merged + + +# ───────────────────────────────────────────────────────────────────────────── +# Entry point +# ───────────────────────────────────────────────────────────────────────────── +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("download_labour_data") + + merge_all_data( + target_year=2020, + output_filepath=snakemake.output.merged, + ) diff --git a/workflow/scripts/model_lcoh.py b/workflow/scripts/model_lcoh.py deleted file mode 100644 index fe2f847..0000000 --- a/workflow/scripts/model_lcoh.py +++ /dev/null @@ -1,288 +0,0 @@ -import pypsa -import pandas as pd -import numpy as np - -# import matplotlib.pyplot as plt -# from pyomo.environ import Constraint -import xarray as xr - - -def calc_annuity(i_rate, lifetime): - # calculating annuity factor with interest rate and lifetime - return i_rate / (1 - (1 + i_rate) ** (-lifetime)) - - -def calc_cap_cost(costs, tech, i_rate): - # select the relevant part of the dataframe - sub_data = costs.loc[costs["technology"] == tech] - - # save values (not all tech has FOM, so setting FOM to zero in that case) - if len(sub_data["value"].loc[sub_data["parameter"] == "FOM"].values) > 0: - FOM = sub_data["value"].loc[sub_data["parameter"] == "FOM"].values - else: - FOM = 0 - - CAPEX = sub_data["value"].loc[sub_data["parameter"] == "investment"].values - lifetime = sub_data["value"].loc[sub_data["parameter"] == "lifetime"].values - - # calculate parameters - annuity = calc_annuity(i_rate, lifetime) - - # returns cap costs in EUR/MW - return (annuity + FOM / 100) * CAPEX * 1e3 - - -# inputs are solar potentials, wind potentials, costs and load -def building_model(ds, dw, dc, load, h_cost): - # create network + buses + carriers - network = pypsa.Network() - - network.set_snapshots(pd.to_datetime(ds.time.to_pandas())) - - # defining the buses - network.add("Bus", "bus el", carrier="el") - network.add("Bus", "bus hydrogen", carrier="hydrogen") - # network.add("Bus","bus water", carrier = "water") - - # adding carriers - network.add("Carrier", "el") - network.add("Carrier", "hydrogen") - network.add("Carrier", "wind") - network.add("Carrier", "solar") - # network.add("Carrier","water") - - # adding wind and solar generators on el bus - interest_rate = 0.075 - wind_cost = calc_cap_cost(dc, "onwind", interest_rate) - # offshore_wind_cost = calc_cap_cost(dc,"offwind",interest_rate) - solar_cost = calc_cap_cost(dc, "solar-utility", interest_rate) - battery_cost = calc_cap_cost(dc, "battery storage", interest_rate) - - # hydrogen cost can either be 0 or real cost - if h_cost == False: - hydrogen_storage_cost = 0 - else: - hydrogen_storage_cost = calc_cap_cost( - dc, "hydrogen storage tank incl. compressor", interest_rate - ) - - # for every class in solar data - print("---------------------------- starting with solar data ") - for i in range(0, len(ds.capacity)): - # "time":slice("2013-01-01 00:00", "2013-01-30 14:00"), - sol_df = ds.sel({"class": ds["class"][i]}) - - # costs taken from dae: solar costs - network.add( - "Generator", - "PV {}".format(i), - bus="bus el", - carrier="solar", - # p_nom = 8, #leave it commented out, start cap should be zero - p_nom_extendable=True, - p_nom_max=sol_df["capacity"] - .to_pandas() - .item(), # this will be ds.capacities - p_max_pu=sol_df["capacity factor"].to_pandas(), # this will be ds.profiles - capital_cost=solar_cost[0], # EUR/MW, this will be read in from costs file - ) - - # for every class in onshore wind data - print("---------------------------- starting with wind data ") - for i in range(0, len(dw.capacity)): - wind_df = dw.sel({"class": dw["class"][i]}) - - network.add( - "Generator", - "on_wind turbine {}".format(i), - bus="bus el", - carrier="wind", - # p_nom = 8, #this is capacity - p_nom_extendable=True, - # p_nom_min = 8, - p_nom_max=wind_df["capacity"].to_pandas().item(), - p_max_pu=wind_df[ - "capacity factor" - ].to_pandas(), # read in from potentials file - capital_cost=wind_cost[ - 0 - ], # EUR/MW, read in from costs file and calculated in above function - ) - - # for every class in offshore wind data - # for i in range (0,len(dww.capacity)): - # offshore_wind_df = dww.sel({"class":dww["class"][i]}) - - # network.add( - # "Generator", - # "off_wind turbine {}".format(i), - # bus="bus el", - # carrier="wind", - # #p_nom = 8, #this is capacity - # p_nom_extendable=True, - # #p_nom_min = 8, - # p_nom_max = offshore_wind_df["capacity"].to_pandas(), - # p_max_pu= offshore_wind_df["capacity factor"].to_pandas(), #read in from potentials file - # capital_cost= offshore_wind_cost #EUR/MW, read in from costs file and calculated in above function - # ) - - # adding storage - # battery storage investment cost = 75EUR/kWh - network.add( - "Store", - "battery", - bus="bus el", - e_cyclic=True, - e_nom_extendable=True, - capital_cost=battery_cost[0], - ) # EUR/MWh - - # hydrogen storage - network.add( - "Store", - "hydrogen", - bus="bus hydrogen", - e_cyclic=True, - e_nom_extendable=True, - capital_cost=hydrogen_storage_cost, - ) # EUR/MWh - - # p_set unit in MW - network.add("Load", "load", bus="bus hydrogen", p_set=load) - print("network load: ", load) - - # values for electrolysis link from cost outputs in 2050 (dae data) - network.add( - "Link", - "electrolysis", - bus0="bus el", - bus1="bus hydrogen", - efficiency=0.75, # per unit - capital_cost=calc_cap_cost(dc, "electrolysis", interest_rate)[0], # EUR/MW - p_nom_extendable=True, - ) - return network - - -def save_lcoh(solved_network): - # creating dataframe for saving - res = pd.DataFrame( - columns=[ - "demand factor [%]", - "demand [MWh]", - "load [MW]", - "cost [EUR]", - "LCOH [EUR/MWh]", - ] - ) - - try: - solved_network.objective - except: - # if infeasible - print("saving infeasible network") - res.loc[res.shape[0]] = [ - snakemake.wildcards["demand_factor"], - load * 8760, - load, - "infeasible", - "infeasible", - ] - else: - # if feasible - print("saving feasible network") - res.loc[res.shape[0]] = [ - snakemake.wildcards["demand_factor"], - load * 8760, - load, - solved_network.objective, - solved_network.objective / (load * 8760), - ] - - # saving network and dataframe - solved_network.export_to_netcdf(snakemake.output.network) - res.to_csv(snakemake.output.results) - return - - -if __name__ == "__main__": - - if "snakemake" not in globals(): - from _helpers import mock_snakemake - - snakemake = mock_snakemake( - "model_lcoh", cost_year="2030", demand_factor=20, region="Europe" - ) - - # making dataframes from inputs - dc = pd.read_csv(snakemake.input.costs, header=0) - d = xr.open_dataset(snakemake.input.supply_data) - - # subselecting each technology and cleaning for "0 and nan" - capacity values - ds = d.sel({"technology": "pvplant"}) - ds_cleaned = ds.where(ds.capacity > 0.0, drop=True) - dw = d.sel({"technology": "windonshore"}) - dw_cleaned = dw.where(dw.capacity > 0.0, drop=True) - # dww = d.sel({"technology":"windoffshore"}) - # dww_cleaned = dww.where(dww.capacity > 0.0,drop=True) - - max_load = ( - int( - (ds_cleaned.capacity * ds_cleaned["capacity factor"]).sum( - dim=["time", "class"] - ) - + (dw_cleaned.capacity * dw_cleaned["capacity factor"]).sum( - dim=["time", "class"] - ) - ) - / 8760 - * 0.75 - ) - print("max load, (solar+wind)/8760*0.75:", max_load) - - # calculating load - # load = int(ds_cleaned.capacity.max()+dw_cleaned.capacity.max())*(int(snakemake.wildcards['demand_factor'])/100) - load = float( - ( - (ds_cleaned.capacity * ds_cleaned["capacity factor"]).sum( - dim=["time", "class"] - ) - + (dw_cleaned.capacity * dw_cleaned["capacity factor"]).sum( - dim=["time", "class"] - ) - # + - # ( - # dww_cleaned.capacity * dww_cleaned["capacity factor"] - # ).sum(dim=["time","class"]) - ) - / 8760 - * (int(snakemake.wildcards["demand_factor"]) / 100) - ) - print("load:", load) - print("diff:", max_load - load) - print("data loaded successfully") - - # building model - print("building model") - network = building_model( - ds_cleaned, dw_cleaned, dc, load, snakemake.config["hydrogen_storage_cost"] - ) - - # solving model - print("solving model") - network.optimize( - network.snapshots, - solver_name="gurobi", - solver_options={ - "crossover": 0, - "method": 2, - "BarConvTol": 1.0e-5, - "OptimalityTol": 1.0e-5, - }, - ) - # , "barHomogeneous":1, "FeasibilityTol": 1.e-5, - print("network was solved succesfully") - - # saving results and calculating LCOH - print("saving results and calculating lcoh") - save_lcoh(network) diff --git a/workflow/scripts/model_lcox.py b/workflow/scripts/model_lcox.py deleted file mode 100644 index 048713d..0000000 --- a/workflow/scripts/model_lcox.py +++ /dev/null @@ -1,526 +0,0 @@ -import pypsa -import pandas as pd -import numpy as np - -# import matplotlib.pyplot as plt -# from pyomo.environ import Constraint -import xarray as xr - - -def calc_annuity(i_rate, lifetime): - # calculating annuity factor with interest rate and lifetime - return i_rate / (1 - (1 + i_rate) ** (-lifetime)) - - -def calc_cap_cost(costs, tech, i_rate): - # select the relevant part of the dataframe - sub_data = costs.loc[costs["technology"] == tech] - - # save values (not all tech has FOM, so setting FOM to zero in that case) - if len(sub_data["value"].loc[sub_data["parameter"] == "FOM"].values) > 0: - FOM = sub_data["value"].loc[sub_data["parameter"] == "FOM"].values - else: - FOM = 0 - - CAPEX = sub_data["value"].loc[sub_data["parameter"] == "investment"].values - lifetime = sub_data["value"].loc[sub_data["parameter"] == "lifetime"].values - - # calculate parameters - annuity = calc_annuity(i_rate, lifetime) - - # returns cap costs in EUR/MW - - if tech in ["hydrogen direct iron reduction furnace", "electric arc furnace"]: - capital_cost = (annuity + FOM / 100) * CAPEX - else: - capital_cost = (annuity + FOM / 100) * CAPEX * 1e3 - - return capital_cost - - -def rename_trace_carriers(n): - - # Index name and new carrier - carrier_rename_dict = { - "electrolysis (exp)": "electrolysis", - "battery inverter (charging, exp)": "battery inverter", - "battery inverter (discharging, exp)": "battery inverter", - "hydrogen direct iron reduction furnace": "hydrogen direct iron reduction furnace", - "electric arc furnace": "electric arc furnace", - } - - nice_names = { - "electrolysis": "electrolysis", - "battery inverter": "battery inverter", - "hydrogen direct iron reduction furnace": "hydrogen direct iron reduction furnace", - "electric arc furnace": "electric arc furnace", - } - colors = snakemake.config["colors"] - - # Deduplicate carrier values while preserving insertion order, then build - # the parallel nice_name and color lists from the same unique sequence. - unique_carriers = list(dict.fromkeys(carrier_rename_dict.values())) - - n.add( - "Carrier", - unique_carriers, - nice_name=[nice_names[carrier] for carrier in unique_carriers], - color=[colors[carrier] for carrier in unique_carriers], - ) - - for idx, new_carrier in carrier_rename_dict.items(): - n.links.loc[idx, "carrier"] = new_carrier - - # Adjust colors of all carriers, overwriting the TRACE colors - for carrier in n.carriers.index: - n.carriers.loc[carrier, "color"] = colors[carrier] - - # Add carrier to DRI generator - n.generators.loc["iron ore DRI-ready (exp)", "carrier"] = "iron ore" - - return n - - -def remove_shipping_importer_components(n): - # Remove trace shipping components - n.remove( - "Link", - ["ship loading (exp)", "ship unloading (imp)"], - ) - n.remove("Bus", ["berth (exp)", "berth (imp)", "steel (imp)"]) - n.remove("Store", ["steel storage (exp)", "steel storage (imp)"]) - - return n - - -# inputs are solar potentials, wind potentials, costs and load -def building_model(n, region, ds, dw, dc, load, h_cost, iron_ore_cost): - - if product != "eaf-grid": - - # Country specific wacc - base_interest_rate = snakemake.params.interest_rate - - if snakemake.wildcards.wacc == "regional": - print(f"applying region specific wacc") - wacc = pd.read_csv(snakemake.input.wacc, header=0) - wacc.set_index("region", inplace=True) - regional_wacc = wacc.loc[region].values[0] - interest_rate = regional_wacc - # Adjust capital_cost of all pre-loaded TRACE components to the - # regional WACC. Technologies not found in the costs table (e.g. - # the 1/1000 stabiliser entries) are left untouched. - n = adjust_trace_wacc(n, base_interest_rate, regional_wacc, dc) - elif snakemake.wildcards.wacc == "uniform": - interest_rate = base_interest_rate - else: - raise ValueError("wacc wildcard not recognized, choose 'regional' or 'uniform'") - - # adding wind and solar generators on el bus - wind_cost = calc_cap_cost(dc, "onwind", interest_rate) - # offshore_wind_cost = calc_cap_cost(dc,"offwind",interest_rate) - solar_cost = calc_cap_cost(dc, "solar-utility", interest_rate) - - # for every class in solar data - print("---------------------------- starting with solar data ") - for i in range(0, len(ds.capacity)): - # "time":slice("2013-01-01 00:00", "2013-01-30 14:00"), - sol_df = ds.sel({"class": ds["class"][i]}) - - # costs taken from dae: solar costs - n.add( - "Generator", - "pv {}".format(i), - bus="electricity (exp)", - carrier="pv", - p_nom_extendable=True, - p_nom_max=sol_df["capacity"].to_pandas().item() - * pv_p_nom_max_cor, # this will be ds.capacities - p_max_pu=sol_df["capacity factor"] - .to_pandas() - .clip(lower=0), # this will be ds.profiles - capital_cost=solar_cost[ - 0 - ], # EUR/MW, this will be read in from costs file - ) - - # for every class in onshore wind data - print("---------------------------- starting with wind data ") - for i in range(0, len(dw.capacity)): - wind_df = dw.sel({"class": dw["class"][i]}) - - n.add( - "Generator", - "onwind {}".format(i), - bus="electricity (exp)", - carrier="wind", - p_nom_extendable=True, - p_nom_max=wind_df["capacity"].to_pandas().item() * onwind_p_nom_max_cor, - p_max_pu=wind_df["capacity factor"] - .to_pandas() - .clip(lower=0), # read in from potentials file - capital_cost=wind_cost[ - 0 - ], # EUR/MW, read in from costs file and calculated in above function - ) - - # for every class in offshore wind data - # for i in range (0,len(dww.capacity)): - # offshore_wind_df = dww.sel({"class":dww["class"][i]}) - - # network.add( - # "Generator", - # "off_wind turbine {}".format(i), - # bus="bus el", - # carrier="wind", - # #p_nom = 8, #this is capacity - # p_nom_extendable=True, - # #p_nom_min = 8, - # p_nom_max = offshore_wind_df["capacity"].to_pandas(), - # p_max_pu= offshore_wind_df["capacity factor"].to_pandas(), #read in from potentials file - # capital_cost= offshore_wind_cost #EUR/MW, read in from costs file and calculated in above function - # ) - - elif product == "eaf-grid": - # adding only electricity grid on el bus for eaf-grid case - n.add( - "Generator", - "grid-electricity", - bus="electricity (exp)", - carrier="electricity", - p_nom_extendable=True, - p_nom_max=np.inf, - capital_cost=snakemake.config["grid_electricity"]["capital_cost"], # EUR/MW - marginal_cost=snakemake.config["grid_electricity"][ - "marginal_cost" - ], # EUR/MW - ) - - else: - raise ValueError("product not recognized, choose steel, hbi, eaf, eaf-grid") - - # hydrogen cost can either be 0 or real cost. Real cost is the default of the imported network - if h_cost == False: - n.stores.at[ - "hydrogen storage tank type 1 including compressor (exp)", "capital_cost" - ] = 0 - else: - pass - - if iron_ore_cost == False: - n.generators.at["iron ore DRI-ready (exp)", "marginal_cost"] = 0 - else: - pass - - # Remove trace shipping components - n = remove_shipping_importer_components(n) - - if product == "steel": - - # p_set unit in MW - n.add("Load", "load", bus="steel (exp)", carrier="steel", p_set=load) - - elif product == "hbi": - - # Remove steel components from the network - n.remove( - "Link", - ["electric arc furnace"], - ) - n.remove("Bus", ["steel (exp)"]) - n.remove("Carrier", ["steel", "electric arc furnace"]) - - # p_set unit in MW - n.add( - "Load", - "load", - bus="hot briquetted iron (exp)", - carrier="hot briquetted iron", - p_set=load, - ) - - elif product in ["eaf", "eaf-grid"]: - - # Remove components up to hbi and leave eaf/steel components - n.remove( - "Link", - ["electrolysis (exp)", "hydrogen direct iron reduction furnace"], - ) - n.remove( - "Bus", - ["hydrogen (g) (exp)", "hydrogen (g) storage (exp)", "iron ore (exp)"], - ) - n.remove( - "Carrier", - [ - "hydrogen", - "iron ore", - "electrolysis", - "hydrogen direct iron reduction furnace", - ], - ) - n.remove( - "Store", - [ - "hydrogen storage tank type 1 including compressor (exp)", - "HBI storage (exp)", - ], - ) - - n.remove("Generator", ["iron ore DRI-ready (exp)"]) - - # Add Generator as HBI input (at no cost) - n.add( - "Generator", - "hbi input", - bus="hot briquetted iron (exp)", - carrier="hot briquetted iron", - p_nom_extendable=True, - capital_cost=0.1, - marginal_cost=0.1, - ) - - # p_set unit in MW - n.add("Load", "load", bus="steel (exp)", carrier="steel", p_set=load) - - else: - raise ValueError("product not recognized, choose steel, hbi, eaf, eaf-grid") - - print("network load: ", load) - - return n - - -def save_lcox(solved_network): - # creating dataframe for saving - res = pd.DataFrame( - columns=[ - "demand factor [%]", - "demand [t]", - "load [t/h]", - "cost [EUR]", - "LCOX [EUR/t]", - ] - ) - - try: - obj = solved_network.objective - if obj is None: - raise AttributeError - except AttributeError: - # if infeasible - print("saving infeasible network") - res.loc[res.shape[0]] = [ - snakemake.wildcards["demand_factor"], - load * 8760, - load, - "infeasible", - "infeasible", - ] - else: - # if feasible - print("saving feasible network") - res.loc[res.shape[0]] = [ - snakemake.wildcards["demand_factor"], - load * 8760, - load, - solved_network.objective, - solved_network.objective / (load * 8760), - ] - - # saving network and dataframe - solved_network.export_to_netcdf(snakemake.output.network) - res.to_csv(snakemake.output.results) - return - - -def solve_network(n): - - solver_name = snakemake.config["solver"]["name"] - options = snakemake.config["solver_options"][snakemake.config["solver"]["options"]] - - print("solving model") - n.optimize(n.snapshots, solver_name=solver_name, solver_options=options) - # , "barHomogeneous":1, "FeasibilityTol": 1.e-5, - print("network was solved succesfully") - - return n - - -def prepare_re(d): - - # subselecting each technology and cleaning for "0 and nan" - capacity values - ds = d.sel({"technology": "pvplant"}) - ds_cleaned = ds.where(ds.capacity > 0.0, drop=True) - dw = d.sel({"technology": "windonshore"}) - dw_cleaned = dw.where(dw.capacity > 0.0, drop=True) - # dww = d.sel({"technology":"windoffshore"}) - # dww_cleaned = dww.where(dww.capacity > 0.0,drop=True) - - return ds_cleaned, dw_cleaned - - -def calculate_load(ds_cleaned, dw_cleaned, pv_p_nom_max_cor, onwind_p_nom_max_cor): - - # calculating (max) load - max_load = ( - int( - ( - ds_cleaned.capacity * pv_p_nom_max_cor * ds_cleaned["capacity factor"] - ).sum(dim=["time", "class"]) - + ( - dw_cleaned.capacity - * onwind_p_nom_max_cor - * dw_cleaned["capacity factor"] - ).sum(dim=["time", "class"]) - # + - # ( - # dww_cleaned.capacity * dww_cleaned["capacity factor"] - # ).sum(dim=["time","class"]) - ) - / 8760 - / snakemake.config["electricity_steel_ratio"] - ) - - load = max_load * (float(snakemake.wildcards["demand_factor"]) / 100) - - print( - f"max load hydrogen, (solar+onwind corrected)/{snakemake.config["electricity_steel_ratio"]}: {max_load:.1f}" - ) - print(f"load steel with demand factor: {load:.1f}") - - return load - - -def adjust_trace_wacc(n, base_interest_rate, regional_wacc, costs): - # TODO This is only applied to links - """ - Rescale the capital_cost of every PyPSA component in *n* from - base_interest_rate to regional_wacc. - - For each component whose carrier exactly matches a technology entry in the - costs dataframe, capital_cost is fully recalculated with the new rate - (CAPEX, FOM and lifetime are looked up from costs, identical to how - calc_cap_cost works for wind/solar). - - Components whose carrier is not found in costs (e.g. the placeholder - 1/1000 stabiliser costs, or iron-ore generators) are left unchanged. - Ensure carrier names are aligned with the costs technology column via - rename_trace_carriers() before calling this function. - - Parameters - ---------- - n : pypsa.Network - base_interest_rate : float – rate used when the TRACE network was built - regional_wacc : float – new, region-specific rate to apply - costs : pd.DataFrame – technology costs table (same ``dc``) - - Returns - ------- - n : pypsa.Network (modified in place and returned for convenience) - """ - if base_interest_rate == regional_wacc: - print("adjust_wacc: base and regional rate are identical – skipping.") - return n - - available_techs = set(costs["technology"].unique()) - - component_frames = [ - # ("Generator", n.generators), - ("Link", n.links), - # ("Store", n.stores), - # ("StorageUnit", n.storage_units), - ] - - for comp_type, df in component_frames: - if df.empty: - continue - for idx in df.index: - carrier = df.at[idx, "carrier"] - if carrier not in available_techs: - print("Not found in costs, skipping: ", idx) - continue - old = df.at[idx, "capital_cost"] - new = calc_cap_cost(costs, carrier, regional_wacc) - new = float(new.flat[0]) if hasattr(new, "__len__") else float(new) - df.at[idx, "capital_cost"] = new - print( - f" adjust_wacc [{comp_type}] '{idx}' (carrier='{carrier}'): " - f"capital_cost {old:.2f} β†’ {new:.2f} EUR/MW " - f"(i {base_interest_rate:.4f} β†’ {regional_wacc:.4f})" - ) - - return n - - -def adjust_part_load(n): - - print(f"adjusting part-load limits for {snakemake.config["part_load"].keys()}") - - for carrier in snakemake.config["part_load"].keys(): - - n.links.loc[ - n.links.carrier == carrier, - "p_min_pu", - ] = snakemake.config[ - "part_load" - ][carrier] - - return n - - -if __name__ == "__main__": - - if "snakemake" not in globals(): - from _helpers import mock_snakemake - - snakemake = mock_snakemake( - "model_lcox", - cost_year="2050", - region="Middle_East", - product="eaf-grid", - demand_factor=10, - wacc="regional", - ) - - # making dataframes from inputs - dc = pd.read_csv(snakemake.input.costs, header=0) - d = xr.open_dataset(snakemake.input.supply_data) - - # load TRACE steel model - n = pypsa.Network(snakemake.input.trace) - n = rename_trace_carriers(n) - n = adjust_part_load(n) - - # Get correction factors and product - pv_p_nom_max_cor = snakemake.config["pv_p_nom_max_cor"] - onwind_p_nom_max_cor = snakemake.config["onwind_p_nom_max_cor"] - product = snakemake.wildcards.product - - # preparing RE data - ds_cleaned, dw_cleaned = prepare_re(d) - - # calculating load - load = calculate_load( - ds_cleaned, dw_cleaned, pv_p_nom_max_cor, onwind_p_nom_max_cor - ) - - # building model - print("adding RE to network") - n = building_model( - n, - snakemake.wildcards.region, - ds_cleaned, - dw_cleaned, - dc, - load, - snakemake.config["hydrogen_storage_cost"], - snakemake.config["iron_ore_cost_in_supply_chain"], - ) - - # solving model - n = solve_network(n) - - # saving results and calculating LCOX - print("saving results and calculating lcoX") - save_lcox(n) diff --git a/workflow/scripts/model_trade.py b/workflow/scripts/model_trade.py index 366e8d6..de90570 100644 --- a/workflow/scripts/model_trade.py +++ b/workflow/scripts/model_trade.py @@ -1,3 +1,5 @@ +from typing import Any + import pypsa import pandas as pd import matplotlib @@ -7,9 +9,14 @@ import os import cartopy.crs as ccrs import geopandas as gpd -import pycountry import cartopy.io.shapereader as shpreader +from _helpers import setup_logging + +snakemake: Any = globals().get("snakemake") + +logger = setup_logging(__name__, snakemake=snakemake, log_filename="model_trade.log") + plt.style.use("bmh") @@ -18,69 +25,28 @@ def build_region_geodataframe(config): Build a dissolved GeoDataFrame of model regions from the config country lists. Each model region (e.g. "Europe", "Middle_East") is formed by dissolving its - member countries from the NaturalEarth 110m dataset, so only region borders - are visible in the map β€” not internal country borders. + member countries (specified as ISO 3166-1 alpha-3 codes) from the NaturalEarth + 110m dataset, so only region borders are visible in the map β€” not internal + country borders. """ regions = config["regions"] - # Corrections to align config country names with pycountry lookup names - country_name_corrections = { - "Democratic Republic of the Congo": "Congo, The Democratic Republic of the", - "Turkey": "TΓΌrkiye", - "Venezuela": "Venezuela, Bolivarian Republic of", - "Tanzania": "United Republic of Tanzania", - "Bolivia": "Plurinational State of Bolivia", - "Vietnam": "Viet Nam", - "South Korea": "Korea, Republic of", - "North Korea": "Korea, Democratic People's Republic of", - "Taiwan": "Taiwan, Province of China", - "Laos": "Lao People's Democratic Republic", - "Brunei": "Brunei Darussalam", - "Equatorial French Guiana": "French Guiana", - "Syria": "Syrian Arab Republic", - "Palestine": "Palestine, State of", - "Moldova": "Republic of Moldova", + # Build ISO A3 -> region mapping directly from config + iso_to_region = { + code.strip(): region + for region, countries in regions.items() + for code in countries } - # Build country name -> ISO A2 mapping via pycountry - country_name_to_iso = {} - for country in pycountry.countries: - country_name_to_iso[country.name] = country.alpha_2 - if hasattr(country, "official_name"): - country_name_to_iso[country.official_name] = country.alpha_2 - - # Build ISO A2 -> region mapping - iso_to_region = {} - for region, countries in regions.items(): - for country in countries: - # Handle entries like "Togo + Algeria" by splitting on + - for part in country.split("+"): - name = part.strip() - name = country_name_corrections.get(name, name) - code = country_name_to_iso.get(name) - if code: - iso_to_region[code] = region - # Load NaturalEarth 110m countries shapefile reader = shpreader.natural_earth( resolution="110m", category="cultural", name="admin_0_countries" ) world = gpd.read_file(reader) - # Fix missing ISO_A2 codes (-99 placeholder in NaturalEarth) - def _lookup_iso(country_name): - try: - return pycountry.countries.lookup(country_name).alpha_2 - except LookupError: - return None - - world.loc[world["ISO_A2"] == "-99", "ISO_A2"] = world.loc[ - world["ISO_A2"] == "-99", "ADMIN" - ].apply(_lookup_iso) - # Assign region and dissolve to remove internal country borders - world["region"] = world["ISO_A2"].map(iso_to_region) + world["region"] = world["ISO_A3_EH"].map(iso_to_region) region_gdf = world.dropna(subset=["region"]).dissolve(by="region").reset_index() return region_gdf @@ -88,136 +54,124 @@ def _lookup_iso(country_name): # inputs are transportation costs, supply curves, trade options and load demand for all regions def building_model( - supply_curves_interone, supply_curves_intertwo, demands, bus_location, final + supply_curves_interone, supply_curves_intertwo, demands, bus_location, trade_chain ): - # this function creates network, carrier and a bus for each region - # with a load and all supply possibilities added - - # create network - n = pypsa.Network() - - # adding carriers - - n.add("Carrier", name=final, color=snakemake.config["plot"]["colors"][final]) - n.add("Carrier", name=interone, color=snakemake.config["plot"]["colors"][interone]) + """ + Build the PyPSA network from the trade_chain config. - # Define the iron ore carrier - n.add( - "Carrier", - name="iron_ore", - color=snakemake.config["plot"]["colors"]["iron_ore"], - ) + Network structure (buses, carriers, links) is derived entirely from + trade_chain["stages"] and trade_chain["tradeable_commodities"] rather + than from wildcards. + """ + # --- Derive model structure from trade_chain config --- + final = trade_chain["final_product"] + tradeable = trade_chain["tradeable_commodities"] + stages = trade_chain["stages"] - n.add( - "Carrier", - name="shipping_" + shipping_first, - color=snakemake.config["plot"]["colors"][shipping_first + "_shipping"], - ) + # is_material_chain: iron ore is involved (steel-type chain) + # otherwise: pure energy chain (e.g. hydrogen) + is_material_chain = "iron_ore" in tradeable - n.add( - "Carrier", - name="shipping_" + shipping_second, - color=snakemake.config["plot"]["colors"][shipping_second + "_shipping"], - ) + # interone: the first non-iron_ore tradeable intermediate (e.g. "hbi") + interone_candidates = [c for c in tradeable if c != "iron_ore"] + interone = interone_candidates[0] if interone_candidates else final - # for each region we are creating a bus with all the potentials and load - for r in range(0, len(supply_curves_interone)): + # two_stage: a separate intermediate bus exists between ore and final product + two_stage = is_material_chain and (interone != final) - # getting the supply curves for one region for different intermediates - region_file_interone = supply_curves_interone[r] - region_file_intertwo = supply_curves_intertwo[r] - region_data_interone = pd.read_csv(region_file_interone, header=0) - region_data_intertwo = pd.read_csv(region_file_intertwo, header=0) - filename = os.path.basename(region_file_interone) - # Extract region name - region_name = filename.split("_" + interone)[0] + # intertwo: process label of the last production stage (e.g. "eaf-grid") + intertwo = stages[max(stages.keys())]["process_label"] - print("building generators and loads for ", region_name) + # --- Create network --- + n = pypsa.Network() - # define the iron ore bus with region name + # Add carriers + n.add("Carrier", name=final, color=snakemake.config["colors"][final]) + if is_material_chain: + n.add("Carrier", name="iron_ore", color=snakemake.config["colors"]["iron_ore"]) + n.add("Carrier", name=interone, color=snakemake.config["colors"][interone]) n.add( - "Bus", - region_name + "_ore", - carrier="iron_ore", - x=bus_location.loc[bus_location["region_name"] == region_name] - .loc[:, "long"] - .values[0], # long - y=bus_location.loc[bus_location["region_name"] == region_name] - .loc[:, "lat"] - .values[0], # lat ) + "Carrier", + name="shipping_" + shipping_first, + color=snakemake.config["colors"][shipping_first + "_shipping"], ) - - # define the bus of intermediate product with region name n.add( - "Bus", - region_name + "_" + interone, - carrier=interone, - x=bus_location.loc[bus_location["region_name"] == region_name] - .loc[:, "long"] - .values[0], # long - y=bus_location.loc[bus_location["region_name"] == region_name] - .loc[:, "lat"] - .values[0], # lat + "Carrier", + name="shipping_" + shipping_second, + color=snakemake.config["colors"][shipping_second + "_shipping"], ) - # define the bus of final product with region name - if final != interone: - n.add( - "Bus", - region_name + "_" + final, - carrier=final, - x=float( - bus_location.loc[bus_location["region_name"] == region_name] - .loc[:, "long"] - .values[0] - ), # long - y=float( - bus_location.loc[bus_location["region_name"] == region_name] - .loc[:, "lat"] - .values[0] - ), # lat - ) + # --- Build buses, generators, and loads per region --- + for r in range(len(supply_curves_interone)): + region_file_interone = supply_curves_interone[r] + region_file_intertwo = supply_curves_intertwo[r] + region_data_interone = ( + pd.read_csv(region_file_interone, header=0) + .dropna(subset=[f"{cost_descriptor} [EUR/{unit}]"]) + .reset_index(drop=True) + ) # Filter out rows where "lcox [EUR/t]" is NaN + region_data_intertwo = ( + pd.read_csv(region_file_intertwo, header=0) + .dropna(subset=[f"{cost_descriptor} [EUR/{unit}]"]) + .reset_index(drop=True) + ) # Filter out rows where "lcox [EUR/t]" is NaN + + region_name = os.path.basename(region_file_interone).rsplit( + "_marginal_cost_", 1 + )[0] + + logger.info(f"building generators and loads for {region_name}") + + # Bus coordinates (shared by all buses in this region) + loc = bus_location.loc[bus_location["region_name"] == region_name] + x = float(loc["long"].values[0]) + y = float(loc["lat"].values[0]) + + if is_material_chain: + # Iron ore bus + n.add("Bus", region_name + "_ore", carrier="iron_ore", x=x, y=y) + # Intermediate (interone) bus + n.add("Bus", region_name + "_" + interone, carrier=interone, x=x, y=y) + + # Final product bus (always present; also covers the interone=final single-stage case) + if not is_material_chain or two_stage: + n.add("Bus", region_name + "_" + final, carrier=final, x=x, y=y) + + if is_material_chain: + # Iron ore generator + iron_ore_limit = ( + iron_ore.loc[iron_ore["region"] == region_name][ + "IronOreProductionMt" + ].values[0] + * 1e6 + * snakemake.config["iron_ore"]["potential_allowance"] + ) # Limit in t_ore + + if regionalise == "grade-dependent": + iron_ore_cost = iron_ore.loc[iron_ore["region"] == region_name][ + "IronOreEur/t_ironore" + ].values[0] + elif regionalise == "uniform": + iron_ore_cost = snakemake.config["iron_ore"]["marginal_cost"] + else: + raise ValueError( + "Invalid option for iron ore regionalisation. Choose 'grade-dependent' or 'uniform'." + ) - # Define iron ore generators feeding iron ore buses in each region - iron_ore_limit = ( - iron_ore.loc[iron_ore["region"] == region_name][ - "IronOreProductionMt" - ].values[0] - * 1e6 - * snakemake.config["iron_ore"]["potential_allowance"] - ) # Limit in t_ore - - # Get iron ore cost: regional or uniform - if regionalise == "grade-dependent": - iron_ore_cost = iron_ore.loc[iron_ore["region"] == region_name][ - "IronOreEur/t_ironore" - ].values[0] - elif regionalise == "uniform": - iron_ore_cost = snakemake.config["iron_ore"]["marginal_cost"] - else: - ValueError( - "Invalid option for iron ore regionalisation. Choose 'grade-dependent' or 'uniform'." + n.add( + "Generator", + "{}_ore".format(region_name), + bus=region_name + "_ore", + carrier="iron_ore", + p_nom_extendable=True, + p_nom_max=iron_ore_limit, # t_ore + marginal_cost=iron_ore_cost, # EUR/t_ore + capital_cost=1 / 1000, # to prevent optimisation shenanigans ) - n.add( - "Generator", - "{}_ore".format(region_name), - bus=region_name + "_ore", - carrier="iron_ore", - p_nom_extendable=True, - p_nom_max=iron_ore_limit, # t_ore - marginal_cost=iron_ore_cost, # EUR/t_ore - capital_cost=1 / 1000, # to prevent optimisation shenanigans - ) - - # defining the demand for the region - load = ( - demands.loc[demands["region"] == region_name].loc[:, "demand"].values[0] * 1 - ) # float(snakemake.wildcards["demand"]) - print( - f"Load set via snakemake.wildcard to 100% of regional final energy demand." - ) - + # Demand load + load = demands.loc[demands["region"] == region_name, "demand"].values[0] + logger.info("Load set to 100%% of regional final energy demand.") n.add( "Load", region_name + "_" + final, @@ -226,212 +180,120 @@ def building_model( p_set=load, ) - # defining the supply opportunities for the region (apart from last supply as that is the 75% infeasible one) - for s in range(0, len(region_data_interone)): + # --- Stage 1 supply: ore β†’ interone (material) or direct supply (energy) --- + for s in range(len(region_data_interone)): + if s == 0: - p_nom_supply_interone = float( - region_data_interone[f"demand [{unit}]"][s] - ) + p_nom_interone = float(region_data_interone[f"demand [{unit}]"][s]) else: - p_nom_supply_interone = float( + p_nom_interone = float( region_data_interone[f"demand [{unit}]"][s] ) - float(region_data_interone[f"demand [{unit}]"][s - 1]) - M_cost_supply_interone = float( - region_data_interone[f"{cost_descriptor} [EUR/{unit}]"][s] - ) + m_cost = float(region_data_interone[f"{cost_descriptor} [EUR/{unit}]"][s]) - if final == "hydrogen": + if not is_material_chain: + # Pure energy chain (e.g. hydrogen): Generator directly on final bus n.add( "Generator", "{} supply {}_{}".format( - final, region_name, region_data_interone["demand factor [%]"][s] + final, region_name, region_data_interone["load [t/h]"][s] ), bus=region_name, carrier=final, p_nom_extendable=True, - p_nom_max=p_nom_supply_interone, # MWh or t, demand = potential supply - marginal_cost=M_cost_supply_interone, # EUR/MWh or EUR/t - capital_cost=1 / 1000, # to prevent optimisation shennanigans + p_nom_max=p_nom_interone, # MWh, demand = potential supply + marginal_cost=m_cost, # EUR/MWh + capital_cost=1 / 1000, # to prevent optimisation shenanigans + ) + else: + # Material chain: Link from ore bus to interone bus + ore_ratio = snakemake.config["iron_ore"]["ore_to_steel_ratio"] + n.add( + "Link", + "{} supply {}_{}".format( + interone, + region_name, + region_data_interone["load [t/h]"][s], + ), + bus0=region_name + "_ore", + bus1=region_name + "_" + interone, + carrier=interone, + p_nom_max=p_nom_interone + * ore_ratio, # t, demand = potential supply + p_nom_extendable=True, + efficiency=1 / ore_ratio, + marginal_cost=m_cost / ore_ratio, # referred to bus0 + capital_cost=1 / 1000, # to prevent optimisation shenanigans ) - elif final != "hydrogen": - - if interone == intertwo: - - # Single link. bus0: iron ore, bus1: final product - # Add link for first intermediate ("interone") - n.add( - "Link", - "{} supply {}_{}".format( - interone, - region_name, - region_data_interone["demand factor [%]"][s], - ), - bus0=region_name + "_ore", - bus1=region_name + "_" + interone, - carrier=interone, - p_nom_max=p_nom_supply_interone - * snakemake.config["iron_ore"][ - "ore_to_steel_ratio" - ], # t, demand = potential supply - p_nom_extendable=True, - efficiency=1 - / snakemake.config["iron_ore"]["ore_to_steel_ratio"], - marginal_cost=M_cost_supply_interone - / snakemake.config["iron_ore"][ - "ore_to_steel_ratio" - ], # Note: marginal_cost are referred to bus0, hence we need to consider efficiency to apply €/t_steel value - capital_cost=1 / 1000, # to prevent optimisation shenanigans - ) - - elif interone != intertwo: - - # two links. First link: bus0=iron ore, bus1: interone, supply_curve: region_data_interone - # second link: bus0=interone, bus1=final product, supply_curve: region_data_intertwo (no ratios for efficiency and marginal cost needed here!) - - # Add link for first intermediate ("interone") - n.add( - "Link", - "{} supply {}_{}".format( - interone, - region_name, - region_data_interone["demand factor [%]"][s], - ), - bus0=region_name + "_ore", - bus1=region_name + "_" + interone, - carrier=interone, - p_nom_max=p_nom_supply_interone - * snakemake.config["iron_ore"][ - "ore_to_steel_ratio" - ], # t, demand = potential supply - p_nom_extendable=True, - efficiency=1 - / snakemake.config["iron_ore"]["ore_to_steel_ratio"], - marginal_cost=M_cost_supply_interone - / snakemake.config["iron_ore"][ - "ore_to_steel_ratio" - ], # Note: marginal_cost are referred to bus0, hence we need to consider efficiency to apply €/t_steel value - capital_cost=1 / 1000, # to prevent optimisation shenanigans - ) + # --- Stage 2 supply: interone β†’ final (two-stage material chain only) --- + if two_stage: + for s in range(len(region_data_intertwo)): - if interone != intertwo: - for s in range(0, len(region_data_intertwo)): if s == 0: - p_nom_supply_intertwo = float( - region_data_intertwo[f"demand [{unit}]"][s] - ) + p_nom_intertwo = float(region_data_intertwo[f"demand [{unit}]"][s]) else: - p_nom_supply_intertwo = float( + p_nom_intertwo = float( region_data_intertwo[f"demand [{unit}]"][s] ) - float(region_data_intertwo[f"demand [{unit}]"][s - 1]) - if ( - intertwo == "eaf-grid" - and snakemake.config["grid_electricity"]["grid_potential_custom"] - ): + # Override capacity for grid-connected EAF based on grid potential + if intertwo == "eaf-grid": grid_potential = pd.read_csv( snakemake.input.grid_potential, header=0, index_col=0 ) - grid_potential = ( + p_nom_intertwo = ( grid_potential.loc[region_name, "potential_mt_steel"] * 1e6 - ) # from t to Mt steel - p_nom_supply_intertwo = grid_potential / len( + ) / len( region_data_intertwo - ) # split on all supply links - else: - pass + ) # split evenly across supply steps - M_cost_supply_intertwo = float( + m_cost = float( region_data_intertwo[f"{cost_descriptor} [EUR/{unit}]"][s] ) - # Add link for second intermediate ("intertwo" / final product) n.add( "Link", "{} supply {}_{}".format( - final, - region_name, - region_data_intertwo["demand factor [%]"][s], + final, region_name, region_data_intertwo["load [t/h]"][s] ), bus0=region_name + "_" + interone, bus1=region_name + "_" + final, carrier=final, - p_nom_max=p_nom_supply_intertwo, # MWh or t, demand = potential supply + p_nom_max=p_nom_intertwo, # t, demand = potential supply p_nom_extendable=True, efficiency=1, # direct conversion, no ratio needed - marginal_cost=M_cost_supply_intertwo, # EUR/MWh or EUR/t + marginal_cost=m_cost, # EUR/t capital_cost=1 / 1000, # to prevent optimisation shenanigans ) - # OLD STEEL ONLY TODO - # n.add( - # "Link", - # "{} supply {}_{}".format( - # product, region_name, region_data["demand factor [%]"][s] - # ), - # bus0=region_name + "_ore", - # bus1=region_name, - # carrier=product, - # p_nom_max=p_nom_supply - # * snakemake.config["iron_ore"][ - # "ore_to_steel_ratio" - # ], # t, demand = potential supply - # p_nom_extendable=True, - # efficiency=1 / snakemake.config["iron_ore"]["ore_to_steel_ratio"], - # marginal_cost=M_cost_supply - # / snakemake.config["iron_ore"][ - # "ore_to_steel_ratio" - # ], # Note: marginal_cost are referred to bus0, hence we need to consider efficiency to apply €/t_steel value - # capital_cost=1 / 1000, # to prevent optimisation shenanigans - # ) - else: - pass - return n -def create_links(transport_costs, trade_options): +def create_links(trade_options): # for in range of length of input csv with all the different links, region_from = column , region_to = column 2 # create links with the correct corresponding costs - # marginal and fixed cost for the different type of transport - ship_mc = float( - transport_costs.loc[transport_costs["transport_type"] == "shipping"] - .loc[:, "marginal_cost"] - .values[0] - ) - pipe_mc = float( - transport_costs.loc[transport_costs["transport_type"] == "pipeline"] - .loc[:, "marginal_cost"] - .values[0] - ) - ship_c = float( - transport_costs.loc[transport_costs["transport_type"] == "shipping"] - .loc[:, "fixed_cost"] - .values[0] - ) + shipping = snakemake.config["trade"]["shipping"] - ship_iron_ore_mc = ( - transport_costs.loc[transport_costs["transport_type"] == "shipping_iron_ore"] - .loc[:, "marginal_cost"] - .values[0] - ) + port_loading = shipping["port_loading"] + nh3_cost = shipping["nh3_cost"] # USD/t_NH3 + nh3_consumption = shipping["nh3_consumption"] # t_NH3/nm + charter_rate = shipping["charter_rate"] # USD/(t*km) + panamax_load = shipping["panamax_load"] # t + nm_to_km = shipping["nm_to_km"] + eur_usd = snakemake.config["techno-economic parameters"]["eur_usd"] - ship_interone_mc = ( - transport_costs.loc[transport_costs["transport_type"] == f"shipping_{interone}"] - .loc[:, "marginal_cost"] - .values[0] - ) - input_demand = 0.42 # MWh/km for LH2, IEA future of hydrogen 2019 - boat_capacity = 363000 # MWh for LH2, IEA future of hydrogen 2019 - speed = 30 # km/h, IEA future of hydrogen 2019 - BOG = 0.2 / 100 # %/day, IEA future of hydrogen 2019 + variable_cost = ( + (nh3_cost * nh3_consumption / nm_to_km) / panamax_load + charter_rate + ) / eur_usd # EUR/(t*km) + fixed_cost = port_loading * 2 / eur_usd # EUR/t - print("ship + pipe cost", ship_mc, ship_c, pipe_mc) - print(f"shipping cost {interone} {ship_interone_mc} EUR/(t*km)") - print(f"shipping cost iron ore {ship_iron_ore_mc} EUR/(t*km)") + logger.info( + f"variable shipping cost {variable_cost:.6f} EUR/(t*km) and fixed cost {fixed_cost:.6f} EUR/t applied to shipping links" + ) # if there should be a link, create a link # do this for both shipping and pipeline @@ -441,27 +303,10 @@ def create_links(transport_costs, trade_options): r_from = trade_options["region_from"][r] r_to = trade_options["region_to"][r] - # If shipping costs are made up from marginal and capital - # total_cost = ship_c + int( - # float(trade_options["shipping_distance [km]"][r]) * ship_mc - # ) - # If shipping costs are made up from marginal only - total_cost_interone = ship_interone_mc * float( - trade_options["shipping_distance [km]"][r] - ) - total_cost = total_cost_interone - - # calculating efficiency - days_at_sea = ( - float(trade_options["shipping_distance [km]"][r]) / speed - ) / 24 - tot_BOG = 1 - (1 - BOG) ** days_at_sea - tot_fuel_demand = ( - (2 * float(trade_options["shipping_distance [km]"][r])) - * input_demand - / boat_capacity - ) - eff = 1 - max(tot_BOG, tot_fuel_demand) + shipping_cost = ( + variable_cost * float(trade_options["shipping_distance [km]"][r]) + + fixed_cost + ) # EUR/t n.add( "Link", @@ -469,17 +314,17 @@ def create_links(transport_costs, trade_options): carrier="shipping_" + interone, bus0=r_from + "_" + interone, bus1=r_to + "_" + interone, - efficiency=eff, # %, calculated above - marginal_cost=total_cost, # EUR/MWh or EUR/t + efficiency=1, + marginal_cost=shipping_cost, capital_cost=1 / 1000, # to prevent optimisation shenenigans p_nom_extendable=True, ) - print(f"shipping {interone} link made from {r_from} to {r_to} - eff {eff}") - - # Add iron ore shipping link - total_cost_iron_ore = ship_iron_ore_mc * float( - trade_options["shipping_distance [km]"][r] - ) # TODO Capital cost are not separate but included + logger.info( + "shipping %s link made from %s to %s", + interone, + r_from, + r_to, + ) n.add( "Link", @@ -488,14 +333,14 @@ def create_links(transport_costs, trade_options): bus0=r_from + "_ore", bus1=r_to + "_ore", efficiency=1, - marginal_cost=total_cost_iron_ore, # EUR/t_ironore + marginal_cost=shipping_cost, # EUR/t_ironore capital_cost=1 / 1000, # to prevent optimisation shenenigans p_nom_extendable=True, ) - print( - "iron ore shipping link made from {}_ore to {}_ore - eff {}".format( - r_from, r_to, eff - ) + logger.info( + "iron ore shipping link made from %s_ore to %s_ore", + r_from, + r_to, ) # checking if the row connects with pipeline @@ -519,7 +364,7 @@ def create_links(transport_costs, trade_options): p_nom_extendable=True, capital_cost=1 / 1000, # to prevent optimisation shenenigans ) - print("pipeline link made from {} to {} - eff {}".format(r_from, r_to, eff)) + logger.info("pipeline link made from %s to %s - eff %s", r_from, r_to, eff) return @@ -529,7 +374,7 @@ def save_trade_network(solved_network): sol = pd.DataFrame(columns=["type", "variable", "value", "unit"]) # add objective cost sol.loc[sol.shape[0]] = ["objective", "cost", solved_network.objective, "EUR"] - print("added objective cost to sol") + logger.info("added objective cost to sol") # add all generators with name and production value df_gen = solved_network.generators.p_nom_opt.T.to_frame() @@ -538,7 +383,7 @@ def save_trade_network(solved_network): df_gen.insert(0, "type", "generator") df_gen.insert(3, "unit", unit) sol = pd.concat([sol, df_gen], ignore_index=True) - print("added generators to sol") + logger.info("added generators to sol") # add all links with names and flows df_links = solved_network.links.p_nom_opt.T.to_frame() @@ -547,7 +392,7 @@ def save_trade_network(solved_network): df_links.insert(0, "type", "link") df_links.insert(3, "unit", unit) sol = pd.concat([sol, df_links], ignore_index=True) - print("added links to sol") + logger.info("added links to sol") # add all bus (balance) - who is importing/exporting df_bus = solved_network.buses_t.p.T @@ -556,7 +401,7 @@ def save_trade_network(solved_network): df_bus.insert(0, "type", "bus") df_bus.insert(3, "unit", unit + "/a") sol = pd.concat([sol, df_bus], ignore_index=True) - print("added bus_balances to sol") + logger.info("added bus_balances to sol") # how much of capacity is actually being used per bus? df_bus_cap = ( @@ -573,7 +418,7 @@ def save_trade_network(solved_network): df_bus_cap.insert(0, "type", "used bus capacity") df_bus_cap.insert(3, "unit", "%") sol = pd.concat([sol, df_bus_cap], ignore_index=True) - print("added bus_capacities to sol") + logger.info("added bus_capacities to sol") sol.to_csv(snakemake.output.trade_result) @@ -607,28 +452,30 @@ def save_network_collection(nc, output_path, optimal_network=None): # Split path into base and extension base, ext = os.path.splitext(output_path) - print(f"Saving NetworkCollection with {len(nc.networks)} networks to {output_dir}") + logger.info( + "Saving NetworkCollection with %s networks to %s", len(nc.networks), output_dir + ) # Save optimal network (without slack) to the base filename if provided if optimal_network is not None: - print(f" Saving optimal network (no slack) to {output_path}") + logger.info(f" Saving optimal network (no slack) to {output_path}") optimal_network.export_to_netcdf(output_path) # Save each network with its index/key in the filename for key, network in nc.networks.items(): filename = f"{base}_{key}{ext}" - print(f" Saving network with key '{key}' to {filename}") + logger.info(f" Saving network with key '{key}' to {filename}") network.export_to_netcdf(filename) total_saved = len(nc.networks) + (1 if optimal_network is not None else 0) - print(f"Saved {total_saved} networks to {output_dir}") + logger.info(f"Saved {total_saved} networks to {output_dir}") def plot_trade_network( n, product="steel", alpha_supply=0.7, - alpha_demand=1, + alpha_demand=0.7, output_path=None, output_path_png=None, region_gdf=None, @@ -639,7 +486,7 @@ def plot_trade_network( """ config = snakemake.config plot_config = config["plot"]["world_map"][product] - colors = config["plot"]["colors"] + colors = config["colors"] supply_color = colors.get(f"{product}_supply", "black") demand_color = colors.get(f"{product}_demand", "lightsteelblue") link_colors = colors.get(f"{product}_link", "gray") @@ -772,28 +619,11 @@ def apply_cost_penalty(n, cost_penalty): "marginal_cost", ] *= cost_penalty[region] else: - print("No cost penalty applied") + logger.info("No cost penalty applied") return n -# def apply_wacc_simple(n, wacc): - -# # Add cost pentalty to all technologies of a certain region, excluding shipping -# wacc.set_index("region", inplace=True) -# base_interest_rate = snakemake.params.interest_rate - -# for region in wacc.index: - -# capital_cost_adj = wacc.loc[region].values[0] / base_interest_rate - -# n.links.loc[ -# ((n.links.bus1 == f"{region}_steel") | (n.links.bus1 == f"{region}_hbi")) -# & ~n.links.carrier.str.contains("shipping"), -# "marginal_cost", -# ] *= capital_cost_adj - - def apply_hbi_diversity_constraint(n, diversity_factor, demands): """ Apply HBI import diversity constraint. @@ -815,7 +645,7 @@ def apply_hbi_diversity_constraint(n, diversity_factor, demands): """ if diversity_factor is False: - print("HBI diversity constraint disabled") + logger.info("HBI diversity constraint disabled") return n if diversity_factor <= 0 or diversity_factor > 1: @@ -836,8 +666,9 @@ def apply_hbi_diversity_constraint(n, diversity_factor, demands): demand_tonnes = demands.loc[demands["region"] == region_name, "demand"].values if len(demand_tonnes) == 0: - print( - f"Warning: No demand found for region {region_name}, skipping diversity constraint" + logger.warning( + "Warning: No demand found for region %s, skipping diversity constraint", + region_name, ) continue @@ -850,13 +681,85 @@ def apply_hbi_diversity_constraint(n, diversity_factor, demands): for link_idx in group.index: n.links.loc[link_idx, "p_nom_max"] = max_from_single_supplier - print( - f"HBI diversity constraint applied to {region_name}: max {diversity_factor*100:.0f}% of {demand_tonnes:.0f}t = {max_from_single_supplier:.0f}t per supplier" + logger.info( + "HBI diversity constraint applied to %s: max %.0f%% of %.0ft = %.0ft per supplier", + region_name, + diversity_factor * 100, + demand_tonnes, + max_from_single_supplier, ) return n +def apply_supply_constraint(n, limit_per_supplier, interone, final, is_material_chain): + """ + Cap each region's interone production capacity to limit_per_supplier tonnes + by adjusting p_nom_max on the relevant links (material chain) or generators + (energy chain) in an already-built network. + + Capacity steps are capped in marginal-cost order (cheapest first), mirroring + the merit-order logic of the supply curves. + + Parameters + ---------- + n : pypsa.Network + The built network to constrain. + limit_per_supplier : float + Maximum interone production per region in tonnes. + interone : str + Intermediate product carrier name (e.g. "hbi"). + final : str + Final product carrier name (e.g. "steel"). + is_material_chain : bool + True for oreβ†’interoneβ†’final chains; False for direct energy chains. + + Returns + ------- + pypsa.Network + The network with adjusted p_nom_max values. + """ + if is_material_chain: + ore_ratio = snakemake.config["iron_ore"]["ore_to_steel_ratio"] + supply_links = n.links[ + (n.links.carrier == interone) & n.links.bus1.str.endswith(f"_{interone}") + ] + for _region_bus, group in supply_links.groupby("bus1"): + group_sorted = group.sort_values("marginal_cost") + running = 0.0 # cumulative interone capacity (t) + for link_name in group_sorted.index: + cap_ore = n.links.at[link_name, "p_nom_max"] + cap_interone = cap_ore / ore_ratio + if running >= limit_per_supplier: + n.links.at[link_name, "p_nom_max"] = 0.0 + elif running + cap_interone <= limit_per_supplier: + running += cap_interone + else: + remaining = limit_per_supplier - running + n.links.at[link_name, "p_nom_max"] = remaining * ore_ratio + running = limit_per_supplier + else: + supply_gens = n.generators[n.generators.carrier == final] + for _region_bus, group in supply_gens.groupby("bus"): + group_sorted = group.sort_values("marginal_cost") + running = 0.0 + for gen_name in group_sorted.index: + cap = n.generators.at[gen_name, "p_nom_max"] + if running >= limit_per_supplier: + n.generators.at[gen_name, "p_nom_max"] = 0.0 + elif running + cap <= limit_per_supplier: + running += cap + else: + remaining = limit_per_supplier - running + n.generators.at[gen_name, "p_nom_max"] = remaining + running = limit_per_supplier + + logger.info( + "Supply constraint applied: %.0f Mt per region", limit_per_supplier / 1e6 + ) + return n + + def normalize_regions(regions, carrier): """Ensure regions are lists and suffixed with _{carrier}.""" if regions is None: @@ -899,7 +802,7 @@ def resolve_mga_exporters_from_indicator(mga, indicators): # Otherwise, resolve from indicator if "indicator" not in mga: - print("No indicator or export specified in MGA config") + logger.info("No indicator or export specified in MGA config") return mga indicator_name = mga["indicator"] @@ -931,8 +834,10 @@ def resolve_mga_exporters_from_indicator(mga, indicators): selected_regions = values[values < threshold].index.tolist() - print(f"Selected regions with {indicator_name} < {threshold}: {selected_regions}") - print(f"Values: {values[values < threshold].to_dict()}") + logger.info( + f"Selected regions with {indicator_name} < {threshold}: {selected_regions}" + ) + logger.info(f"Values: {values[values < threshold].to_dict()}") # Set export to the selected regions mga["export"] = selected_regions @@ -1008,14 +913,17 @@ def resolve_mga_links_from_chokepoints(n, mga, trade_options, interone): route_cp = route_chokepoints.get((r_from, r_to), set()) if route_cp & chokepoints_to_avoid: # set intersection selected_links.append(link_name) - print( - f" Chokepoint MGA: link '{link_name}' traverses " - f"{route_cp & chokepoints_to_avoid}" + logger.info( + " Chokepoint MGA: link '%s' traverses %s", + link_name, + route_cp & chokepoints_to_avoid, ) - print( - f"Chokepoint MGA: selected {len(selected_links)}/{len(carrier_links)} " - f"shipping links traversing {chokepoints_to_avoid}" + logger.info( + "Chokepoint MGA: selected %s/%s shipping links traversing %s", + len(selected_links), + len(carrier_links), + chokepoints_to_avoid, ) return pd.Index(selected_links) @@ -1046,14 +954,23 @@ def resolve_mga_links_from_blocks(n, mga): carrier = mga["carrier"] blocks = mga["threshold_value"] # dict: block_name -> [regions] - # Build region -> block mapping + # Build region -> block mapping. + # Each entry in the regions list may itself be a comma-separated string + # (e.g. from YAML flow syntax), so split defensively. region_to_block = {} for block_name, regions in blocks.items(): - for region in regions: - region_to_block[region] = block_name - - print( - f"Blocks MGA: {', '.join(f'{k}: {len(v)} regions' for k, v in blocks.items())}" + for entry in regions: + for region in str(entry).split(","): + region = region.strip() + if region: + region_to_block[region] = block_name + + logger.info( + "Blocks MGA: %s", + ", ".join( + f"{k}: {sum(1 for v in region_to_block.values() if v == k)} regions" + for k in blocks + ), ) # Select shipping links for the target carrier @@ -1075,14 +992,17 @@ def resolve_mga_links_from_blocks(n, mga): if block_from != block_to: selected_links.append(link_name) - print( - f" Blocks MGA: link '{link_name}' crosses " - f"{block_from} β†’ {block_to}" + logger.info( + " Blocks MGA: link '%s' crosses %s β†’ %s", + link_name, + block_from, + block_to, ) - print( - f"Blocks MGA: selected {len(selected_links)}/{len(carrier_links)} " - f"inter-block shipping links" + logger.info( + "Blocks MGA: selected %s/%s inter-block shipping links", + len(selected_links), + len(carrier_links), ) return pd.Index(selected_links) @@ -1162,7 +1082,7 @@ def solve_network(n, mga=None, indicators=None): if hasattr(n, "model") and getattr(n.model, "solver_model", None) is not None: n.model.solver_model = None except Exception as e: - print(f"Warning clearing solver model before copying network: {e}") + logger.warning(f"Warning clearing solver model before copying network: {e}") optimal_network = n.copy() # Store the optimal solution @@ -1204,13 +1124,13 @@ def _link_weight(link_name): slack_list = mga["slack"] # Always a list in config # Handle slack values (always as a list) - print(f"MGA activated with slacks: {slack_list}") - print(f"Optimal cost (no MGA): {optimal_cost:.2f} B€") + logger.info(f"MGA activated with slacks: {slack_list}") + logger.info(f"Optimal cost (no MGA): {optimal_cost:.2f} B€") networks = {} for slack_value in slack_list: - print(f"\n--- Solving with slack = {slack_value} ---") + logger.info(f"\n--- Solving with slack = {slack_value} ---") # Create a copy of the network for each slack n_copy = n.copy() @@ -1230,8 +1150,8 @@ def _link_weight(link_name): .div(1e9) ) mga_cost = tsc.sum() - print( - f"MGA cost: {mga_cost:.2f} B€, allowed cost increase: {optimal_cost*(1+slack_value):.2f} B€" + logger.info( + f"MGA cost: {mga_cost:.2f} B€, allowed cost increase: {optimal_cost * (1 + slack_value):.2f} B€" ) # Store in dictionary with slack as key @@ -1243,35 +1163,132 @@ def _link_weight(link_name): return (optimal_network, nc) +def solve_pareto(n, pareto_config, interone, final, is_material_chain): + """ + Solve the network for each supply-limit threshold in pareto_config, building + the Pareto front of cost vs. per-region supply cap. + + An unconstrained solve is run first (key=None) as the reference point, then + one constrained solve per threshold value via apply_supply_constraint. + + Parameters + ---------- + n : pypsa.Network + The built (unsolved) network. + pareto_config : dict + Config dict with key ``threshold_value`` (list of Mt values, + e.g. [100, 500, 1000]). + interone : str + Intermediate product carrier name (e.g. "hbi"). + final : str + Final product carrier name (e.g. "steel"). + is_material_chain : bool + True for oreβ†’interoneβ†’final chains; False for direct energy chains. + + Returns + ------- + tuple(pypsa.Network, pypsa.NetworkCollection) + (optimal_network, NetworkCollection) where NetworkCollection contains + the unconstrained solution (key=None) and one entry per threshold value + (key = Mt limit as provided in config). + """ + solver_name = snakemake.config["solver"]["name"] + options = snakemake.config["solver_options"][snakemake.config["solver"]["options"]] + threshold_values = pareto_config["threshold_value"] + + # Solve unconstrained reference + logger.info("Solving unconstrained reference network for Pareto front") + n.optimize(n.snapshots, solver_name=solver_name, solver_options=options) + + try: + if hasattr(n, "model") and getattr(n.model, "solver_model", None) is not None: + n.model.solver_model = None + except Exception as e: + logger.warning(f"Warning clearing solver model before copying network: {e}") + + optimal_network = n.copy() + networks = {None: optimal_network} + + for limit_mt in threshold_values: + limit_t = float(limit_mt) * 1e6 + logger.info(f"\n--- Pareto: solving with supply limit = {limit_mt} Mt ---") + + n_copy = n.copy() + apply_supply_constraint(n_copy, limit_t, interone, final, is_material_chain) + n_copy.optimize( + n_copy.snapshots, solver_name=solver_name, solver_options=options + ) + + try: + if ( + hasattr(n_copy, "model") + and getattr(n_copy.model, "solver_model", None) is not None + ): + n_copy.model.solver_model = None + except Exception as e: + logger.warning( + f"Warning clearing solver model for limit {limit_mt} Mt: {e}" + ) + + tsc = ( + pd.concat([n_copy.statistics.capex(), n_copy.statistics.opex()], axis=1) + .sum(axis=1) + .div(1e9) + ) + logger.info( + f"Pareto limit {limit_mt} Mt: total system cost = {tsc.sum():.2f} B\u20ac" + ) + + networks[limit_mt] = n_copy + + nc = pypsa.NetworkCollection(networks) + return (optimal_network, nc) + + if __name__ == "__main__": - if "snakemake" not in globals(): + if snakemake is None: from _helpers import mock_snakemake snakemake = mock_snakemake( "model_trade", cost_year="2050", interone="hbi", - intertwo="eaf-grid", + intertwo="eaf", final="steel", - scenario="mga-stability-weighted", - wacc="uniform", + scenario="constrain-supply", + wacc="regional", + chain_id="supplyconstraint", ) final = snakemake.wildcards["final"] interone = snakemake.wildcards["interone"] intertwo = snakemake.wildcards["intertwo"] scenario = snakemake.wildcards["scenario"] - - print( - f"intermediate 1 ({interone}) and intermediate 2 ({intertwo}) to final product {final}" + chain_id = snakemake.wildcards["chain_id"] + + trade_chain = snakemake.config["trade_chains"] + + # Derive model structure from trade_chains config (source of truth). + # The wildcard variables above are kept for Snakefile compatibility only. + final = trade_chain["final_product"] + tradeable = trade_chain["tradeable_commodities"] + interone = next(c for c in tradeable if c != "iron_ore") + stages = trade_chain["stages"] + intertwo = stages[max(stages.keys())]["process_label"] + is_material_chain = "iron_ore" in tradeable + + logger.info( + "intermediate 1 (%s) and intermediate 2 (%s) to final product %s", + interone, + intertwo, + final, ) shipping_first = "iron_ore" - shipping_second = interone if interone != "steel" else final + shipping_second = interone - print("starting up with all regions--- ") + logger.info("starting up with all regions--- ") # making dataframes - transport_costs = pd.read_csv(snakemake.input.transport_costs, header=0) trade_options = pd.read_csv(snakemake.input.trade_options, header=0) supply_curves_interone = snakemake.input.supply_curves_interone supply_curves_intertwo = snakemake.input.supply_curves_intertwo @@ -1281,7 +1298,6 @@ def _link_weight(link_name): snakemake.input.political_stability, index_col=0 ) regions = snakemake.config["regions"] - wacc = pd.read_csv(snakemake.input.wacc, header=0) # Load indicators for MGA (flexible architecture for future extensions) indicators = {} @@ -1304,91 +1320,110 @@ def _link_weight(link_name): regionalise = snakemake.config["iron_ore"]["regionalise"] if final == "steel": - demands = pd.read_csv(snakemake.input.steel_demand, header=0) demands.rename(columns={"SteelDemand_DRI_Mt": "demand"}, inplace=True) demands["demand"] = demands["demand"] * 1e6 # Mt to t unit = "t" elif final == "hydrogen": - demands = pd.read_csv(snakemake.input.demand, header=0) unit = "MWh" else: raise ValueError("Product must be either 'steel' or 'hydrogen'.") - cost_descriptor = "LCOX" + cost_descriptor = "lcox" plot_config = snakemake.config["plot"]["world_map"][final] - print("data loaded successfully") + logger.info("data loaded successfully") # building model - print("building model") + logger.info("building model") n = building_model( - supply_curves_interone, supply_curves_intertwo, demands, bus_locations, final + supply_curves_interone, + supply_curves_intertwo, + demands, + bus_locations, + trade_chain, ) # building transport network connecting the individual buses - print("building transportation links") - create_links(transport_costs, trade_options) + logger.info("building transportation links") + create_links(trade_options) # Cost penalty - cost_penalty = snakemake.config["scenario"][scenario]["modifiers"]["cost_penalty"] - print(f"applying cost penalty scenario: {scenario} with penalties {cost_penalty}") - n = apply_cost_penalty(n, cost_penalty) - - # Note: Only relevant when capital costs are added in this script. Currently, they are added only in model_lcox - # Country specific wacc adjustment (simplified) - # if snakemake.wildcards.wacc == "regional": - # print(f"applying region specific wacc (simplified)") - # n = apply_wacc_simple(n, wacc) - # else: - # pass + if snakemake.config["scenario"][scenario]["modifiers"]["cost_penalty"] is None: + cost_penalty = None + logger.info("cost_penalty not activated") + else: + cost_penalty = snakemake.config["scenario"][scenario]["modifiers"][ + "cost_penalty" + ] + logger.info( + "applying cost penalty scenario: %s with penalties %s", + scenario, + cost_penalty, + ) + n = apply_cost_penalty(n, cost_penalty) - # MGA # HBI diversity constraint diversity_factor = snakemake.config["trade"]["diversity_factor"] if diversity_factor is not False: - print(f"applying HBI diversity constraint with factor {diversity_factor}") + logger.info( + "applying HBI diversity constraint with factor %s", diversity_factor + ) n = apply_hbi_diversity_constraint(n, diversity_factor, demands) else: - print("HBI diversity constraint disabled") + logger.info("HBI diversity constraint disabled") + + # Pareto supply constraint + pareto = snakemake.config["scenario"][scenario]["modifiers"].get("pareto") + if pareto is not None: + logger.info( + f"Pareto supply constraint activated with thresholds {pareto['threshold_value']} Mt" + ) + else: + logger.info("Pareto supply constraint not activated") # MGA if "mga" not in snakemake.config["scenario"][scenario]["modifiers"].keys(): mga = None - print("MGA not activated") + logger.info("MGA not activated") else: mga = snakemake.config["scenario"][scenario]["modifiers"]["mga"] - print(f"MGA activated with slack {mga['slack']}") + logger.info(f"MGA activated with slack {mga['slack']}") # solving model - print("solving model") - result = solve_network(n, mga=mga, indicators=indicators if indicators else None) - print("network was solved") + logger.info("solving model") + if pareto is not None: + result = solve_pareto(n, pareto, interone, final, is_material_chain) + else: + result = solve_network( + n, mga=mga, indicators=indicators if indicators else None + ) + logger.info("network was solved") # Export result: always a tuple (optimal_network, NetworkCollection) - print("saving network to netCDF") + logger.info("saving network to netCDF") optimal_net, nc = result save_network_collection( nc, snakemake.output.trade_network, optimal_network=optimal_net ) n_selected = optimal_net - print( + logger.info( f"Saved optimal network and NetworkCollection with {len(nc.networks)} networks" ) # saving results and calculating LCOH - print("saving results as network+csv") + logger.info("saving results as network+csv") save_trade_network(n_selected) # Build dissolved region GeoDataFrame once for basemap (no internal country borders) region_gdf = build_region_geodataframe(snakemake.config) # Plot results: consolidate plotting for all networks - print("saving plots") + logger.info("saving plots") # Define the products to plot and their settings plot_settings = [ @@ -1418,9 +1453,9 @@ def _link_weight(link_name): is_optimal = pd.isna(slack_key) if is_optimal: - print(f"\nPlotting optimal network (no slack)") + logger.info("\nPlotting optimal network (no slack)") else: - print(f"\nPlotting for slack={slack_key}") + logger.info(f"\nPlotting for slack={slack_key}") for product, alpha_supply, output_path, output_path_png in plot_settings: # Use base filenames for optimal, append slack value for MGA variants diff --git a/workflow/scripts/model_trade_singlestage.py b/workflow/scripts/model_trade_singlestage.py deleted file mode 100644 index 672b523..0000000 --- a/workflow/scripts/model_trade_singlestage.py +++ /dev/null @@ -1,364 +0,0 @@ -import pypsa -import pandas as pd -import matplotlib.pyplot as plt -import os - -plt.style.use("bmh") - - -# inputs are transportation costs, supply curves, trade options and load demand for all regions -def building_model(supply_curves, demands, bus_location, product): - # this function creates network, carrier and a bus for each region - # with a load and all supply possibilities added - - # create network - network = pypsa.Network() - - # adding carriers - network.add( - "Carrier", name=product, color=snakemake.config["plot"]["colors"][product] - ) - - # for each region we are creating a bus with all the potentials and load - for r in range(0, len(supply_curves)): - - # getting the supply curve for one region - region_file = supply_curves[r] - region_data = pd.read_csv(region_file, header=0) - filename = os.path.basename(region_file) - # Extract region name - region_name = filename.split("_" + product)[0] - - print("building generators and loads for ", region_name) - - # define the steel bus with region name - network.add( - "Bus", - region_name, - carrier=product, - x=float( - bus_location.loc[bus_location["region_name"] == region_name]["long"] - ), # long - y=float( - bus_location.loc[bus_location["region_name"] == region_name]["lat"] - ), # lat - ) - - # defining the demand for the region - load = int(demands.loc[demands["region"] == region_name]["demand"]) * float( - snakemake.wildcards["demand"] - ) - print( - f"Load set via snakemake.wildcard to {float(snakemake.wildcards['demand'])*100}% of regional final energy demand." - ) - - network.add( - "Load", - region_name, - bus=region_name, - p_set=load, - ) - - # defining the supply opportunities for the region (apart from last supply as that is the 75% infeasible one) - for s in range(0, len(region_data) - 1): - if s == 0: - p_nom_supply = float(region_data[f"demand [{unit}]"][s]) - else: - p_nom_supply = float(region_data[f"demand [{unit}]"][s]) - float( - region_data[f"demand [{unit}]"][s - 1] - ) - M_cost_supply = float(region_data[f"{cost_descriptor} [EUR/{unit}]"][s]) - - network.add( - "Generator", - "{} supply {}_{}".format( - product, region_name, region_data["demand factor [%]"][s] - ), - bus=region_name, - carrier=product, - p_nom_extendable=True, - p_nom_max=p_nom_supply, # MWh or t, demand = potential supply - marginal_cost=M_cost_supply, # EUR/MWh or EUR/t - capital_cost=1 / 1000, # to prevent optimisation shennanigans - ) - - return network - - -def create_links(transport_costs, trade_options): - - # for in range of length of input csv with all the different links, region_from = column , region_to = column 2 - # create links with the correct corresponding costs - - # marginal and fixed cost for the different type of transport - ship_mc = float( - transport_costs.loc[transport_costs["transport_type"] == "shipping"][ - "marginal_cost" - ] - ) - pipe_mc = float( - transport_costs.loc[transport_costs["transport_type"] == "pipeline"][ - "marginal_cost" - ] - ) - ship_c = float( - transport_costs.loc[transport_costs["transport_type"] == "shipping"][ - "fixed_cost" - ] - ) - input_demand = 0.42 # MWh/km for LH2, IEA future of hydrogen 2019 - boat_capacity = 363000 # MWh for LH2, IEA future of hydrogen 2019 - speed = 30 # km/h, IEA future of hydrogen 2019 - BOG = 0.2 / 100 # %/day, IEA future of hydrogen 2019 - - print("ship + pipe cost", ship_mc, ship_c, pipe_mc) - - # if there should be a link, create a link - # do this for both shipping and pipeline - for r in range(0, len(trade_options)): - # checking if the row connects with shipping - if trade_options["shipping"][r] == 1: - r_from = trade_options["region_from"][r] - r_to = trade_options["region_to"][r] - total_cost = ship_c + int( - float(trade_options["shipping_distance [km]"][r]) * ship_mc - ) - - # calculating efficiency - days_at_sea = ( - float(trade_options["shipping_distance [km]"][r]) / speed - ) / 24 - tot_BOG = 1 - (1 - BOG) ** days_at_sea - tot_fuel_demand = ( - (2 * float(trade_options["shipping_distance [km]"][r])) - * input_demand - / boat_capacity - ) - eff = 1 - max(tot_BOG, tot_fuel_demand) - - network.add( - "Link", - "shipping {}-{}".format(r_from, r_to), - bus0=r_from, - bus1=r_to, - efficiency=eff, # %, calculated above - marginal_cost=total_cost, # EUR/MWh or EUR/t - capital_cost=1 / 1000, # to prevent optimisation shenenigans - p_nom_extendable=True, - ) - print("shipping link made from {} to {} - eff {}".format(r_from, r_to, eff)) - - # checking if the row connects with pipeline - if (trade_options["pipeline"][r] == 1) & (product == "hydrogen"): - r_from = trade_options["region_from"][r] - r_to = trade_options["region_to"][r] - p_cost = int(float(trade_options["pipeline_distance [km]"][r]) * pipe_mc) - filling_demand = 1.5 / 100 # DEA, energy transport datasheet, 2050, % - losses = 1.7 / 100 # DEA, energy transport datasheet 2022, 2050, %/1000km - eff = (1 - filling_demand) * (1 - losses) ** ( - float(trade_options["pipeline_distance [km]"][r]) / 1000 - ) - - network.add( - "Link", - "pipeline {}-{}".format(r_from, r_to), - bus0=r_from, - bus1=r_to, - efficiency=eff, # calculated above - marginal_cost=p_cost, # EUR/MWh - p_nom_extendable=True, - capital_cost=1 / 1000, # to prevent optimisation shenenigans - ) - print("pipeline link made from {} to {} - eff {}".format(r_from, r_to, eff)) - - return - - -def save_trade_network(solved_network): - - sol = pd.DataFrame(columns=["type", "variable", "value", "unit"]) - # add objective cost - sol.loc[sol.shape[0]] = ["objective", "cost", solved_network.objective, "EUR"] - print("added objective cost to sol") - - # add all generators with name and production value - df_gen = solved_network.generators.p_nom_opt.T.to_frame() - df_gen.reset_index(inplace=True) - df_gen = df_gen.rename(columns={"Generator": "variable", "now": "value"}) - df_gen.insert(0, "type", "generator") - df_gen.insert(3, "unit", unit) - sol = pd.concat([sol, df_gen], ignore_index=True) - print("added generators to sol") - - # add all links with names and flows - df_links = solved_network.links.p_nom_opt.T.to_frame() - df_links.reset_index(inplace=True) - df_links = df_links.rename(columns={"Link": "variable", "p_nom_opt": "value"}) - df_links.insert(0, "type", "link") - df_links.insert(3, "unit", unit) - sol = pd.concat([sol, df_links], ignore_index=True) - print("added links to sol") - - # add all bus (balance) - who is importing/exporting - df_bus = solved_network.buses_t.p.T - df_bus.reset_index(inplace=True) - df_bus = df_bus.rename(columns={"Bus": "variable", "now": "value"}) - df_bus.insert(0, "type", "bus") - df_bus.insert(3, "unit", unit + "/a") - sol = pd.concat([sol, df_bus], ignore_index=True) - print("added bus_balances to sol") - - # how much of capacity is actually being used per bus? - df_bus_cap = ( - ( - solved_network.generators.groupby(["bus"]).p_nom_opt.sum() - / solved_network.generators.groupby(["bus"]).p_nom_max.sum() - ) - * 100 - ).to_frame() - df_bus_cap.reset_index(inplace=True) - df_bus_cap = df_bus_cap.rename( - columns={df_bus_cap.columns[0]: "variable", df_bus_cap.columns[1]: "value"} - ) - df_bus_cap.insert(0, "type", "used bus capacity") - df_bus_cap.insert(3, "unit", "%") - sol = pd.concat([sol, df_bus_cap], ignore_index=True) - print("added bus_capacities to sol") - - sol.to_csv(snakemake.output.trade_result) - network.export_to_netcdf(snakemake.output.trade_network) - - return - - -def plot_trade_network(n): - # creating color dataframe for type of transportation method - df_link = n.links.type.astype(str).to_frame() - df_link.reset_index(inplace=True) - df_link = df_link.rename( - columns={df_link.columns[0]: "Link", df_link.columns[1]: "color"} - ) - # setting all as default to green - df_link["color"] = "lightgreen" - # shipping links are changed to blue - df_link.loc[df_link["Link"].str.contains("shipping"), "color"] = "skyblue" - df_link.set_index("Link", inplace=True) - - # creating figure - fig = plt.figure() - region_gen = n.generators.groupby(["bus"]).p_nom_opt.sum() - region_load = n.loads.groupby(["bus"]).p_set.sum() - link_flow = n.links.p_nom_opt.astype(int) - n.plot( - bus_sizes=region_load * plot_config["bus_size"], # 1e-8 - bus_colors="seagreen", - bus_alpha=1, - link_widths=0, - branch_components=["Link"], - ) # the load at bus in green - n.plot( - bus_sizes=region_gen * plot_config["bus_size"], # 1e-8 - bus_colors="lightsteelblue", - bus_alpha=0.7, - link_widths=link_flow * plot_config["link_width"], # 1e-9 - branch_components=["Link"], - link_colors=df_link["color"], - ) # the gen at bus in light blue - - legend_elements = [ - plt.Line2D([0], [0], color="lightgreen", label="pipeline"), - plt.Line2D([0], [0], color="lightblue", label="shipping"), - plt.Line2D( - [0], - [0], - marker="o", - color="white", - label="Demand", - markerfacecolor="seagreen", - markersize=10, - ), - plt.Line2D( - [0], - [0], - marker="o", - color="white", - label="Supply", - markerfacecolor="lightsteelblue", - markersize=10, - ), - ] - fig.legend(handles=legend_elements, frameon=False) - - # fig.suptitle("scenario:{}-{}-{}".format(snakemake.wildcards["cost_year"],snakemake.wildcards["transport_cost"],snakemake.wildcards["demand"])) - fig.savefig(snakemake.output.trade_plot, format="pdf") - return - - -if __name__ == "__main__": - if "snakemake" not in globals(): - from _helpers import mock_snakemake - - snakemake = mock_snakemake( - "model_trade", - transport_cost="custom", - cost_year="2030", - demand=1, - product="steel", - ) - - product = snakemake.wildcards["product"] - - print("starting up with all regions--- ") - # making dataframes - transport_costs = pd.read_csv(snakemake.input.transport_costs, header=0) - trade_options = pd.read_csv(snakemake.input.trade_options, header=0) - supply_curves = snakemake.input.supply_curves - bus_locations = pd.read_csv(snakemake.input.bus_locations, header=0) - if product == "steel": - - demands = pd.read_csv(snakemake.input.steel_demand, header=0) - demands.rename(columns={"SteelProductionMt": "demand"}, inplace=True) - demands["demand"] = demands["demand"] * 1e6 # Mt to t - unit = "t" - cost_descriptor = "LCOS" - - elif product == "hydrogen": - - demands = pd.read_csv(snakemake.input.demand, header=0) - unit = "MWh" - cost_descriptor = "LCOH" - else: - raise ValueError("Product must be either 'steel' or 'hydrogen'.") - - plot_config = snakemake.config["plot"]["world_map"][product] - - print("data loaded successfully") - - # building model - print("building model") - network = building_model(supply_curves, demands, bus_locations, product) - - # building transport network connecting the individual buses - print("building transportation links") - create_links(transport_costs, trade_options) - - # solving model - print("solving model") - network.optimize( - network.snapshots, - solver_name="gurobi", - solver_options={ - "crossover": 0, - "method": 2, - "BarConvTol": 1.0e-5, - "FeasibilityTol": 1.0e-5, - "OptimalityTol": 1.0e-5, - "barHomogeneous": 1, - }, - ) - print("network was solved") - - # saving results and calculating LCOH - print("saving results as network+csv and pdf") - save_trade_network(network) - plot_trade_network(network) diff --git a/workflow/scripts/prepare_labour_cost.py b/workflow/scripts/prepare_labour_cost.py new file mode 100644 index 0000000..5be7cb4 --- /dev/null +++ b/workflow/scripts/prepare_labour_cost.py @@ -0,0 +1,278 @@ +""" +Labour cost calculator for H-DRI-EAF value chains. + +Reads the merged labour inputs produced by data_downloader.py, computes +an all-in hourly steelworker wage [EUR/h, 2020 prices] for each country, +maps countries to the model regions defined in config/config.yaml, and +saves a regional aggregated CSV. + +Methodology (Nykvist et al. 2025, Section D4) +---------------------------------------------- +1. Steel wage ratio (dimensionless): + wage_ratio = (wage_per_employee_USD * (1 + employer_contrib_rate)) + / GNI_data_year_USD + Both numerator and denominator use the same year and the same USD + denomination, so currency conversion cancels out. + +2. Hourly wage [EUR/h, 2020]: + hourly_wage = (GNI_2020_EUR * wage_ratio / WORKING_YEAR) * (1 + OVERHEAD) + where GNI_2020_EUR = GNI_2020_USD * EUR_per_USD_2020. + +3. Countries with no UNIDO data have their wage ratio imputed as the + employment-weighted mean of all countries with data. + +4. Regional aggregation: employment-weighted mean of country hourly wages + within each model region. Regions with no data fall back to the + global employment-weighted mean. + +Output: resources/labour_cost_clustered.csv + region | labour_ely | labour_dri | labour_eaf [EUR/h, 2020] + (all three columns hold the same hourly rate; the model applies + different labour-intensity factors per technology downstream) + +Usage +----- + python workflow/scripts/labour_cost_calculator.py +""" + +import warnings +import pycountry +import pandas as pd +from pathlib import Path +from typing import Any + +from _helpers import setup_logging + +snakemake: Any = globals().get("snakemake") +logger = setup_logging( + __name__, snakemake=snakemake, log_filename="prepare_labour_cost.log" +) + +# --------------------------------------------------------------------------- +# Constants +# --------------------------------------------------------------------------- +WORKING_YEAR = 2080 # assumed working hours per year +OVERHEAD = 0.25 # 25 % overhead on direct labour cost +TARGET_YEAR = 2020 # reference year for all monetary outputs + +# Labour intensities (Nykvist Table D5, original data Devlin) +LI_ELY_PU = 2.0 # h / kW installed electrolyser +LI_DRI_PU = 0.18 # h / t DRI +LI_EAF_PU = 0.49 # h / t steel + +# --------------------------------------------------------------------------- +# Country name β†’ ISO3 helpers for config region mapping +# --------------------------------------------------------------------------- +_EXTRA_NAME_TO_ISO3 = { + # Config-specific names that pycountry.lookup() doesn't find by default + "Iran, Islamic Republic of": "IRN", + "Republic of the Congo": "COG", + "Hong Kong": "HKG", + "Taiwan": "TWN", + "South Korea": "KOR", + "North Korea": "PRK", + "Vietnam": "VNM", + "Bolivia": "BOL", + "Venezuela": "VEN", + "Russia": "RUS", + "Russian Federation": "RUS", + "Laos": "LAO", + "Brunei": "BRN", + "Palestine": "PSE", + "Syria": "SYR", + "Democratic Republic of the Congo": "COD", + "Equatorial French Guiana": None, # not a sovereign country +} + + +def _config_name_to_iso3(name: str): + """Convert a config region country name to ISO3, return None if not found.""" + name = name.strip() + if name in _EXTRA_NAME_TO_ISO3: + return _EXTRA_NAME_TO_ISO3[name] + try: + return pycountry.countries.lookup(name).alpha_3 + except LookupError: + return None + + +def build_iso_to_region(config_regions: dict) -> dict: + """ + Build {iso3: region_name} from the config 'regions' dict. + + Config entries may use '+' to combine two countries in one string + (e.g. "Togo + Algeria"); each part is split and mapped individually. + """ + iso_to_region = {} + unmatched = [] + for region, countries in config_regions.items(): + for entry in countries: + for part in str(entry).split("+"): + iso3 = _config_name_to_iso3(part.strip()) + if iso3: + iso_to_region[iso3] = region + else: + unmatched.append((region, part.strip())) + if unmatched: + warnings.warn( + f"Could not map {len(unmatched)} config country name(s) to ISO3: " + + ", ".join(f"{r}/{n}" for r, n in unmatched[:10]) + + (" …" if len(unmatched) > 10 else "") + ) + return iso_to_region + + +# --------------------------------------------------------------------------- +# Wage computation +# --------------------------------------------------------------------------- +def compute_hourly_wage(row) -> float: + """ + Compute the all-in hourly steelworker wage [EUR/h] in TARGET_YEAR prices. + + wage_ratio = (steel_wage_usd / steel_employees) * (1 + employer_contrib_rate) + / gni_data_year_usd + + hourly_wage = (gni_target_year_usd * eur_per_usd_target + * wage_ratio / WORKING_YEAR) * (1 + OVERHEAD) + """ + wage_ratio = ( + (row["steel_wage_usd"] / row["steel_employees"]) + * (1.0 + row["employer_contrib_rate"]) + / row["gni_data_year_usd"] + ) + gni_target_eur = row["gni_target_year_usd"] * row["eur_per_usd_target"] + return (gni_target_eur * wage_ratio / WORKING_YEAR) * (1.0 + OVERHEAD) + + +def compute_all_hourly_wages(merged_df: pd.DataFrame) -> pd.DataFrame: + """ + Return a DataFrame with columns [iso3, country_name, steel_employees, + hourly_wage_eur] for every country in *merged_df*. + + Countries missing any required column get their wage imputed as the + employment-weighted mean of all countries with complete data. + """ + required = [ + "steel_wage_usd", + "steel_employees", + "gni_data_year_usd", + "gni_target_year_usd", + "employer_contrib_rate", + "eur_per_usd_target", + ] + valid_mask = merged_df[required].notna().all(axis=1) # type: ignore[arg-type] + valid = merged_df[valid_mask].copy() + valid["hourly_wage_eur"] = valid.apply(compute_hourly_wage, axis=1) + + # Employment-weighted mean for imputation + total_emp = valid["steel_employees"].sum() + mean_wage = ( + (valid["hourly_wage_eur"] * valid["steel_employees"]).sum() / total_emp + if total_emp > 0 + else valid["hourly_wage_eur"].mean() + ) + + result = merged_df[["iso3", "country_name", "steel_employees"]].merge( + valid[["iso3", "hourly_wage_eur"]], on="iso3", how="left" + ) + n_imputed = result["hourly_wage_eur"].isna().sum() + if n_imputed: + warnings.warn( + f"{n_imputed} countries have incomplete data and will be imputed " + f"with the global mean ({mean_wage:.2f} EUR/h)." + ) + result["hourly_wage_eur"] = result["hourly_wage_eur"].fillna(mean_wage) + return result + + +# --------------------------------------------------------------------------- +# Regional aggregation +# --------------------------------------------------------------------------- +def aggregate_by_region( + wages_df: pd.DataFrame, + iso_to_region: dict, + regions: list, +) -> pd.DataFrame: + """ + Compute the employment-weighted mean hourly wage for each model region. + + Countries with no employment figure use weight = 1. + Regions with no matching countries use the global weighted mean. + """ + df = wages_df.copy() + df["region"] = df["iso3"].map(iso_to_region) + df["weight"] = df["steel_employees"].fillna(1.0) + + # Global fallback + global_mean = (df["hourly_wage_eur"] * df["weight"]).sum() / df["weight"].sum() + + rows = [] + for region in regions: + grp = df[df["region"] == region] + if grp.empty: + wage = global_mean + else: + w_sum = grp["weight"].sum() + wage = ( + (grp["hourly_wage_eur"] * grp["weight"]).sum() / w_sum + if w_sum > 0 + else global_mean + ) + rows.append( + { + "region": region, + "steelworker_wage in euro/h": round(wage, 4), + "ely_intensity in h/kW_ely": LI_ELY_PU, + "dri_intensity in h/t_dri": LI_DRI_PU, + "eaf_intensity in h/t_steel": LI_EAF_PU, + } + ) + + return pd.DataFrame(rows).set_index("region") + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("prepare_labour_cost") + + # ── 1. Load merged data ────────────────────────────────────────────── + merged_path = Path(snakemake.input.merged) + if not merged_path.exists(): + raise FileNotFoundError( + f"Merged labour inputs not found: {merged_path}\n" + " Run download_labour_data first." + ) + logger.info(f"Loading {merged_path} …") + merged = pd.read_csv(merged_path) + logger.info(f" {len(merged)} countries loaded.") + + # ── 2. Load config regions ─────────────────────────────────────────── + regions_config: dict = snakemake.config["regions"] + iso_to_region = build_iso_to_region(regions_config) + regions = list(regions_config.keys()) + logger.info(f" {len(regions)} model regions from config.") + + # ── 3. Compute hourly wages ────────────────────────────────────────── + wages = compute_all_hourly_wages(merged) + logger.info("\nCountry-level hourly wages [EUR/h, 2020]:") + wage_table = ( + wages[["iso3", "country_name", "hourly_wage_eur"]] + .sort_values("hourly_wage_eur", ascending=False) # type: ignore[call-overload] + .to_string(index=False) + ) + logger.info(wage_table) + + # ── 4. Aggregate by region ─────────────────────────────────────────── + result = aggregate_by_region(wages, iso_to_region, regions) + + # ── 5. Save ────────────────────────────────────────────────────────── + output_path = Path(snakemake.output.labour_cost) + output_path.parent.mkdir(parents=True, exist_ok=True) + result.to_csv(output_path) + logger.info(f"\nSaved β†’ {output_path}") + logger.info(result.to_string()) diff --git a/workflow/scripts/prepare_regional_network.py b/workflow/scripts/prepare_regional_network.py new file mode 100644 index 0000000..ede3d2e --- /dev/null +++ b/workflow/scripts/prepare_regional_network.py @@ -0,0 +1,1217 @@ +""" +Prepare regional network: load clustered renewables and configure supply chain. + +This is the simplified Step 1 workflow that: +1. Loads the clustered renewable profiles directly (region, technology, class, time) +2. Creates PyPSA generators for each technology and class +3. Applies local demand reservation if configured +4. Adds supply chain (electrolyzer, DRI, optional EAF) +5. Applies product-specific cutoff + +Usage (Snakemake rule): + rule prepare_regional_network: + input: + skeleton = "resources/networks/skeleton.nc", + renewables = "resources/clustered_renewables.nc", + tech_costs = "resources/tech_database.csv", + params: + region = "{region}", + product = "{product}", + output: + network = "resources/networks/base_{cost_year}_{region}_{product}.nc", + script: + "scripts/prepare_regional_network.py" +""" + +import logging +from typing import Any, Dict, Optional, Tuple, Iterable, cast +import numpy as np # type: ignore +import pandas as pd # type: ignore +import xarray as xr # type: ignore +import pypsa # type: ignore + +import tech_database as td + +from trade_chain_utils import ( + build_product_components, + get_external_material_inputs, +) +from _helpers import setup_logging + +snakemake: Any = globals().get("snakemake") + +logger = setup_logging(__name__, snakemake=snakemake) + + +def load_regional_clustered_renewables( + clustered_path: str, + region: str, +) -> Tuple[Dict[str, np.ndarray], xr.DataArray, Dict]: + """ + Load renewable data for a region from clustered NetCDF. + + Parameters + ---------- + clustered_path : str + Path to data/clustered_renewables.nc + region : str + Region name (e.g., 'Europe', 'North_America') + + Returns + ------- + technologies_dict : dict + Mapping {tech_name: capacity_array} where each is (n_class,) + + cf_ts : xr.DataArray + Capacity factor time series with dims (time, technology, class) + + metadata : dict + Summary info (n_classes, n_time, technologies, etc.) + """ + with xr.open_dataset(clustered_path) as ds: + if region not in ds.region.values: + available = ", ".join(ds.region.values) + raise ValueError(f"Region '{region}' not found. Available: {available}") + + logger.info(f"Loading clustered renewables for {region}") + + # Select region (dims: technology, class) + region_cap = ds["capacity"].sel(region=region) # (tech, class) + region_cf = ds["capacity_factor"].sel(region=region) # (tech, class, time) + + # Extract technology names and data + techs = list(region_cap.technology.values) + technologies_dict = {} + + for tech in techs: + cap = region_cap.sel(technology=tech).values + # Drop NaN-padded trailing classes + valid = ~np.isnan(cap) + technologies_dict[tech] = cap[valid] + logger.info( + f" {tech}: {valid.sum()} classes, {np.nansum(cap):.0f} MW total" + ) + + # Capacity factor time series (keep full structure for now) + cf_ts = region_cf # (tech, class, time) + + # Validate capacity factors: clamp to [0, 1] and replace NaN with 0 + # This prevents infeasibility warnings from PyPSA when p_max_pu goes negative or exceeds 1 + n_invalid_before = int( + ((cf_ts < 0) | (cf_ts > 1) | cf_ts.isnull()).sum().values + ) + cf_ts = cf_ts.clip(0, 1).fillna(0) + if n_invalid_before > 0: + logger.warning(f"Fixed {n_invalid_before} invalid CF values (clamped/NaN)") + + avg_cf_data = {} + if "avg_cf" in ds.data_vars: + for tech in techs: + avg = ds["avg_cf"].sel(region=region, technology=tech).values + valid = ~np.isnan(avg) + avg_cf_data[tech] = avg[valid] + + metadata = { + "region": region, + "n_classes": { + tech: int((~np.isnan(region_cap.sel(technology=tech).values)).sum()) + for tech in techs + }, + "n_time": region_cf.sizes["time"], + "n_technologies": len(techs), + "technologies": techs, + "time_start": pd.Timestamp(ds["time"].values[0]), + "time_end": pd.Timestamp(ds["time"].values[-1]), + "total_capacity_mw": float(region_cap.sum().values), + "avg_cf": avg_cf_data, + } + + logger.info( + f" Total capacity: {metadata['total_capacity_mw']:.0f} MW, " + f"{metadata['n_time']} timesteps, {metadata['n_technologies']} technologies" + ) + + return technologies_dict, cf_ts, metadata + + +def load_local_electricity_demand_mw( + local_demand_path: Optional[str], + region: str, +) -> float: + """Load regional electricity demand and convert it to average MW.""" + + if not local_demand_path: + return 0.0 + + try: + local_df = pd.read_csv(local_demand_path) + region_mask = local_df["region"].str.lower() == region.lower() + if not region_mask.any(): + logger.warning(f"Region '{region}' not found in local demand data") + return 0.0 + + total_energy_mwh = float(local_df[region_mask]["demand"].values[0]) + el_share = float(local_df[region_mask]["el_share"].values[0]) / 100.0 + local_el_demand_mwh = total_energy_mwh * el_share + return local_el_demand_mwh / 8760.0 + except Exception as exc: + logger.warning(f"Could not load local demand for {region}: {exc}") + return 0.0 + + +def reserve_top_sites_by_highest_cf( + technologies_dict: Dict[str, np.ndarray], + cf_ts: xr.DataArray, + reserve_capacity_mw: float, + scenario: str = "reserved", +) -> Optional[Dict[str, np.ndarray]]: + """ + Reserve top sites (highest average capacity factor) for local demand. + + Parameters + ---------- + technologies_dict : dict + {tech_name: capacity_array} + cf_ts : xr.DataArray + Capacity factor time series with dims (technology, class, time) + reserve_capacity_mw : float + Target MW capacity to reserve + scenario : str + "reserved" (default): apply reservation logic + "unreserved": skip reservation, return None + + Returns + ------- + dict or None + Dict of same structure as technologies_dict, with NaN for non-reserved sites. + If scenario="unreserved", returns None (no reservation). + """ + if scenario == "unreserved": + logger.info( + "Scenario=unreserved: skipping site reservation (all generators available)" + ) + return None + + if reserve_capacity_mw <= 0: + logger.info( + "No reservation applied: reserve_capacity_mw <= 0 for reserved scenario" + ) + return None + + # Flatten all sites with (tech, site, capacity, avg_cf) index + reserved = {} + total_reserved_mw = 0 + + all_sites = [] + for tech, caps in technologies_dict.items(): + for site_idx, cap in enumerate(caps): + # Calculate average capacity factor for this site + if tech in cf_ts.coords.get("technology", []): + cf_data = cf_ts.sel(technology=tech).isel({"class": site_idx}) + avg_cf = float(cf_data.mean().values) + else: + avg_cf = 0 + all_sites.append((tech, site_idx, cap, avg_cf)) + + # Sort by average capacity factor (descending) β€” highest CF first + all_sites.sort(key=lambda x: x[3], reverse=True) + + # Reserve until target capacity (allow partial reservation on the last site) + reserved_set = set() + reserved_amounts = {} + for tech, site_idx, cap, avg_cf in all_sites: + if total_reserved_mw >= reserve_capacity_mw: + break + remaining_mw = max(reserve_capacity_mw - total_reserved_mw, 0) + reserve_mw = min(cap, remaining_mw) + if reserve_mw <= 0: + continue + reserved_set.add((tech, site_idx)) + reserved_amounts[(tech, site_idx)] = reserve_mw + total_reserved_mw += reserve_mw + + # Create reserved arrays (copy dict structure, mask non-reserved with NaN) + for tech, caps in technologies_dict.items(): + reserved_array = np.full_like(caps, np.nan, dtype=np.float32) + for site_idx, cap in enumerate(caps): + if (tech, site_idx) in reserved_set: + reserved_array[site_idx] = reserved_amounts[(tech, site_idx)] + reserved[tech] = reserved_array + + logger.info( + f"Reserved {len(reserved_set)} sites, {total_reserved_mw:.0f} MW for local demand" + ) + return reserved + + +def apply_capacity_allocation( + technologies_dict: Dict[str, np.ndarray], + allocation_factor: float, +) -> Dict[str, np.ndarray]: + """ + Scale all renewable generator capacities by allocation factor. + + Used for allocated_share scenario where each generator can only provide + allocation_factor (0 < X <= 1) of its nominal capacity. This simulates + grid constraints or partial dedication of renewable infrastructure. + + Parameters + ---------- + technologies_dict : dict + {tech_name: capacity_array} where capacity_array is (n_classes,) + allocation_factor : float + Allocation factor (0 < X <= 1). Each generator's p_nom_max will be + multiplied by this factor. + + Returns + ------- + allocated_capacities : dict + Same structure as technologies_dict with scaled capacities. + Non-NaN entries are multiplied by allocation_factor. + """ + if not (0 < allocation_factor <= 1): + logger.warning( + f"allocation_factor={allocation_factor} outside valid range (0, 1]; " + f"clamping to 1.0" + ) + allocation_factor = min(max(allocation_factor, 0.0001), 1.0) + + allocated = {} + total_original_mw = 0 + total_allocated_mw = 0 + + for tech, capacities in technologies_dict.items(): + allocated_array = np.full_like(capacities, np.nan, dtype=np.float32) + for site_idx, cap in enumerate(capacities): + if not np.isnan(cap) and cap > 0: + allocated_array[site_idx] = cap * allocation_factor + total_original_mw += cap + total_allocated_mw += allocated_array[site_idx] + else: + allocated_array[site_idx] = cap # Keep NaN as-is + allocated[tech] = allocated_array + + logger.info( + f"Applied capacity allocation factor {allocation_factor}: " + f"{total_original_mw:.0f} MW β†’ {total_allocated_mw:.0f} MW" + ) + return allocated + + +def add_renewable_generators( + network: pypsa.Network, + region: str, + technologies_dict: Dict[str, np.ndarray], + cf_ts: xr.DataArray, + tech_costs: pd.Series, + config: dict, + reserved_techs: Optional[Dict[str, np.ndarray]] = None, +) -> Dict: + """ + Add renewable generators to PyPSA network. + + For each technology and class (site), creates an extendable generator on the + electricity bus with capacity ceiling from technologies_dict and time series from cf_ts. + + If reserved_techs provided, marks reserved sites with local_priority=True tag. + + Parameters + ---------- + network : pypsa.Network + PyPSA network to add generators to + region : str + Region name (for bus and generator naming) + technologies_dict : dict + {tech_name: capacity_array} where capacity_array is (n_classes,) + cf_ts : xr.DataArray + Capacity factor time series with dims (technology, class, time) + tech_costs : pd.Series + Technology cost database + config : dict + Configuration dict + reserved_techs : dict, optional + {tech_name: reserved_capacity_array} (NaN for non-reserved) + + Returns + ------- + audit_dict : dict + Statistics: n_generators_added, total_capacity_mw, etc. + """ + n_added = 0 + total_p_nom_max = 0 + n_reserved = 0 + + # Ensure electricity bus exists (umbrella renewable carrier) + elec_bus = "renewable_electricity" + if elec_bus not in network.buses.index: + network.add("Bus", elec_bus, carrier="renewable_electricity", unit="MW") + + # Get discount rate + discount_rate = network.discount_rate + + # Map consolidated file tech names to database keys + tech_db_map = { + "windonshore": "onwind", + "windoffshore": "offwind", + "pvplant": "solar-utility", + } + + for tech, capacities in technologies_dict.items(): + cf_data = cf_ts.sel(technology=tech).values # (class, time) + + # Get technology cost parameters from database + db_tech_name = tech_db_map.get(tech, tech) + try: + tech_params = td.get_tech(tech_costs, db_tech_name) + # investment is EUR/kW, convert to EUR/MW by multiplying by 1000 + overnight_cost = td.get_tech_param(tech_params, "investment", 0) * 1000 + fom_pct = td.get_tech_param(tech_params, "FOM", 0) + fom_cost = overnight_cost * (fom_pct / 100) if overnight_cost > 0 else 0 + lifetime = td.get_tech_param(tech_params, "lifetime", 20) + except Exception as e: + logger.warning( + f"Could not load costs for {db_tech_name}: {e}, using defaults" + ) + overnight_cost, fom_cost, lifetime = 0, 0, 20 + + # Add generator for each site (class) + for site_idx, p_nom_max in enumerate(capacities): + if np.isnan(p_nom_max) or p_nom_max <= 0: + continue + + gen_name = f"renewable_{region}_{tech}_{site_idx}" + reserved_cap = 0.0 + is_reserved = False + + # Check if this site is reserved for local demand + if reserved_techs is not None and tech in reserved_techs: + reserved_cap = reserved_techs[tech][site_idx] + if not np.isnan(reserved_cap) and reserved_cap > 0: + is_reserved = True + n_reserved += 1 + + # If reserved, remove reserved capacity from export supply + if is_reserved: + if reserved_cap >= p_nom_max: + continue + p_nom_max = p_nom_max - reserved_cap + + # Get time series for this site + p_max_pu = cf_data[site_idx, :] # (time,) + + # Ensure p_max_pu is valid (should be [0, 1] after data validation above) + if np.any(np.isnan(p_max_pu)): + logger.warning( + f"Generator {gen_name}: p_max_pu contains NaN values, filling with 0" + ) + p_max_pu = np.nan_to_num(p_max_pu, nan=0.0) + if np.any(p_max_pu < 0) or np.any(p_max_pu > 1): + logger.warning( + f"Generator {gen_name}: p_max_pu out of bounds [0,1], clamping" + ) + p_max_pu = np.clip(p_max_pu, 0, 1) + + # Determine tech-specific carrier while keeping generators on the + # shared `renewable_electricity` bus. This preserves per-tech + # statistics while modelling a common electricity bus. + tech_to_carrier = { + "pvplant": "renewable_pv", + "windonshore": "renewable_wind_onshore", + "windoffshore": "renewable_wind_offshore", + } + carrier_name = tech_to_carrier.get(tech, f"renewable_{tech}") + + # Add generator (extendable with ceiling) + network.add( + "Generator", + gen_name, + bus=elec_bus, + carrier=carrier_name, + p_nom_extendable=True, + p_nom=0, # Start with no capacity; optimization will decide + p_nom_min=0, + p_nom_max=p_nom_max, # Upper ceiling from dataset (MW) + p_max_pu=p_max_pu, # Hourly capacity factor (0-1) + overnight_cost=overnight_cost, + discount_rate=discount_rate, + lifetime=lifetime, + fom_cost=fom_cost, + tags={ + "technology": tech, + "resource_tech": tech, + "region": region, + "local_priority": is_reserved, + "site_id": site_idx, + }, + ) + + n_added += 1 + total_p_nom_max += p_nom_max + + n_sites_added = sum(~np.isnan(capacities)) + logger.info(f"Added {n_sites_added} {tech} generators for {region}") + + logger.info( + f"Total generators added: {n_added}, ceiling capacity: {total_p_nom_max:.0f} MW" + ) + if n_reserved > 0: + logger.info(f" Reserved sites (local_priority): {n_reserved}") + + return { + "n_generators_added": n_added, + "total_capacity_mw": total_p_nom_max, + "n_reserved": n_reserved, + } + + +def _product_has_renewables(config: dict, product: str) -> bool: + """Check if a product uses renewable electricity in its network. + + Returns True if the product should have renewable generators and reservation logic applied. + Returns False if the product uses grid electricity only. + """ + return bool(build_product_components(config, product).get("has_renewables", False)) + + +def sanitize_and_fix( + network: pypsa.Network, logger: Optional[logging.Logger] = None +) -> None: + """Run `network.sanitize()` and apply small, safe fixes. + + Fixes applied: + - Ensure renewable generators have `p_nom_min = 0`. + - Clamp `p_nom_min` to `p_nom_max` when inconsistent. + - Logs a summary of applied fixes. + """ + if logger is None: + _logger = globals()["logger"] + else: + _logger = logger + + _logger.info("Sanitizing network (PyPSA sanitize + post-fix checks)...") + try: + network.sanitize() + except Exception as exc: + _logger.warning(f"network.sanitize() raised an exception: {exc}") + + fixes = [] + + # operate on a snapshot of the generators DataFrame to avoid SettingWithCopy + if len(network.generators) == 0: + _logger.info("No generators to check during sanitize_and_fix.") + return + + gens = network.generators + for gen in gens.index: + try: + carrier = gens.loc[gen, "carrier"] + except Exception: + carrier = None + + # Ensure renewable generators have zero minimum + if isinstance(carrier, str) and carrier.startswith("renewable_"): + try: + current_pmin = ( + gens.loc[gen, "p_nom_min"] if "p_nom_min" in gens.columns else None + ) + except Exception: + current_pmin = None + # Set p_nom_min to 0 if not set or positive + try: + if current_pmin is None or ( + pd.notna(current_pmin) and float(current_pmin) != 0.0 + ): + network.generators.loc[gen, "p_nom_min"] = 0.0 + fixes.append(f"set p_nom_min=0 for {gen}") + except Exception: + # best-effort; continue + pass + + # Clamp p_nom_min <= p_nom_max + try: + pmin = ( + network.generators.loc[gen, "p_nom_min"] + if "p_nom_min" in network.generators.columns + else None + ) + pmax = ( + network.generators.loc[gen, "p_nom_max"] + if "p_nom_max" in network.generators.columns + else None + ) + if pd.notna(pmin) and pd.notna(pmax): + # If pmax < pmin, reduce pmin to pmax + if float(cast(Any, pmax)) < float(cast(Any, pmin)): + network.generators.loc[gen, "p_nom_min"] = float(cast(Any, pmax)) + fixes.append(f"clamped p_nom_min to p_nom_max for {gen}") + except Exception: + pass + + if fixes: + _logger.info(f"sanitize_and_fix applied {len(fixes)} fixes: {fixes[:10]}") + else: + _logger.info("sanitize_and_fix applied no fixes") + + +def _get_components_for_product(config: dict, product: str) -> Tuple[set, set, set]: + """Get links, stores, and buses for a product from the configured stage groups. + + Returns (keep_links, keep_stores, keep_buses) sets. + """ + comp = build_product_components(config, product) + keep_links = set(cast(Iterable[str], comp.get("links") or [])) + keep_stores = set(cast(Iterable[str], comp.get("stores") or [])) + keep_buses = set(cast(Iterable[str], comp.get("buses") or [])) + + logger.info( + f"Components for product={product}: links={keep_links}, stores={keep_stores}, buses={keep_buses}" + ) + return keep_links, keep_stores, keep_buses + + +def apply_product_cutoff( + network: pypsa.Network, product: str, config: Optional[dict] = None +) -> None: + """Remove supply chain components beyond the target product. + + Uses config.product_components to determine which components to keep. + Removes all links and stores not needed for the target product. + Preserves the output buses for the product (e.g., 'steel' for steel product). + Also removes orphaned buses (buses with no connected components). + """ + if config is None: + config = {} + + # Get the set of links, stores, and buses to keep for this product + keep_links, keep_stores, keep_buses = _get_components_for_product(config, product) + + # Remove links not in the keep set + for link_name in list(network.links.index): + if link_name not in keep_links: + try: + network.remove("Link", link_name) + logger.info( + f"Removed Link: {link_name} (not needed for product={product})" + ) + except Exception as e: + logger.warning(f"Could not remove Link {link_name}: {e}") + + # Remove stores not in the keep set + for store_name in list(network.stores.index): + if store_name not in keep_stores: + try: + network.remove("Store", store_name) + logger.info( + f"Removed Store: {store_name} (not needed for product={product})" + ) + except Exception as e: + logger.warning(f"Could not remove Store {store_name}: {e}") + + # Remove orphaned buses (buses not connected to any remaining component) + # BUT preserve buses listed in keep_buses (output bus for this product) + for bus_name in list(network.buses.index): + # Skip essential supply buses and product output buses + if ( + bus_name in ["renewable_electricity", "grid_electricity"] + or bus_name in keep_buses + ): + continue + + has_connection = False + + # Check if bus is used by any link (bus0, bus1, bus2, bus3) + if len(network.links) > 0: + for bcol in ["bus0", "bus1", "bus2", "bus3"]: + if ( + bcol in network.links.columns + and (network.links[bcol] == bus_name).any() + ): + has_connection = True + break + + # Check generators + if not has_connection and len(network.generators) > 0: + if (network.generators["bus"] == bus_name).any(): + has_connection = True + + # Check stores + if not has_connection and len(network.stores) > 0: + if (network.stores["bus"] == bus_name).any(): + has_connection = True + + # Check loads + if not has_connection and len(network.loads) > 0: + if (network.loads["bus"] == bus_name).any(): + has_connection = True + + # Remove if orphaned + if not has_connection: + try: + network.remove("Bus", bus_name) + logger.info(f"Removed orphaned Bus: {bus_name}") + except Exception as e: + logger.warning(f"Could not remove Bus {bus_name}: {e}") + + +def prepare_network( + skeleton_network_path: str, + clustered_renewables_path: str, + tech_costs_path: str, + local_demand_path: Optional[str], + region: str, + product: str, + cost_year: int = 2030, + config: Optional[dict] = None, + scenario: str = "reserved", + route_label: Optional[str] = None, +) -> Tuple[pypsa.Network, Dict]: + """Prepare regional network with clustered renewables. + + Parameters + ---------- + skeleton_network_path : str + Path to base network topology + clustered_renewables_path : str + Path to clustered renewables NetCDF + tech_costs_path : str + Path to technology cost database + region : str + Region name + product : str + Target product (h2, hbi, steel) + cost_year : int + Cost year for technology parameters + config : dict, optional + Configuration dict + scenario : str + "reserved" (default): apply high-CF site reservation for domestic demand + "unreserved": no reservation; full renewable stack available (fallback scenario) + route_label : str, optional + If provided, slice skeleton to this stage only (e.g., "hbi", "steel") + This enables independent per-stage solves for Option B semantics. + + Returns + ------- + network : pypsa.Network + Prepared PyPSA network + audit_dict : dict + Summary statistics + """ + if config is None: + config = {} + + logger.info("=" * 70) + logger.info( + f"Preparing network: region={region}, product={product}, route_label={route_label}" + ) + logger.info("=" * 70) + + # Load skeleton (prefer stage-group specific skeleton when available) + logger.info("Loading skeleton network...") + skeleton_to_load = skeleton_network_path + if route_label: + try: + from pathlib import Path + + p = Path(skeleton_network_path) + stem = p.stem + suffix = p.suffix + # Expect group-specific files like 'generic_model_2050_hbi.nc' + candidate = p.with_name(f"{stem}_{route_label}{suffix}") + if candidate.exists(): + logger.info( + f"Found group-specific skeleton for route_label={route_label}: {candidate}" + ) + skeleton_to_load = str(candidate) + else: + logger.info( + f"No group-specific skeleton found for {route_label}; using {skeleton_network_path}" + ) + except Exception: + # Fallback to provided skeleton path + skeleton_to_load = skeleton_network_path + + network = pypsa.Network(skeleton_to_load) + network.name = f"base_{cost_year}_{region}_{product}" + + # STAGE SLICING: if route_label provided, slice skeleton to that stage only + # Note: previously we skipped slicing when product == route_label (because + # Snakemake params set `product` to the same value). Always slice when a + # `route_label` is supplied to ensure per-stage networks are produced. + if route_label: + logger.info(f"Slicing skeleton to route_label={route_label}") + + # Use configured component resolver to derive which PyPSA components + # (links, stores, buses) belong to this stage-group. This keeps the + # slicing logic driven by `trade_chain` config and the canonical + # TECH_COMPONENT_MAP in `trade_chain_utils.py`. + try: + keep_links, keep_stores, keep_buses = _get_components_for_product( + config, route_label + ) + except Exception as exc: + logger.warning( + f"Could not derive components for route_label={route_label}: {exc}; keeping full skeleton" + ) + keep_links, keep_stores, keep_buses = set(), set(), set() + + # If resolver returned empty sets, warn and keep full skeleton + if not (keep_links or keep_stores or keep_buses): + logger.warning( + f"Component resolver returned no components for {route_label}; keeping full skeleton" + ) + else: + # Remove links not in keep_links + for link_name in list(network.links.index): + if link_name not in keep_links: + try: + network.remove("Link", link_name) + logger.info(f"Removed Link: {link_name}") + except Exception as e: + logger.warning(f"Could not remove Link {link_name}: {e}") + + # Remove stores not in keep_stores + for store_name in list(network.stores.index): + if store_name not in keep_stores: + try: + network.remove("Store", store_name) + logger.info(f"Removed Store: {store_name}") + except Exception as e: + logger.warning(f"Could not remove Store {store_name}: {e}") + + # Add free external inputs ONLY for external materials of this + # configured stage-group. + external_material_inputs = set( + get_external_material_inputs(config, route_label) + ) + + for bus_name in sorted(external_material_inputs): + if bus_name not in network.buses.index: + logger.warning( + f"Expected material input bus missing during stage slicing: {bus_name}; skipping free input generator" + ) + continue + + gen_name = f"{bus_name}_input" + if gen_name not in network.generators.index: + try: + network.add( + "Generator", + gen_name, + bus=bus_name, + carrier=bus_name, + p_nom=1e10, + marginal_cost=0, + ) + logger.info( + f"Added external free input generator from trade chain: {gen_name} on {bus_name}" + ) + except Exception as e: + logger.warning(f"Could not add free input {gen_name}: {e}") + + logger.info( + f"Skeleton sliced to {route_label}: {len(network.links)} links, {len(network.stores)} stores" + ) + + if snakemake.wildcards.wacc == "regional": + logger.info("applying region specific wacc") + wacc = pd.read_csv(snakemake.input.wacc, header=0) + wacc.set_index("region", inplace=True) + discount_rate = wacc.loc[region].values[0] + + elif snakemake.wildcards.wacc == "uniform": + discount_rate = snakemake.params.uniform_interest_rate + + else: + raise ValueError( + f"Unrecognized wacc wildcard: {snakemake.wildcards.wacc}. " + f"Expected 'regional' or 'uniform'." + ) + + network.discount_rate = discount_rate + logger.info(f"Region {region}: discount_rate = {discount_rate}") + + # Apply regional discount rate to all links and stores with costs + for link_name in network.links.index: + if network.links.loc[link_name, "overnight_cost"] > 0: + network.links.loc[link_name, "discount_rate"] = discount_rate + + for store_name in network.stores.index: + if network.stores.loc[store_name, "overnight_cost"] > 0: + network.stores.loc[store_name, "discount_rate"] = discount_rate + + # Load tech costs + logger.info("Loading technology costs...") + tech_costs = td.load_tech_costs(tech_costs_path) + + # Check product_components config to see if product uses renewable_electricity + product_uses_renewables = _product_has_renewables(config, route_label or product) + + if not product_uses_renewables: + logger.info( + f"Product '{route_label}' does not use renewable_electricity: " + f"skipping renewable generator loading" + ) + techs_dict = {} + cf_ts = None + metadata = {} + else: + logger.info("Loading clustered renewables...") + techs_dict, cf_ts, metadata = load_regional_clustered_renewables( + clustered_renewables_path, region + ) + + # Apply capacity allocation or local demand reservation based on scenario + # (only for products with renewable_electricity) + reserved_techs = None + if product_uses_renewables: + logger.info(f"Scenario: {scenario} (scenario flag passed from Snakemake rule)") + + if scenario == "allocated_share": + # Apply capacity allocation: scale p_nom_max by allocation_factor + allocation_factor = config.get("supply_curve", {}).get( + "allocation_factor", 0.5 + ) + logger.info( + f"Applying capacity allocation for scenario=allocated_share: " + f"allocation_factor={allocation_factor}" + ) + if techs_dict: + techs_dict = apply_capacity_allocation(techs_dict, allocation_factor) + else: + # For reserved/unreserved scenarios: apply local demand reservation + reserve_capacity_mw = config.get("reserve_local_demand_mw", 0) + if reserve_capacity_mw <= 0 and scenario == "reserved": + reserve_capacity_mw = load_local_electricity_demand_mw( + local_demand_path, region + ) + logger.info( + f"Derived reservation target from local demand: {reserve_capacity_mw:.1f} MW" + ) + if reserve_capacity_mw > 0 or scenario == "reserved": + logger.info( + f"Applying local demand reservation for scenario={scenario}: " + f"target {reserve_capacity_mw} MW" + ) + reserved_techs = reserve_top_sites_by_highest_cf( + techs_dict, cf_ts, reserve_capacity_mw, scenario=scenario + ) + else: + logger.info( + f"Skipping reservation/allocation: product '{route_label}' does not use renewables" + ) + + # Add renewable generators (only if techs_dict is not empty) + logger.info("Adding renewable generators...") + if techs_dict: + gen_audit = add_renewable_generators( + network, region, techs_dict, cf_ts, tech_costs, config, reserved_techs + ) + else: + logger.info( + "Skipping renewable generator addition (no technologies for this stage)" + ) + gen_audit = { + "n_generators_added": 0, + "total_capacity_mw": 0, + "n_reserved": 0, + } + # Apply product cutoff only when using full skeleton. + # When route_label is provided (dedicated stage-group skeleton), the network + # is already scoped to the correct components, so cutoff is redundant. + if route_label: + logger.info( + f"Using dedicated stage-group skeleton for {route_label}; skipping product cutoff" + ) + else: + logger.info(f"Applying product cutoff for {product}...") + apply_product_cutoff(network, product, config=config) + + # Build audit info + audit_info = { + "region": region, + "product": product, + "cost_year": cost_year, + "scenario": scenario, + "discount_rate": discount_rate, + "renewables_metadata": metadata, + "generators_audit": gen_audit, + "network_stats": { + "n_buses": len(network.buses), + "n_generators": len(network.generators), + "n_links": len(network.links), + "n_stores": len(network.stores), + }, + } + + logger.info("=" * 70) + logger.info("Network prepared successfully:") + logger.info(f" - Buses: {len(network.buses)}") + logger.info(f" - Generators: {len(network.generators)}") + logger.info(f" - Capacity: {gen_audit['total_capacity_mw']:.0f} MW") + logger.info("=" * 70) + + # Run centralized sanitization and small automatic fixes + sanitize_and_fix(network, logger=logger) + + # Stage-slicing helper: produce a subnetwork containing only the specified process carrier + def build_stage_subnetwork(n: pypsa.Network, process_carrier: str) -> pypsa.Network: + """Return a deep copy of the network pruned to links with carrier == process_carrier + + Keeps: + - Links whose `carrier` equals `process_carrier`. + - Generators/stores attached to buses referenced by those links (e.g., raw resource suppliers). + - Removes other conversion links and any isolated buses. + + The returned subnetwork is suitable for independent per-stage marginal solves (Option B semantics). + """ + import copy + + sub = copy.deepcopy(n) + + # Remove links that are not the target process carrier + for link_name in list(sub.links.index): + carrier = sub.links.loc[link_name, "carrier"] + if carrier != process_carrier: + sub.remove("Link", link_name) + + # Remove generators not attached to remaining buses + for gen_name in list(sub.generators.index): + gen_bus = sub.generators.loc[gen_name, "bus"] + if gen_bus not in sub.buses.index: + try: + sub.remove("Generator", gen_name) + except Exception: + pass + + # Remove stores not attached to remaining buses + for store_name in list(sub.stores.index): + store_bus = sub.stores.loc[store_name, "bus"] + if store_bus not in sub.buses.index: + try: + sub.remove("Store", store_name) + except Exception: + pass + + # Remove isolated buses (no generators, no links, no stores) + for bus_name in list(sub.buses.index): + has_gen = ( + len(sub.generators.index[sub.generators["bus"] == bus_name]) > 0 + if len(sub.generators) > 0 + else False + ) + has_store = ( + len(sub.stores.index[sub.stores["bus"] == bus_name]) > 0 + if len(sub.stores) > 0 + else False + ) + has_link = False + if len(sub.links) > 0: + # check bus presence in any of the bus columns + for link_name in sub.links.index: + row = sub.links.loc[link_name] + for bcol in ["bus0", "bus1", "bus2", "bus3"]: + if bcol in row.index and row.get(bcol) == bus_name: + has_link = True + break + if has_link: + break + + if not (has_gen or has_store or has_link): + try: + sub.remove("Bus", bus_name) + except Exception: + pass + + return sub + + # Validate carrier semantics before returning (buses β‰  process carriers; links == process carriers) + def validate_network_carriers(n: pypsa.Network): + """Validate that buses are commodity carriers and links are process carriers. + + Raises ValueError on semantic violations to prevent accidental upstream pricing. + """ + # Define expected process carriers (conversion technologies) + process_carriers = set( + [ + "electrolysis", + "direct_reduction_furnace", + "electric_arc_furnace", + ] + ) + + # Buses must not use process carriers + invalid_buses = [] + for bus_name, row in n.buses.iterrows(): + carrier = row.get("carrier") + if carrier in process_carriers: + invalid_buses.append((bus_name, carrier)) + + if invalid_buses: + msgs = ", ".join([f"{b}({c})" for b, c in invalid_buses]) + raise ValueError( + f"Invalid bus carriers found (process carriers on buses): {msgs}" + ) + + # Links should use process carriers; flag links that look like conversions but use commodity carriers. + # Exclude storage-related links (charge/discharge) which legitimately use commodity carriers. + storage_link_keywords = ("charge", "discharge", "storage") + invalid_links = [] + for link_name, row in n.links.iterrows(): + carrier = row.get("carrier") + # Skip storage-related links (e.g., batt_charge, batt_discharge) + if any(kw in link_name.lower() for kw in storage_link_keywords): + continue + if carrier not in process_carriers: + # A link that looks like a conversion should be a process carrier. + # We conservatively flag any link that has multiple buses (bus0 and bus1) and isn't a process. + n_buses = 0 + for bcol in ("bus0", "bus1", "bus2", "bus3"): + if bcol in row and not pd.isna(row.get(bcol)): + n_buses += 1 + if n_buses >= 2: + invalid_links.append((link_name, carrier)) + + if invalid_links: + msgs = ", ".join([f"{link}({carrier})" for link, carrier in invalid_links]) + raise ValueError( + f"Invalid link carriers found (conversion links missing process carriers): {msgs}" + ) + + try: + validate_network_carriers(network) + except Exception as exc: + logger.error(f"Carrier validation failed: {exc}") + raise + + return network, audit_info + + +def add_labour_cost(n, labour_cost): + + logger.info("adding labour cost") + + carrier_labour_cost_dict = { + "electrolysis": "ely_intensity in h/kW_ely", + "direct_reduction_furnace": "dri_intensity in h/t_dri", + "electric_arc_furnace": "eaf_intensity in h/t_steel", + } + + regional_labour_cost = labour_cost.loc[snakemake.wildcards.region] + wage = regional_labour_cost["steelworker_wage in euro/h"] + + for carrier in carrier_labour_cost_dict.keys(): + mask = n.links.carrier == carrier + if mask.any(): + intensity = regional_labour_cost[carrier_labour_cost_dict[carrier]] + + if carrier == "electrolysis": + fom_cost = wage * intensity * 1000 + n.links.loc[mask, "fom_cost"] += fom_cost + logger.info( + f"Added labour cost as fom_cost to {carrier} links: {wage} €/h * {intensity} h/kW_ely * 1000 = {fom_cost:.2f} €/MW" + ) + + if carrier == "direct_reduction_furnace": + marginal_cost = wage * intensity * n.links.loc[mask, "efficiency"] + n.links.loc[mask, "marginal_cost"] += marginal_cost + logger.info( + f"Added labour cost as marginal_cost to {carrier} links: {wage} €/h * {intensity} h/t_dri * efficiency" + ) + + if carrier == "electric_arc_furnace": + marginal_cost = wage * intensity * n.links.loc[mask, "efficiency"] + n.links.loc[mask, "marginal_cost"] += marginal_cost + logger.info( + f"Added labour cost as marginal_cost to {carrier} links: {wage} €/h * {intensity} h/t_steel * efficiency" + ) + else: + logger.info( + f"carrier {carrier} not in network, skipping labour cost addition for this carrier" + ) + return n + + +# ============================================================================ +# SNAKEMAKE INTEGRATION +# ============================================================================ + +if __name__ == "__main__": + if snakemake is None: + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "prepare_regional_network", + cost_year="2050", + region="South_America", + product="hbi", + scenario="reserved", + wacc="regional", + ) + + # Check if running from Snakemake + if snakemake is not None: + # Snakemake inputs/outputs + skeleton_path = snakemake.input.skeleton + renewables_path = snakemake.input.renewables + tech_costs_path = snakemake.input.tech_costs + local_demand_path = snakemake.input.local_demand + + region = snakemake.params.region + product = snakemake.params.product + route_label = ( + snakemake.params.route_label + if hasattr(snakemake.params, "route_label") + else None + ) # route_label is the process stage name (e.g., "hbi", "steel") + cost_year = ( + snakemake.wildcards.cost_year + if hasattr(snakemake.wildcards, "cost_year") + else 2050 + ) + scenario = ( + snakemake.wildcards.scenario + if hasattr(snakemake.wildcards, "scenario") + else "reserved" + ) + + output_path = snakemake.output[0] + + # Load config (if available) + config_dict = snakemake.config if snakemake is not None else {} + + # Prepare network + network, audit = prepare_network( + skeleton_network_path=skeleton_path, + clustered_renewables_path=renewables_path, + tech_costs_path=tech_costs_path, + local_demand_path=local_demand_path, + region=region, + product=product, + cost_year=cost_year, + config=config_dict, + scenario=scenario, + route_label=route_label, + ) + + # Add labour cost + if snakemake.config["trade_chains"]["labour_cost"]: + logger.info("Adding labour costs to network") + # Load labour cost + labour_cost = pd.read_csv(snakemake.input.labour_cost, header=0, index_col=0) + network = add_labour_cost(network, labour_cost) + + elif not snakemake.config["trade_chains"]["labour_cost"]: + logger.info("Labour cost addition skipped (labour_cost is False)") + + else: + raise ValueError( + f"Unrecognized labour_cost wildcard: {snakemake.config['trade_chains']['labour_cost']}. " + f"Expected 'True' or 'False'." + ) + + # Save network + logger.info(f"Saving network to {output_path}") + network.export_to_netcdf(output_path) + + logger.info("Network preparation complete") diff --git a/workflow/scripts/preprocess_consolidate_renewables.py b/workflow/scripts/preprocess_consolidate_renewables.py new file mode 100644 index 0000000..76a2fec --- /dev/null +++ b/workflow/scripts/preprocess_consolidate_renewables.py @@ -0,0 +1,281 @@ +"""Consolidate regional renewable supply NetCDF files into one unified file. + +Input: regional files from `data/new_renewables/supply_{Region}_2013_cleaned.nc`. +Output: `data/new_renewables_consolidated.nc` with dimensions `(region, site_id, time)`. + +Usage: + python workflow/scripts/preprocess_consolidate_renewables.py [--input-dir data/new_renewables] [--output data/new_renewables_consolidated.nc] +""" + +from pathlib import Path +from typing import List, Tuple +import numpy as np +import xarray as xr +import pandas as pd + +from _helpers import setup_logging + +logger = setup_logging(__name__, log_filename="preprocess_consolidate_renewables.log") + + +def extract_region_from_filename(filepath: Path) -> str: + """Extract region name from supply_{Region}_2013_cleaned.nc filename.""" + name = filepath.stem # Remove .nc extension + # Format: supply_{Region}_2013_cleaned + parts = name.split("_") + if len(parts) >= 2 and parts[0] == "supply": + # Join all middle parts (handle multi-word regions like 'East_Asia') + region = "_".join( + parts[1:-2] + ) # Exclude 'supply' prefix and '2013_cleaned' suffix + return region + raise ValueError(f"Could not extract region from filename: {filepath.name}") + + +def load_and_flatten_region( + filepath: Path, +) -> Tuple[str, np.ndarray, np.ndarray, List[str], int]: + """ + Load a regional NetCDF file, preserving technology dimension but flattening class. + + Returns: + (region_name, capacity_by_tech, capacity_factor_by_tech, tech_names, n_classes) + where capacity_by_tech is (n_tech, n_classes) and capacity_factor_by_tech is (n_tech, n_classes, n_time) + """ + region = extract_region_from_filename(filepath) + logger.info(f"Loading {region} from {filepath.name}") + + ds = xr.open_dataset(filepath) + + # Find capacity variable (2D: technology Γ— class) + cap_var = None + for var_name in ds.data_vars: + if "capacity" in var_name.lower() and ds[var_name].ndim == 2: + cap_var = var_name + break + if cap_var is None: + raise ValueError( + f"Could not find 2D capacity variable in {filepath.name}. Available vars: {list(ds.data_vars)}" + ) + + # Find capacity_factor variable (3D: technology Γ— class Γ— time) + cf_var = None + for var_name in ds.data_vars: + if any( + x in var_name.lower() + for x in ["capacity factor", "capacity_factor", "cf", "power", "profile"] + ): + if ds[var_name].ndim == 3: + cf_var = var_name + break + if cf_var is None: + raise ValueError( + f"Could not find 3D time-series variable in {filepath.name}. Available vars: {list(ds.data_vars)}" + ) + + logger.info(f" Capacity var: {cap_var}, Time-series var: {cf_var}") + logger.info(f" Capacity shape: {ds[cap_var].shape}, CF shape: {ds[cf_var].shape}") + + capacity = ds[cap_var] # (technology, class) + capacity_factor = ds[cf_var] # (technology, class, time) + + # Identify dimension names + tech_dim, class_dim, time_dim = None, None, None + for dim in capacity.dims: + if "tech" in dim.lower(): + tech_dim = dim + if "class" in dim.lower(): + class_dim = dim + + for dim in capacity_factor.dims: + if "tech" in dim.lower(): + tech_dim = dim + if "class" in dim.lower(): + class_dim = dim + if "time" in dim.lower(): + time_dim = dim + + if tech_dim is None or class_dim is None: + raise ValueError( + f"Could not identify technology/class dimensions. Dims: {capacity.dims}" + ) + + # Get technology names from coordinate + tech_names = ds.coords[tech_dim].values.tolist() + n_classes = ds.sizes[class_dim] + n_time = ds.sizes[time_dim] + + logger.info(f" Technologies: {tech_names}, Classes: {n_classes}, Time: {n_time}") + + # Keep technology dimension intact, just extract data + cap_array = capacity.values # (tech, class) + cf_array = capacity_factor.values # (tech, class, time) + + # Ensure time is last dimension + if capacity_factor.dims.index(time_dim) != 2: + cf_array = np.moveaxis(cf_array, capacity_factor.dims.index(time_dim), -1) + + ds.close() + return region, cap_array, cf_array, tech_names, n_classes + + +def consolidate_renewables(input_dir: Path, output_path: Path) -> None: + """ + Consolidate 15 regional NetCDF files into one unified file, preserving technology dimension. + + Output structure: + - Dimensions: region (15), technology, class, time (8760) + - Variables: capacity (region, technology, class), capacity_factor (region, technology, class, time) + + This preserves the technology distinction (wind, solar, etc.) so PyPSA can create separate + generators per technology and region. + """ + input_dir = Path(input_dir) + output_path = Path(output_path) + + # Find all regional files + nc_files = sorted(input_dir.glob("supply_*_2013_cleaned.nc")) + logger.info(f"Found {len(nc_files)} regional files") + + if len(nc_files) == 0: + raise FileNotFoundError(f"No NetCDF files found in {input_dir}") + + # Load all regions (preserve technology and class dimensions) + regions_data = [] + tech_names = None + n_classes = None + time_length = None + + for filepath in nc_files: + region, cap_array, cf_array, file_tech_names, file_n_classes = ( + load_and_flatten_region(filepath) + ) + + # Verify consistency + if tech_names is None: + tech_names = file_tech_names + elif tech_names != file_tech_names: + raise ValueError( + f"Inconsistent technologies: {region} has {file_tech_names}, expected {tech_names}" + ) + + if n_classes is None: + n_classes = file_n_classes + elif n_classes != file_n_classes: + raise ValueError( + f"Inconsistent class count: {region} has {file_n_classes}, expected {n_classes}" + ) + + if time_length is None: + time_length = ( + cap_array.shape[-1] if cap_array.ndim == 3 else cf_array.shape[-1] + ) + elif cf_array.shape[-1] != time_length: + raise ValueError( + f"Inconsistent time dimensions: {region} has {cf_array.shape[-1]}, expected {time_length}" + ) + + regions_data.append( + { + "region": region, + "capacity": cap_array, # (tech, class) + "capacity_factor": cf_array, # (tech, class, time) + } + ) + + logger.info( + f"Tech names: {tech_names}, Classes: {n_classes}, Time length: {time_length}" + ) + + # Stack all regions into (region, tech, class, time) structure + region_names = [r["region"] for r in regions_data] + + # Preallocate arrays + capacity_stacked = np.zeros( + (len(regions_data), len(tech_names), n_classes), dtype=np.float32 + ) + cf_stacked = np.zeros( + (len(regions_data), len(tech_names), n_classes, time_length), dtype=np.float32 + ) + + for i, data in enumerate(regions_data): + capacity_stacked[i, :, :] = data["capacity"] + cf_stacked[i, :, :, :] = data["capacity_factor"] + + logger.info( + f"Created stacked arrays: capacity {capacity_stacked.shape}, cf {cf_stacked.shape}" + ) + + # Create consolidated xarray Dataset with technology dimension preserved + time_index = pd.date_range("2013-01-01", periods=time_length, freq="h") + class_ids = np.arange(n_classes) + + ds_consolidated = xr.Dataset( + data_vars={ + "capacity": (["region", "technology", "class"], capacity_stacked), + "capacity_factor": (["region", "technology", "class", "time"], cf_stacked), + }, + coords={ + "region": region_names, + "technology": tech_names, + "class": class_ids, + "time": time_index, + }, + attrs={ + "description": "Consolidated renewable supply profiles for 15 global regions, with technology distinction", + "source": "data/new_renewables/*.nc", + "temporal_resolution": "hourly", + "year": 2013, + "technologies": ", ".join(tech_names), + }, + ) + + # Add variable attributes + ds_consolidated["capacity"].attrs = { + "long_name": "Installed capacity", + "units": "MW", + } + ds_consolidated["capacity_factor"].attrs = { + "long_name": "Capacity factor (power output / installed capacity)", + "units": "p.u.", + } + + # Write to NetCDF + output_path.parent.mkdir(parents=True, exist_ok=True) + logger.info(f"Writing consolidated file to {output_path}") + ds_consolidated.to_netcdf( + output_path, + encoding={ + "capacity": {"dtype": "float32", "zlib": True, "complevel": 4}, + "capacity_factor": {"dtype": "float32", "zlib": True, "complevel": 4}, + }, + ) + + logger.info(f"βœ“ Consolidation complete: {output_path}") + logger.info(f" Regions: {len(region_names)}") + logger.info(f" Technologies: {tech_names}") + logger.info(f" Classes per region: {n_classes}") + logger.info(f" Timesteps: {time_length}") + logger.info(f" Output size: {output_path.stat().st_size / 1e6:.1f} MB") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--input-dir", + type=Path, + default=Path("data/new_renewables"), + help="Directory containing supply_*.nc files (default: data/new_renewables)", + ) + parser.add_argument( + "--output", + type=Path, + default=Path("data/new_renewables_consolidated.nc"), + help="Output path for consolidated file (default: data/new_renewables_consolidated.nc)", + ) + + args = parser.parse_args() + + consolidate_renewables(args.input_dir, args.output) diff --git a/workflow/scripts/renewable_profiles.py b/workflow/scripts/renewable_profiles.py new file mode 100644 index 0000000..dc7253a --- /dev/null +++ b/workflow/scripts/renewable_profiles.py @@ -0,0 +1,1515 @@ +""" +Renewable Profiles Preprocessing Script + +Builds per-bus renewable energy profiles from PyPSA-Earth data. +Pure functions β€” no hardcoded globals, fully parameterized for notebook/Snakemake use. + +Public API: + build_profiles() β€” Main orchestrator (7-stage pipeline) + load_pypsa_earth_profiles() β€” Load raw PyPSA-Earth profile data + load_region_boundaries() β€” Load GeoJSON region boundaries + save_profiles() β€” Write NetCDF + GeoJSON + metadata.json + load_profiles() β€” Load saved files with version check + audit_profiles_against_raw() β€” Compare processed vs raw stats (min/max/mean/NaN) + +Visualization API: + plot_grid_potentials() β€” Grid-level raster map (GW/cell) + plot_bus_capacity_density() β€” Bus regions colored by capacity density (MW/kmΒ²) +""" + +import json +from pathlib import Path +from datetime import datetime + +import numpy as np +import pandas as pd +import xarray as xr +import geopandas as gpd +import pycountry +import geohash2 +from tqdm import tqdm + +# Visualization imports (required) +import matplotlib.pyplot as plt +import matplotlib.colors as mcolors +import cartopy.crs as ccrs +import cartopy.feature as cfeature +from cartopy.io import shapereader as shprdr +from _helpers import setup_logging + +logger = setup_logging(__name__, log_filename="renewable_profiles.log") + +SCHEMA_VERSION = "1.0" + +# Region/technology compatibility rules. +REGION_TECH_COMPAT = { + "onshore": {"onwind", "solar"}, + "offshore": {"offwind-ac"}, +} + +# Plotting style constants +MAP_STYLE = { + "ne_scale": "50m", + "buffer": 1.0, + "ocean_color": "#e6f2ff", + "land_color": "#f5f5f5", + "coastline_color": "#1a1a1a", + "coastline_width": 1.0, + "border_color": "#1a1a1a", + "border_width": 1.5, + "grid_color": "gray", +} + +# Cache Natural Earth data (expensive to load) +_NE_COUNTRIES_CACHE = None + + +def load_pypsa_earth_profiles(pypsa_earth_path, technologies=None): + """ + Load renewable technology profiles from PyPSA-Earth. + + Parameters + ---------- + pypsa_earth_path : str or Path + Path to pypsa-earth repository + technologies : list, optional + List of technologies to load. Default: ["onwind", "offwind-ac", "solar"] + + Returns + ------- + dict + Technology-keyed dict of xarray Datasets + """ + if technologies is None: + technologies = ["onwind", "offwind-ac", "solar"] + + pypsa_earth_path = Path(pypsa_earth_path) + tech_profiles = {} + + logger.info("Loading renewable technology profiles from PyPSA-Earth...") + for tech in technologies: + path = ( + pypsa_earth_path / "resources" / "renewable_profiles" / f"profile_{tech}.nc" + ) + try: + ds = xr.open_dataset(path) + tech_profiles[tech] = ds + n_hours = len(ds.coords.get("time", ds.coords.get("hour", []))) + logger.info( + f" βœ“ {tech}: {n_hours} hours, {len(ds.bus)} buses, " + f"grid {len(ds.x)}Γ—{len(ds.y)}" + ) + except FileNotFoundError: + logger.warning(f" βœ— {tech}: File not found at {path}") + except Exception as e: + logger.warning( + f" βœ— {tech}: Failed to load ({type(e).__name__}: {str(e)[:50]})" + ) + + if not tech_profiles: + raise RuntimeError("No renewable technology profiles could be loaded!") + + logger.info(f"βœ“ Loaded {len(tech_profiles)} profiles: {list(tech_profiles.keys())}") + return tech_profiles + + +def load_region_boundaries(pypsa_earth_path): + """ + Load onshore and offshore region boundaries from GeoJSON. + + Parameters + ---------- + pypsa_earth_path : str or Path + Path to pypsa-earth repository + + Returns + ------- + tuple + (onshore_gpd, offshore_gpd) β€” GeoDataFrames + """ + pypsa_earth_path = Path(pypsa_earth_path) + + logger.info("Loading geographic region boundaries from GeoJSON...") + onshore_gpd = gpd.read_file( + pypsa_earth_path / "resources" / "bus_regions" / "regions_onshore.geojson" + ) + offshore_gpd = gpd.read_file( + pypsa_earth_path / "resources" / "bus_regions" / "regions_offshore.geojson" + ) + + logger.info(f" Onshore: {len(onshore_gpd)} regions") + logger.info(f" Offshore: {len(offshore_gpd)} regions") + + return onshore_gpd, offshore_gpd + + +def _prepare_regions(onshore_gpd, offshore_gpd, country_codes=None): + """ + Prepare regions: normalize country codes and calculate areas. + + Returns + ------- + GeoDataFrame + Combined onshore + offshore regions with standardized columns + """ + onshore_gpd = onshore_gpd.copy() + offshore_gpd = offshore_gpd.copy() + + # Convert ISO2 β†’ ISO3 country codes + onshore_gpd["country"] = onshore_gpd["country"].apply( + lambda iso2: pycountry.countries.get(alpha_2=iso2).alpha_3 + ) + offshore_gpd["country"] = offshore_gpd["country"].apply( + lambda iso2: pycountry.countries.get(alpha_2=iso2).alpha_3 + ) + + # Filter countries if specified + if country_codes is not None: + onshore_gpd = onshore_gpd[onshore_gpd["country"].isin(country_codes)] + offshore_gpd = offshore_gpd[offshore_gpd["country"].isin(country_codes)] + logger.info(f"Filtered to countries: {country_codes}") + + # Keep original PyPSA region IDs unchanged for robust matching to raw profiles. + onshore_gpd["name"] = onshore_gpd["name"].astype(str) + offshore_gpd["name"] = offshore_gpd["name"].astype(str) + + # Calculate area in kmΒ² using EPSG:6933 projection + onshore_gpd["area_km2"] = onshore_gpd.to_crs("EPSG:6933").geometry.area / 1e6 + offshore_gpd["area_km2"] = offshore_gpd.to_crs("EPSG:6933").geometry.area / 1e6 + + # Mark region type + onshore_gpd["onshore_offshore"] = "onshore" + offshore_gpd["onshore_offshore"] = "offshore" + + # Combine + all_regions = pd.concat([onshore_gpd, offshore_gpd], ignore_index=True) + logger.info(f"Combined: {len(all_regions)} total regions") + + return all_regions + + +def _generate_bus_ids(regions, geohash_precision=6): + """Generate bus IDs as ISO3_ON/OFF_geohash with collision handling.""" + centroids = regions.geometry.centroid + lons = centroids.x.values + lats = centroids.y.values + + # Vectorized geohash encoding + geohash_func = np.vectorize( + lambda lat, lon: geohash2.encode(lat, lon, precision=geohash_precision) + ) + geohashes = geohash_func(lats, lons) + country_codes = regions["country"].astype(str).values + region_flags = np.where( + regions["onshore_offshore"].astype(str).values == "offshore", + "OFF", + "ON", + ) + base_ids = [ + f"{country}_{flag}_{gh}" + for country, flag, gh in zip(country_codes, region_flags, geohashes) + ] + + # Handle collisions + bus_ids = [] + collision_count = 0 + seen_hashes = {} + + for base_id in base_ids: + if base_id in seen_hashes: + seen_hashes[base_id] += 1 + bus_id = f"{base_id}_{seen_hashes[base_id]:03d}" + collision_count += 1 + else: + seen_hashes[base_id] = 0 + bus_id = base_id + bus_ids.append(bus_id) + + logger.info( + f"Generated {len(bus_ids)} bus IDs ({collision_count} collisions handled)" + ) + return bus_ids + + +def _cache_tech_data(profile_datasets): + """ + Cache technology datasets: trim to 8760 hours, sort grids, pre-compute fast lookups. + + Returns + ------- + dict + Technology-keyed cache with profiles, potentials, p_nom_max arrays, + coordinates, and normalized busβ†’index mapping. + """ + tech_data_cache = {} + + for tech, ds in profile_datasets.items(): + profile_8760 = ds["profile"].isel(time=slice(0, 8760)) + if "bus" in profile_8760.dims and "time" in profile_8760.dims: + profile_8760 = profile_8760.transpose("bus", "time") + profile_8760 = profile_8760.values.astype(np.float32) + + potential = ds["potential"].values.astype(np.float32) + x_coords = ds.coords["x"].values.astype(np.float32) + y_coords = ds.coords["y"].values.astype(np.float32) + p_nom_max = ds["p_nom_max"].values.astype(np.float32) + + # Ensure grids are sorted for binary search + if not np.all(np.diff(x_coords) > 0): + x_sort_idx = np.argsort(x_coords) + x_coords = x_coords[x_sort_idx] + potential = potential[:, x_sort_idx] + + if not np.all(np.diff(y_coords) > 0): + y_sort_idx = np.argsort(y_coords) + y_coords = y_coords[y_sort_idx] + potential = potential[y_sort_idx, :] + + # Pre-compute busβ†’index lookup + bus_to_idx = {str(bus_id): idx for idx, bus_id in enumerate(ds.bus.values)} + + tech_data_cache[tech] = { + "profile": profile_8760, + "potential": potential, + "p_nom_max": p_nom_max, + "x": x_coords, + "y": y_coords, + "bus_to_idx": bus_to_idx, + } + + logger.info(f"Cached {len(tech_data_cache)} technology datasets") + return tech_data_cache + + +def _nearest_index(sorted_values, target): + """Return index of nearest value in an ascending 1D array.""" + idx = np.searchsorted(sorted_values, target) + if idx <= 0: + return 0 + if idx >= len(sorted_values): + return len(sorted_values) - 1 + left = sorted_values[idx - 1] + right = sorted_values[idx] + return idx - 1 if abs(target - left) <= abs(right - target) else idx + + +def _extract_profiles_for_bus( + region_name, region_type, lon, lat, tech, tech_data_cache +): + """ + Extract profile data for a single bus-technology pair. + + Returns + ------- + tuple or None + (cf, p_nom_max, avg_cf, quality_flag) or None if missing/incompatible + """ + allowed_techs = REGION_TECH_COMPAT.get(region_type, set()) + if tech not in allowed_techs: + return None + + cache = tech_data_cache[tech] + bus_to_idx = cache["bus_to_idx"] + region_name_str = str(region_name) + + # Offshore regions are prefixed as OFF_* in prepared regions, while raw + # PyPSA-Earth bus IDs are often unprefixed numeric names. + candidate_names = [region_name_str] + if region_name_str.startswith("OFF_"): + candidate_names.append(region_name_str[4:]) + + bus_idx = None + for candidate in candidate_names: + if candidate in bus_to_idx: + bus_idx = bus_to_idx[candidate] + break + + if bus_idx is None: + return None + + try: + cf = cache["profile"][bus_idx, :] + p_nom_max = float(cache["p_nom_max"][bus_idx]) + + x_idx = _nearest_index(cache["x"], lon) + y_idx = _nearest_index(cache["y"], lat) + potential_val = cache["potential"][y_idx, x_idx] + + avg_cf = float(np.nanmean(cf)) if not np.isnan(cf).all() else np.nan + + if np.isnan(p_nom_max) and not np.isnan(potential_val): + p_nom_max = float(potential_val) + + quality_flag = (avg_cf > 0) and (p_nom_max > 0) + return (cf, p_nom_max, avg_cf, quality_flag) + + except Exception as e: + logger.debug( + f"Error extracting {region_name}/{tech}: {type(e).__name__}: {str(e)[:80]}" + ) + return None + + +def _reconcile_grids(tech_data_cache, technologies): + """ + Reconcile grid extents across all technologies. + + Technologies may have identical spacing (e.g., 0.25Β°) but different start/end points. + This function finds the union of all extents and returns a unified grid that covers all data. + + Returns + ------- + tuple + (grid_x, grid_y, reconciled_potentials_dict) + """ + logger.info("Reconciling grid extents across technologies...") + + # Extract grids from all technologies + grids = { + tech: (tech_data_cache[tech]["x"], tech_data_cache[tech]["y"]) + for tech in technologies + } + + # Get reference spacing from first technology + ref_x, ref_y = grids[technologies[0]] + reference_dx = np.diff(ref_x).mean() + reference_dy = np.diff(ref_y).mean() + + logger.info(f" Reference spacing: dx={reference_dx:.6f}, dy={reference_dy:.6f}") + + # Verify all technologies have compatible spacing + for tech in technologies[1:]: + x_tech, y_tech = grids[tech] + dx = np.diff(x_tech).mean() + dy = np.diff(y_tech).mean() + + if not ( + np.isclose(dx, reference_dx, rtol=1e-3) + and np.isclose(dy, reference_dy, rtol=1e-3) + ): + raise ValueError( + f"Spacing mismatch for {tech}: dx={dx:.6f} vs {reference_dx:.6f}, " + f"dy={dy:.6f} vs {reference_dy:.6f}. All technologies must have compatible spacing." + ) + + # Find union bounds + x_min_union = min(x.min() for x, _ in grids.values()) + x_max_union = max(x.max() for x, _ in grids.values()) + y_min_union = min(y.min() for _, y in grids.values()) + y_max_union = max(y.max() for _, y in grids.values()) + + # Reconstruct unified grid with proper uniform spacing + n_x = int(np.round((x_max_union - x_min_union) / reference_dx)) + 1 + n_y = int(np.round((y_max_union - y_min_union) / reference_dy)) + 1 + + grid_x = np.linspace(x_min_union, x_max_union, n_x) + grid_y = np.linspace(y_min_union, y_max_union, n_y) + + logger.info( + f" Union bounds: X=[{x_min_union:.4f}, {x_max_union:.4f}], Y=[{y_min_union:.4f}, {y_max_union:.4f}]" + ) + logger.info( + f" Unified grid: {len(grid_x)} Γ— {len(grid_y)}, spacing dx={np.diff(grid_x).mean():.6f}, dy={np.diff(grid_y).mean():.6f}" + ) + + # Map each technology's potential to unified grid + reconciled_potentials = {} + for tech in technologies: + x_old, y_old = grids[tech] + potential_old = tech_data_cache[tech]["potential"] + + if potential_old.shape != (len(grid_y), len(grid_x)): + # Calculate where old grid starts in new grid (in grid indices) + dx_new = np.diff(grid_x).mean() + dy_new = np.diff(grid_y).mean() + + x_offset = int(np.round((x_old[0] - grid_x[0]) / dx_new)) + y_offset = int(np.round((y_old[0] - grid_y[0]) / dy_new)) + + # Clamp to valid range + x_offset = max(0, min(x_offset, len(grid_x))) + y_offset = max(0, min(y_offset, len(grid_y))) + + # Pad with NaN + padded = np.full((len(grid_y), len(grid_x)), np.nan, dtype=np.float32) + y_end = min(y_offset + potential_old.shape[0], len(grid_y)) + x_end = min(x_offset + potential_old.shape[1], len(grid_x)) + + padded[y_offset:y_end, x_offset:x_end] = potential_old[ + : y_end - y_offset, : x_end - x_offset + ] + + reconciled_potentials[tech] = padded + logger.info( + f" {tech}: padded {potential_old.shape} β†’ {padded.shape} (offset: y={y_offset}, x={x_offset})" + ) + else: + reconciled_potentials[tech] = potential_old + + logger.info("βœ“ Grid reconciliation complete") + return grid_x, grid_y, reconciled_potentials + + +def build_profiles( + profile_datasets, + onshore_regions_gpd, + offshore_regions_gpd, + config=None, +): + """ + Main orchestrator: 7-stage pipeline to build renewable profiles. + + ============================================================================ + OUTPUT DATA FORMAT + ============================================================================ + + This function produces TWO complementary data structures: + + 1. xarray.Dataset (Energy Data) + ───────────────────────────── + Dimensions: [bus, technology, hour, y_grid, x_grid] + + Coordinates: + β€’ bus: Unique renewable region IDs representing a voronoi cell (format: ISO3_ON/OFF_geohash) + β€’ technology: ["onwind", "offwind-ac", "solar"] + β€’ hour: 0–8759 (hourly steps in a year, Jan 1 – Dec 30) + β€’ x_grid, y_grid: 0.25Β° Γ— 0.25Β° grid cell corners + + Data Variables (all float32): + β€’ capacity_factor[bus, tech, hour]: Hourly CF timeseries (0–1) + β€’ p_nom_max[bus, tech]: Max installable capacity (MW) + β€’ avg_cf[bus, tech]: Annual average capacity factor + β€’ potential[y_grid, x_grid, tech]: Grid-level potential (GW/cell) + β€’ weight[bus]: Area-normalized weight (sum=1 across all buses) + β€’ data_quality_flag[bus, tech]: Boolean indicating data completeness + + β†’ Saved to NetCDF (.nc) with zlib compression, chunked by bus + + 2. GeoDataFrame (Geometry & Attributes) + ────────────────────────────────── + Columns: + β€’ bus_id: Unique identifier (matches Dataset bus coordinate) + β€’ pypsa_region_id: Original PyPSA-Earth region name + β€’ country: ISO3 country code + β€’ onshore_offshore: "onshore" or "offshore" + β€’ x_centroid, y_centroid: Polygon centroid (lon, lat) + β€’ area_km2: Voronoi cell area in kmΒ² + β€’ geometry: WKT polygon (Voronoi cell boundary) + + β†’ Saved to GeoJSON (.geojson) with full spatial reference + + Note: GIS data (geometries, country, area) are stored ONLY in GeoJSON, + not duplicated in NetCDF (reduces file size from ~27GB β†’ ~558MB). + Use geometry_gdf for all spatial operations and attribute lookups. + + ============================================================================ + + Parameters + ---------- + profile_datasets : dict + Technology-keyed dict of xarray Datasets + onshore_regions_gpd : GeoDataFrame + Onshore regions + offshore_regions_gpd : GeoDataFrame + Offshore regions + config : dict, optional + Configuration with keys: + - country_codes (list): ISO3 country codes to filter to [None = all] + - geohash_precision (int): 1-12 [default: 6] + - process_by_country (bool): Sequential processing to reduce memory [default: True] + + Returns + ------- + tuple + (dataset, geometry_gdf) where: + - dataset: xr.Dataset with capacity_factor, p_nom_max, avg_cf, potential + - geometry_gdf: GeoDataFrame with bus_id, country, onshore_offshore, centroids, area_km2 + """ + if config is None: + config = {} + + country_codes = config.get("country_codes", None) + geohash_precision = config.get("geohash_precision", 6) + process_by_country = config.get("process_by_country", True) + + technologies = list(profile_datasets.keys()) + logger.info(f"Building profiles for: {technologies}") + + # ===== STAGE 0: Prepare Regions ===== + logger.info("STAGE 0: Prepare regions") + all_regions = _prepare_regions( + onshore_regions_gpd, offshore_regions_gpd, country_codes + ) + + # Validate region typing contract used throughout extraction. + if "onshore_offshore" not in all_regions.columns: + raise ValueError( + "Missing required column 'onshore_offshore' after region preparation" + ) + valid_region_types = {"onshore", "offshore"} + found_region_types = set(all_regions["onshore_offshore"].astype(str).unique()) + if not found_region_types.issubset(valid_region_types): + raise ValueError( + f"Invalid values in 'onshore_offshore': {sorted(found_region_types)}. " + f"Expected subset of {sorted(valid_region_types)}" + ) + + # ===== STAGE 1: Generate Bus IDs ===== + logger.info("STAGE 1: Generate bus IDs") + all_regions["pypsa_region_id"] = all_regions["name"].astype(str) + bus_ids = _generate_bus_ids(all_regions, geohash_precision) + all_regions["bus_id"] = bus_ids + all_regions["geometry_wkt"] = all_regions.geometry.apply(lambda geom: geom.wkt) + + # ===== STAGE 2: Cache Tech Data ===== + logger.info("STAGE 2: Cache technology data") + tech_data_cache = _cache_tech_data(profile_datasets) + + # ===== STAGE 3: Extract Profiles ===== + logger.info("STAGE 3: Extract profiles for all buses") + n_buses = len(all_regions) + n_techs = len(technologies) + n_hours = 8760 + + cf_array = np.full((n_buses, n_techs, n_hours), np.nan, dtype=np.float32) + p_nom_max_array = np.full((n_buses, n_techs), np.nan, dtype=np.float32) + avg_cf_array = np.full((n_buses, n_techs), np.nan, dtype=np.float32) + quality_flag_array = np.full((n_buses, n_techs), False, dtype=bool) + + # Pre-extract arrays once to avoid expensive per-row DataFrame access. + region_names = all_regions["name"].astype(str).values + region_types = all_regions["onshore_offshore"].astype(str).values + countries_arr = all_regions["country"].astype(str).values + centroids = all_regions.geometry.centroid + x_coords = centroids.x.values.astype(np.float32) + y_coords = centroids.y.values.astype(np.float32) + + if process_by_country: + countries_list = sorted(np.unique(countries_arr)) + logger.info(f"Processing {len(countries_list)} countries sequentially") + + for country_idx, country in enumerate(countries_list): + bus_indices = np.where(countries_arr == country)[0] + logger.info( + f" [{country_idx + 1}/{len(countries_list)}] {country}: {len(bus_indices)} regions" + ) + + for bus_idx in bus_indices: + for tech_idx, tech in enumerate(technologies): + result = _extract_profiles_for_bus( + region_name=region_names[bus_idx], + region_type=region_types[bus_idx], + lon=float(x_coords[bus_idx]), + lat=float(y_coords[bus_idx]), + tech=tech, + tech_data_cache=tech_data_cache, + ) + + if result is not None: + cf, p_nom_max, avg_cf, flag = result + cf_array[bus_idx, tech_idx, :] = cf + p_nom_max_array[bus_idx, tech_idx] = p_nom_max + avg_cf_array[bus_idx, tech_idx] = avg_cf + quality_flag_array[bus_idx, tech_idx] = flag + else: + for bus_idx in tqdm(range(n_buses), total=n_buses): + for tech_idx, tech in enumerate(technologies): + result = _extract_profiles_for_bus( + region_name=region_names[bus_idx], + region_type=region_types[bus_idx], + lon=float(x_coords[bus_idx]), + lat=float(y_coords[bus_idx]), + tech=tech, + tech_data_cache=tech_data_cache, + ) + + if result is not None: + cf, p_nom_max, avg_cf, flag = result + cf_array[bus_idx, tech_idx, :] = cf + p_nom_max_array[bus_idx, tech_idx] = p_nom_max + avg_cf_array[bus_idx, tech_idx] = avg_cf + quality_flag_array[bus_idx, tech_idx] = flag + + logger.info( + f"Extracted {np.sum(~np.isnan(p_nom_max_array))} bus-technology combinations" + ) + + # ===== STAGE 4: Reconcile Grids ===== + logger.info("STAGE 4: Reconcile grid extents") + grid_x, grid_y, reconciled_potentials = _reconcile_grids( + tech_data_cache, technologies + ) + + # ===== STAGE 5: Create xarray Dataset ===== + logger.info("STAGE 5: Create xarray dataset") + + # Vectorized extraction (replaces 6Γ— iterrows() calls with direct array access) + bus_ids_final = all_regions["bus_id"].values + countries = countries_arr + onshore_offshore = region_types + area_km2_coords = all_regions["area_km2"].values.astype(np.float32) + + area_sum = np.sum(area_km2_coords) + weights = area_km2_coords / area_sum + + # 3D potential array + n_y_grid = len(grid_y) + n_x_grid = len(grid_x) + grid_potential_3d = np.full((n_y_grid, n_x_grid, n_techs), np.nan, dtype=np.float32) + for tech_idx, tech in enumerate(technologies): + grid_potential_3d[:, :, tech_idx] = reconciled_potentials[tech] + + # Create dataset (only energy/profile data, no GIS metadata) + dataset = xr.Dataset( + { + "capacity_factor": (["bus", "technology", "hour"], cf_array), + "p_nom_max": (["bus", "technology"], p_nom_max_array), + "avg_cf": (["bus", "technology"], avg_cf_array), + "potential": (["y_grid", "x_grid", "technology"], grid_potential_3d), + "weight": (["bus"], weights), + "data_quality_flag": (["bus", "technology"], quality_flag_array), + }, + coords={ + "bus": bus_ids_final, + "technology": technologies, + "hour": np.arange(n_hours, dtype=np.int32), + "x_grid": grid_x, + "y_grid": grid_y, + }, + ) + + # ===== STAGE 6: Add Metadata ===== + logger.info("STAGE 6: Add metadata") + + valid_entries = np.sum(quality_flag_array) + total_entries = n_buses * n_techs + + dataset.attrs.update( + { + "schema_version": SCHEMA_VERSION, + "created": datetime.now().isoformat(), + "technologies": ",".join(technologies), + "geohash_precision": geohash_precision, + "total_buses": len(bus_ids_final), + "complete_rate": f"{100 * valid_entries / total_entries:.1f}%", + } + ) + + # ===== Prepare Geometry GeoDataFrame ===== + logger.info("Preparing geometry GeoDataFrame") + + geometry_gdf = gpd.GeoDataFrame( + { + "bus_id": bus_ids_final, + "pypsa_region_id": all_regions["pypsa_region_id"].values.astype(str), + "country": countries, + "onshore_offshore": onshore_offshore, + "x_centroid": x_coords, + "y_centroid": y_coords, + "area_km2": area_km2_coords, + }, + geometry=all_regions.geometry.values, + crs="EPSG:4326", + ) + + logger.info("βœ“ Profile building complete") + return dataset, geometry_gdf + + +def save_profiles( + dataset, geometry_gdf, output_dir, filename_prefix="renewable_profiles" +): + """ + Save profiles to NetCDF + GeoJSON + metadata.json. + + Parameters + ---------- + dataset : xr.Dataset + From build_profiles() + geometry_gdf : GeoDataFrame + From build_profiles() + output_dir : str or Path + Output directory + filename_prefix : str + Filename prefix (before timestamp) + + Returns + ------- + tuple + (nc_path, geojson_path, metadata_path) + """ + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + nc_filename = f"{filename_prefix}__{timestamp}.nc" + geojson_filename = f"{filename_prefix}__{timestamp}.geojson" + metadata_filename = f"{filename_prefix}__{timestamp}_metadata.json" + + nc_path = output_dir / nc_filename + geojson_path = output_dir / geojson_filename + metadata_path = output_dir / metadata_filename + + # Save NetCDF with compression + logger.info(f"Saving NetCDF to {nc_path}") + + # Build encoding dict only for float variables in energy data + float_vars = ["capacity_factor", "p_nom_max", "avg_cf", "potential", "weight"] + encoding = {} + for var in float_vars: + if var in dataset.data_vars: + encoding[var] = {"dtype": "float32", "zlib": True, "complevel": 4} + + # Save with bus as unlimited dimension (allows future appending) + dataset.to_netcdf(nc_path, encoding=encoding, unlimited_dims=["bus"]) + + # Save GeoJSON + logger.info(f"Saving GeoJSON to {geojson_path}") + geometry_gdf.to_file(geojson_path, driver="GeoJSON") + + # Save metadata with version pinning + logger.info(f"Saving metadata to {metadata_path}") + metadata = { + "schema_version": SCHEMA_VERSION, + "timestamp": datetime.now().isoformat(), + "technologies": dataset.attrs.get("technologies", "").split(","), + "n_buses": int(dataset.attrs.get("total_buses", 0)), + "nc_file": nc_filename, + "geojson_file": geojson_filename, + } + with open(metadata_path, "w") as f: + json.dump(metadata, f, indent=2) + + logger.info(f"βœ“ Saved: {nc_path.name}, {geojson_path.name}, {metadata_path.name}") + return str(nc_path), str(geojson_path), str(metadata_path) + + +def load_profiles(nc_path, geojson_path, metadata_path=None): + """ + Load saved profiles with schema version check. + + Parameters + ---------- + nc_path : str or Path + Path to NetCDF file + geojson_path : str or Path + Path to GeoJSON file + metadata_path : str or Path, optional + Path to metadata.json for version check + + Returns + ------- + tuple + (dataset, geometry_gdf) + """ + nc_path = Path(nc_path) + geojson_path = Path(geojson_path) + + # Load metadata and check version + if metadata_path: + metadata_path = Path(metadata_path) + with open(metadata_path) as f: + metadata = json.load(f) + + if metadata.get("schema_version") != SCHEMA_VERSION: + logger.warning( + f"Schema version mismatch: file={metadata.get('schema_version')}, " + f"code={SCHEMA_VERSION}. Attempting to load anyway..." + ) + + # Load NetCDF + logger.info(f"Loading NetCDF from {nc_path}") + dataset = xr.open_dataset(nc_path) + + # Load GeoJSON + logger.info(f"Loading GeoJSON from {geojson_path}") + geometry_gdf = gpd.read_file(geojson_path) + + logger.info( + f"βœ“ Loaded {len(dataset.bus)} buses, {len(dataset.technology)} technologies" + ) + return dataset, geometry_gdf + + +def _array_stats(arr): + """Compute min/max/mean and NaN counts for a numeric array.""" + arr = np.asarray(arr) + total = int(arr.size) + nan_count = int(np.isnan(arr).sum()) + valid = arr[~np.isnan(arr)] + + if valid.size == 0: + return { + "min": np.nan, + "max": np.nan, + "mean": np.nan, + "nan_count": nan_count, + "total": total, + "nan_share_pct": float(100 * nan_count / max(total, 1)), + } + + return { + "min": float(np.min(valid)), + "max": float(np.max(valid)), + "mean": float(np.mean(valid)), + "nan_count": nan_count, + "total": total, + "nan_share_pct": float(100 * nan_count / max(total, 1)), + } + + +def audit_profiles_against_raw(profiles_ds, raw_profile_datasets, logger_instance=None): + """ + Compare processed dataset stats against raw PyPSA-Earth datasets. + + Parameters + ---------- + profiles_ds : xr.Dataset + Processed dataset from build_profiles(). + raw_profile_datasets : dict[str, xr.Dataset] + Raw technology-keyed datasets from load_pypsa_earth_profiles(). + logger_instance : logging.Logger, optional + Logger to use for output. Defaults to module logger. + + Returns + ------- + dict + Nested stats by technology and variable. + """ + log = logger_instance or logger + audit = {} + + log.info("=" * 70) + log.info("PROCESSED vs RAW AUDIT") + log.info("=" * 70) + + for tech in profiles_ds.technology.values: + tech_key = str(tech) + if tech_key not in raw_profile_datasets: + log.warning( + f"Skipping {tech_key}: technology not present in raw_profile_datasets" + ) + continue + + raw_ds = raw_profile_datasets[tech_key] + tech_result = {} + + log.info("\n" + "-" * 70) + log.info(f"Technology: {tech_key}") + log.info("-" * 70) + + # Potential stats + proc_potential = profiles_ds["potential"].sel(technology=tech_key).values + raw_potential = raw_ds["potential"].values + proc_potential_stats = _array_stats(proc_potential) + raw_potential_stats = _array_stats(raw_potential) + + log.info("potential stats") + log.info( + f" processed: min={proc_potential_stats['min']:.6g}, max={proc_potential_stats['max']:.6g}, " + f"mean={proc_potential_stats['mean']:.6g}, NaN={proc_potential_stats['nan_count']}/{proc_potential_stats['total']} " + f"({proc_potential_stats['nan_share_pct']:.2f}%)" + ) + log.info( + f" raw: min={raw_potential_stats['min']:.6g}, max={raw_potential_stats['max']:.6g}, " + f"mean={raw_potential_stats['mean']:.6g}, NaN={raw_potential_stats['nan_count']}/{raw_potential_stats['total']} " + f"({raw_potential_stats['nan_share_pct']:.2f}%)" + ) + + tech_result["potential"] = { + "processed": proc_potential_stats, + "raw": raw_potential_stats, + } + + # p_nom_max stats + proc_p_nom = profiles_ds["p_nom_max"].sel(technology=tech_key).values + proc_p_nom_stats = _array_stats(proc_p_nom) + + log.info("p_nom_max stats") + log.info( + f" processed: min={proc_p_nom_stats['min']:.6g}, max={proc_p_nom_stats['max']:.6g}, " + f"mean={proc_p_nom_stats['mean']:.6g}, NaN={proc_p_nom_stats['nan_count']}/{proc_p_nom_stats['total']} " + f"({proc_p_nom_stats['nan_share_pct']:.2f}%)" + ) + + p_nom_section = {"processed": proc_p_nom_stats} + if "p_nom_max" in raw_ds.data_vars: + raw_p_nom = raw_ds["p_nom_max"].values + raw_p_nom_stats = _array_stats(raw_p_nom) + log.info( + f" raw: min={raw_p_nom_stats['min']:.6g}, max={raw_p_nom_stats['max']:.6g}, " + f"mean={raw_p_nom_stats['mean']:.6g}, NaN={raw_p_nom_stats['nan_count']}/{raw_p_nom_stats['total']} " + f"({raw_p_nom_stats['nan_share_pct']:.2f}%)" + ) + p_nom_section["raw"] = raw_p_nom_stats + else: + log.info(" raw: p_nom_max not present in raw dataset") + + proc_non_nan = int(np.sum(~np.isnan(proc_p_nom))) + log.info( + f" processed non-NaN p_nom_max buses: {proc_non_nan}/{proc_p_nom.size}" + ) + p_nom_section["processed_non_nan_buses"] = { + "non_nan": proc_non_nan, + "total": int(proc_p_nom.size), + } + + tech_result["p_nom_max"] = p_nom_section + audit[tech_key] = tech_result + + log.info("\nβœ“ Audit complete") + return audit + + +# ============================================================================ +# VISUALIZATION FUNCTIONS (Refactored from notebook) +# ============================================================================ + + +def _get_natural_earth_countries(): + """Load and cache Natural Earth country shapes (expensive operation).""" + global _NE_COUNTRIES_CACHE + if _NE_COUNTRIES_CACHE is None: + nat_earth_shp = shprdr.natural_earth( + resolution="110m", category="cultural", name="admin_0_countries" + ) + _NE_COUNTRIES_CACHE = list(shprdr.Reader(nat_earth_shp).records()) + return _NE_COUNTRIES_CACHE + + +def _parse_region_list(region, dataset=None, geometry_gdf=None): + """ + Parse region input (str or list) into normalized list. + Handles comma-separated strings and nested lists. + If region is None and dataset is provided, returns all unique countries in dataset. + + Parameters + ---------- + region : str, list, or None + Region(s) to parse. If None and dataset is provided, uses all countries in dataset. + dataset : xr.Dataset, optional + Dataset to extract countries from if region is None. + + Returns + ------- + list + Normalized list of region codes. + """ + # If region is None, extract all unique countries from dataset + if region is None: + if geometry_gdf is not None and "country" in geometry_gdf.columns: + unique_countries = sorted( + geometry_gdf["country"].dropna().astype(str).unique().tolist() + ) + logger.info( + "Region not specified. Using all countries from geometry_gdf: " + f"{unique_countries}" + ) + return unique_countries + + if dataset is not None and "country" in dataset: + unique_countries = sorted(list(set(dataset["country"].values))) + logger.info( + f"Region not specified. Using all countries in dataset: {unique_countries}" + ) + return unique_countries + + raise ValueError( + "region is None but no country metadata is available. " + "Pass region explicitly, or provide geometry_gdf with a 'country' column." + ) + + if isinstance(region, str): + return [r.strip() for r in region.split(",") if r.strip()] + + region = [item for item in region if item is not None] + expanded = [] + for item in region: + if isinstance(item, str) and "," in item: + expanded.extend([r.strip() for r in item.split(",") if r.strip()]) + else: + expanded.append(item) + return expanded + + +def _get_country_extent(regions): + """ + Get map extent (bounds) for a list of country codes/names using Natural Earth data. + + Returns + ------- + (min_lon, max_lon, min_lat, max_lat) : tuple + Geographic bounds with buffer applied, ordered for cartopy.Axes.set_extent + """ + countries = _get_natural_earth_countries() + + def normalize_label(label): + return label.strip().upper() if isinstance(label, str) else "" + + def country_matches(label, country_record): + label_upper = normalize_label(label) + if not label_upper: + return False + return any( + label_upper == str(country_record.attributes.get(attr, "")).upper() + for attr in ("ISO_A2", "ISO_A3", "NAME_LONG", "NAME", "ABBREV") + ) + + matched_geometries = [] + unmatched_regions = [] + for r in regions: + geom = next( + (c.geometry.buffer(0) for c in countries if country_matches(r, c)), + None, + ) + if geom is None: + unmatched_regions.append(r) + else: + matched_geometries.append(geom) + + shapes = gpd.GeoDataFrame(geometry=matched_geometries, crs="EPSG:4326") + + if unmatched_regions: + logger.warning( + f"No Natural Earth country match for: {unmatched_regions}. " + "These labels are ignored for extent calculation." + ) + + if shapes.empty: + logger.warning( + f"No Natural Earth matches for regions {regions}. Using global extent." + ) + return -180, -90, 180, 90 + + # Natural Earth geometries are lon/lat; bounds can be taken directly in EPSG:4326. + minx, miny, maxx, maxy = shapes.total_bounds + buffer = MAP_STYLE["buffer"] + extent = (minx - buffer, maxx + buffer, miny - buffer, maxy + buffer) + logger.info( + "Computed extent from %d matched countries [min_lon, max_lon, min_lat, max_lat]: " + "[%.2f, %.2f, %.2f, %.2f]", + len(shapes), + extent[0], + extent[1], + extent[2], + extent[3], + ) + return extent + + +def _setup_map_features(ax, extent): + """Apply standard map styling and background features.""" + ax.set_extent(extent, crs=ccrs.PlateCarree()) + + ne_scale = MAP_STYLE["ne_scale"] + + # Background + ax.add_feature( + cfeature.OCEAN.with_scale(ne_scale), + facecolor=MAP_STYLE["ocean_color"], + zorder=0, + alpha=0.3, + ) + ax.add_feature( + cfeature.LAND.with_scale(ne_scale), + facecolor=MAP_STYLE["land_color"], + zorder=0, + ) + ax.add_feature( + cfeature.COASTLINE.with_scale(ne_scale), + linewidth=MAP_STYLE["coastline_width"], + zorder=1, + alpha=0.7, + color=MAP_STYLE["coastline_color"], + ) + + # Borders on top + ax.add_feature( + cfeature.BORDERS.with_scale(ne_scale), + linewidth=MAP_STYLE["border_width"], + linestyle="-", + zorder=10, + alpha=0.7, + color=MAP_STYLE["border_color"], + edgecolor=MAP_STYLE["border_color"], + ) + + +def plot_grid_potentials( + dataset, + region=None, + technology="onwind", + geometry_gdf=None, + figsize=(14, 11), + projection=ccrs.PlateCarree(), + cmap="Blues", + title=None, + filename=None, + gridlabels=True, +): + """ + Plot grid-level renewable potential as raster map. + + Parameters + ---------- + dataset : xr.Dataset + Output from build_profiles() or load_profiles() + region : str, list, or None + Region(s) to display: country codes (ISO2/ISO3) or names, e.g., "US,CA" or ["US", "CA"]. + If None, uses all countries present in dataset. Default: None + technology : str + Technology: "onwind", "offwind-ac", or "solar". Default: "onwind" + geometry_gdf : GeoDataFrame, optional + GeoDataFrame with bus geometries and country data (from build_profiles() or load_profiles()). + Used to look up countries when region is None. Default: None + figsize : tuple + Figure size (width, height) in inches. Default: (14, 11) + projection : cartopy CRS + Map projection. Default: PlateCarree (lat/lon) + cmap : str + Matplotlib colormap name. Default: "Blues" + title : str + Plot title. If None, auto-generated. Default: None + filename : str + Save path if provided (e.g., "plot.png", "plot.pdf"). Default: None + gridlabels : bool + Show latitude/longitude gridlines. Default: True + + Returns + ------- + fig, ax : matplotlib Figure and Axes objects + """ + regions = _parse_region_list(region, dataset=dataset, geometry_gdf=geometry_gdf) + extent = _get_country_extent(regions) + + font_scale = figsize[0] / 10 + plt.rcParams.update({"font.size": 10 * font_scale}) + + fig, ax = plt.subplots(figsize=figsize, subplot_kw={"projection": projection}) + + # Setup map + _setup_map_features(ax, extent) + + # Extract grid + tech_idx = list(dataset.technology.values).index(technology) + potential_gw = dataset["potential"].values[:, :, tech_idx] / 1e3 # MW β†’ GW + + x_grid = dataset.coords["x_grid"].values + y_grid = dataset.coords["y_grid"].values + + # Convert cell centers to edges for proper pcolormesh alignment + # If spacing is uniform (from linspace), compute half-cell offsets + dx = (x_grid[-1] - x_grid[0]) / (len(x_grid) - 1) if len(x_grid) > 1 else 0.25 + dy = (y_grid[-1] - y_grid[0]) / (len(y_grid) - 1) if len(y_grid) > 1 else 0.25 + + # Create edge arrays: add half-cell boundaries + x_edges = np.concatenate( + [[x_grid[0] - dx / 2], (x_grid[:-1] + x_grid[1:]) / 2, [x_grid[-1] + dx / 2]] + ) + y_edges = np.concatenate( + [[y_grid[0] - dy / 2], (y_grid[:-1] + y_grid[1:]) / 2, [y_grid[-1] + dy / 2]] + ) + + X, Y = np.meshgrid(x_edges, y_edges) + + im = ax.pcolormesh( + X, + Y, + potential_gw, + transform=ccrs.PlateCarree(), + cmap=cmap, + shading="flat", # 'flat' works with edges + zorder=2, + alpha=0.85, + ) + + # Colorbar + cbar = plt.colorbar(im, ax=ax, shrink=0.75, pad=0.08, aspect=25) + cbar.set_label( + "Renewable Potential (GW)", fontsize=11 * font_scale, fontweight="bold" + ) + cbar.ax.tick_params(labelsize=9 * font_scale) + + # Labels and title + if title is None: + title = f"{technology.upper().replace('-', ' ')} - Grid-Level Potential" + ax.set_title(title, fontsize=14 * font_scale, fontweight="bold", pad=20) + ax.set_xlabel("Longitude (Β°E)", fontsize=10 * font_scale, fontweight="bold") + ax.set_ylabel("Latitude (Β°N)", fontsize=10 * font_scale, fontweight="bold") + + # Gridlines + if gridlabels: + gl = ax.gridlines( + crs=ccrs.PlateCarree(), + draw_labels=True, + linewidth=0.5, + color=MAP_STYLE["grid_color"], + alpha=0.3, + linestyle="--", + zorder=2, + ) + gl.top_labels = False + gl.right_labels = False + gl.xlabel_style = {"size": 9 * font_scale, "color": "#555555"} + gl.ylabel_style = {"size": 9 * font_scale, "color": "#555555"} + + # Border + ax.spines["geo"].set_visible(True) + ax.spines["geo"].set_linewidth(1.5) + ax.spines["geo"].set_edgecolor(MAP_STYLE["border_color"]) + + # Save + if filename is not None: + plt.savefig(filename, dpi=300, bbox_inches="tight", facecolor="white") + logger.info(f"βœ“ Saved plot to {filename}") + + return fig, ax + + +def plot_bus_capacity_density( + dataset, + region=None, + technology="onwind", + geometry_gdf=None, + figsize=(14, 11), + projection=ccrs.PlateCarree(), + cmap="Blues", + vmin=None, + vmax=None, + title=None, + filename=None, + gridlabels=True, + edgecolor="black", + linewidth=0.3, +): + """ + Plot bus region geometries colored by installable capacity density. + + Each bus region (Voronoi polygon) is colored by its p_nom_max per unit area. + Useful for comparing capacity potential across regions. + + Parameters + ---------- + dataset : xr.Dataset + Output from build_profiles() or load_profiles() + region : str, list, or None + Region(s) to display: country codes (ISO2/ISO3) or names. + If None, uses all countries present in dataset. Default: None + technology : str + Technology: "onwind", "offwind-ac", or "solar". Default: "onwind" + geometry_gdf : GeoDataFrame + **REQUIRED**. GeoDataFrame with bus geometries, country, and area_km2 (from build_profiles() or load_profiles()). + GIS metadata is now stored only in GeoJSON, not in the xarray dataset. + figsize : tuple + Figure size (width, height) in inches. Default: (14, 11) + projection : cartopy CRS + Map projection. Default: PlateCarree (lat/lon) + cmap : str + Matplotlib colormap. Default: "Blues" + vmin, vmax : float, optional + Color normalization limits (MW/kmΒ²). If None, uses 5-95 percentile for automatic scaling. + title : str + Plot title. If None, auto-generated. Default: None + filename : str + Save path if provided. Default: None + gridlabels : bool + Show latitude/longitude gridlines. Default: True + edgecolor : str + Color of region boundaries. Default: "black" + linewidth : float + Width of region edges. Default: 0.3 + + Returns + ------- + fig, ax : matplotlib Figure and Axes objects + + Examples + -------- + # Load from saved files + dataset, geometry_gdf = load_profiles("data.nc", "data.geojson") + # Plot specific region + fig, ax = plot_bus_capacity_density(dataset, "US", geometry_gdf=geometry_gdf) + + # Plot all countries in dataset + fig, ax = plot_bus_capacity_density(dataset, geometry_gdf=geometry_gdf) + """ + # geometry_gdf is now REQUIRED (GIS data no longer in xarray) + if geometry_gdf is None: + raise ValueError( + "geometry_gdf parameter is required. GIS data (geometries, country, area) " + "are now stored only in GeoJSON, not in the xarray dataset." + ) + + regions = _parse_region_list(region, dataset=dataset, geometry_gdf=geometry_gdf) + + # Convert ISO2 β†’ ISO3 for dataset filtering + region_iso3 = [] + for r in regions: + r_upper = r.upper() + if len(r_upper) == 2: + try: + iso3 = pycountry.countries.get(alpha_2=r_upper).alpha_3 + region_iso3.append(iso3) + except AttributeError: + region_iso3.append(r_upper) + else: + region_iso3.append(r_upper) + + extent = _get_country_extent(regions) + + font_scale = figsize[0] / 10 + plt.rcParams.update({"font.size": 10 * font_scale}) + + fig, ax = plt.subplots(figsize=figsize, subplot_kw={"projection": projection}) + + # Setup map + _setup_map_features(ax, extent) + + # Extract technology index + tech_idx = list(dataset.technology.values).index(technology) + p_nom_max_data = dataset.isel(technology=tech_idx)["p_nom_max"].values + bus_ids = dataset["bus"].values + + # Get country and area data from geometry_gdf + geometry_gdf = geometry_gdf.copy() + if "bus_id" not in geometry_gdf.columns: + geometry_gdf["bus_id"] = geometry_gdf.get("name", geometry_gdf.index) + + countries_in_gdf = set(geometry_gdf.get("country", ["UNK"]).unique()) + matching_countries = [c for c in countries_in_gdf if c in region_iso3] + + if not matching_countries: + raise ValueError( + f"No data for region {region_iso3} and technology {technology}. " + f"Available countries in GeoJSON: {sorted(countries_in_gdf)}" + ) + + # Filter geometry_gdf to matching countries + geometry_gdf_filtered = geometry_gdf[ + geometry_gdf.get("country", "UNK").isin(matching_countries) + ] + + # Extract geometries and calculate densities + geometries = [] + densities = [] + + logger.info( + f"Loading {len(geometry_gdf_filtered)} bus geometries for {technology}..." + ) + + for bus_idx, (_, gdf_row) in enumerate( + tqdm( + geometry_gdf_filtered.iterrows(), + total=len(geometry_gdf_filtered), + desc="Processing geometries", + ) + ): + try: + # Get bus ID to match with dataset + bus_id = gdf_row.get( + "bus_id", + gdf_row.name if isinstance(gdf_row.name, str) else str(bus_idx), + ) + + # Find matching index in dataset + dataset_idx = None + for ds_idx, ds_bus_id in enumerate(bus_ids): + if str(ds_bus_id) == str(bus_id): + dataset_idx = ds_idx + break + + if dataset_idx is None: + continue + + p_nom_max = p_nom_max_data[dataset_idx] + area_km2 = gdf_row.get("area_km2", 1.0) + geom = gdf_row.geometry + + if not ( + np.isnan(p_nom_max) + or np.isnan(area_km2) + or p_nom_max <= 0 + or area_km2 <= 0 + ): + geometries.append(geom) + densities.append(p_nom_max / area_km2) # MW/kmΒ² + except Exception as e: + logger.debug(f"Skipped bus {bus_idx}: {e}") + + if not geometries: + raise ValueError(f"No valid geometries for {region} and {technology}") + + logger.info( + f"Plotting {len(geometries)} regions, density range: " + f"{np.min(densities):.3f} - {np.max(densities):.3f} MW/kmΒ²" + ) + + # Normalize color scale + if vmin is None or vmax is None: + vmin, vmax = np.nanpercentile(densities, [5, 95]) + norm = mcolors.Normalize(vmin=vmin, vmax=vmax) + + # Plot geometries + for geom, density in zip(geometries, densities): + color = plt.cm.get_cmap(cmap)(norm(density)) + ax.add_geometries( + [geom], + crs=ccrs.PlateCarree(), + facecolor=color, + edgecolor=edgecolor, + linewidth=linewidth, + alpha=0.85, + zorder=5, + ) + + # Colorbar + sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm) + sm.set_array([]) + cbar = plt.colorbar(sm, ax=ax, shrink=0.75, pad=0.08, aspect=25) + cbar.set_label( + "Capacity Density (MW/kmΒ²)", fontsize=11 * font_scale, fontweight="bold" + ) + cbar.ax.tick_params(labelsize=9 * font_scale) + + # Labels and title + if title is None: + title = f"{technology.upper().replace('-', ' ')} - Installable Capacity Density" + ax.set_title(title, fontsize=14 * font_scale, fontweight="bold", pad=20) + ax.set_xlabel("Longitude (Β°E)", fontsize=10 * font_scale, fontweight="bold") + ax.set_ylabel("Latitude (Β°N)", fontsize=10 * font_scale, fontweight="bold") + + # Gridlines + if gridlabels: + gl = ax.gridlines( + crs=ccrs.PlateCarree(), + draw_labels=True, + linewidth=0.5, + color=MAP_STYLE["grid_color"], + alpha=0.3, + linestyle="--", + zorder=2, + ) + gl.top_labels = False + gl.right_labels = False + gl.xlabel_style = {"size": 9 * font_scale, "color": "#555555"} + gl.ylabel_style = {"size": 9 * font_scale, "color": "#555555"} + + # Border + ax.spines["geo"].set_visible(True) + ax.spines["geo"].set_linewidth(1.5) + ax.spines["geo"].set_edgecolor(MAP_STYLE["border_color"]) + + # Save + if filename is not None: + plt.savefig(filename, dpi=300, bbox_inches="tight", facecolor="white") + logger.info(f"βœ“ Saved plot to {filename}") + + return fig, ax + + +if __name__ == "__main__": + # Placeholder for future CLI/Snakemake integration + raise NotImplementedError( + "CLI interface not yet implemented. Use as a module: " + "from workflow.scripts.renewable_profiles import build_profiles" + ) diff --git a/workflow/scripts/retrieve_cost_data.py b/workflow/scripts/retrieve_cost_data.py deleted file mode 100644 index 83425eb..0000000 --- a/workflow/scripts/retrieve_cost_data.py +++ /dev/null @@ -1,44 +0,0 @@ -# SPDX-FileCopyrightText: Contributors to PyPSA-Eur -# -# SPDX-License-Identifier: MIT -""" -Retrieve cost data from ``technology-data``. -""" - -import logging -from pathlib import Path - -from _helpers import progress_retrieve #configure_logging, , set_scenario_config - -logger = logging.getLogger(__name__) - -if __name__ == "__main__": - if "snakemake" not in globals(): - from _helpers import mock_snakemake - - snakemake = mock_snakemake("retrieve_cost_data", year=2030) - rootpath = ".." - else: - rootpath = "." - # configure_logging(snakemake) - # set_scenario_config(snakemake) - - version = snakemake.params.version - if "/" in version: - baseurl = f"https://raw.githubusercontent.com/{version}/outputs/" - else: - baseurl = f"https://raw.githubusercontent.com/PyPSA/technology-data/{version}/outputs/" - filepath = Path(snakemake.output[0]) - url = baseurl + filepath.name - - print(url) - - to_fn = Path(rootpath) / filepath - - print(to_fn) - - logger.info(f"Downloading technology data from '{url}'.") - disable_progress = snakemake.config["run"].get("disable_progressbar", False) - progress_retrieve(url, to_fn, disable=disable_progress) - - logger.info(f"Technology data available at at {to_fn}") \ No newline at end of file diff --git a/workflow/scripts/tech_database.py b/workflow/scripts/tech_database.py new file mode 100644 index 0000000..d2c4730 --- /dev/null +++ b/workflow/scripts/tech_database.py @@ -0,0 +1,87 @@ +# SPDX-FileCopyrightText: Contributors to shift +# +# SPDX-License-Identifier: MIT +""" +Technology database utilities: Download and query PyPSA cost data. + +Dual-purpose module: Snakemake rule for downloading tech costs + importable utilities. +""" + +from pathlib import Path +from typing import Any + +import pandas as pd +from _helpers import setup_logging + +snakemake: Any = globals().get("snakemake") +logger = setup_logging(__name__, snakemake=snakemake, log_filename="tech_database.log") + + +def download_tech_database( + version: str, output_path: str, disable_progress: bool = False +) -> None: + """Download PyPSA technology-data from GitHub. Supports standard versions or custom paths.""" + from _helpers import progress_retrieve + + # Construct URL based on version format (matches retrieve_cost_data.py logic) + if "/" in version: + # Custom GitHub path: "owner/repo/branch" -> https://raw.githubusercontent.com/owner/repo/branch/outputs/ + baseurl = f"https://raw.githubusercontent.com/{version}/outputs/" + else: + # Default PyPSA path: "v0.5.0" -> https://raw.githubusercontent.com/PyPSA/technology-data/v0.5.0/outputs/ + baseurl = f"https://raw.githubusercontent.com/PyPSA/technology-data/{version}/outputs/" + + filepath = Path(output_path) + url = baseurl + filepath.name + + logger.info(f"Downloading technology data from '{url}'.") + progress_retrieve(url, str(filepath), disable=disable_progress) + logger.info(f"Technology data available at {filepath}") + + +def load_tech_costs(path: str) -> pd.Series: + """Load technology costs CSV into MultiIndex Series [technology, parameter].""" + df = pd.read_csv(path, index_col=[0, 1]) + return df.iloc[:, 0] # Return first column as Series with MultiIndex + + +def get_tech(tech_costs: pd.Series, tech_name: str) -> pd.Series: + """Retrieve all parameters for a specific technology. Returns empty Series if not found.""" + try: + return tech_costs.loc[tech_name] + except KeyError: + logger.warning(f"Technology '{tech_name}' not found in database") + return pd.Series() + + +def get_tech_param( + tech_params: pd.Series, param_name: str, default: float | None = None +) -> float: + """Extract technology parameter with optional fallback default.""" + try: + return tech_params.loc[param_name] + except KeyError: + if default is not None: + logger.warning( + f"Parameter '{param_name}' not found, using default: {default}" + ) + return default + raise + + +# Snakemake integration: Allow direct execution as rule +if __name__ == "__main__": + if snakemake is None: + from _helpers import mock_snakemake + + snakemake = mock_snakemake("retrieve_cost_data", year=2030) + rootpath = ".." + else: + rootpath = "." + + # Download technology data using Snakemake parameters + version = snakemake.params.version + output_path = Path(rootpath) / snakemake.output[0] + disable_progress = snakemake.config["run"].get("disable_progressbar", False) + + download_tech_database(version, str(output_path), disable_progress=disable_progress) diff --git a/workflow/scripts/trade_chain_utils.py b/workflow/scripts/trade_chain_utils.py new file mode 100644 index 0000000..72112b8 --- /dev/null +++ b/workflow/scripts/trade_chain_utils.py @@ -0,0 +1,388 @@ +"""Helpers for normalizing trade-chain config and deriving stage groups. + +The config currently stores a single trade chain with ordered stages keyed by +stage number. This module turns that into a stable, ordered representation and +derives the stage group boundaries implied by tradeable commodities. +""" + +from __future__ import annotations + +from typing import Dict, List, Optional, Tuple + +from _helpers import setup_logging + +logger = setup_logging(__name__) + + +ENERGY_INPUTS = {"renewable_electricity", "grid_electricity"} +BUS_ALIASES = { + "H2": "hydrogen", + "h2": "hydrogen", + "hydrogen": "hydrogen", + "renewable_electricity": "renewable_electricity", + "grid_electricity": "grid_electricity", +} + +# Explicit mapping from high-level process identifiers to concrete PyPSA components. +# Keep this mapping authoritative so config `process_label` remains high-level. +TECH_COMPONENT_MAP = [ + { + "match": ("electro", "electrolyser", "electrolyzer"), + # Some skeletons name this link `electrolysis` while others use + # `electrolyzer`/`electrolyser`. Include common variants so slicer + # keeps the actual link present in the network. + "links": ("electrolyzer", "electrolysis", "electrolyser"), + "stores": ("h2_storage",), + # expected material reactants, energy inputs, and outputs + "materials": (), + "energy": ("renewable_electricity",), + "outputs": ("hydrogen",), + "buses": ("hydrogen", "renewable_electricity"), + }, + { + "match": ("dri", "direct_reduction", "reduction"), + "links": ("dri",), + "stores": ("h2_storage", "hbi_storage"), + "materials": ("iron_ore", "hydrogen"), + "energy": ("renewable_electricity",), + "outputs": ("hbi",), + "buses": ( + "iron_ore", + "hydrogen", + "hbi", + "renewable_electricity", + "grid_electricity", + ), + }, + { + "match": ("eaf", "electric_arc", "arc_furnace"), + # Support both `eaf` and `eaf-grid` link namings found in skeletons. + "links": ("eaf", "eaf-grid", "electric_arc_furnace"), + "stores": ("steel_storage",), + "materials": ("hbi",), + "energy": ("grid_electricity", "renewable_electricity"), + "outputs": ("steel",), + "buses": ("hbi", "steel", "grid_electricity", "renewable_electricity"), + }, +] + + +def _components_for_process_label( + process_label: str, +) -> Optional[Dict[str, Tuple[str, ...]]]: + """Return mapped components and expected IO for a given process_label or None if not found.""" + if not process_label: + return None + pl = process_label.lower() + for entry in TECH_COMPONENT_MAP: + for pat in entry["match"]: + if pat in pl: + return { + "links": tuple(entry.get("links", ())), + "stores": tuple(entry.get("stores", ())), + "buses": tuple(entry.get("buses", ())), + "materials": tuple(entry.get("materials", ())), + "energy": tuple(entry.get("energy", ())), + "outputs": tuple(entry.get("outputs", ())), + } + return None + + +def validate_stage_io(stage: Dict, raise_on_mismatch: bool = False) -> bool: + """Validate that a stage's declared inputs/outputs match the canonical mapping. + + Returns True if validation passes or no mapping exists. If `raise_on_mismatch` is True, + a ValueError is raised on mismatch; otherwise a warning is returned via logging and False is returned. + """ + process_label = str(stage.get("process_label", "")).strip() + if not process_label: + return True + + comp = _components_for_process_label(process_label) + if comp is None: + # No mapping β€” nothing to validate + return True + + # Normalize declared inputs/outputs + declared_materials, declared_energy = split_stage_inputs(stage) + declared_materials_norm = {_normalize_commodity(m) for m in declared_materials} + declared_energy_norm = {_normalize_commodity(e) for e in declared_energy} + declared_output = _normalize_commodity(stage.get("output_commodity", "")) + + expected_materials = {_normalize_commodity(m) for m in comp.get("materials", ())} + expected_energy = {_normalize_commodity(e) for e in comp.get("energy", ())} + expected_outputs = {_normalize_commodity(o) for o in comp.get("outputs", ())} + + msgs = [] + # Materials: declared_materials should be a superset of expected_materials or vice versa? + # We allow declared to be a superset (user may include both H2 and iron_ore), but require at least one overlap + if expected_materials and declared_materials_norm.isdisjoint(expected_materials): + msgs.append( + f"Stage '{process_label}': declared material inputs {declared_materials_norm} do not overlap expected {expected_materials}" + ) + + # Energy: declared energy should overlap expected energy + if expected_energy and declared_energy_norm.isdisjoint(expected_energy): + msgs.append( + f"Stage '{process_label}': declared energy inputs {declared_energy_norm} do not overlap expected {expected_energy}" + ) + + # Output: declared_output should be one of expected outputs + if expected_outputs and declared_output and declared_output not in expected_outputs: + msgs.append( + f"Stage '{process_label}': declared output '{declared_output}' not in expected outputs {expected_outputs}" + ) + + if msgs: + if raise_on_mismatch: + raise ValueError("; ".join(msgs)) + for m in msgs: + logger.warning(m) + return False + + return True + + +def iter_trade_chains(config: Dict) -> List[Dict]: + """Return trade chain definitions as a list.""" + + trade_chains = config.get("trade_chains") + if not trade_chains: + return [] + if isinstance(trade_chains, dict): + return [trade_chains] + return list(trade_chains) + + +def get_trade_chain(config: Dict) -> Dict: + """Return the primary trade chain from config.""" + + chains = iter_trade_chains(config) + if not chains: + return {} + return chains[0] + + +def get_ordered_stages(chain: Dict) -> List[Dict]: + """Return stages ordered by their numeric key or declared order.""" + + stages = chain.get("stages", {}) + if isinstance(stages, dict): + items = sorted(stages.items(), key=lambda item: int(item[0])) + ordered = [] + for key, stage in items: + stage_dict = dict(stage) + stage_dict.setdefault("order", int(key)) + ordered.append(stage_dict) + return ordered + + ordered = [dict(stage) for stage in stages] + ordered.sort(key=lambda stage: int(stage.get("order", 0))) + return ordered + + +def _as_list(value) -> List[str]: + if value is None: + return [] + if isinstance(value, (list, tuple, set)): + return [str(item) for item in value] + return [str(value)] + + +def _normalize_commodity(name: str) -> str: + return BUS_ALIASES.get(str(name), str(name)) + + +def split_stage_inputs(stage: Dict) -> Tuple[List[str], List[str]]: + """Split a stage's inputs into material inputs and energy inputs.""" + + if "material_inputs" in stage or "energy_inputs" in stage: + raw_inputs = _as_list(stage.get("material_inputs")) + energy_inputs = _as_list(stage.get("energy_inputs")) + elif "input_commodities" in stage: + raw_inputs = _as_list(stage.get("input_commodities")) + energy_inputs = _as_list(stage.get("energy_inputs")) + else: + raw_inputs = _as_list(stage.get("input_commodity")) + energy_inputs = [] + + materials = [] + energy = list(energy_inputs) + + for input_name in raw_inputs: + if input_name in ENERGY_INPUTS: + energy.append(input_name) + else: + materials.append(input_name) + + return materials, energy + + +def get_stage_groups(chain: Dict) -> List[Dict]: + """Group contiguous stages until a tradeable output or the final product.""" + + ordered_stages = get_ordered_stages(chain) + if not ordered_stages: + return [] + + tradeable = {str(item) for item in chain.get("tradeable_commodities", [])} + final_product = str(chain.get("final_product", "")).strip() + + groups = [] + current = [] + for stage in ordered_stages: + current.append(stage) + output_commodity = str(stage.get("output_commodity", "")).strip() + if output_commodity in tradeable or output_commodity == final_product: + groups.append( + { + "label": output_commodity, + "stages": list(current), + } + ) + current = [] + + if current: + last_output = str(current[-1].get("output_commodity", "")).strip() + groups.append({"label": last_output, "stages": list(current)}) + + return groups + + +def route_label_for_product(config: Dict, product: str) -> str: + """Return the stage-group label for a product.""" + + chain = get_trade_chain(config) + for group in get_stage_groups(chain): + if group["label"] == product: + return group["label"] + return product + + +def derive_supply_curve_products(config: Dict) -> List[str]: + """Return the externally visible product list for supply curves.""" + + products = [] + for chain in iter_trade_chains(config): + for group in get_stage_groups(chain): + label = group["label"] + if label and label not in products: + products.append(label) + return products or ["steel"] + + +def build_product_components(config: Dict, product: str) -> Dict[str, object]: + """Derive the links, stores, buses, and renewable flag for a product.""" + + chain = get_trade_chain(config) + groups = get_stage_groups(chain) + + target_group: Optional[Dict] = None + for group in groups: + if group["label"] == product: + target_group = group + break + + if target_group is None: + raise ValueError(f"Product '{product}' not found in configured stage groups") + + links = set() + stores = set() + buses = set() + has_renewables = False + + for stage in target_group["stages"]: + process_label = str(stage.get("process_label", "")).strip() + materials, energy = split_stage_inputs(stage) + + # Add explicit buses derived from stage inputs + for material in materials: + buses.add(_normalize_commodity(material)) + for energy_input in energy: + norm = _normalize_commodity(energy_input) + buses.add(norm) + if energy_input == "renewable_electricity": + has_renewables = True + + output_commodity = _normalize_commodity(stage.get("output_commodity", "")) + if output_commodity: + buses.add(output_commodity) + + # Use explicit mapping from process_label -> concrete components + comp = _components_for_process_label(process_label) + if comp is None and process_label: + # Fail fast: require explicit mapping for new/unknown process labels + raise ValueError( + f"Process label '{process_label}' has no TECH_COMPONENT_MAP entry; add mapping before using it in config" + ) + + if comp: + links.update(comp.get("links", ())) + stores.update(comp.get("stores", ())) + # Include canonical buses from mapping, but avoid adding energy-carrier + # buses (e.g., renewable_electricity, grid_electricity) unless the + # stage explicitly declares them as energy inputs. This prevents + # slicers from preserving unused energy buses for stages that only + # consume material inputs (e.g., steel stage using grid_electricity + # only when declared). + declared_energy_norm = {_normalize_commodity(e) for e in energy} + for b in comp.get("buses", ()): + normb = _normalize_commodity(b) + # If this is an energy input carrier, only keep it when declared + if normb in ENERGY_INPUTS and normb not in declared_energy_norm: + continue + buses.add(normb) + # If this stage-group uses renewable electricity, include battery + # storage and bus as an explicit component so slicers keep batteries + # for renewable-based stages. The user requested batteries be explicit + # in stage configurations; adding them here maintains backward + # compatibility while keeping per-stage skeletons functional. + if has_renewables: + stores.add("battery") + buses.add("battery") + links.update({"batt_charge", "batt_discharge"}) + return { + "links": links, + "stores": stores, + "buses": buses, + "has_renewables": has_renewables, + } + + +def get_external_material_inputs(config: Dict, product: str) -> List[str]: + """Return material buses that must be supplied externally for a stage-group. + + Inputs produced by earlier stages in the same group are not returned. + """ + + chain = get_trade_chain(config) + groups = get_stage_groups(chain) + + target_group: Optional[Dict] = None + for group in groups: + if group["label"] == product: + target_group = group + break + + if target_group is None: + raise ValueError(f"Product '{product}' not found in configured stage groups") + + produced = set() + external_materials: List[str] = [] + + for stage in target_group["stages"]: + materials, _ = split_stage_inputs(stage) + for material in materials: + norm_material = _normalize_commodity(material) + if ( + norm_material + and norm_material not in produced + and norm_material not in external_materials + ): + external_materials.append(norm_material) + + output_commodity = _normalize_commodity(stage.get("output_commodity", "")) + if output_commodity: + produced.add(output_commodity) + + return external_materials