diff --git a/.gitignore b/.gitignore index a61dd35..9979a7a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ tests/.~lock.plant_test_data.csv\# doc/source/samples/benchmark_problems/res_cross_commodity_benchmark.xlsx doc/source/samples/benchmark_problems/DK1_input_data.xlsx .vscode/launch.json +doc/source/samples/grid and battery/~$test.xlsx diff --git a/doc/source/samples/grid and battery/battery_own_consumption.ipynb b/doc/source/samples/grid and battery/battery_own_consumption.ipynb index f4fbe89..70f5c0a 100644 --- a/doc/source/samples/grid and battery/battery_own_consumption.ipynb +++ b/doc/source/samples/grid and battery/battery_own_consumption.ipynb @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -125,7 +125,9 @@ " size = battery_data['size'],\n", " start_level= 0.5 * battery_data['size'],\n", " end_level = 0.5 * battery_data['size'],\n", - " block_size = 'd') # daily optimization of battery (leaving it 1/2 full every day)\n", + " block_size = 'd', # daily optimization of battery (leaving it 1/2 full every day)\n", + " no_simult_in_out = False) # Important: The battery may now charge and discharge at the same time and\n", + " # \"burn\" power due to efficiency < 100%. This makes computation much faster (no MIP)\n", "\n", "### Supply via the grid. Note that we enabling scaling the grid connection -- since grid fees \n", "# apply on a yearly basis for the maximum load (which we will minimize utilizing our battery)\n", @@ -171,7 +173,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGbCAYAAABZBpPkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlfElEQVR4nO3deXxU1f3/8ddMkslKVkKQNYQlYQ8CskgAF3aQgNW6iwoUl1pbbS3VorZ1abU/laKioojbV0XZREVl30EQZE0ghABJWBKyr5OZub8/0kwJCSEJ2fN+Ph48au7cufdzJ+nMe8459xyTYRgGIiIi0myZ67sAERERqV8KAyIiIs2cwoCIiEgzpzAgIiLSzCkMiIiINHMKAyIiIs2cwoCIiEgzpzAgIiLSzCkMiIiINHMKAyLVMG3aNHx8fOq7jBpVE9f08ssvExYWhouLC5GRkTVTWCPw0UcfERERgZubG/7+/lV67rRp0wgNDS21zWQy8eyzz9ZYfSKXozAgNeKDDz7AZDLh4eFBUlJSmcdHjhxJr169qnXsTz/9lNdee+0KK5Ta9sMPP/CnP/2Ja6+9loULF/LCCy/Ud0k1Jjk5mWeffZa9e/eWeSwmJoZp06bRuXNn3n33Xd555526L1DkCrnWdwHStBQWFvLSSy/xn//8p8aO+emnn3LgwAEee+yxGjum1Ly1a9diNpt57733sFgs9V1OjUpOTua5554jNDS0TIvH+vXrcTgcvP7663Tp0qVGzpefn4+rq96epe6oZUBqVGRkJO+++y7Jycn1XUqtyM3Nrdfz22w2rFZrvdZwKefOncPT07PGgoBhGOTn59fIsaqrMq/3uXPnAKrcPVARDw8PhQGpUwoDUqP+8pe/YLfbeemllyq1/8cff0z//v3x9PQkMDCQ2267jVOnTjkfHzlyJN988w0nTpzAZDJhMpkIDQ3FMAxatmzJH/7wB+e+DocDf39/XFxcyMjIcG7/5z//iaurKzk5Oc5ta9euJSoqCm9vb/z9/Zk8eTKHDx8uVduzzz6LyWTi0KFD3HHHHQQEBDBs2LBLXsvevXsJDg5m5MiRpc5VnsWLF9OjRw88PDzo1asXS5cuLdN3nJCQgMlk4pVXXuG1116jc+fOuLu7c+jQIaxWK3PmzKF///74+fnh7e1NVFQU69atK3WeC4/x6quv0rFjRzw9PRkxYgQHDhwot7akpCSio6Px8fEhODiYJ554ArvdXuH1mEwmFi5cSG5urvP39MEHHwDFH6h///vfnfWHhobyl7/8hcLCwlLHCA0NZeLEiXz//fcMGDAAT09P3n777Uues6Traffu3QwdOhRPT086derE/Pnzy+x77tw5HnjgAUJCQvDw8KBv374sWrTokq/Vha/3m2++ycCBAwG47777Sl1faGgozzzzDADBwcFl+vrffPNNevbsibu7O23atOHhhx8u9bdZ0et58ZiBPXv2MG7cOHx9ffHx8eGGG25g+/btlz2WSGUoekqN6tSpE/fccw/vvvsuf/7zn2nTps0l933++ef561//yq233sr06dNJSUnhP//5D8OHD2fPnj34+/vz1FNPkZmZSWJiIq+++ioAPj4+mEwmrr32WjZu3Og83r59+8jMzMRsNrNlyxYmTJgAwKZNm+jXr59zcNzq1asZN24cYWFhPPvss+Tn5/Of//yHa6+9lp9//rnMYK5bbrmFrl278sILL3CpFb9/+uknxowZw4ABA1i+fDmenp6XvO5vvvmGX//61/Tu3ZsXX3yR9PR0HnjgAdq2bVvu/gsXLqSgoICZM2fi7u5OYGAgWVlZLFiwgNtvv50ZM2aQnZ3Ne++9x5gxY9i5c2eZpuwPP/yQ7OxsHn74YQoKCnj99de5/vrr2b9/PyEhIc797HY7Y8aMYdCgQbzyyiusXr2af//733Tu3JkHH3zwktf00Ucf8c4777Bz504WLFgAwNChQwGYPn06ixYt4le/+hWPP/44O3bs4MUXX+Tw4cMsXbq01HFiY2O5/fbb+c1vfsOMGTMIDw+/5DkB0tPTGT9+PLfeeiu33347X3zxBQ8++CAWi4X7778fKG5yHzlyJHFxcTzyyCN06tSJxYsXM23aNDIyMvjd735X4es9ZcoUsrOzmTNnDjNnziQqKsp5fa+99hoffvghS5cu5a233sLHx4c+ffoAxWHyueee48Ybb+TBBx8kNjaWt956i59++oktW7bg5uZW4bVd6ODBg0RFReHr68uf/vQn3NzcePvttxk5ciQbNmxg0KBBlT6WSLkMkRqwcOFCAzB++ukn49ixY4arq6vx6KOPOh8fMWKE0bNnT+fPCQkJhouLi/H888+XOs7+/fsNV1fXUtsnTJhgdOzYscw5X375ZcPFxcXIysoyDMMw5s6da3Ts2NG45pprjCeffNIwDMOw2+2Gv7+/8fvf/975vMjISKNVq1bG+fPnndt++eUXw2w2G/fcc49z2zPPPGMAxu23317m3Pfee6/h7e1tGIZhbN682fD19TUmTJhgFBQUXPa16t27t9GuXTsjOzvbuW39+vUGUOo6jx8/bgCGr6+vce7cuVLHsNlsRmFhYalt6enpRkhIiHH//feXOYanp6eRmJjo3L5jxw4DKPW63HvvvQZg/O1vfyt13H79+hn9+/e/7HVd+JqU2Lt3rwEY06dPL7X9iSeeMABj7dq1zm0dO3Y0AGPVqlWXPZdhFP9NAca///1v57bCwkLn79dqtRqGYRivvfaaARgff/yxcz+r1WoMGTLE8PHxcf79VPR6//TTTwZgLFy4sEwdJX8nKSkpzm3nzp0zLBaLMXr0aMNutzu3z5s3zwCM999/37nt3nvvLfP3DRjPPPOM8+fo6GjDYrEYx44dc25LTk42WrRoYQwfPrwSr5ZIxdRNIDUuLCyMu+++m3feeYfTp0+Xu8+SJUtwOBzceuutpKamOv+1bt2arl27lmnuLk9UVBR2u52tW7cCxS0AUVFRREVFsWnTJgAOHDhARkaG89vc6dOn2bt3L9OmTSMwMNB5rD59+jBq1Ci+/fbbMueZNWvWJWtYt24dY8aM4YYbbmDJkiW4u7tXWHNycjL79+/nnnvuKXUb34gRI+jdu3e5z7n55psJDg4utc3FxcXZN+9wOEhLS8NmszFgwAB+/vnnMseIjo4u1fJwzTXXMGjQoEpdb1RUFPHx8RVe16WUHP/C7hyAxx9/HChuJblQp06dGDNmTKWP7+rqym9+8xvnzxaLhd/85jecO3eO3bt3O2to3bo1t99+u3M/Nzc3Hn30UXJyctiwYUOpY5b3elfV6tWrsVqtPPbYY5jN/3ubnTFjBr6+vmWuuyJ2u50ffviB6OhowsLCnNuvuuoq7rjjDjZv3kxWVtYV1SuiMCC14umnn8Zms11y7MDRo0cxDIOuXbsSHBxc6t/hw4edg7IqcvXVV+Pl5eX84C8JA8OHD2fXrl0UFBQ4Hyvp6z9x4gRAuc3P3bt3JzU1tcwgwU6dOpV7/oKCAiZMmEC/fv344osvKjVwruT85Y06v9RI9Eudf9GiRfTp0wcPDw+CgoIIDg7mm2++ITMzs8y+Xbt2LbOtW7duJCQklNrm4eFR5oMwICCA9PT0cmu4nBMnTmA2m8tcW+vWrfH393e+HiUuda2X0qZNG7y9vUtt69atG4Dz2k6cOEHXrl1LfShD8e+75PErqaE8l/o7s1gshIWFlTlnRVJSUsjLy7vk36zD4Sg1zkakOjRmQGpFWFgYd911F++88w5//vOfyzzucDgwmUx89913uLi4lHm8MpPfuLm5MWjQIDZu3EhcXBxnzpwhKiqKkJAQioqK2LFjB5s2bSIiIuKKvuldqv/f3d2d8ePHs3z5clatWsXEiROrfY6qnv/jjz9m2rRpREdH88c//pFWrVrh4uLCiy++yLFjx6p9rvJ+FzXBZDJVar+KxlrUlYZQg0hdUxiQWvP000/z8ccf889//rPMY507d8YwDDp16uT8JncpFX2QREVF8c9//pPVq1fTsmVLIiIiMJlM9OzZk02bNrFp06ZSH9IdO3YEigeqXSwmJoaWLVuW+aZZUV2ffPIJkydP5pZbbuG7775j5MiRFT6n5PxxcXFlHitv26V8+eWXhIWFsWTJklKvT8nI9osdPXq0zLYjR46UGSxZ0zp27IjD4eDo0aPOb+IAZ8+eJSMjw/l6VFdycjK5ubmlfmdHjhwBcF5bx44d2bdvHw6Ho1TrQExMjPPxy6lsmClx4d/ZhU37VquV48ePc+ONN1b6WMHBwXh5eV3yb9ZsNtO+ffsq1SdyMXUTSK3p3Lkzd911F2+//TZnzpwp9djUqVNxcXHhueeeKzNC3zAMzp8/7/zZ29u73KZvKA4DhYWFvPbaawwbNsz5ph0VFcVHH31EcnKyc7wAFPezRkZGsmjRolK3eB04cIAffviB8ePHV+kaLRYLS5YsYeDAgUyaNImdO3dWuH+bNm3o1asXH374YanbDzds2MD+/fsrfd6Sb/AXvnY7duxg27Zt5e6/bNmyUjND7ty5kx07djBu3LhKn7M6Sl7Pi2eQ/H//7/8BOO/4qC6bzVbq9kOr1crbb79NcHAw/fv3d9Zw5swZPv/881LP+89//oOPjw8jRoy47HlKwkZlbgsEuPHGG7FYLMydO7fU7+i9994jMzOzStft4uLC6NGjWb58ealunbNnz/Lpp58ybNgwfH19K308kfKoZUBq1VNPPcVHH31EbGwsPXv2dG7v3Lkz//jHP5g9ezYJCQlER0fTokULjh8/ztKlS5k5cyZPPPEEAP379+fzzz/nD3/4AwMHDsTHx4dJkyYBMGTIEFxdXYmNjWXmzJnO4w8fPpy33noLoFQYgOL588eNG8eQIUN44IEHnLcW+vn5VWs+eE9PT1auXMn111/PuHHj2LBhQ4VTL7/wwgtMnjyZa6+9lvvuu4/09HTmzZtHr169Ljs/QYmJEyeyZMkSpkyZwoQJEzh+/Djz58+nR48e5R6jS5cuDBs2jAcffNAZnoKCgvjTn/5U5eutir59+3LvvffyzjvvkJGRwYgRI9i5cyeLFi0iOjqa66677oqO36ZNG/75z3+SkJBAt27d+Pzzz9m7dy/vvPOO89a9mTNn8vbbbzNt2jR2795NaGgoX375JVu2bOG1116jRYsWlz1P586d8ff3Z/78+bRo0QJvb28GDRp0yfEFwcHBzJ49m+eee46xY8dy0003ERsb65yz4K677qrSdf7jH//gxx9/ZNiwYTz00EO4urry9ttvU1hYyL/+9a8qHUukXPV5K4M0HRfeWnixklvWLry1sMRXX31lDBs2zPD29ja8vb2NiIgI4+GHHzZiY2Od++Tk5Bh33HGH4e/vX+b2O8MwjIEDBxqAsWPHDue2xMREAzDat29fbr2rV682rr32WsPT09Pw9fU1Jk2aZBw6dKjUPuXdMnbhNV18G11qaqrRo0cPo3Xr1sbRo0fLPW+Jzz77zIiIiDDc3d2NXr16GStWrDBuvvlmIyIiwrlPya1uL7/8cpnnOxwO44UXXjA6duxouLu7G/369TNWrlxZ5ja1C4/x73//22jfvr3h7u5uREVFGb/88stlr+nC1+FyLvX8oqIi47nnnjM6depkuLm5Ge3btzdmz55d5jbMjh07GhMmTLjseUqU3K66a9cuY8iQIYaHh4fRsWNHY968eWX2PXv2rHHfffcZLVu2NCwWi9G7d+8ytwlW9HobhmEsX77c6NGjh+Hq6lrqNsOK/k7mzZtnREREGG5ubkZISIjx4IMPGunp6aX2qcythYZhGD///LMxZswYw8fHx/Dy8jKuu+46Y+vWrRW+RiKVZTKMS8yiIiJ1KjIykuDgYH788ccaO2ZCQgKdOnXi5Zdfdra0NBUjR44kNTX1kjMpikjlacyASB0rKirCZrOV2rZ+/Xp++eWXyw5AFBGpDRozIFLHkpKSuPHGG7nrrrto06YNMTExzJ8/n9atW1c4wZGISG1RGBCpYwEBAfTv358FCxaQkpKCt7c3EyZM4KWXXiIoKKi+yxORZkhjBkRERJo5jRkQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBEGhWHw4HNZsMwjPouRaTJcK3vAkREKmIYBqdPnyYhIYEzZ86QkZGBYRi4urrSsmVLrrrqKjp37oyfn199lyrSaJkMxWsRaaBSUlLYunUrp0+fxmaz4eLigpubGyaTCYfDQVFREXa7HQ8PD7p27cqgQYPw9PSs77JFGh2FARFpcAzD4ODBg2zfvp2CggJ8fHywWCyYTKZy983Pzyc/P5/AwECuv/56WrduXQ9VizReCgMi0uDs27ePrVu3YjKZaNGiRbkh4GIOh4P09HR8fHwYN24cISEhdVCpSNOgAYQi0qCcOXOGHTt2YDab8fX1rVQQADCbzQQGBpKTk8P69espLCys5UpFmg6FARFpMBwOB1u2bMFqteLj41Pl55tMJvz9/UlJSWHPnj21UKFI06QwICJ1bvny5XTv3p3IyEj279/v3H7q1CnOnTtX6a6BC5/36KOPApCVlcXrr79OTEwMBQUFNV67SFOkMCAidW7+/PnMmTOHvXv30rt3b+f2Y8eOYbfbcXNzq/axAwICePbZZ8nNzSUhIaEGqhVp+jTPgIjUqUcffZRNmzYRExPDf/7zH15//XWefPJJsrKySE1NZcyYMYwcORKAX375haVLl2K1WjGbzdx+++307NkTgC+//JItW7bg6elJZGSk8/gpKSnMnj2bf/3rX6SmpmIymXj++edZtmwZKSkpzJkzh/vuu68erlyk4VIYEJE6NXfuXPbt28djjz3GyJEjue666/j222/x8/Nj/vz5PP/88/Tp04eioiK++uor/vznP+Pl5cWZM2f429/+xuuvv86BAwfYsWMHzz//PJ6enrz55ptlzmM2m0lNTQXA3d2dnTt3EhMTw8CBA7n77rtxddXbn0gJ/b9BROrN1q1biY+PZ9y4cc5bAwFOnz5NcnIyZ8+e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", "text/plain": [ "
" ] @@ -195,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -226,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -247,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -275,7 +277,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -317,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -428,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -441,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 14, "metadata": {}, "outputs": [ { diff --git a/doc/source/samples/order_book/order_book_battery.ipynb b/doc/source/samples/order_book/order_book_battery.ipynb index b4cedb3..9ae6601 100644 --- a/doc/source/samples/order_book/order_book_battery.ipynb +++ b/doc/source/samples/order_book/order_book_battery.ipynb @@ -171,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,8 @@ " start_level = 20,\n", " end_level = 20,\n", " eff_in = efficiency,\n", - " size = 40)\n", + " size = 40,\n", + " no_simult_in_out = True) # at negative prices, we want to ensure the battery does not charge & discharge at the same time to \"burn\" power\n", "# last resort - battery end level. May allow battery not to be completely full, \"borrowing\" in last hours\n", "extra_power = eao.assets.SimpleContract('fill_level_adjust', node,\n", " max_cap = 10,\n", @@ -246,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -274,10 +275,12 @@ "ax.plot([S, S], [0,0],'r-',linewidth = 5, alpha = 1, label = 'executed buy - we sell')\n", "ax.set_xlim(S, E)\n", "ax2 = ax.twinx() \n", - "# calculate fill level from dispatch\n", - "fill_level = -out['dispatch'].loc[:,'battery']\n", - "fill_level[fill_level>0] *= efficiency\n", - "fill_level = fill_level.cumsum()+20 \n", + "### show how to manually calculate fill level from dispatch\n", + "# fill_level = -out['dispatch'].loc[:,'battery']\n", + "# fill_level[fill_level>0] *= efficiency\n", + "# fill_level = fill_level.cumsum()+20 \n", + "### this is the automatic output\n", + "fill_level = out['internal_variables']['battery_fill_level']\n", "ax2.plot(fill_level, label = 'battery fill level')\n", "ax2.set_ylabel('fill level battery in MWh')\n", "ax.legend(loc = 'upper left')\n", diff --git a/eaopack/assets.py b/eaopack/assets.py index ab17d7f..61d3c9b 100644 --- a/eaopack/assets.py +++ b/eaopack/assets.py @@ -109,7 +109,7 @@ def dcf(self, optim_problem:OptimProblem, results:Results) -> np.array: dcf = np.zeros(self.timegrid.T) # filter for right asset in case larger problem is given my_mapping = optim_problem.mapping.loc[optim_problem.mapping['asset']==self.name].copy() - # drop duplicate index - since mapping may contain several rows per varaible (indexes enumerate variables) + # drop duplicate index - since mapping may contain several rows per variable (indexes enumerate variables) my_mapping = pd.DataFrame(my_mapping[~my_mapping.index.duplicated(keep = 'first')]) for i, r in my_mapping.iterrows(): @@ -355,7 +355,9 @@ def setup_optim_problem(self, prices: dict, timegrid:Timegrid = None, costs_only price = np.asarray(myprice) else: # simply restrict prices to asset time window price = price[self.timegrid.restricted.I] - + # warning if there are neg. prices and no_simult_in_out is not True + if (not self.no_simult_in_out) and (self.eff_in <= 1) and (not (price >= 0).all()): + print('Storage --'+self.name+'--: no_simult_in_out is set to False, but there are neg. prices. Likely storage will load & unload simultaneously. You want that?') # separation into in/out needed? Only one or two dispatch variables per time step # new separation reason: separate nodes in and out sep_needed = (self.eff_in != 1) or (self.cost_in !=0) or (self.cost_out !=0) or (len(self.nodes)==2) @@ -553,7 +555,46 @@ def setup_optim_problem(self, prices: dict, timegrid:Timegrid = None, costs_only periodic_period_length = self.periodicity, periodic_duration = self.periodicity_duration, timegrid = self.timegrid) + + def fill_level(self, optim_problem:OptimProblem, results:Results) -> np.array: + """ Calculate discounted cash flow for the asset given the optimization results + + Args: + optim_problem (OptimProblem): optimization problem created by this asset + results (Results): Results given by optimizer + Returns: + np.array: array with DCF per time step as per timegrid of asset + """ + # for this asset simply from cost vector and optimal dispatch + # mapped to the full timegrid + + ######### missing: mapping in optim problem + fill_level = np.zeros(self.timegrid.T) + # filter for right asset in case larger problem is given + my_mapping = optim_problem.mapping.loc[(optim_problem.mapping['asset']==self.name) & (optim_problem.mapping['type']=='d')].copy() + # drop duplicate index - since mapping may contain several rows per variable (indexes enumerate variables) + my_mapping = pd.DataFrame(my_mapping[~my_mapping.index.duplicated(keep = 'first')]) + + # # for only one variable + # I_d = my_mapping['var_name']=="disp" + # if sum(I_d) != 0: + # fill_level = np.maximum(0,-results.x[my_mapping.loc[I_d].index]*self.eff_in) \ + # + np.minimum(0,-results.x[my_mapping.loc[I_d].index]) + # else: + # I_in = my_mapping['var_name']=="disp_in" + # I_out = my_mapping['var_name']=="disp_out" + # fill_level = -results.x[my_mapping.loc[I_in].index]*self.eff_in \ + # - results.x[my_mapping.loc[I_out].index] + # fill_level = fill_level.cumsum() + self.start_level + + fill_level = np.zeros(self.timegrid.T) + for i, r in my_mapping.iterrows(): + fill_level[r['time_step']] += max(0,-results.x[i])*self.eff_in \ + + min(0,-results.x[i]) + fill_level = fill_level.cumsum() + self.start_level + return fill_level + class SimpleContract(Asset): """ Contract Class """ def __init__(self, diff --git a/eaopack/io.py b/eaopack/io.py index 2810efa..fb105db 100644 --- a/eaopack/io.py +++ b/eaopack/io.py @@ -2,10 +2,12 @@ import pandas as pd import datetime as dt import copy +from typing import Union, List, Dict from eaopack.portfolio import Portfolio from eaopack.optimization import Results, OptimProblem from eaopack import serialization +from eaopack.assets import Storage def extract_output(portf: Portfolio, op: OptimProblem, res:Results, prices: dict = None) -> dict: @@ -58,6 +60,7 @@ def extract_output(portf: Portfolio, op: OptimProblem, res:Results, prices: dict # in case an asset links nodes, dispatch should be separate per node for a in portf.assets: for i_n, n in enumerate(a.nodes): + # sum up dispatch I = (op.mapping['asset'] == a.name) \ & (op.mapping['type'] == 'd') \ & (op.mapping['node'] == n.name) @@ -68,10 +71,10 @@ def extract_output(portf: Portfolio, op: OptimProblem, res:Results, prices: dict myCol = (a.name +' ('+ n.name + ')') disp[myCol] = 0. for i,r in my_mapping.iterrows(): - disp.loc[times[r.time_step], myCol] += res.x[i]*r.disp_factor + disp.loc[times[r.time_step], myCol] += res.x[i]*r.disp_factor # extract internal variables per asset for a in portf.assets: - variable_names = op.mapping[(op.mapping['asset'] == a.name)& (op.mapping['type'] == 'i')]['var_name'].unique() + variable_names = op.mapping[(op.mapping['asset'] == a.name) & (op.mapping['type'] == 'i')]['var_name'].unique() for v in variable_names: I = (op.mapping['asset'] == a.name) \ & (op.mapping['type'] == 'i') \ @@ -80,8 +83,35 @@ def extract_output(portf: Portfolio, op: OptimProblem, res:Results, prices: dict myCol = (a.name +' ('+ v + ')') internal_variables[myCol] = None for i,r in my_mapping.iterrows(): - pass internal_variables.loc[times[r.time_step], myCol] = res.x[i] + # specific case: Storage; also extract disp_in, disp_out and fill level separately + if isinstance(a, Storage): + I = (op.mapping['asset'] == a.name) \ + & (op.mapping['type'] == 'd') \ + & (op.mapping['node'] == n.name) + my_mapping = op.mapping.loc[I,:] + ### extract ... disp in + what = 'charge' + if len(portf.nodes)==1: + myCol = a.name+'_'+what + else: # add node information + myCol = (a.name +' ('+ n.name +'_'+ what + ')') + internal_variables[myCol] = 0. + for i,r in my_mapping.iterrows(): + internal_variables.loc[times[r.time_step], myCol] += max(0,-res.x[i])*r.disp_factor + ### extract ... disp out + what = 'discharge' + if len(portf.nodes)==1: + myCol = a.name+'_'+what + else: # add node information + myCol = (a.name +' ('+ n.name +'_'+ what + ')') + internal_variables[myCol] = 0. + for i,r in my_mapping.iterrows(): + internal_variables.loc[times[r.time_step], myCol] += min(0,-res.x[i])*r.disp_factor + ### extract ... fill level + myCol = a.name+'_fill_level' + internal_variables[myCol] = 0. + internal_variables.loc[:, myCol] = a.fill_level(op, res) # extract duals from nodal restrictions # looping through nodes and their recorded nodal restrictions and extract dual if not res.duals is None and not res.duals['N'] is None: @@ -181,7 +211,7 @@ def output_to_file(output, file_name:str, format_output:str = 'xlsx',csv_ger:boo #### easy access to object parameters e.g. for assets & portfolio ## get tree, get parameter, set parameter -def get_params_tree(obj) -> (list, dict): +def get_params_tree(obj) -> Union[List, Dict]: """ get parameters of object - typically asset or portfolio Args: @@ -191,7 +221,7 @@ def get_params_tree(obj) -> (list, dict): list of parameter names (nested) """ - def make_dict(dd) -> (list, dict): + def make_dict(dd) -> Union[List, Dict]: if isinstance(dd, list): dd_keys = range(0,len(dd)) elif isinstance(dd, dict): dd_keys = list(dd) else: diff --git a/setup.cfg b/setup.cfg index 146c5d3..f99a640 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = eaopack -version = 2.1.3 +version = 2.1.4 author = The EAO development Team description = A Framework for Optimizing Decentralized Portfolios and Green Supply long_description = file: README.md diff --git a/tests/test_various.py b/tests/test_various.py new file mode 100644 index 0000000..a1cce7e --- /dev/null +++ b/tests/test_various.py @@ -0,0 +1,320 @@ +import unittest +import numpy as np +import pandas as pd +import datetime as dt +import json +from os.path import dirname, join +import sys +mypath = (dirname(__file__)) +sys.path.append(join(mypath, '..')) + +import eaopack as eao + +class various(unittest.TestCase): + def test_battery_efficiency(self): + """ test specific setup of a battery to show the importance of no_simult_in_out. + """ + s = """{ + "__class__": "Portfolio", + "assets": [ + { + "__class__": "Asset", + "asset_type": "Storage", + "block_size": null, + "cap_in": 50, + "cap_out": 50, + "cost_in": 0.0, + "cost_out": 0.0, + "cost_store": 0.0, + "eff_in": 0.9, + "end": null, + "end_level": 50.0, + "freq": null, + "inflow": 0.0, + "max_store_duration": null, + "name": "battery", + "no_simult_in_out": false, + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": null, + "profile": null, + "size": 100.0, + "start": null, + "start_level": 50.0, + "wacc": 0.0 + }, + { + "__class__": "Asset", + "asset_type": "SimpleContract", + "end": null, + "extra_costs": 0, + "freq": null, + "max_cap": 500, + "min_cap": -500, + "name": "supply", + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": "price", + "profile": null, + "start": null, + "wacc": 0 + } + ] + }""" + size = 100 # battery size + eff = 0.9 + portf = eao.serialization.load_from_json(s) + portf.assets[0].eff_in = eff + portf.assets[0].size = size + portf.assets[0].no_simult_in_out = True # !!! we sum up in and out in output. Computing the storage level won't work without enforcing + tg = eao.assets.Timegrid(dt.date(2021,1,1), dt.date(2021,1,3), freq = 'h') + prices ={ 'price': np.sin(np.linspace(0,40,tg.T))} + op = portf.setup_optim_problem(timegrid = tg, prices = prices) + res = op.optimize() + out = eao.io.extract_output(portf = portf, op = op, res = res) + # eao.io.output_to_file(out, 'test.xlsx') + # get fill level from asset + bat = portf.assets[0] + fill_level = bat.fill_level(op, res) + # calculate fill level from dispatch + fill_level_check = -out['dispatch'].loc[:,'battery'] + fill_level_check[fill_level_check>0] *= eff + fill_level_check = fill_level_check.cumsum()+50 + self.assertGreaterEqual(np.round(fill_level.min(), 3), 0) + self.assertGreaterEqual(100, np.round(fill_level.max(), 3)) + self.assertAlmostEqual(abs(fill_level_check.values-fill_level).sum(), 0,4) + # get fill level from output and check + fl_out = out['internal_variables'].loc[:,'battery_fill_level'].values + self.assertAlmostEqual(abs(fill_level-fl_out).sum(), 0,4) + + def test_battery_efficiency_100(self): + """ test specific setup of a battery to show the importance of no_simult_in_out. + """ + s = """{ + "__class__": "Portfolio", + "assets": [ + { + "__class__": "Asset", + "asset_type": "Storage", + "block_size": null, + "cap_in": 50, + "cap_out": 50, + "cost_in": 0.0, + "cost_out": 0.0, + "cost_store": 0.0, + "eff_in": 0.9, + "end": null, + "end_level": 50.0, + "freq": null, + "inflow": 0.0, + "max_store_duration": null, + "name": "battery", + "no_simult_in_out": false, + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": null, + "profile": null, + "size": 100.0, + "start": null, + "start_level": 50.0, + "wacc": 0.0 + }, + { + "__class__": "Asset", + "asset_type": "SimpleContract", + "end": null, + "extra_costs": 0, + "freq": null, + "max_cap": 500, + "min_cap": -500, + "name": "supply", + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": "price", + "profile": null, + "start": null, + "wacc": 0 + } + ] + }""" + size = 100 # battery size + eff = 1 + portf = eao.serialization.load_from_json(s) + portf.assets[0].eff_in = eff + portf.assets[0].size = size + portf.assets[0].no_simult_in_out = False + tg = eao.assets.Timegrid(dt.date(2021,1,1), dt.date(2021,1,3), freq = 'h') + prices ={ 'price': np.sin(np.linspace(0,40,tg.T))} + op = portf.setup_optim_problem(timegrid = tg, prices = prices) + res = op.optimize() + out = eao.io.extract_output(portf = portf, op = op, res = res) + # eao.io.output_to_file(out, 'test.xlsx') + # get fill level from asset + bat = portf.assets[0] + fill_level = bat.fill_level(op, res) + # calculate fill level from dispatch + fill_level_check = -out['dispatch'].loc[:,'battery'] + fill_level_check[fill_level_check>0] *= eff + fill_level_check = fill_level_check.cumsum()+50 + self.assertGreaterEqual(np.round(fill_level.min(), 3), 0) + self.assertGreaterEqual(100, np.round(fill_level.max(), 3)) + self.assertAlmostEqual(abs(fill_level_check.values-fill_level).sum(), 0,4) + # get fill level from output and check + fl_out = out['internal_variables'].loc[:,'battery_fill_level'].values + self.assertAlmostEqual(abs(fill_level-fl_out).sum(), 0,4) + + def test_battery_efficiency_asset_only(self): + """ test specific setup of a battery + """ + s = """{ + "__class__": "Portfolio", + "assets": [ + { + "__class__": "Asset", + "asset_type": "Storage", + "block_size": null, + "cap_in": 50, + "cap_out": 50, + "cost_in": 0.0, + "cost_out": 0.0, + "cost_store": 0.0, + "eff_in": 0.9, + "end": null, + "end_level": 50.0, + "freq": null, + "inflow": 0.0, + "max_store_duration": null, + "name": "battery", + "no_simult_in_out": false, + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": "price", + "profile": null, + "size": 100.0, + "start": null, + "start_level": 50.0, + "wacc": 0.0 + }, + { + "__class__": "Asset", + "asset_type": "SimpleContract", + "end": null, + "extra_costs": 0, + "freq": null, + "max_cap": 500, + "min_cap": -500, + "name": "supply", + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": "price", + "profile": null, + "start": null, + "wacc": 0 + } + ] + }""" + size = 100 # battery size + eff = 0.9 + portf = eao.serialization.load_from_json(s) + portf.assets[0].eff_in = eff + portf.assets[0].size = size + a = portf.assets[0] + tg = eao.assets.Timegrid(dt.date(2021,1,1), dt.date(2021,1,10), freq = 'h') + prices ={ 'price': np.sin(np.linspace(0,30,tg.T))} + op = a.setup_optim_problem(timegrid = tg, prices = prices) + res = op.optimize() + # get fill level from asset + fill_level_asset = a.fill_level(op, res) + # calculate fill level from dispatch + d_in = -res.x[:tg.T] + d_out = -res.x[tg.T:] + fill_level = eff*d_in + d_out + fill_level = fill_level.cumsum()+50 + self.assertGreaterEqual(fill_level.min(), 0) + self.assertGreaterEqual(100, fill_level.max()) + self.assertAlmostEqual(abs(fill_level_asset-fill_level).sum(), 0,4) + +########################################################################################################### +########################################################################################################### +########################################################################################################### + +if __name__ == '__main__': + unittest.main()