{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Parameter management\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Some prerequisites & basic definitions" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import datetime as dt\n", "pd.set_option(\"mode.chained_assignment\", None) \n", "import eaopack as eao\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load sample portfolio (and the timegrid)\n", "The portfolio comes prefefined in a JSON. Let us have a look. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGbCAYAAABZBpPkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJy0lEQVR4nO3dB3zU9fkH8E92QhZh7703smSJWAQVUYva4kJctWr/anHSWqttrVoUFUe14Kha26KCKLgAAVmyQfbeOySBJJB9/9fniZdeQhISSHL3u/u8+0pD7i5337uc93t+z/f5Pt8gl8vlgoiIiASsYG8PQERERLxLwYCIiEiAUzAgIiIS4BQMiIiIBDgFAyIiIgFOwYCIiEiAUzAgIiIS4BQMiIiIBDgFAyIiIgFOwYDIORgzZgxiYmLgTyriOY0fPx4tWrRASEgIunXrhkDxwQcfoF27dggLC0P16tXL/bo3a9as0GVBQUF46qmnKniUIiVTMCAV4r333rMPsMjISBw4cOCM6y+++GJ06tTpnO77o48+wssvv1wBo5TK9O233+LRRx9F//798e677+Kvf/0r/MXBgwft4LxmzZozrtu8ebMd0Fu2bIlJkybhH//4h1fGKHI+Qs/rt0WKyMzMxHPPPYdXX321wu6TwcD69evx4IMPVth9SsX77rvvEBwcjLfffhvh4eHwJwwGnn76aTuDL5rxmDdvHvLy8vDKK6+gVatWFfJ4p0+fRmioPp6l6igzIBWKH5Q8O+KHpz9KT0/36uPn5OQgKysLvujo0aOIioqqsECAe6jxoOjrrzefN5V3eqA0zLApGJCqpGBAKtTvfvc75ObmWnagLD788EP06NHDDiI1atTAqFGjsG/fvkLTCzNnzsSePXtsGoJfPDvjgaJWrVoYO3ZswW15dsYPZM5Xp6SkFFz+/PPP2wdrWlpaobPYgQMHIjo62n7n6quvxqZNmwqNjWlhPt7GjRtx4403IiEhAQMGDCjxuTCFXLt2bRuz52MV5+OPP0aHDh3sQ5/TJ9OmTTtj7nj37t32+C+88IJNkzANHRERYePhAerJJ5+01y4+Pt6eB5/P3LlzCz2O53289NJLaNq0qb3WgwYNsmxLcTjNc80111j9AJ/Pww8/bH/T0vAxODXAYMn9d+LUkfuA+uc//7lg/HyOfJ8wi+SJl1955ZX45ptv0LNnTxvnW2+9VeJjuqeeVq5ciX79+tntmzdvjjfffLPYA/Ydd9yBunXr2mvetWtX/POf/yzxtfJ8vd944w306tXLbnPbbbcVen4c8x//+Ee7jq9V0bl+/m7Hjh3tfho0aID77ruv0HuztNezaM3A6tWrcfnllyMuLs7+Nj/72c/www8/nPW+RMpCoadUKH4Yjx492rIDjz/+uH0AluSZZ57BH/7wB/ziF7/AnXfeiWPHjtn0wkUXXWQffDxI//73v8eJEyewf/9+O5gRPwj5Ycm56e+//77g/n788Ue7LVPVixYtwvDhw+3yBQsWoHv37gXFcbNnz7YPVRa68QOXZ598XN7fqlWrzijmuv7669G6dWubAy9px+/ly5dj2LBhdhCbPn26HZhKwuDml7/8JTp37oxnn30WycnJdqBq2LBhsbfnQTYjIwO/+tWv7KDCoOnkyZOYPHkybrjhBtx1111ITU219DzHsGzZsjNS2e+//77dhgcj3hdT2pdccgnWrVtnB0g3HvR5H3369LGDIl+rF1980Q6M99xzT6kFdJwr52NzXMQDNPFvywPvddddh4ceeghLly61583gi0GQpy1btthzuvvuu+15tW3bFqXha3fFFVfYe4i/N2XKFBsnsxO333673YZ/XwYO27dvx29+8xt7jzIYY/DFA/MDDzxQ6uv985//3F47Bl+8jEGX+/kxaOBry+fx97//3d5jXbp0sev53uLUwpAhQ2xMfG68Dd8rfH+y2LCsNmzYYI/LQIB1GfxdBkp8XvPnz7e/l8h5cYlUgHfffZdHSdfy5ctdO3bscIWGhrruv//+gusHDRrk6tixY8HPu3fvdoWEhLieeeaZQvezbt06+13Py4cPH+5q2rTpGY85fvx4u4+TJ0/azxMnTrTb9e7d2/XYY4/ZZbm5ua7q1au7fvvb3xb8Xrdu3Vx16tRxHT9+vOCytWvXuoKDg12jR48uuOyPf/yjPacbbrjhjMe+9dZbXdHR0fbvhQsXuuLi4mycGRkZZ32tOnfu7GrUqJErNTW14LJ58+bZY3k+z127dtllvO+jR48Wuo+cnBxXZmZmocuSk5NddevWdd1+++1n3EdUVJRr//79BZcvXbrULvd8XficeNmf/vSnQvfbvXt3V48ePc76vDxfE7c1a9bYfd55552FLn/44Yft8u+++67gMj53Xvb111+7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "timegrid = eao.serialization.load_from_json(file_name='timegrid.json')\n", "portf = eao.serialization.load_from_json(file_name='portfolio_simple_start.json')\n", "eao.network_graphs.create_graph(portf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see. the portfolio is a simple setup with a sourcing possibility and two sales contracts at two locations. For flexibility there is a storage (which we will manipulate in the following).\n", "\n", "## Looking at parameters and setting them to new values\n", "As the next step we look at the parameters that define the portfolio. To this end, EAO provides three routines:\n", "* eao.io.get_params_tree - to retrieve parameters as a dict and the paths to the parameters. To be used mainly with assets & portfolios\n", "* get_param - to get parameter values using the path\n", "* set_param - to change the parameters" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__class__\n", "['assets', 0, '__class__']\n", "['assets', 0, 'asset_type']\n", "['assets', 0, 'end']\n", "['assets', 0, 'extra_costs']\n", "['assets', 0, 'freq']\n", "['assets', 0, 'max_cap']\n", "['assets', 0, 'min_cap']\n", "['assets', 0, 'name']\n", "['assets', 0, 'nodes', 0, '__class__']\n", "['assets', 0, 'nodes', 0, 'commodity']\n", "['assets', 0, 'nodes', 0, 'name']\n", "['assets', 0, 'nodes', 0, 'unit', '__class__']\n", "['assets', 0, 'nodes', 0, 'unit', 'factor']\n", "['assets', 0, 'nodes', 0, 'unit', 'flow']\n", "['assets', 0, 'nodes', 0, 'unit', 'volume']\n", "['assets', 0, 'periodicity']\n", "['assets', 0, 'periodicity_duration']\n", "['assets', 0, 'price']\n", "['assets', 0, 'profile']\n", "['assets', 0, 'start']\n", "['assets', 0, 'wacc']\n", "['assets', 1, '__class__']\n", "['assets', 1, 'asset_type']\n", "['assets', 1, 'end']\n", "['assets', 1, 'extra_costs']\n", "['assets', 1, 'freq']\n", "['assets', 1, 'max_cap']\n", "['assets', 1, 'min_cap']\n", "['assets', 1, 'name']\n", "['assets', 1, 'nodes', 0, '__class__']\n", "['assets', 1, 'nodes', 0, 'commodity']\n", "['assets', 1, 'nodes', 0, 'name']\n", "['assets', 1, 'nodes', 0, 'unit', '__class__']\n", "['assets', 1, 'nodes', 0, 'unit', 'factor']\n", "['assets', 1, 'nodes', 0, 'unit', 'flow']\n", "['assets', 1, 'nodes', 0, 'unit', 'volume']\n", "['assets', 1, 'periodicity']\n", "['assets', 1, 'periodicity_duration']\n", "['assets', 1, 'price']\n", "['assets', 1, 'profile']\n", "['assets', 1, 'start']\n", "['assets', 1, 'wacc']\n", "['assets', 2, '__class__']\n", "['assets', 2, 'asset_type']\n", "['assets', 2, 'end']\n", "['assets', 2, 'extra_costs']\n", "['assets', 2, 'freq']\n", "['assets', 2, 'max_cap']\n", "['assets', 2, 'min_cap']\n", "['assets', 2, 'name']\n", "['assets', 2, 'nodes', 0, '__class__']\n", "['assets', 2, 'nodes', 0, 'commodity']\n", "['assets', 2, 'nodes', 0, 'name']\n", "['assets', 2, 'nodes', 0, 'unit', '__class__']\n", "['assets', 2, 'nodes', 0, 'unit', 'factor']\n", "['assets', 2, 'nodes', 0, 'unit', 'flow']\n", "['assets', 2, 'nodes', 0, 'unit', 'volume']\n", "['assets', 2, 'periodicity']\n", "['assets', 2, 'periodicity_duration']\n", "['assets', 2, 'price']\n", "['assets', 2, 'profile']\n", "['assets', 2, 'start']\n", "['assets', 2, 'wacc']\n", "['assets', 3, '__class__']\n", "['assets', 3, 'asset_type']\n", "['assets', 3, 'costs_const']\n", "['assets', 3, 'costs_time_series']\n", "['assets', 3, 'efficiency']\n", "['assets', 3, 'end']\n", "['assets', 3, 'freq']\n", "['assets', 3, 'max_cap']\n", "['assets', 3, 'min_cap']\n", "['assets', 3, 'name']\n", "['assets', 3, 'nodes', 0, '__class__']\n", "['assets', 3, 'nodes', 0, 'commodity']\n", "['assets', 3, 'nodes', 0, 'name']\n", "['assets', 3, 'nodes', 0, 'unit', '__class__']\n", "['assets', 3, 'nodes', 0, 'unit', 'factor']\n", "['assets', 3, 'nodes', 0, 'unit', 'flow']\n", "['assets', 3, 'nodes', 0, 'unit', 'volume']\n", "['assets', 3, 'nodes', 1, '__class__']\n", "['assets', 3, 'nodes', 1, 'commodity']\n", "['assets', 3, 'nodes', 1, 'name']\n", "['assets', 3, 'nodes', 1, 'unit', '__class__']\n", "['assets', 3, 'nodes', 1, 'unit', 'factor']\n", "['assets', 3, 'nodes', 1, 'unit', 'flow']\n", "['assets', 3, 'nodes', 1, 'unit', 'volume']\n", "['assets', 3, 'periodicity']\n", "['assets', 3, 'periodicity_duration']\n", "['assets', 3, 'profile']\n", "['assets', 3, 'start']\n", "['assets', 3, 'wacc']\n", "['assets', 4, '__class__']\n", "['assets', 4, 'asset_type']\n", "['assets', 4, 'block_size']\n", "['assets', 4, 'cap_in']\n", "['assets', 4, 'cap_out']\n", "['assets', 4, 'cost_in']\n", "['assets', 4, 'cost_out']\n", "['assets', 4, 'cost_store']\n", "['assets', 4, 'eff_in']\n", "['assets', 4, 'eff_out']\n", "['assets', 4, 'end']\n", "['assets', 4, 'end_level']\n", "['assets', 4, 'freq']\n", "['assets', 4, 'inflow']\n", "['assets', 4, 'max_cycles_freq']\n", "['assets', 4, 'max_cycles_no']\n", "['assets', 4, 'max_store_duration']\n", "['assets', 4, 'name']\n", "['assets', 4, 'no_simult_in_out']\n", "['assets', 4, 'nodes', 0, '__class__']\n", "['assets', 4, 'nodes', 0, 'commodity']\n", "['assets', 4, 'nodes', 0, 'name']\n", "['assets', 4, 'nodes', 0, 'unit', '__class__']\n", "['assets', 4, 'nodes', 0, 'unit', 'factor']\n", "['assets', 4, 'nodes', 0, 'unit', 'flow']\n", "['assets', 4, 'nodes', 0, 'unit', 'volume']\n", "['assets', 4, 'periodicity']\n", "['assets', 4, 'periodicity_duration']\n", "['assets', 4, 'price']\n", "['assets', 4, 'profile']\n", "['assets', 4, 'size']\n", "['assets', 4, 'start']\n", "['assets', 4, 'start_level']\n", "['assets', 4, 'wacc']\n" ] } ], "source": [ "[params, param_dict] = eao.io.get_params_tree(portf)\n", "for p in params:\n", " print(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the parameter tree, note that we extracted the whole tree of parameters in the portfolio. Each entry is a list, that points downwards into the nested object (portfolio --> asset, --> ...).\n", "\n", "To access the parameter, we can use any of those entries. Let us concentrate on the storage (asset no. 4):" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'__class__': 'Asset',\n", " 'asset_type': 'Storage',\n", " 'block_size': None,\n", " 'cap_in': 30,\n", " 'cap_out': 30,\n", " 'cost_in': 0.2,\n", " 'cost_out': 0.2,\n", " 'cost_store': 0.0,\n", " 'eff_in': 1.0,\n", " 'eff_out': 1.0,\n", " 'end': None,\n", " 'end_level': 5,\n", " 'freq': None,\n", " 'inflow': 0.0,\n", " 'max_cycles_freq': 'd',\n", " 'max_cycles_no': None,\n", " 'max_store_duration': None,\n", " 'name': 'storage',\n", " 'no_simult_in_out': False,\n", " 'nodes': [{'__class__': 'Node',\n", " 'commodity': None,\n", " 'name': 'location b',\n", " 'unit': {'__class__': 'Unit',\n", " 'factor': 1.0,\n", " 'flow': 'MW',\n", " 'volume': 'MWh'}}],\n", " 'periodicity': None,\n", " 'periodicity_duration': None,\n", " 'price': None,\n", " 'profile': None,\n", " 'size': 48,\n", " 'start': None,\n", " 'start_level': 5,\n", " 'wacc': 0.0}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "param_dict['assets'][4]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, get direct access via tree entries, e.g. the fill level on start up" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "print(eao.io.get_param(portf, ['assets', 4, 'start_level']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Going via the complete portfolio is one way. However, it is also possible to directly go via specific assets:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "price sales b\n" ] } ], "source": [ "print(eao.io.get_param(portf.get_asset('sales b'), ['price']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us manipulate the fill level. Note that this could also be done by diving directly into the object ..." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "portf.get_asset('storage').start_level = 4\n", "print(portf.get_asset('storage').start_level)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... but setting parameters this way is actually relatively insecure, since this circumvents proper initialization. Therefore, it is better to use the set_param routine:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6\n" ] } ], "source": [ "portf = eao.io.set_param(portf,['assets', 4, 'start_level'], 6 )\n", "print(portf.get_asset('storage').start_level)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This routine properly extracts parameters using the serialization machinery and re-initiates the objects. Therefore, all tests are called.\n", "\n", "Let us take a look by setting an invalid parameter. In this case we set the storage size to a value which is smaller than the initial fill level:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Not possible\n" ] } ], "source": [ "try:\n", " portf = eao.io.set_param(portf, ['assets', 4, 'size'], 1.)\n", "except Exception as error:\n", " print('Not possible')\n", " pass\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sample: Looping different parameters\n", "\n", "Here we do a simple loop on the storage size to demonstrate how to manipulate parameters for parameter studies or how to react to live data" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# sample prices\n", "prices = {'price sourcing': 5.*np.sin(np.linspace(0.,6., timegrid.T)),\n", " 'price sales a' : np.ones(timegrid.T)*2.,\n", " 'price sales b' : 5.+5.*np.sin(np.linspace(0.,6., timegrid.T)) }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Current storage size" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "48\n", "MWh\n" ] } ], "source": [ "print(eao.io.get_param(portf, ['assets', 4, 'size']))\n", "print(eao.io.get_param(portf, ['assets', 4, 'nodes', 0,'unit','volume']))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "storage_sizes = range(10, 150, 5)\n", "values = [] # collect results\n", "\n", "for my_size in storage_sizes:\n", " portf = eao.io.set_param(portf, ['assets', 4, 'size'], my_size )\n", " optim_problem = portf.setup_optim_problem(timegrid = timegrid, prices=prices)\n", " result = optim_problem.optimize()\n", " values.append(result.value)\n", "# output = eao.io.extract_output(portf, optim_problem, result)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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G20dewAAAAAAkIHn2Cd3/PhxmTlzpkyfPl22b98uDzzwQOrdGQBkEMx1BwAAQED12J89e1amTp0qjz76qBQqVEgmTJggjRo1kv3798v69evT5i4BAAAAAEDq9NjrfPrIyEh5+umnZciQIVKpUiVfTwEAAAAAAPwV2C9YsEBq1apl8+wBAAAAAIDDAnsdgg8AgTbPXTHXHQAAAE7k9253XTqvdevWEhUVJVmzZpWyZcvK5s2bvers2bPH5vHnypXLlti7//775ciRI57yCxcuSKdOnewcOXLkkKZNm1q2/uS0fsOGDSVbtmySN29eee211+TKlSvp9j0BAAAAAAi4wP706dNStWpVCQkJkUWLFsnu3btl1KhRNoff7aeffpKHH35YSpYsKd9++61l3+/bt6+EhYV56sTGxsqXX34pc+bMkZUrV8qxY8ekSZMmnvLExEQL6i9duiRr166VadOm2VJ9/fr1S/fvDAAAAABAhlnu7mYNGzbMMutrln23YsWKedXp3bu3NGjQQIYPH+45duedd3r2z5w5I1OmTJEZM2ZIzZo17Zier1SpUpal/6GHHpIlS5bYQ4Nly5ZZ8r/77rtP3nrrLenRo4f0799fQkND0+X7AgAAAAAQUD32mohPs+o3a9bMhseXL19eJk+e7ClPSkqSr776Su6++26pW7eu1XnwwQdl/vz5njpbtmyRy5cvS+3atT3HtHe/cOHCsm7dOnuvrzrEX4N6Nz2fLt23a9euFO/t4sWLVp58AwAAAAAgIHrsdbj7yJEjbe67Kl26tM1Zr1atmk/nOXjwoEyYMEG6d+8ub7zxhmzatEm6du1qPegxMTFy8uRJOX/+vAwdOlTefvtt6+FfvHixDbOPi4uTGjVqyPHjx61+RESE17k1iNcypa/Jg3p3ubssJbqU34ABA3z6PsCtIK2T2JHADgAAAEjjHvvp06db77gmodMgXDdNeqdL4OlweF9oj3yFChVk8ODB1lvfsWNH6dChg0ycONFTrp544gmbR69D6Hv27CmPPfaYp05a6dWrlw3zd2/x8fFpej0AAAAAANKlx37QoEE2310DbTcN7kePHm3z1p955pkbPlf+/Pmttz85nRv/+eef236ePHkkc+bMKdb57rvvbD86OtqS4iUkJHj12mtWfC1z19m4caPXOdxZ8911rpYlSxbbAAAAAAAIqB57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SpSw4//5z3+kUqVKkjNnTomOjpZnnnlGTp486XU/CxYskOLFi0tYWJg88sgjdg96bR054Pbdd99JtWrV7PqFChWSrl272j3/nR9++MHOpdcNDw+XihUryubNm1Mcil+0aFHP902+ucXHx0vz5s3tM7lz55YnnnhCfv7551RpCwAA/IXAHgAAh/r111+lZcuW0q5dO9mzZ48F7k2aNBGdZfevf/3LAth69epZPd2qVKliAXTdunUlMjJSNm3aJHPmzJFly5ZJ586dvc69fPly2bt3ryxdulQWLlxoxy5fvixvvfWWBdo6vF8DYn0I4Hbo0CF56qmn7KGA1nnhhRekd+/eXuf96aef7J6aNm0q27dvl1mzZlmgf/X1k2vVqpUULFjQ7nfLli3Ss2dPCQkJSbGu1nF/319++UUeeughe4jgvn/97vqAYPXq1bJmzRrJkSOH3Y+OSgAAwKmYYw8AgENt3brVeq81wC5SpMgNzbGfPHmy9OjRw3qus2fPbse+/vprefzxx+XYsWOSL18++9zixYvlyJEj1x2Cr73m999/v81x1wBZA+6vvvrKRgS49enTx3r+T58+bb3kzz//vGTKlEk++OADTx0N7GvUqGEPHbSn/2raSz9u3DiJiYm5pkx77F955RWvEQFu3bp1sxELGuzfdtttMn36dHn77bftIYi7F18Der0v/TOqU6fO//gTBwAgY6LHHgAAh7r33nulVq1aNhS/WbNmFrRrAH09GtTq59xBvapataokJSVZD72bnvPqoF57y/UBQOHCha3XW4NxpQ8AlH5eA/3kHnjgAa/32pOvwbg+CHBv2ouu19ce/5R0797dHgjoNIOhQ4dar///MmnSJJkyZYpNDdCg3n3tAwcO2L27r63D8S9cuHBD5wQAIKMisAcAwKG051uHyi9atEhKly5tvdo6H/7vAmRfJA/8lXsIv/aef/LJJ9YLPm/ePCvzZRi7zuXXIfrbtm3zbBpw79+/X+68884UP6P5Anbt2iUNGzaUFStW2Hd1XzslcXFx0qVLF/n444+lXLlyXtfWEQ7Jr63bvn37LF8AAABORVZ8AAAcTIeUa4+7bv369bMh+Rr0ai+39rgnJiZ61S9VqpT1mGug7g7eda55cHCwJ0leSn788Uf5/fffrcdcE94pdwI7N/28DutPTh8AJFehQgXZvXu33HXXXT59z7vvvtu22NhYyyswdepUady48TX1tEde5/m/8cYblm/g6mvrnH5dGk8fUAAAECjosQcAwKE2bNgggwcPtgBbh8PPnTtXfvvtNwve3RniNUGdDpH/73//a8njNBGdzmPX+eo7d+709G63adPG5tf/HR1+rw8KdFTAwYMHbYi7JtJLTnvi9QGAzuHXXvDZs2fbQwTlntOuZWvXrrVkedpbrj31Og/+75Ln6Tr1WqaJAQ8fPmwPIfRhgfs7Xl1XpwqUL1/eMv0fP37csyn97nny5LFM+Jo8T0c26Hk1K78m2gMAwKkI7AEAcCjtdV61apU0aNDAerM1Ud2oUaOkfv36Vt6hQwfrRdcl6nSeuQbF2bJlk2+++UZOnTpl8+G1d1vn6b/33nvXvZZ+XoN0zaKvQ+G1537kyJFedYoVK2bL7+kDBh0CP2HCBE9W/CxZstirHl+5cqUF/pqtXoNwHWmgy+r93XQDHSnQtm1b+46a6V+/34ABA66pe+LECXuwoBn99Xz58+f3bEq/u/556UMK7c3XhwPt27e3Ofb04AMAnIys+AAAIM1oRvyJEydaFn4AAJA2mGMPAABSzfjx420kQFRUlI0QGDFixHXXqAcAADePwB4AAKQanTOva8XrUH8d8v7qq69Kr169/H1bAAAENIbiAwAAAADgYCTPAwAAAADAwQjsAQAAAABwMAJ7AAAAAAAcjMAeAAAAAAAHI7AHAAAAAMDBCOwBAAAAAHAwAnsAAAAAAByMwB4AAAAAAHGu/w8BYvkmO66DLQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (12,3))\n", "plt.bar(storage_sizes, values, width = 4)\n", "plt.ylim((6000, 7000))\n", "plt.xlabel('storage size')\n", "plt.ylabel('total portfolio value')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is just for demonstration purpose. However - neat to see how the value add of extra storage size decreases." ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "my_env", "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.9" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }