{ "cells": [ { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "# -*- coding: utf-8 -*-\n", "\"\"\"\n", "Spyder Editor\n", "\n", "This is a temporary script file.\n", "\"\"\"\n", "\n", "from numpy import arange\n", "\n", "import highspy\n", "import linopy\n", "import openpyxl\n", "from linopy import Model, EQUAL\n", "import pandas as pd\n", "import mercury as mr\n", "## import gurobipy\n", "import plotly.express as px\n", "import xarray as xr" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "application/mercury+json": { "code_uid": "Slider.0.40.34.2-rand9e15e39b", "disabled": false, "hidden": false, "label": "Natural gas price [€/MWh]", "max": 400, "min": 0, "model_id": "273b24553e41487f84168746626e3f56", "step": 10, "url_key": "", "value": 10, "widget": "Slider" }, "application/vnd.jupyter.widget-view+json": { "model_id": "273b24553e41487f84168746626e3f56", "version_major": 2, "version_minor": 0 }, "text/plain": [ "mercury.Slider" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/mercury+json": { "code_uid": "Slider.0.40.34.5-rand9b30b717", "disabled": false, "hidden": false, "label": "CO2 price [€/t CO2eq]", "max": 400, "min": 0, "model_id": "c22ce88a85fd4cfd8980db94f8845df2", "step": 10, "url_key": "", "value": 80, "widget": "Slider" }, "application/vnd.jupyter.widget-view+json": { "model_id": "c22ce88a85fd4cfd8980db94f8845df2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "mercury.Slider" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/mercury+json": { "code_uid": "Slider.0.40.34.8-randf7b1a968", "disabled": false, "hidden": false, "label": "CO2 limit [mio. t]", "max": 750, "min": 0, "model_id": "e0adbf2a56b740caaa624612b517c241", "step": 50, "url_key": "", "value": 400, "widget": "Slider" }, "application/vnd.jupyter.widget-view+json": { "model_id": "e0adbf2a56b740caaa624612b517c241", "version_major": 2, "version_minor": 0 }, "text/plain": [ "mercury.Slider" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/mercury+json": { "code_uid": "Slider.0.40.34.11-rand06c5a0ed", "disabled": false, "hidden": false, "label": "Hydrogen price [€/MWh]", "max": 300, "min": 0, "model_id": "11355fc0c291440ca72e8bc2b816c333", "step": 10, "url_key": "", "value": 100, "widget": "Slider" }, "application/vnd.jupyter.widget-view+json": { "model_id": "11355fc0c291440ca72e8bc2b816c333", "version_major": 2, "version_minor": 0 }, "text/plain": [ "mercury.Slider" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Slider for gas price [€/MWh_th]\n", "price_gas = mr.Slider(value=10, min=0, max=400, label=\"Natural gas price [€/MWh]\", step=10)\n", "\n", "# Slider for CO2 price [€/t]\n", "price_co2 = mr.Slider(value=80, min=0, max=400, label=\"CO2 price [€/t CO2eq]\", step=10)\n", "\n", "# Slider for CO2 limit [mio. t]\n", "limit_co2 = mr.Slider(value=400, min=0, max=750, label=\"CO2 limit [mio. t]\", step=50)\n", "\n", "# Slider for H2 price / usevalue [€/MWH_th]\n", "price_h2 = mr.Slider(value=100, min=0, max=300, label=\"Hydrogen price [€/MWh]\", step=10)" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "# Set input file\n", "url_excel = r'Input_Jahr_2021.xlsx'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Read Sets" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "## Define all sets for the model\n", "# Timesteps\n", "df_excel= pd.read_excel(url_excel, sheet_name = 'Timesteps', header=None)\n", "#t = pd.Index(df_excel.iloc[:,0], name = 't')[1:167]\n", "t = pd.Index(df_excel.iloc[:,0], name = 't')[0:168]\n", "\n", "# Technologies\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Technologies')\n", "i = pd.Index(df_excel.iloc[:,0], name = 'i')\n", "i\n", "\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Technologies')\n", "iConv = pd.Index(df_excel.iloc[0:7,2], name = 'iConv')\n", "\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Technologies')\n", "iRes = pd.Index(df_excel.iloc[0:4,4], name = 'iRes')\n", "\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Technologies')\n", "iSto = pd.Index(df_excel.iloc[0:2,6], name = 'iSto')\n", "\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Technologies')\n", "iPtG = pd.Index(df_excel.iloc[0:1,8], name = 'iPtG')\n", "\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Technologies')\n", "iHyRes = pd.Index(df_excel.iloc[0:1,10], name = 'iHyRes')" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "### Parameters\n", "# CO2 limit (from slider)\n", "l_co2 = limit_co2.value\n", "p_co2 = price_co2.value\n", "\n", "# length of timesteps\n", "dt = 1\n", "\n", "# Demand\n", "df_excel= pd.read_excel(url_excel, sheet_name = 'Demand')\n", "#df_melt = pd.melt(df_excel, id_vars='Zeit')\n", "df_excel = df_excel.rename(columns = {'Timesteps':'t', 'Unnamed: 1':'Demand'})\n", "#df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('t')\n", "D_t = df_excel.iloc[:,0].to_xarray()\n", "\n", "## Efficiencies\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'Efficiency')\n", "df_excel = df_excel.rename(columns = {'All':'i', 'Unnamed: 1':'Efficiency'})\n", "df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "eff_i = df_excel.iloc[:,0].to_xarray()\n", "\n", "## Variable costs\n", "# Fuel costs\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'FuelCosts')\n", "df_excel = df_excel.rename(columns = {'Conventionals':'i', 'Unnamed: 1':'FuelCosts'})\n", "df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "c_fuel_i = df_excel.iloc[:,0].to_xarray()\n", "# Apply slider value\n", "c_fuel_i.loc[dict(i = 'Fossil Gas')] = price_gas.value\n", "c_fuel_i.loc[dict(i = 'H2')] = price_h2.value\n", "\n", "# Other var. costs\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'OtherVarCosts')\n", "df_excel = df_excel.rename(columns = {'Conventionals':'i', 'Unnamed: 1':'OtherVarCosts'})\n", "df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "c_other_i = df_excel.iloc[:,0].to_xarray()\n", "\n", "# Investment costs\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'InvCosts')\n", "df_excel = df_excel.rename(columns = {'All':'i', 'Unnamed: 1':'InvCosts'})\n", "df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "c_inv_i = df_excel.iloc[:,0].to_xarray()\n", "\n", "# Emission factor\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'EmFactor')\n", "df_excel = df_excel.rename(columns = {'Conventionals':'i', 'Unnamed: 1':'EmFactor'})\n", "df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "co2_factor_i = df_excel.iloc[:,0].to_xarray()\n", "\n", "## Calculation of variable costs\n", "c_var_i = (c_fuel_i.sel(i = iConv) + p_co2 * co2_factor_i.sel(i = iConv)) / eff_i.sel(i = iConv) + c_other_i.sel(i = iConv)\n", "\n", "# RES capacity factors\n", "#df_excel = pd.read_excel(url_excel, sheet_name = 'RES',header=[0,1])\n", "#df_excel = pd.read_excel(url_excel, sheet_name = 'RES', index_col=['Timesteps'], columns=['PV', 'WindOn', 'WindOff', 'RoR'])\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'RES')\n", "df_excel = df_excel.set_index(['Timesteps'])\n", "df_test = df_excel\n", "df_excel = df_excel.stack()\n", "#df_excel = df_excel.rename(columns={'PV', 'WindOn', 'WindOff', 'RoR'})\n", "df_test2 = df_excel\n", "#df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "#df_excel = df_excel.fillna(0)\n", "\n", "#df_test = df_excel.set_index(['Timesteps', 'PV', 'WindOn', 'WindOff', 'RoR']).stack([0])\n", "#df_test.index = df_test.index.set_names(['t','i'])\n", "s_t_r_iRes = df_excel.to_xarray().rename({'level_1': 'i','Timesteps':'t'})\n", "#s_t_r_iRes = df_excel.iloc[:,0].to_xarray()\n", "\n", "# Base capacities\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'InstalledCap')\n", "df_excel = df_excel.rename(columns = {'All':'i', 'Unnamed: 1':'InstalledCap'})\n", "df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "K_0_i = df_excel.iloc[:,0].to_xarray()\n", "\n", "# Energy-to-power ratio storages\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'E2P') \n", "df_excel = df_excel.rename(columns = {'Storage':'i', 'Unnamed: 1':'E2P ratio'})\n", "#df_excel = i.to_frame().reset_index(drop=True).merge(df_excel, how = 'left')\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('i')\n", "e2p_iSto = df_excel.iloc[:,0].to_xarray()\n", "\n", "# Inflow for hydro reservoir\n", "df_excel = pd.read_excel(url_excel, sheet_name = 'HydroInflow')\n", "df_excel = df_excel.rename(columns = {'Timesteps':'t', 'Hydro Water Reservoir':'Inflow'})\n", "df_excel = df_excel.fillna(0)\n", "df_excel = df_excel.set_index('t')\n", "h_t = df_excel.iloc[:,0].to_xarray()" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
<xarray.DataArray (t: 8760, i: 4)>\n", "array([[0. , 0.09415617, 0.05353259, 0.52617329],\n", " [0. , 0.08576801, 0.05504104, 0.52301444],\n", " [0. , 0.07759342, 0.04262261, 0.51568141],\n", " ...,\n", " [0. , 0.66534576, 0.86073107, 0.65433213],\n", " [0. , 0.64106519, 0.84792675, 0.65049639],\n", " [0. , 0.60996257, 0.88616432, 0.64541968]])\n", "Coordinates:\n", " * t (t) object "'2021-01-01 00:00 +0100'" ... "'2021-12-31 23:00 +01...\n", " * i (i) object 'PV' 'WindOn' 'WindOff' 'RoR'
<xarray.DataArray 'InstalledCap' (i: 15)>\n", "array([ 9000, 18600, 34800, 18900, 4700, 4900, 1000, 0, 79200,\n", " 8400, 60400, 0, 9700, 7300, 0], dtype=int64)\n", "Coordinates:\n", " * i (i) object 'Biomass' 'Lignite' ... 'Electrolyzer'
\n", " | t | \n", "dual | \n", "
---|---|---|
0 | \n", "'2021-01-01 00:00 +0100' | \n", "-0.0 | \n", "
1 | \n", "'2021-01-01 01:00 +0100' | \n", "-0.0 | \n", "
2 | \n", "'2021-01-01 02:00 +0100' | \n", "-0.0 | \n", "
3 | \n", "'2021-01-01 03:00 +0100' | \n", "-0.0 | \n", "
4 | \n", "'2021-01-01 04:00 +0100' | \n", "-0.0 | \n", "