{ "cells": [ { "cell_type": "markdown", "id": "9621b7f9", "metadata": {}, "source": [ "(reversible-turbine-example)=\n", "# Reversible turbines\n", "\n", "This example is available in the following formats:\n", "\n", "- pyshop\n", " - [](basic_pump.py)\n", "\n", "## Introduction\n", "\n", "This example imports a basic model and adds a reversible turbine modelled as two separate [generator](generator) and [pump](pump) objects. To ensure that the pump and generator does not operate at the same time, two [commit_groups](commit_group) are created to force the optimization to choose between production and pumping. This assumes that the reversible turbine is a single turbine-generator machine, and not a ternary set of one pump and one turbine that can run in hydraulic short circuit.\n", "\n", "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "06febd9a", "metadata": { "Collapsed": "false" }, "outputs": [], "source": [ "#Necessary imports used in all examples\n", "import pandas as pd\n", "import plotly.graph_objs as go\n", "import plotly.express as px\n", "\n", "from pyshop import ShopSession\n", "\n", "#Functions used in this example for building a basic SHOP model and running it\n", "from basic_pump import build_model, run_model" ] }, { "cell_type": "markdown", "id": "3a624369", "metadata": {}, "source": [ "## Create a SHOP session and import basic model from file function" ] }, { "cell_type": "code", "execution_count": 2, "id": "6c47bd73", "metadata": { "Collapsed": "false" }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "reservoir_Reservoir1\n", "\n", "Reservoir1\n", "\n", "\n", "\n", "plant_Plant1\n", "\n", "Plant1\n", "\n", "\n", "\n", "reservoir_Reservoir1->plant_Plant1\n", "\n", "\n", "\n", "\n", "reservoir_Reservoir2\n", "\n", "Reservoir2\n", "\n", "\n", "\n", "plant_Plant1->reservoir_Reservoir2\n", "\n", "\n", "\n", "\n", "river_outlet\n", "\n", "outlet\n", "\n", "\n", "\n", "reservoir_Reservoir2->river_outlet\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Create a standard ShopSession\n", "shop=ShopSession()\n", "#Build a basic SHOP model\n", "build_model(shop)\n", "#Display topology to the screen\n", "display(shop.model.build_connection_tree())" ] }, { "cell_type": "markdown", "id": "e171e6f2", "metadata": {}, "source": [ "## Add a variable speed pump\n", "\n", "Pumps can be added as pump objects, and need to be connected to a [plant](plant). We then apply attributes to the pump object. The pump added to model \"half\" of the reversible turbine is a variable speed pump, see [the binary pump example](binary-pump-example) for modelling of binary pumps. The difference between a binary and variable speed pump in SHOP is that multiple points are added in the [turbine efficiency curves](pump:turb_eff_curves) for variable speed pumps. The [p_min](pump:p_min) and [p_max](pump:p_max) attributes of the pump are set to limit the consumption to be between 30 and 50 MW.\n", "\n", "The upper reservoir is also set to be full at the start of the optimization, and the generator is committed to be on in all hours." ] }, { "cell_type": "code", "execution_count": 3, "id": "e48444b5", "metadata": {}, "outputs": [], "source": [ "#Add variable speed pump\n", "pump = shop.model.pump.add_object(\"P1P1\")\n", "pump.connect_to(shop.model.plant.Plant1)\n", "pump.penstock.set(1)\n", "pump.p_nom.set(50)\n", "pump.p_min.set(30)\n", "pump.p_max.set(50)\n", "pump.startcost.set(500)\n", "pump.gen_eff_curve.set(pd.Series([100,100], index=[0,50]))\n", "\n", "c1 = pd.Series([84,86,85],index=[64,90,110],name=40)\n", "c2 = pd.Series([82.5,84,83],index=[60,80,90],name=50)\n", "c3 = pd.Series([79,82.5,82],index=[40,65,70],name=60)\n", "\n", "pump.turb_eff_curves.set([c1,c2,c3])\n", "\n", "#Set upper reservoir to almost full at the start\n", "rsv1 = shop.model.reservoir[\"Reservoir1\"]\n", "rsv1.start_head.set(rsv1.hrl.get()-1)\n", "\n", "#Force generator to run in all time steps\n", "gen = shop.model.generator[\"P1G1\"]\n", "gen.committed_in.set(1)" ] }, { "cell_type": "markdown", "id": "5fdcdf9b", "metadata": {}, "source": [ "When we plot the market price, we see that the first hours have a low price compared to the water value in the upper reservoir. This makes it economical to pump for the first hours, but this is not possible since the generator is committed to be on for the whole period." ] }, { "cell_type": "code", "execution_count": 4, "id": "1e0c3cec", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "rgb(33,102,172)" }, "name": "Market price", "type": "scatter", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 19.99, 19.99, 19.99, 19.99, 19.99, 19.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99, 39.99 ] }, { "line": { "dash": "dot" }, "marker": { "color": "rgb(67,147,195)" }, "name": "Water value of Reservoir1", "type": "scatter", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7, 39.7 ] }, { "line": { "dash": "dot" }, "marker": { "color": "rgb(146,197,222)" }, "name": "Water value of Reservoir2", "type": "scatter", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#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" } ], "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.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.0, "#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.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.0, "#f0f921" ] ], "sequentialminus": [ [ 0.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.0, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Market price and water value of reservoirs" }, "xaxis": { "title": { "text": "Time (Hour)" } }, "yaxis": { "title": { "text": "Price (€/MWh)" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot market price and water value of reservoirs\n", "spot_price=shop.model.market.Day_Ahead.sale_price.get()\n", "\n", "fig = go.Figure()\n", "colorscale = px.colors.sequential.RdBu_r\n", "color = 1\n", "fig.add_trace(go.Scatter(x=spot_price.index, marker_color = colorscale[color], y=spot_price.values, name=\"Market price\"))\n", "\n", "for rsv in shop.model.reservoir:\n", " color+=1\n", " end_water_value=rsv.energy_value_input.get()\n", " water_value=pd.Series([end_water_value]*len(spot_price),index=spot_price.index)\n", " curve_name=\"Water value of \"+rsv.get_name()\n", " fig.add_trace(go.Scatter(x=water_value.index, y=water_value.values, marker_color = colorscale[color], name=curve_name, line=dict(dash=\"dot\")))\n", " \n", "fig.update_layout(title=\"Market price and water value of reservoirs\", xaxis_title=\"Time (Hour)\", yaxis_title=\"Price (€/MWh)\")\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "id": "65fdcd01", "metadata": {}, "source": [ "## Run SHOP\n", "We first run a naive optimization where the pump and generator are unaware that they are coupled and unable to operate at the same time." ] }, { "cell_type": "code", "execution_count": 5, "id": "8abb1156", "metadata": {}, "outputs": [], "source": [ "run_model(shop)" ] }, { "cell_type": "markdown", "id": "16a0593e", "metadata": {}, "source": [ "We observe that the pump is used in the first six hours of the period, even though the generator is also producing power. This is not possible when dealing with a reversible turbine, but additional input is required for SHOP to recognize this." ] }, { "cell_type": "code", "execution_count": 6, "id": "1fb02ba1", "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "rgb(234, 169, 189)" }, "name": "Pump consumption", "type": "bar", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 48.42773530934233, 48.44353455261206, 48.459067848227896, 48.474340514321135, 48.489357717807195, 48.50412447945618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, { "marker": { "color": "rgb(108, 33, 103)" }, "name": "Generator production", "type": "bar", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 25.464432935939413, 25.459390262438735, 25.45444061412397, 25.449581374566918, 25.4448100050974, 25.440124042225783, 24.999707002500536, 24.999693376386208, 24.9996699220728, 24.9996343091714, 24.999583932391378, 24.999515878251888, 24.999426887154872, 24.99980196441777, 24.99970371012465, 24.99957713957023, 24.999417835055773, 24.99922079903513, 24.998980427803428, 24.99869042754339, 24.99834371640815, 24.997932309847684, 24.997447185722788, 24.99687812489771 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#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" } ], "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.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.0, "#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.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.0, "#f0f921" ] ], "sequentialminus": [ [ 0.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.0, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Pump consumption and generator production" }, "xaxis": { "title": { "text": "Time (Hour)" } }, "yaxis": { "title": { "text": "Production/Consumption (MW)" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plotting pump consumption and generator production\n", "consumption=pump.consumption.get()\n", "production=gen.production.get()\n", "fig = go.Figure()\n", "colorscale = px.colors.sequential.Magenta\n", "fig.add_trace(go.Bar(x=consumption.index, y=consumption.values, name=\"Pump consumption\", marker_color=colorscale[1]))\n", "fig.add_trace(go.Bar(x=production.index, y=production.values, name=\"Generator production\", marker_color=colorscale[6]))\n", "fig.update_layout(title=\"Pump consumption and generator production\", xaxis_title=\"Time (Hour)\", yaxis_title=\"Production/Consumption (MW)\")" ] }, { "cell_type": "markdown", "id": "c7acea83", "metadata": {}, "source": [ "## Using commit_group to stop simultaneous pumping and production\n", "\n", "To stop the pump and generator running at the same time, we can use the [commit_group object](commit_group). A commit_group is simply a collection of generators and pumps. When two commit_groups are connected, the units connected to the first group can not run when any of the units in the other group is running, and vice versa. No other input is required for the commit_groups, only the connections.\n", "\n", "First we recreate the previous model:" ] }, { "cell_type": "code", "execution_count": 7, "id": "daab4e9e", "metadata": { "Collapsed": "false" }, "outputs": [], "source": [ "#Create a standard ShopSession\n", "shop=ShopSession()\n", "#Build a basic SHOP model\n", "build_model(shop)\n", "\n", "#Add variable speed pump\n", "pump = shop.model.pump.add_object(\"P1P1\")\n", "pump.connect_to(shop.model.plant.Plant1)\n", "pump.penstock.set(1)\n", "pump.p_nom.set(50)\n", "pump.p_min.set(30)\n", "pump.p_max.set(50)\n", "pump.startcost.set(500)\n", "pump.gen_eff_curve.set(pd.Series([100,100], index=[0,50]))\n", "\n", "c1 = pd.Series([84,86,85],index=[64,90,110],name=40)\n", "c2 = pd.Series([82.5,84,83],index=[60,80,90],name=50)\n", "c3 = pd.Series([79,82.5,82],index=[40,65,70],name=60)\n", "\n", "pump.turb_eff_curves.set([c1,c2,c3])\n", "\n", "#Set upper reservoir to almost full at the start\n", "rsv1 = shop.model.reservoir[\"Reservoir1\"]\n", "rsv1.start_head.set(rsv1.hrl.get()-1)\n", "\n", "#Force generator to run in all time steps\n", "gen = shop.model.generator[\"P1G1\"]\n", "gen.committed_in.set(1)" ] }, { "cell_type": "markdown", "id": "ea15e2cb", "metadata": {}, "source": [ "Now we add two commit_groups and connect the pump to one group and the generator to the other group. The the two commit_groups are then connected, which means that the pump and generator cannot operate at the same time." ] }, { "cell_type": "code", "execution_count": 8, "id": "73e11cfb", "metadata": {}, "outputs": [], "source": [ "cg1 = shop.model.commit_group.add_object(\"cg1\")\n", "cg2 = shop.model.commit_group.add_object(\"cg2\")\n", "\n", "cg1.connect_to(pump)\n", "cg2.connect_to(gen)\n", "\n", "#Exclude pump in cg1 from running when generator in cg2 is on\n", "cg1.connect_to(cg2)" ] }, { "cell_type": "markdown", "id": "b9e99996", "metadata": {}, "source": [ "Since the commit_group constraints are applied directly to the binary variables that decide whether a unit is on or off, it is important to use MIP to ensure the constraints are enforced." ] }, { "cell_type": "code", "execution_count": 9, "id": "e97d8702", "metadata": {}, "outputs": [], "source": [ "shop.set_universal_mip(\"on\",[])\n", "run_model(shop)" ] }, { "cell_type": "markdown", "id": "1db82ac9", "metadata": {}, "source": [ "The results below show that the pump no longer operates in the beginning of the optimization since the generator is forced to run." ] }, { "cell_type": "code", "execution_count": 10, "id": "8cd0a4df", "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "rgb(234, 169, 189)" }, "name": "Pump consumption", "type": "bar", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, { "marker": { "color": "rgb(108, 33, 103)" }, "name": "Generator production", "type": "bar", "x": [ "2018-02-27T00:00:00", "2018-02-27T01:00:00", "2018-02-27T02:00:00", "2018-02-27T03:00:00", "2018-02-27T04:00:00", "2018-02-27T05:00:00", "2018-02-27T06:00:00", "2018-02-27T07:00:00", "2018-02-27T08:00:00", "2018-02-27T09:00:00", "2018-02-27T10:00:00", "2018-02-27T11:00:00", "2018-02-27T12:00:00", "2018-02-27T13:00:00", "2018-02-27T14:00:00", "2018-02-27T15:00:00", "2018-02-27T16:00:00", "2018-02-27T17:00:00", "2018-02-27T18:00:00", "2018-02-27T19:00:00", "2018-02-27T20:00:00", "2018-02-27T21:00:00", "2018-02-27T22:00:00", "2018-02-27T23:00:00" ], "y": [ 24.99965609510123, 24.999708668268642, 24.999696389558657, 24.999682863648452, 24.99966786186828, 24.999651087748244, 24.99963220942883, 24.999610854780048, 24.99958660568206, 24.99955899129472, 24.99952748010629, 24.99999165098025, 24.999995794818428, 24.9999991702915, 25.000001613068584, 25.00000294831435, 25.000002990050373, 25.000001540358, 24.999998388340817, 24.999993308725895, 24.999986059923952, 24.999976381283847, 24.999963989150352, 24.99994857114664 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.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.0, "#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" } ], "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.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.0, "#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.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.0, "#f0f921" ] ], "sequentialminus": [ [ 0.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.0, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Pump consumption and generator production" }, "xaxis": { "title": { "text": "Time (Hour)" } }, "yaxis": { "title": { "text": "Production/Consumption (MW)" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plotting pump consumption and generator production\n", "consumption=pump.consumption.get()\n", "production=gen.production.get()\n", "fig = go.Figure()\n", "colorscale = px.colors.sequential.Magenta\n", "fig.add_trace(go.Bar(x=consumption.index, y=consumption.values, name=\"Pump consumption\", marker_color=colorscale[1]))\n", "fig.add_trace(go.Bar(x=production.index, y=production.values, name=\"Generator production\", marker_color=colorscale[6]))\n", "fig.update_layout(title=\"Pump consumption and generator production\", xaxis_title=\"Time (Hour)\", yaxis_title=\"Production/Consumption (MW)\")" ] } ], "metadata": { "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst", "format_version": 0.13, "jupytext_version": "1.14.6" } }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13.9" }, "source_map": [ 12, 28, 40, 44, 53, 61, 85, 89, 108, 113, 115, 119, 128, 136, 167, 171, 180, 184, 187, 191 ] }, "nbformat": 4, "nbformat_minor": 5 }