From aeca88ba6d25227912f508591cb33784d2a232f5 Mon Sep 17 00:00:00 2001 From: Alina Voilova Date: Tue, 6 Feb 2024 13:08:38 +0100 Subject: [PATCH] added slice property & tests --- docs/core/pfline.rst | 7 +- docs/tutorial/part3.ipynb | 1910 ++++++++++++----------- docs/tutorial/part4.ipynb | 556 +++---- portfolyo/core/ndframelike.py | 6 + portfolyo/core/pfline/classes.py | 2 + portfolyo/core/pfline/flat_methods.py | 25 + portfolyo/core/pfline/nested_methods.py | 17 + portfolyo/core/pfstate/pfstate.py | 18 + tests/core/pfline/test_slice.py | 91 ++ tests/core/pfstate/test_slice_state.py | 68 + 10 files changed, 1475 insertions(+), 1225 deletions(-) create mode 100644 tests/core/pfline/test_slice.py create mode 100644 tests/core/pfstate/test_slice_state.py diff --git a/docs/core/pfline.rst b/docs/core/pfline.rst index e3a8678..5a6756d 100644 --- a/docs/core/pfline.rst +++ b/docs/core/pfline.rst @@ -252,6 +252,8 @@ Index slice From ``pandas`` we know the ``.loc[]`` property which allows us to select a slice of the objects. This is implemented also for portfolio lines. Currently, it supports enering a slice of timestamps. It is a wrapper around the ``pandas.DataFrame.loc[]`` property, and therefore follows the same convention, with the end point being included in the result. +Another slicing method is implemented with the ``.slice[]`` property. The improvement to ``.loc[]`` is, that ``.slice[]`` uses the more common convention of excluding the end point. This has several advantages, which stem from the fact that, unlike when using ``.loc``, using ``left = pfl.slice[:a]`` and ``right = pfl.slice[a:]`` returns portfolio lines that are complements - every timestamp in the original portfolio line is found in either the left or the right slice. This is useful when e.g. concatenating portfolio lines (see below.) + .. exec_code:: # --- hide: start --- @@ -261,12 +263,13 @@ From ``pandas`` we know the ``.loc[]`` property which allows us to select a slic pfl = pf.PfLine(input_df) # --- hide: stop --- # continuation of previous code example - pfl.loc['2024':'2025'] # includes 2025 + pfl.slice['2024':'2026'] # excludes 2026; 2026 interpreted as timestamp 2026-01-01 00:00:00 # --- hide: start --- - print(pfl.loc['2024':'2025']) + print(pfl.slice['2024':'2026']) # --- hide: stop --- + Volume-only, price-only or revenue-only ======================================= diff --git a/docs/tutorial/part3.ipynb b/docs/tutorial/part3.ipynb index e71e8bf..1abbd36 100644 --- a/docs/tutorial/part3.ipynb +++ b/docs/tutorial/part3.ipynb @@ -1,948 +1,968 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tutorial part 3\n", - "\n", - "In [part 1](part1.ipynb) and [part 2](part2.ipynb) we have learnt about portfolio lines. These are timeseries, or collections of timeseries, describing the volumes and/or prices during various delivery periods.\n", - "\n", - "In this part, we'll combine portfolio lines into a \"portfolio state\" (``PfState``) object. As we'll see, some of the methods and properties we know from the ``PfLine`` class also apply here.\n", - "\n", - "\n", - "## Example data\n", - "\n", - "Let's again use the mock functions to get some portfolio lines. (The parameter details here are not important, we just want some more-or-less realistic data). To change things up a bit from the previous tutorial parts, we'll look at about 80 days in the autumn of 2024, in quarterhourly (``\"15T\"``) resolution. And let's localize the data to a specific timezone:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import portfolyo as pf\n", - "import pandas as pd\n", - "\n", - "index = pd.date_range('2024-09-20', '2024-12-10', freq='15T', inclusive='left', tz='Europe/Berlin')\n", - "# Creating offtake portfolio line.\n", - "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", - "offtake = pf.PfLine({'w': ts_offtake})\n", - "# Creating portfolio line with market prices (here: price-forward curve).\n", - "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", - "prices = pf.PfLine({'p': ts_prices})\n", - "\n", - "# Creating portfolio line with sourced volume.\n", - "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(ts_offtake, 'QS', 0.3, p_avg=120)\n", - "sourced_quarters = pf.PfLine({'w': ts_sourced_power1, 'p': ts_sourced_price1})\n", - "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(ts_offtake, 'MS', 0.2, p_avg=150)\n", - "sourced_months = pf.PfLine({'w': ts_sourced_power2, 'p': ts_sourced_price2})\n", - "sourced = pf.PfLine({'quarter_products': sourced_quarters, 'month_products': sourced_months})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use these portfolio lines to create a portfolio state.\n", - "\n", - "## Portfolio State\n", - "\n", - "The ``PfState`` class is used to hold information about offtake, market prices, and sourcing. Let's create one from the portfolio lines we just created:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfState object.\n", - ". Start: 2024-09-20 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-10 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : <15 * Minutes> (7780 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "──────── offtake\n", - " 2024-09-20 00:00:00 +0200 -45.8 -11 \n", - " 2024-09-20 00:15:00 +0200 -44.4 -11 \n", - " .. .. .. .. ..\n", - " 2024-12-09 23:30:00 +0100 -60.5 -15 \n", - " 2024-12-09 23:45:00 +0100 -58.3 -15 \n", - "─●────── pnl_cost\n", - " │ 2024-09-20 00:00:00 +0200 45.8 11 136.54 1 564\n", - " │ 2024-09-20 00:15:00 +0200 44.4 11 135.21 1 500\n", - " │ .. .. .. .. ..\n", - " │ 2024-12-09 23:30:00 +0100 60.5 15 167.89 2 540\n", - " │ 2024-12-09 23:45:00 +0100 58.3 15 167.21 2 436\n", - " ├●───── sourced\n", - " ││ 2024-09-20 00:00:00 +0200 31.3 8 135.03 1 058\n", - " ││ 2024-09-20 00:15:00 +0200 31.3 8 135.03 1 058\n", - " ││ .. .. .. .. ..\n", - " ││ 2024-12-09 23:30:00 +0100 35.7 9 126.09 1 124\n", - " ││ 2024-12-09 23:45:00 +0100 35.7 9 126.09 1 124\n", - " │├───── quarter_products\n", - " ││ 2024-09-20 00:00:00 +0200 16.4 4 102.48 421\n", - " ││ 2024-09-20 00:15:00 +0200 16.4 4 102.48 421\n", - " ││ .. .. .. .. ..\n", - " ││ 2024-12-09 23:30:00 +0100 13.4 3 111.14 372\n", - " ││ 2024-12-09 23:45:00 +0100 13.4 3 111.14 372\n", - " │└───── month_products\n", - " │ 2024-09-20 00:00:00 +0200 14.9 4 170.85 637\n", - " │ 2024-09-20 00:15:00 +0200 14.9 4 170.85 637\n", - " │ .. .. .. .. ..\n", - " │ 2024-12-09 23:30:00 +0100 22.3 6 135.07 752\n", - " │ 2024-12-09 23:45:00 +0100 22.3 6 135.07 752\n", - " └────── unsourced\n", - " 2024-09-20 00:00:00 +0200 14.5 4 139.81 506\n", - " 2024-09-20 00:15:00 +0200 13.0 3 135.64 442\n", - " .. .. .. .. ..\n", - " 2024-12-09 23:30:00 +0100 24.8 6 227.88 1 416\n", - " 2024-12-09 23:45:00 +0100 22.6 6 232.05 1 312" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs = pf.PfState(offtake, prices, sourced)\n", - "\n", - "pfs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note from how these portfolio lines were created, that ``offtake`` has negative values. The sign conventions are discussed [here](../core/pfstate.rst#sign-conventions).\n", - "\n", - "This portfolio state contains values for every quarterhour in the specified time period. Let's see what features this class has, starting with two methods we already met when discussing the ``PfLine`` class.\n", - "\n", - "### Plotting\n", - "\n", - "Just as when working with portfolio lines, we can get a quick overview of the portfolio state with the ``.plot()`` method..." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "pfs.plot();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "...and we can copy its data to the clipboard, or save it as an Excel workbook:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "pfs.to_clipboard()\n", - "pfs.to_excel('portfolio_state.xlsx')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looking at the offtake, we can see the daily and weekly cycles, as well as a slow increase over the entire time period.\n", - "\n", - "This graph is a bit too detailed for most purposes, so let's look at the second method we know from ``PfLine``: resampling.\n", - "\n", - "### Resampling\n", - "\n", - "We might prefer to see hourly, daily, or monthly values instead of the quarterhourly values that are in ``pfs``. For this, we can resample the object with the ``.asfreq()`` method. In this code example, we also use the ``.print()`` method, which adds some helpful coloring to the output:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PfState object.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\u001b[1m\u001b[37m──────── offtake\n", - " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 744 \n", - " \u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 -59.4 -42 732 \n", - "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452\n", - " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 31.2 23 221 132.58 3 078 642\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 25.9 18 652 133.27 2 485 849\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 13.8 10 256 106.54 1 092 646\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 13.7 9 897 106.78 1 056 810\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 17.4 12 964 153.19 1 985 996\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 12.2 8 755 163.22 1 429 039\n", - " \u001b[1m\u001b[33m└────── unsourced\n", - " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 23.5 17 523 197.44 3 459 829\n", - " \u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 33.4 24 080 221.41 5 331 603\n" - ] - } - ], - "source": [ - "pfs_monthly = pfs.asfreq('MS')\n", - "pfs_monthly.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the resampled output only contains those months, that are *entirely* included in the original data. ``pfl`` has data in September and December, but as these are not present in their entirety, they are dropped from ``pfl_monthly``.\n", - "\n", - "### On frequencies and unsourced prices\n", - "\n", - "There is one other important consequence of resampling: the unsourced prices are now *specific for this portfolio*. We can demonstrate this by creating a second portfolio state, using the *same price-forward curve* (but different offtake and sourced volume):" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "pfs2 = pf.PfState(offtake*1.5, prices, sourced*2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this shortest frequency, the unsourced prices are identical (namely, the price-forward curve). Let's create a dataframe with the prices to verify this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pfspfs2hpfc
2024-09-20 00:00:00+02:00139.80568207211454139.80568207211454139.80568207211454
2024-09-20 00:15:00+02:00135.63901540544785135.63901540544785135.63901540544785
2024-09-20 00:30:00+02:00131.47234873878116131.47234873878116131.47234873878116
2024-09-20 00:45:00+02:00128.13901540544785128.13901540544785128.13901540544785
2024-09-20 01:00:00+02:00124.80568207211451124.80568207211451124.80568207211451
............
2024-12-09 22:45:00+01:00217.88078474854294217.88078474854294217.88078474854294
2024-12-09 23:00:00+01:00221.2141180818763221.2141180818763221.2141180818763
2024-12-09 23:15:00+01:00224.54745141520962224.54745141520962224.54745141520962
2024-12-09 23:30:00+01:00227.88078474854294227.88078474854294227.88078474854294
2024-12-09 23:45:00+01:00232.0474514152096232.0474514152096232.0474514152096
\n", - "

7780 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " pfs pfs2 \\\n", - "2024-09-20 00:00:00+02:00 139.80568207211454 139.80568207211454 \n", - "2024-09-20 00:15:00+02:00 135.63901540544785 135.63901540544785 \n", - "2024-09-20 00:30:00+02:00 131.47234873878116 131.47234873878116 \n", - "2024-09-20 00:45:00+02:00 128.13901540544785 128.13901540544785 \n", - "2024-09-20 01:00:00+02:00 124.80568207211451 124.80568207211451 \n", - "... ... ... \n", - "2024-12-09 22:45:00+01:00 217.88078474854294 217.88078474854294 \n", - "2024-12-09 23:00:00+01:00 221.2141180818763 221.2141180818763 \n", - "2024-12-09 23:15:00+01:00 224.54745141520962 224.54745141520962 \n", - "2024-12-09 23:30:00+01:00 227.88078474854294 227.88078474854294 \n", - "2024-12-09 23:45:00+01:00 232.0474514152096 232.0474514152096 \n", - "\n", - " hpfc \n", - "2024-09-20 00:00:00+02:00 139.80568207211454 \n", - "2024-09-20 00:15:00+02:00 135.63901540544785 \n", - "2024-09-20 00:30:00+02:00 131.47234873878116 \n", - "2024-09-20 00:45:00+02:00 128.13901540544785 \n", - "2024-09-20 01:00:00+02:00 124.80568207211451 \n", - "... ... \n", - "2024-12-09 22:45:00+01:00 217.88078474854294 \n", - "2024-12-09 23:00:00+01:00 221.2141180818763 \n", - "2024-12-09 23:15:00+01:00 224.54745141520962 \n", - "2024-12-09 23:30:00+01:00 227.88078474854294 \n", - "2024-12-09 23:45:00+01:00 232.0474514152096 \n", - "\n", - "[7780 rows x 3 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame({'pfs': pfs.unsourcedprice.p, 'pfs2': pfs2.unsourcedprice.p, 'hpfc': prices.p})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, at every other frequency, they are not equal. When changing the frequency, a *volume-weighted* average is calculated for the unsourced prices - just like with every other price-and-volume timeseries. This makes that the unsourced prices apply only to the unsourced volume profile *of that portfolio*:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pfspfs2hpfc
2024-10-01 00:00:00+02:00197.4437803760265192.11463549822653194.78888729464586
2024-11-01 00:00:00+01:00221.40989836363784217.79829542112196220.07479863376392
\n", - "
" - ], - "text/plain": [ - " pfs pfs2 \\\n", - "2024-10-01 00:00:00+02:00 197.4437803760265 192.11463549822653 \n", - "2024-11-01 00:00:00+01:00 221.40989836363784 217.79829542112196 \n", - "\n", - " hpfc \n", - "2024-10-01 00:00:00+02:00 194.78888729464586 \n", - "2024-11-01 00:00:00+01:00 220.07479863376392 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame({'pfs': pfs.asfreq('MS').unsourcedprice.p, 'pfs2': pfs2.asfreq('MS').unsourcedprice.p, 'hpfc': prices.asfreq('MS').p})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This has important consequences. \n", - "\n", - "For example, when doing a scenario analysis in which the unsourced volume is changed (e.g. \"what happens if the offtake increases by 50%?\"), we cannot expect the results to be correct *unless we are working at the original frequency*. In situations where it is clear that this error looms, a ``UserWarning`` is shown to alert the user (e.g. in the examples further below). For more information on unsourced volume, [see this section](../core/pfstate.rst#Unsourced-price) in the documentation on the `PfState` class.\n", - "\n", - "For this reason, we commonly work with our porfolio states at the frequency of the price-forward curve. Downsampling is only done to see the aggregated values for verification or reporting." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Components\n", - "\n", - "Now, let's look at the portfolio state ``pfs_monthly`` in a bit more detail, to learn more about the ``PfState`` class.\n", - "\n", - "The portfolio state is presented to us as a tree structure, with several branches. Each branch is a portfolio line. E.g, ``offtake`` and ``sourced`` are the portfolio lines we specified when creating the object. Also, the branch ``pnl_cost`` is the sum of ``sourced`` and ``unsourced``, with ``sourced`` being the sum of ``quarter_products`` and ``month_products``. \n", - "\n", - "The unsourced volume is found by comparing the offtake to what is already sourced. This volume is valued at the market prices in the forward curve.\n", - "\n", - "These portfolio lines can be obtained from the portfolio state by accessing them as attributes. E.g. ``.offtakevolume``, ``.sourced``, ``.unsourced``, or ``.pnl_cost``. The latter is the best estimate for what it will cost to procure the offtake:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", - "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs_monthly.pnl_cost" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that this portfolio line has children, and as a reminder, we can \"drill into\" the object to get these nested portfolio line, e.g. with ``pfl_monthly.pnl_cost[\"sourced\"]``.\n", - "\n", - "There are some other components that are not explicitly shown:\n", - "\n", - "* We may be interested in how much of the offtake has already been sourced or unsourced. These fractions are available at the ``.sourcedfraction`` and ``.unsourcedfraction`` properties.\n", - "\n", - "* You may have noticed that ``unsourced`` is the inverse from what traders would call the \"open positions\" or \"portfolio positions\": if our portfolio is short, the unsourced volume is positive. For those that prefer this other perspective, it is available at ``.netposition``.\n", - "\n", - "### Export\n", - "\n", - "Just as with portfolio lines, we can create an excel file that contains all the information in a portfolio state with its ``.to_excel()`` method, and we can copy it to the clipboard with the ``.to_clipboard()`` method.\n", - "\n", - "### MtM\n", - "\n", - "We can evaluate the value of our sourcing contracts against the current forward curve (\"mark-to-market\") with the ``.mtm_of_sourced()`` method." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Analyses with portfolio states\n", - "\n", - "We'll now look at how we can do \"what-if\" analyses with portfolio state. The original portfolio state we will consider as the reference and store it in an appropriately named variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "ref = pfs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The monthly procurement prices of this portfolio are what interest us the most. As a reminder, we can find the procurement volumes and costs with:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", - "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_ref = ref.asfreq('MS').pnl_cost\n", - "cost_ref" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "(Or we could go one step further and focus on only the prices with ``ref.asfreq(\"MS\").pnl_cost.p``.)\n", - "\n", - "### Change in offtake\n", - "\n", - "Now, what would happen if the offtake were to increase by 25%? Qualitatively, this is not hard. An increase in the offtake increases the unsourced volume. And because the market prices are higher than what we pay for the sourced volume, this means that the procurement price will go up. \n", - "\n", - "How much? Let's see. First, we create a new portfolio state, from the reference, by setting the offtake to the new value. We can do this with the ``.set_offtake()`` method. After that, we can again see what the procurement volumes and costs are. (Note the ``UserWarning`` which was mentioned [above](#on-frequencies-and-unsourced-pricesE).)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 68.4 50 930 168.64 8 588 719\n", - "2024-11-01 00:00:00 +0100 74.2 53 416 191.54 10 231 182" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "higherofftake = ref.offtakevolume * 1.25\n", - "pfs_higherofftake = ref.set_offtakevolume(higherofftake)\n", - "cost_higherofftake = pfs_higherofftake.asfreq(\"MS\").pnl_cost\n", - "cost_higherofftake" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Comparing these two ``cost`` portfolio lines, we see that indeed the values for ``w`` and ``q`` have increased to 125% of the original values. Also, the procurement prices have increased. We can quickly calculate by how much:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2024-10-01 00:00:00+02:00 8.160879013401626\n", - "2024-11-01 00:00:00+01:00 8.599884206454362\n", - "Freq: MS, Name: p, dtype: pint[Eur/MWh]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_higherofftake.p - cost_ref.p" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We could similarly create a portfolio states for situations with a market price drop of 40%. Or one which combines both effects:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "lowerprices = ref.unsourcedprice * 0.6\n", - "pfs_lowerprices = ref.set_unsourcedprice(lowerprices)\n", - "pfs_lowerprices_higherofftake = ref.set_offtakevolume(higherofftake).set_unsourcedprice(lowerprices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Hedging\n", - "\n", - "Hedging can reduce the sensitivity of our portfolio to changes in the market price. Given the current market price curve, we can calculate how much we'd need to source to obtain a fully hedged portfolio:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "needed = ref.hedge_of_unsourced(\"val\", \"MS\") # value hedge with month products" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's say we procure exactly that volume. We can add it to the sourced volume in our portfolio state:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:209: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "hedged = ref.add_sourced(pf.PfLine({\"newvolume\": needed}))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "(We could have obtained the same result with the ``ref.source_unsourced()`` method.)\n", - "\n", - "The portfolio is now hedged at the month level. We can verify this by looking at the unsourced volume. In case of a volume hedge, the unsourced volume (``q`` and ``w``) is 0, even if its monetary value (``r``) is not; in case of a value hedge, it is the reverse:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 -0.2 -173 0.00 -0\n", - "2024-11-01 00:00:00 +0100 -0.2 -134 0.00 -0" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hedged.asfreq('MS').unsourced" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Because the market prices have not changed, the best-estimate procurement prices (at month level and longer) are also unchanged from before. (This is verified in the \"before\" columns of the dataframe further below.)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Market price change\n", - "\n", - "A hedged profile is less impacted by market price changes. To see that this is indeed the case, let's look at a scenario with an increase in the forward price curve by 40 Eur/MWh, for both portfolio states:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "newprices = prices + pf.Q_(40.0, 'Eur/MWh')\n", - "ref_higherprices = ref.set_unsourcedprice(newprices)\n", - "hedged_higherprices = hedged.set_unsourcedprice(newprices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reference portfolio has gotten a lot more expensive, whereas the procurement price for the hedged portfolio has not moved significantly:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
refhedged
beforeafterbeforeafter
unitEur/MWhEur/MWhEur/MWhEur/MWh
2024-10-01 00:00:00+02:00160.478106177.681366160.478106160.307936
2024-11-01 00:00:00+01:00182.939602205.480086182.939602182.814260
\n", - "
" - ], - "text/plain": [ - " ref hedged \n", - " before after before after\n", - "unit Eur/MWh Eur/MWh Eur/MWh Eur/MWh\n", - "2024-10-01 00:00:00+02:00 160.478106 177.681366 160.478106 160.307936\n", - "2024-11-01 00:00:00+01:00 182.939602 205.480086 182.939602 182.814260" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame({\n", - " ('ref', 'before'): ref.pnl_cost.asfreq('MS').p, \n", - " ('ref', 'after'): ref_higherprices.pnl_cost.asfreq('MS').p, \n", - " ('hedged', 'before'): hedged.pnl_cost.asfreq('MS').p, \n", - " ('hedged', 'after'): hedged_higherprices.pnl_cost.asfreq('MS').p,\n", - "}).pint.dequantify()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the observant reader: it may seem that the portfolio was not fully hedged after all, as a small change in the procurement price is seen. The reason is that each strategy (i.e., volume or value hedge) fully protects only against a specific price change (i.e., absolute or relative). A volume hedge does not *fully* hedge against an absolute price change such as the one we see here." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tutorial is continued [in part 4](part4.ipynb)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.13 ('pf38')", - "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.8.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" - } - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial part 3\n", + "\n", + "In [part 1](part1.ipynb) and [part 2](part2.ipynb) we have learnt about portfolio lines. These are timeseries, or collections of timeseries, describing the volumes and/or prices during various delivery periods.\n", + "\n", + "In this part, we'll combine portfolio lines into a \"portfolio state\" (``PfState``) object. As we'll see, some of the methods and properties we know from the ``PfLine`` class also apply here.\n", + "\n", + "\n", + "## Example data\n", + "\n", + "Let's again use the mock functions to get some portfolio lines. (The parameter details here are not important, we just want some more-or-less realistic data). To change things up a bit from the previous tutorial parts, we'll look at about 80 days in the autumn of 2024, in quarterhourly (``\"15T\"``) resolution. And let's localize the data to a specific timezone:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import portfolyo as pf\n", + "import pandas as pd\n", + "\n", + "index = pd.date_range(\n", + " \"2024-09-20\", \"2024-12-10\", freq=\"15T\", inclusive=\"left\", tz=\"Europe/Berlin\"\n", + ")\n", + "# Creating offtake portfolio line.\n", + "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", + "offtake = pf.PfLine({\"w\": ts_offtake})\n", + "# Creating portfolio line with market prices (here: price-forward curve).\n", + "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", + "prices = pf.PfLine({\"p\": ts_prices})\n", + "\n", + "# Creating portfolio line with sourced volume.\n", + "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(\n", + " ts_offtake, \"QS\", 0.3, p_avg=120\n", + ")\n", + "sourced_quarters = pf.PfLine({\"w\": ts_sourced_power1, \"p\": ts_sourced_price1})\n", + "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(\n", + " ts_offtake, \"MS\", 0.2, p_avg=150\n", + ")\n", + "sourced_months = pf.PfLine({\"w\": ts_sourced_power2, \"p\": ts_sourced_price2})\n", + "sourced = pf.PfLine(\n", + " {\"quarter_products\": sourced_quarters, \"month_products\": sourced_months}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use these portfolio lines to create a portfolio state.\n", + "\n", + "## Portfolio State\n", + "\n", + "The ``PfState`` class is used to hold information about offtake, market prices, and sourcing. Let's create one from the portfolio lines we just created:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfState object.\n", + ". Start: 2024-09-20 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-10 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : <15 * Minutes> (7780 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "──────── offtake\n", + " 2024-09-20 00:00:00 +0200 -45.8 -11 \n", + " 2024-09-20 00:15:00 +0200 -44.4 -11 \n", + " .. .. .. .. ..\n", + " 2024-12-09 23:30:00 +0100 -60.5 -15 \n", + " 2024-12-09 23:45:00 +0100 -58.3 -15 \n", + "─●────── pnl_cost\n", + " │ 2024-09-20 00:00:00 +0200 45.8 11 136.54 1 564\n", + " │ 2024-09-20 00:15:00 +0200 44.4 11 135.21 1 500\n", + " │ .. .. .. .. ..\n", + " │ 2024-12-09 23:30:00 +0100 60.5 15 167.89 2 540\n", + " │ 2024-12-09 23:45:00 +0100 58.3 15 167.21 2 436\n", + " ├●───── sourced\n", + " ││ 2024-09-20 00:00:00 +0200 31.3 8 135.03 1 058\n", + " ││ 2024-09-20 00:15:00 +0200 31.3 8 135.03 1 058\n", + " ││ .. .. .. .. ..\n", + " ││ 2024-12-09 23:30:00 +0100 35.7 9 126.09 1 124\n", + " ││ 2024-12-09 23:45:00 +0100 35.7 9 126.09 1 124\n", + " │├───── quarter_products\n", + " ││ 2024-09-20 00:00:00 +0200 16.4 4 102.48 421\n", + " ││ 2024-09-20 00:15:00 +0200 16.4 4 102.48 421\n", + " ││ .. .. .. .. ..\n", + " ││ 2024-12-09 23:30:00 +0100 13.4 3 111.14 372\n", + " ││ 2024-12-09 23:45:00 +0100 13.4 3 111.14 372\n", + " │└───── month_products\n", + " │ 2024-09-20 00:00:00 +0200 14.9 4 170.85 637\n", + " │ 2024-09-20 00:15:00 +0200 14.9 4 170.85 637\n", + " │ .. .. .. .. ..\n", + " │ 2024-12-09 23:30:00 +0100 22.3 6 135.07 752\n", + " │ 2024-12-09 23:45:00 +0100 22.3 6 135.07 752\n", + " └────── unsourced\n", + " 2024-09-20 00:00:00 +0200 14.5 4 139.81 506\n", + " 2024-09-20 00:15:00 +0200 13.0 3 135.64 442\n", + " .. .. .. .. ..\n", + " 2024-12-09 23:30:00 +0100 24.8 6 227.88 1 416\n", + " 2024-12-09 23:45:00 +0100 22.6 6 232.05 1 312" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs = pf.PfState(offtake, prices, sourced)\n", + "\n", + "pfs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note from how these portfolio lines were created, that ``offtake`` has negative values. The sign conventions are discussed [here](../core/pfstate.rst#sign-conventions).\n", + "\n", + "This portfolio state contains values for every quarterhour in the specified time period. Let's see what features this class has, starting with two methods we already met when discussing the ``PfLine`` class.\n", + "\n", + "### Plotting\n", + "\n", + "Just as when working with portfolio lines, we can get a quick overview of the portfolio state with the ``.plot()`` method..." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pfs.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "...and we can copy its data to the clipboard, or save it as an Excel workbook:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "pfs.to_clipboard()\n", + "pfs.to_excel(\"portfolio_state.xlsx\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looking at the offtake, we can see the daily and weekly cycles, as well as a slow increase over the entire time period.\n", + "\n", + "This graph is a bit too detailed for most purposes, so let's look at the second method we know from ``PfLine``: resampling.\n", + "\n", + "### Resampling\n", + "\n", + "We might prefer to see hourly, daily, or monthly values instead of the quarterhourly values that are in ``pfs``. For this, we can resample the object with the ``.asfreq()`` method. In this code example, we also use the ``.print()`` method, which adds some helpful coloring to the output:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PfState object.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\u001b[1m\u001b[37m──────── offtake\n", + " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 744 \n", + " \u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 -59.4 -42 732 \n", + "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452\n", + " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 31.2 23 221 132.58 3 078 642\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 25.9 18 652 133.27 2 485 849\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 13.8 10 256 106.54 1 092 646\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 13.7 9 897 106.78 1 056 810\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 17.4 12 964 153.19 1 985 996\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 12.2 8 755 163.22 1 429 039\n", + " \u001b[1m\u001b[33m└────── unsourced\n", + " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 23.5 17 523 197.44 3 459 829\n", + " \u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 33.4 24 080 221.41 5 331 603\n" + ] + } + ], + "source": [ + "pfs_monthly = pfs.asfreq(\"MS\")\n", + "pfs_monthly.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how the resampled output only contains those months, that are *entirely* included in the original data. ``pfl`` has data in September and December, but as these are not present in their entirety, they are dropped from ``pfl_monthly``.\n", + "\n", + "### On frequencies and unsourced prices\n", + "\n", + "There is one other important consequence of resampling: the unsourced prices are now *specific for this portfolio*. We can demonstrate this by creating a second portfolio state, using the *same price-forward curve* (but different offtake and sourced volume):" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "pfs2 = pf.PfState(offtake * 1.5, prices, sourced * 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At this shortest frequency, the unsourced prices are identical (namely, the price-forward curve). Let's create a dataframe with the prices to verify this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pfspfs2hpfc
2024-09-20 00:00:00+02:00139.80568207211454139.80568207211454139.80568207211454
2024-09-20 00:15:00+02:00135.63901540544785135.63901540544785135.63901540544785
2024-09-20 00:30:00+02:00131.47234873878116131.47234873878116131.47234873878116
2024-09-20 00:45:00+02:00128.13901540544785128.13901540544785128.13901540544785
2024-09-20 01:00:00+02:00124.80568207211451124.80568207211451124.80568207211451
............
2024-12-09 22:45:00+01:00217.88078474854294217.88078474854294217.88078474854294
2024-12-09 23:00:00+01:00221.2141180818763221.2141180818763221.2141180818763
2024-12-09 23:15:00+01:00224.54745141520962224.54745141520962224.54745141520962
2024-12-09 23:30:00+01:00227.88078474854294227.88078474854294227.88078474854294
2024-12-09 23:45:00+01:00232.0474514152096232.0474514152096232.0474514152096
\n", + "

7780 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " pfs pfs2 \\\n", + "2024-09-20 00:00:00+02:00 139.80568207211454 139.80568207211454 \n", + "2024-09-20 00:15:00+02:00 135.63901540544785 135.63901540544785 \n", + "2024-09-20 00:30:00+02:00 131.47234873878116 131.47234873878116 \n", + "2024-09-20 00:45:00+02:00 128.13901540544785 128.13901540544785 \n", + "2024-09-20 01:00:00+02:00 124.80568207211451 124.80568207211451 \n", + "... ... ... \n", + "2024-12-09 22:45:00+01:00 217.88078474854294 217.88078474854294 \n", + "2024-12-09 23:00:00+01:00 221.2141180818763 221.2141180818763 \n", + "2024-12-09 23:15:00+01:00 224.54745141520962 224.54745141520962 \n", + "2024-12-09 23:30:00+01:00 227.88078474854294 227.88078474854294 \n", + "2024-12-09 23:45:00+01:00 232.0474514152096 232.0474514152096 \n", + "\n", + " hpfc \n", + "2024-09-20 00:00:00+02:00 139.80568207211454 \n", + "2024-09-20 00:15:00+02:00 135.63901540544785 \n", + "2024-09-20 00:30:00+02:00 131.47234873878116 \n", + "2024-09-20 00:45:00+02:00 128.13901540544785 \n", + "2024-09-20 01:00:00+02:00 124.80568207211451 \n", + "... ... \n", + "2024-12-09 22:45:00+01:00 217.88078474854294 \n", + "2024-12-09 23:00:00+01:00 221.2141180818763 \n", + "2024-12-09 23:15:00+01:00 224.54745141520962 \n", + "2024-12-09 23:30:00+01:00 227.88078474854294 \n", + "2024-12-09 23:45:00+01:00 232.0474514152096 \n", + "\n", + "[7780 rows x 3 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(\n", + " {\"pfs\": pfs.unsourcedprice.p, \"pfs2\": pfs2.unsourcedprice.p, \"hpfc\": prices.p}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, at every other frequency, they are not equal. When changing the frequency, a *volume-weighted* average is calculated for the unsourced prices - just like with every other price-and-volume timeseries. This makes that the unsourced prices apply only to the unsourced volume profile *of that portfolio*:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pfspfs2hpfc
2024-10-01 00:00:00+02:00197.4437803760265192.11463549822653194.78888729464586
2024-11-01 00:00:00+01:00221.40989836363784217.79829542112196220.07479863376392
\n", + "
" + ], + "text/plain": [ + " pfs pfs2 \\\n", + "2024-10-01 00:00:00+02:00 197.4437803760265 192.11463549822653 \n", + "2024-11-01 00:00:00+01:00 221.40989836363784 217.79829542112196 \n", + "\n", + " hpfc \n", + "2024-10-01 00:00:00+02:00 194.78888729464586 \n", + "2024-11-01 00:00:00+01:00 220.07479863376392 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(\n", + " {\n", + " \"pfs\": pfs.asfreq(\"MS\").unsourcedprice.p,\n", + " \"pfs2\": pfs2.asfreq(\"MS\").unsourcedprice.p,\n", + " \"hpfc\": prices.asfreq(\"MS\").p,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This has important consequences. \n", + "\n", + "For example, when doing a scenario analysis in which the unsourced volume is changed (e.g. \"what happens if the offtake increases by 50%?\"), we cannot expect the results to be correct *unless we are working at the original frequency*. In situations where it is clear that this error looms, a ``UserWarning`` is shown to alert the user (e.g. in the examples further below). For more information on unsourced volume, [see this section](../core/pfstate.rst#Unsourced-price) in the documentation on the `PfState` class.\n", + "\n", + "For this reason, we commonly work with our porfolio states at the frequency of the price-forward curve. Downsampling is only done to see the aggregated values for verification or reporting." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Components\n", + "\n", + "Now, let's look at the portfolio state ``pfs_monthly`` in a bit more detail, to learn more about the ``PfState`` class.\n", + "\n", + "The portfolio state is presented to us as a tree structure, with several branches. Each branch is a portfolio line. E.g, ``offtake`` and ``sourced`` are the portfolio lines we specified when creating the object. Also, the branch ``pnl_cost`` is the sum of ``sourced`` and ``unsourced``, with ``sourced`` being the sum of ``quarter_products`` and ``month_products``. \n", + "\n", + "The unsourced volume is found by comparing the offtake to what is already sourced. This volume is valued at the market prices in the forward curve.\n", + "\n", + "These portfolio lines can be obtained from the portfolio state by accessing them as attributes. E.g. ``.offtakevolume``, ``.sourced``, ``.unsourced``, or ``.pnl_cost``. The latter is the best estimate for what it will cost to procure the offtake:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", + "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs_monthly.pnl_cost" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that this portfolio line has children, and as a reminder, we can \"drill into\" the object to get these nested portfolio line, e.g. with ``pfl_monthly.pnl_cost[\"sourced\"]``.\n", + "\n", + "There are some other components that are not explicitly shown:\n", + "\n", + "* We may be interested in how much of the offtake has already been sourced or unsourced. These fractions are available at the ``.sourcedfraction`` and ``.unsourcedfraction`` properties.\n", + "\n", + "* You may have noticed that ``unsourced`` is the inverse from what traders would call the \"open positions\" or \"portfolio positions\": if our portfolio is short, the unsourced volume is positive. For those that prefer this other perspective, it is available at ``.netposition``.\n", + "\n", + "### Export\n", + "\n", + "Just as with portfolio lines, we can create an excel file that contains all the information in a portfolio state with its ``.to_excel()`` method, and we can copy it to the clipboard with the ``.to_clipboard()`` method.\n", + "\n", + "### MtM\n", + "\n", + "We can evaluate the value of our sourcing contracts against the current forward curve (\"mark-to-market\") with the ``.mtm_of_sourced()`` method." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyses with portfolio states\n", + "\n", + "We'll now look at how we can do \"what-if\" analyses with portfolio state. The original portfolio state we will consider as the reference and store it in an appropriately named variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "ref = pfs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The monthly procurement prices of this portfolio are what interest us the most. As a reminder, we can find the procurement volumes and costs with:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", + "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_ref = ref.asfreq(\"MS\").pnl_cost\n", + "cost_ref" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Or we could go one step further and focus on only the prices with ``ref.asfreq(\"MS\").pnl_cost.p``.)\n", + "\n", + "### Change in offtake\n", + "\n", + "Now, what would happen if the offtake were to increase by 25%? Qualitatively, this is not hard. An increase in the offtake increases the unsourced volume. And because the market prices are higher than what we pay for the sourced volume, this means that the procurement price will go up. \n", + "\n", + "How much? Let's see. First, we create a new portfolio state, from the reference, by setting the offtake to the new value. We can do this with the ``.set_offtake()`` method. After that, we can again see what the procurement volumes and costs are. (Note the ``UserWarning`` which was mentioned [above](#on-frequencies-and-unsourced-pricesE).)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", + " warnings.warn(\n" + ] }, - "nbformat": 4, - "nbformat_minor": 2 + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 68.4 50 930 168.64 8 588 719\n", + "2024-11-01 00:00:00 +0100 74.2 53 416 191.54 10 231 182" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "higherofftake = ref.offtakevolume * 1.25\n", + "pfs_higherofftake = ref.set_offtakevolume(higherofftake)\n", + "cost_higherofftake = pfs_higherofftake.asfreq(\"MS\").pnl_cost\n", + "cost_higherofftake" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Comparing these two ``cost`` portfolio lines, we see that indeed the values for ``w`` and ``q`` have increased to 125% of the original values. Also, the procurement prices have increased. We can quickly calculate by how much:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2024-10-01 00:00:00+02:00 8.160879013401626\n", + "2024-11-01 00:00:00+01:00 8.599884206454362\n", + "Freq: MS, Name: p, dtype: pint[Eur/MWh]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_higherofftake.p - cost_ref.p" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We could similarly create a portfolio states for situations with a market price drop of 40%. Or one which combines both effects:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "lowerprices = ref.unsourcedprice * 0.6\n", + "pfs_lowerprices = ref.set_unsourcedprice(lowerprices)\n", + "pfs_lowerprices_higherofftake = ref.set_offtakevolume(higherofftake).set_unsourcedprice(\n", + " lowerprices\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hedging\n", + "\n", + "Hedging can reduce the sensitivity of our portfolio to changes in the market price. Given the current market price curve, we can calculate how much we'd need to source to obtain a fully hedged portfolio:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "needed = ref.hedge_of_unsourced(\"val\", \"MS\") # value hedge with month products" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's say we procure exactly that volume. We can add it to the sourced volume in our portfolio state:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:209: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "hedged = ref.add_sourced(pf.PfLine({\"newvolume\": needed}))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(We could have obtained the same result with the ``ref.source_unsourced()`` method.)\n", + "\n", + "The portfolio is now hedged at the month level. We can verify this by looking at the unsourced volume. In case of a volume hedge, the unsourced volume (``q`` and ``w``) is 0, even if its monetary value (``r``) is not; in case of a value hedge, it is the reverse:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 -0.2 -173 0.00 -0\n", + "2024-11-01 00:00:00 +0100 -0.2 -134 0.00 -0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hedged.asfreq(\"MS\").unsourced" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because the market prices have not changed, the best-estimate procurement prices (at month level and longer) are also unchanged from before. (This is verified in the \"before\" columns of the dataframe further below.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Market price change\n", + "\n", + "A hedged profile is less impacted by market price changes. To see that this is indeed the case, let's look at a scenario with an increase in the forward price curve by 40 Eur/MWh, for both portfolio states:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "newprices = prices + pf.Q_(40.0, \"Eur/MWh\")\n", + "ref_higherprices = ref.set_unsourcedprice(newprices)\n", + "hedged_higherprices = hedged.set_unsourcedprice(newprices)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reference portfolio has gotten a lot more expensive, whereas the procurement price for the hedged portfolio has not moved significantly:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
refhedged
beforeafterbeforeafter
unitEur/MWhEur/MWhEur/MWhEur/MWh
2024-10-01 00:00:00+02:00160.478106177.681366160.478106160.307936
2024-11-01 00:00:00+01:00182.939602205.480086182.939602182.814260
\n", + "
" + ], + "text/plain": [ + " ref hedged \n", + " before after before after\n", + "unit Eur/MWh Eur/MWh Eur/MWh Eur/MWh\n", + "2024-10-01 00:00:00+02:00 160.478106 177.681366 160.478106 160.307936\n", + "2024-11-01 00:00:00+01:00 182.939602 205.480086 182.939602 182.814260" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(\n", + " {\n", + " (\"ref\", \"before\"): ref.pnl_cost.asfreq(\"MS\").p,\n", + " (\"ref\", \"after\"): ref_higherprices.pnl_cost.asfreq(\"MS\").p,\n", + " (\"hedged\", \"before\"): hedged.pnl_cost.asfreq(\"MS\").p,\n", + " (\"hedged\", \"after\"): hedged_higherprices.pnl_cost.asfreq(\"MS\").p,\n", + " }\n", + ").pint.dequantify()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the observant reader: it may seem that the portfolio was not fully hedged after all, as a small change in the procurement price is seen. The reason is that each strategy (i.e., volume or value hedge) fully protects only against a specific price change (i.e., absolute or relative). A volume hedge does not *fully* hedge against an absolute price change such as the one we see here." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tutorial is continued [in part 4](part4.ipynb)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.13 ('pf38')", + "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.8.13" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/tutorial/part4.ipynb b/docs/tutorial/part4.ipynb index eee3669..0a323da 100644 --- a/docs/tutorial/part4.ipynb +++ b/docs/tutorial/part4.ipynb @@ -1,282 +1,282 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tutorial part 4\n", - "\n", - "In [part 3](part3.ipynb) we have learnt about portfolio states and how to use them in scenario analyses. Here we learn how to export them and how to combine several ones.\n", - "\n", - "## Example data\n", - "\n", - "We start with a similar portfolio state as in the previous part:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\u001b[1m\u001b[37m──────── offtake\n", - " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -49.4 -35 593 \n", - " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 748 \n", - "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 49.4 35 593 147.61 5 253 964\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 748 163.85 6 676 561\n", - " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 28.9 20 844 123.03 2 564 413\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 26.0 19 389 132.10 2 561 236\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 13.8 9 943 103.24 1 026 519\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 11.1 8 261 118.15 976 055\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 15.1 10 901 141.07 1 537 894\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 14.9 11 128 142.45 1 585 180\n", - " \u001b[1m\u001b[33m└────── unsourced\n", - " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 20.5 14 749 182.36 2 689 551\n", - " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 28.7 21 358 192.68 4 115 325\n" - ] - } - ], - "source": [ - "import portfolyo as pf\n", - "import pandas as pd\n", - "\n", - "index = pd.date_range(\n", - " \"2024-09-01\", \"2024-11-01\", freq=\"15T\", inclusive=\"left\", tz=\"Europe/Berlin\"\n", - ")\n", - "# Creating portfolio line with market prices (here: price-forward curve).\n", - "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", - "prices = pf.PfLine({\"p\": ts_prices})\n", - "\n", - "\n", - "# Creating offtake portfolio line.\n", - "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", - "offtake = pf.PfLine({\"w\": ts_offtake})\n", - "\n", - "# Creating portfolio line with sourced volume.\n", - "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(\n", - " ts_offtake, \"QS\", 0.3, p_avg=120\n", - ")\n", - "sourced_quarters = pf.PfLine({\"w\": ts_sourced_power1, \"p\": ts_sourced_price1})\n", - "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(\n", - " ts_offtake, \"MS\", 0.2, p_avg=150\n", - ")\n", - "sourced_months = pf.PfLine({\"w\": ts_sourced_power2, \"p\": ts_sourced_price2})\n", - "sourced = pf.PfLine(\n", - " {\"quarter_products\": sourced_quarters, \"month_products\": sourced_months}\n", - ")\n", - "\n", - "# Create the portfolio state.\n", - "pfs1 = pf.PfState(offtake, prices, sourced).asfreq('MS')\n", - "\n", - "pfs1.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Arithmatic\n", - "\n", - "The final part about portfolio lines is the arithmatic that can be done with them.\n", - "\n", - "Let's create a second portfolio state:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\u001b[1m\u001b[37m──────── offtake\n", - " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -98.9 -71 186 \n", - " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -109.4 -81 495 \n", - "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 98.9 71 186 118.77 8 454 414\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 109.4 81 495 131.98 10 755 857\n", - " \u001b[1m\u001b[33m├────── sourced\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 80.0 57 600 100.00 5 760 000\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 80.0 59 600 100.00 5 960 000\n", - " \u001b[1m\u001b[33m└────── unsourced\n", - " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 18.9 13 586 198.33 2 694 414\n", - " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 29.4 21 895 219.04 4 795 857\n" - ] - } - ], - "source": [ - "offtake2 = offtake * 2\n", - "sourced2 = pf.PfLine(pd.DataFrame({\"w\": 80, \"p\": 100}, index))\n", - "pfs2 = pf.PfState(offtake2, prices, sourced2).asfreq('MS')\n", - "pfs2.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that ``pfs1`` and ``pfs2`` have distinct unsourced prices at this month level, even though they were created using the same market prices on the quarter-hour level.\n", - "\n", - "### Addition and subtraction\n", - "\n", - "We can add these two portfolio states:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "──────── offtake\n", - " 2024-09-01 00:00:00 +0200 -148.3 -106 778 \n", - " 2024-10-01 00:00:00 +0200 -164.1 -122 243 \n", - "─●────── pnl_cost\n", - " │ 2024-09-01 00:00:00 +0200 148.3 106 778 128.38 13 708 378\n", - " │ 2024-10-01 00:00:00 +0200 164.1 122 243 142.60 17 432 418\n", - " ├────── sourced\n", - " │ 2024-09-01 00:00:00 +0200 108.9 78 444 106.12 8 324 413\n", - " │ 2024-10-01 00:00:00 +0200 106.0 78 989 107.88 8 521 236\n", - " └────── unsourced\n", - " 2024-09-01 00:00:00 +0200 39.4 28 334 190.02 5 383 965\n", - " 2024-10-01 00:00:00 +0200 58.1 43 254 206.02 8 911 182" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs1 + pfs2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the individual components are added together. The volumes (offtake, sourced, unsourced) are summed; the prices (sourced and unsourced) are the energy-weighted averaged. (Or, put differently, the *revenues* are also summed, and the prices are calculated from the volume-total and renevue-total.)\n", - "\n", - "Note also that the sourced volume of ``pfs1`` has been flattened, i.e., the values of its children are lost. This is because ``pfs2`` does not have any children. This behaviour is described [here](../core/pfline.rst#Arithmatic).\n", - "\n", - "Likewise we can subtract them with ``pfs1 - pfs2``:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "──────── offtake\n", - " 2024-09-01 00:00:00 +0200 49.4 35 593 \n", - " 2024-10-01 00:00:00 +0200 54.7 40 748 \n", - "─●────── pnl_cost\n", - " │ 2024-09-01 00:00:00 +0200 -49.4 -35 593 89.92 -3 200 450\n", - " │ 2024-10-01 00:00:00 +0200 -54.7 -40 748 100.11 -4 079 296\n", - " ├────── sourced\n", - " │ 2024-09-01 00:00:00 +0200 -51.1 -36 756 86.94 -3 195 587\n", - " │ 2024-10-01 00:00:00 +0200 -54.0 -40 211 84.52 -3 398 764\n", - " └────── unsourced\n", - " 2024-09-01 00:00:00 +0200 1.6 1 163 -4.18 -4 863\n", - " 2024-10-01 00:00:00 +0200 -0.7 -537 1 267.81 -680 532" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs1 - pfs2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That was it for this tutorial!" - ] - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial part 4\n", + "\n", + "In [part 3](part3.ipynb) we have learnt about portfolio states and how to use them in scenario analyses. Here we learn how to export them and how to combine several ones.\n", + "\n", + "## Example data\n", + "\n", + "We start with a similar portfolio state as in the previous part:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\u001b[1m\u001b[37m──────── offtake\n", + " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -49.4 -35 593 \n", + " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 748 \n", + "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 49.4 35 593 147.61 5 253 964\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 748 163.85 6 676 561\n", + " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 28.9 20 844 123.03 2 564 413\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 26.0 19 389 132.10 2 561 236\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 13.8 9 943 103.24 1 026 519\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 11.1 8 261 118.15 976 055\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 15.1 10 901 141.07 1 537 894\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 14.9 11 128 142.45 1 585 180\n", + " \u001b[1m\u001b[33m└────── unsourced\n", + " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 20.5 14 749 182.36 2 689 551\n", + " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 28.7 21 358 192.68 4 115 325\n" + ] + } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.13 ('pf38')", - "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.8.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" - } - } + "source": [ + "import portfolyo as pf\n", + "import pandas as pd\n", + "\n", + "index = pd.date_range(\n", + " \"2024-09-01\", \"2024-11-01\", freq=\"15T\", inclusive=\"left\", tz=\"Europe/Berlin\"\n", + ")\n", + "# Creating portfolio line with market prices (here: price-forward curve).\n", + "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", + "prices = pf.PfLine({\"p\": ts_prices})\n", + "\n", + "\n", + "# Creating offtake portfolio line.\n", + "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", + "offtake = pf.PfLine({\"w\": ts_offtake})\n", + "\n", + "# Creating portfolio line with sourced volume.\n", + "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(\n", + " ts_offtake, \"QS\", 0.3, p_avg=120\n", + ")\n", + "sourced_quarters = pf.PfLine({\"w\": ts_sourced_power1, \"p\": ts_sourced_price1})\n", + "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(\n", + " ts_offtake, \"MS\", 0.2, p_avg=150\n", + ")\n", + "sourced_months = pf.PfLine({\"w\": ts_sourced_power2, \"p\": ts_sourced_price2})\n", + "sourced = pf.PfLine(\n", + " {\"quarter_products\": sourced_quarters, \"month_products\": sourced_months}\n", + ")\n", + "\n", + "# Create the portfolio state.\n", + "pfs1 = pf.PfState(offtake, prices, sourced).asfreq(\"MS\")\n", + "\n", + "pfs1.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Arithmatic\n", + "\n", + "The final part about portfolio lines is the arithmatic that can be done with them.\n", + "\n", + "Let's create a second portfolio state:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\u001b[1m\u001b[37m──────── offtake\n", + " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -98.9 -71 186 \n", + " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -109.4 -81 495 \n", + "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 98.9 71 186 118.77 8 454 414\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 109.4 81 495 131.98 10 755 857\n", + " \u001b[1m\u001b[33m├────── sourced\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 80.0 57 600 100.00 5 760 000\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 80.0 59 600 100.00 5 960 000\n", + " \u001b[1m\u001b[33m└────── unsourced\n", + " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 18.9 13 586 198.33 2 694 414\n", + " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 29.4 21 895 219.04 4 795 857\n" + ] + } + ], + "source": [ + "offtake2 = offtake * 2\n", + "sourced2 = pf.PfLine(pd.DataFrame({\"w\": 80, \"p\": 100}, index))\n", + "pfs2 = pf.PfState(offtake2, prices, sourced2).asfreq(\"MS\")\n", + "pfs2.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that ``pfs1`` and ``pfs2`` have distinct unsourced prices at this month level, even though they were created using the same market prices on the quarter-hour level.\n", + "\n", + "### Addition and subtraction\n", + "\n", + "We can add these two portfolio states:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "──────── offtake\n", + " 2024-09-01 00:00:00 +0200 -148.3 -106 778 \n", + " 2024-10-01 00:00:00 +0200 -164.1 -122 243 \n", + "─●────── pnl_cost\n", + " │ 2024-09-01 00:00:00 +0200 148.3 106 778 128.38 13 708 378\n", + " │ 2024-10-01 00:00:00 +0200 164.1 122 243 142.60 17 432 418\n", + " ├────── sourced\n", + " │ 2024-09-01 00:00:00 +0200 108.9 78 444 106.12 8 324 413\n", + " │ 2024-10-01 00:00:00 +0200 106.0 78 989 107.88 8 521 236\n", + " └────── unsourced\n", + " 2024-09-01 00:00:00 +0200 39.4 28 334 190.02 5 383 965\n", + " 2024-10-01 00:00:00 +0200 58.1 43 254 206.02 8 911 182" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs1 + pfs2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the individual components are added together. The volumes (offtake, sourced, unsourced) are summed; the prices (sourced and unsourced) are the energy-weighted averaged. (Or, put differently, the *revenues* are also summed, and the prices are calculated from the volume-total and renevue-total.)\n", + "\n", + "Note also that the sourced volume of ``pfs1`` has been flattened, i.e., the values of its children are lost. This is because ``pfs2`` does not have any children. This behaviour is described [here](../core/pfline.rst#Arithmatic).\n", + "\n", + "Likewise we can subtract them with ``pfs1 - pfs2``:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "──────── offtake\n", + " 2024-09-01 00:00:00 +0200 49.4 35 593 \n", + " 2024-10-01 00:00:00 +0200 54.7 40 748 \n", + "─●────── pnl_cost\n", + " │ 2024-09-01 00:00:00 +0200 -49.4 -35 593 89.92 -3 200 450\n", + " │ 2024-10-01 00:00:00 +0200 -54.7 -40 748 100.11 -4 079 296\n", + " ├────── sourced\n", + " │ 2024-09-01 00:00:00 +0200 -51.1 -36 756 86.94 -3 195 587\n", + " │ 2024-10-01 00:00:00 +0200 -54.0 -40 211 84.52 -3 398 764\n", + " └────── unsourced\n", + " 2024-09-01 00:00:00 +0200 1.6 1 163 -4.18 -4 863\n", + " 2024-10-01 00:00:00 +0200 -0.7 -537 1 267.81 -680 532" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs1 - pfs2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That was it for this tutorial!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.13 ('pf38')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 }, - "nbformat": 4, - "nbformat_minor": 2 + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 } \ No newline at end of file diff --git a/portfolyo/core/ndframelike.py b/portfolyo/core/ndframelike.py index 560a576..60f4aa0 100644 --- a/portfolyo/core/ndframelike.py +++ b/portfolyo/core/ndframelike.py @@ -42,6 +42,12 @@ def loc(self): a boolean array.)""" ... + @abc.abstractproperty + def slice(self): + """Create a new instance with a subset of the rows. + Different from loc since performs slicing with right-open interval.""" + ... + @abc.abstractmethod def dataframe( self, cols: Iterable[str] = None, has_units: bool = True, *args, **kwargs diff --git a/portfolyo/core/pfline/classes.py b/portfolyo/core/pfline/classes.py index 8c6dd0b..a2aa855 100644 --- a/portfolyo/core/pfline/classes.py +++ b/portfolyo/core/pfline/classes.py @@ -286,6 +286,7 @@ class FlatPfLine(PfLine): hedge_with = prices.Flat.hedge_with # map_to_year => on child classes loc = flat_methods.loc + slice = flat_methods.slice __getitem__ = flat_methods.__getitem__ # __bool__ => on child classes __eq__ = flat_methods.__eq__ @@ -300,6 +301,7 @@ class NestedPfLine(PfLine, children.ChildFunctionality): hedge_with = prices.Nested.hedge_with map_to_year = nested_methods.map_to_year loc = nested_methods.loc + slice = nested_methods.slice __bool__ = nested_methods.__bool__ __eq__ = nested_methods.__eq__ diff --git a/portfolyo/core/pfline/flat_methods.py b/portfolyo/core/pfline/flat_methods.py index 90a27e4..155ff0f 100644 --- a/portfolyo/core/pfline/flat_methods.py +++ b/portfolyo/core/pfline/flat_methods.py @@ -3,6 +3,8 @@ from typing import TYPE_CHECKING, Any from ... import testing +import pandas as pd +from datetime import timedelta if TYPE_CHECKING: from .classes import FlatPfLine @@ -31,6 +33,11 @@ def loc(self: FlatPfLine) -> LocIndexer: return LocIndexer(self) +@property +def slice(self: FlatPfLine) -> SliceIndexer: + return SliceIndexer(self) + + class LocIndexer: """Helper class to obtain FlatPfLine instance, whose index is subset of original index.""" @@ -40,3 +47,21 @@ def __init__(self, pfl: FlatPfLine): def __getitem__(self, arg) -> FlatPfLine: newdf = self.pfl.df.loc[arg] return self.pfl.__class__(newdf) # use same (leaf) class + + +class SliceIndexer: + """Helper class to obtain FlatPfLine instance, whose index is subset of original index. + Exclude end point from the slice.""" + + def __init__(self, pfl: FlatPfLine): + self.pfl = pfl + + def __getitem__(self, arg) -> FlatPfLine: + date_start = pd.to_datetime(arg.start) + date_end = pd.to_datetime(arg.stop) + + if arg.stop is not None: + date_end = date_end - timedelta(seconds=1) + + newdf = self.pfl.df.loc[date_start:date_end] + return self.pfl.__class__(newdf) # use same (leaf) class diff --git a/portfolyo/core/pfline/nested_methods.py b/portfolyo/core/pfline/nested_methods.py index dbe1c4b..33d37b1 100644 --- a/portfolyo/core/pfline/nested_methods.py +++ b/portfolyo/core/pfline/nested_methods.py @@ -37,6 +37,11 @@ def loc(self: NestedPfLine) -> LocIndexer: return LocIndexer(self) +@property +def slice(self: NestedPfLine) -> SliceIndexer: + return SliceIndexer(self) + + class LocIndexer: """Helper class to obtain NestedPfLine instance, whose index is subset of original index.""" @@ -46,3 +51,15 @@ def __init__(self, pfl: NestedPfLine): def __getitem__(self, arg) -> NestedPfLine: newchildren = {name: child.loc[arg] for name, child in self.pfl.items()} return self.pfl.__class__(newchildren) + + +class SliceIndexer: + """Helper class to obtain NestedPfLine instance, whose index is subset of original index. + Exclude end point from the slice.""" + + def __init__(self, pfl: NestedPfLine): + self.pfl = pfl + + def __getitem__(self, arg) -> NestedPfLine: + newchildren = {name: child.slice[arg] for name, child in self.pfl.items()} + return self.pfl.__class__(newchildren) diff --git a/portfolyo/core/pfstate/pfstate.py b/portfolyo/core/pfstate/pfstate.py index b90b79c..ed127a4 100644 --- a/portfolyo/core/pfstate/pfstate.py +++ b/portfolyo/core/pfstate/pfstate.py @@ -280,6 +280,10 @@ def __bool__(self): def loc(self) -> _LocIndexer: # from ABC return _LocIndexer(self) + @property + def slice(self) -> _SliceIndexer: # from ABC + return _SliceIndexer(self) + class _LocIndexer: """Helper class to obtain PfState instance, whose index is subset of original index.""" @@ -292,3 +296,17 @@ def __getitem__(self, arg) -> PfState: unsourcedprice = self.pfs.unsourcedprice.loc[arg] sourced = self.pfs.sourced.loc[arg] return PfState(offtakevolume, unsourcedprice, sourced) + + +class _SliceIndexer: + """Helper class to obtain PfState instance, whose index is subset of original index. + Exclude end index from the slice""" + + def __init__(self, pfs): + self.pfs = pfs + + def __getitem__(self, arg) -> PfState: + offtakevolume = self.pfs.offtake.volume.slice[arg] + unsourcedprice = self.pfs.unsourcedprice.slice[arg] + sourced = self.pfs.sourced.slice[arg] + return PfState(offtakevolume, unsourcedprice, sourced) diff --git a/tests/core/pfline/test_slice.py b/tests/core/pfline/test_slice.py new file mode 100644 index 0000000..d7b76e2 --- /dev/null +++ b/tests/core/pfline/test_slice.py @@ -0,0 +1,91 @@ +"""Test if slice attributes works properly with portfolio line.""" + +import pytest +import pandas as pd +from portfolyo import dev + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("slice_start", ["2021", "2022", "2022-01-02"]) +def test_flat_slice_start(slice_start, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfl1 = dev.get_flatpfline(index) + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_flat_slice_end(slice_end, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfl1 = dev.get_flatpfline(index) + assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +def test_flat_slice_whole(where: str, freq: str): + """Test that slicing splits the pfl in 2 non-overlapping pieces without gap + (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) + """ + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfl1 = dev.get_flatpfline(index) + left, right = pfl1.slice[:where], pfl1.slice[where:] + # Test that each timestamp is present at least once. + pd.testing.assert_index_equal(left.index.union(right.index), index) + # Test that no timestamp is present twice. + assert len(left.index.intersection(right.index)) == 0 + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("slice_start", ["2021", "2022", "2022-01-02"]) +def test_nested_slice_start(slice_start, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfl1 = dev.get_nestedpfline(index) + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_nested_slice_end(slice_end, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfl1 = dev.get_nestedpfline(index) + assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +def test_nested_slice_whole(where: str, freq: str): + """Test that slicing splits the pfl in 2 non-overlapping pieces without gap + (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) + """ + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfl1 = dev.get_nestedpfline(index) + left, right = pfl1.slice[:where], pfl1.slice[where:] + # Test that each timestamp is present at least once. + pd.testing.assert_index_equal(left.index.union(right.index), index) + # Test that no timestamp is present twice. + assert len(left.index.intersection(right.index)) == 0 diff --git a/tests/core/pfstate/test_slice_state.py b/tests/core/pfstate/test_slice_state.py new file mode 100644 index 0000000..6a5a960 --- /dev/null +++ b/tests/core/pfstate/test_slice_state.py @@ -0,0 +1,68 @@ +"""Test if slice attributes works properly with portfolio state.""" + +import pytest +import pandas as pd +from portfolyo import dev + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("slice_start", ["2021", "2022", "2022-01-02"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_slice_state(slice_start, slice_end, freq): + index = pd.date_range("2020", "2024", freq=freq) + pfs = dev.get_pfstate(index) + + pfs_to_concat = [pfs.slice[: slice_end[0]], pfs.slice[slice_start:]] + pfs_to_concat2 = [pfs.loc[: slice_end[1]], pfs.loc[slice_start:]] + assert pfs_to_concat == pfs_to_concat2 + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("slice_start", ["2021", "2022", "2022-01-02"]) +def test_state_slice_start(slice_start, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfs = dev.get_pfstate(index) + assert pfs.slice[slice_start:] == pfs.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_state_slice_end(slice_end, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfs = dev.get_pfstate(index) + assert pfs.slice[: slice_end[0]] == pfs.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +def test_state_slice_whole(where: str, freq: str): + """Test that slicing splits the pfl in 2 non-overlapping pieces without gap + (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) + """ + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfs = dev.get_pfstate(index) + left, right = pfs.slice[:where], pfs.slice[where:] + # Test that each timestamp is present at least once. + pd.testing.assert_index_equal(left.index.union(right.index), index) + # Test that no timestamp is present twice. + assert len(left.index.intersection(right.index)) == 0