From 1928e73758a7329159b96b40d5ab24dd7f19749a Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Mon, 27 May 2024 19:10:10 +0200 Subject: [PATCH 1/3] new release 0.6.0 (#92) * better description of development process (#70) * Update README.rst (#71) * feat: bump version to latest release +1 (#69) * Wavgfix (#62) * initial commit * small fix * stash for the weekend * Fixed wavg to handle surplus values. * Re-instated 'Europe/Berlin' as default for tz in standardize. For now. * small fix in docs * docs and better unit handling * Kind available at project root * fixed init tests (?) * new release * fixed for pyton 3.9 too * additional tests (#74) * Portfolyo Release 0.5.10 (#75) * Slice (#78) * added slice property & tests * changed toml * fixed tz issue and added tz test for slicing * added test-cases with tz --------- Co-authored-by: Alina Voilova Co-authored-by: rwijtvliet * Standardise sod (#82) * refactoring and additional assertion on start-of-day * fixed test and assertion * fixed? * fixed some * not working * fixed some things * tests for slice * final test for slice for 15T * docs * try to fix docs * another try to fix * poetry shell * fixing 2.0 * fixing 2.1 * fixing 3.0 * fixing 4.0 * fixing 5.0 * fixing 6.0 * fixng 7.0 * fixng 8.0 * fixing 11 * fixing 12 * fixing 13 * fixng 14 * fixing 15 * fixing 16 * fixing 17 * deleted python 3.0 from tests * deleted hmtl folder * changed toml * updated lock file --------- Co-authored-by: rwijtvliet Co-authored-by: Alina Voilova * Concat (#83) * added slice property & tests * changed toml * created branch concat * first commit * works for flat pflines, nested not yet * draft of concat function done, need more testing though * created error_case tests for concat * wrote test_func for concat_pflines, improved the code for concat * added test cases for concat pfstates, requires approval(!) * changed test_function * change general to take iterable as argument --------- Co-authored-by: Alina Voilova * Toplevelfunctions (#84) * initial commit * gitignore * Intersect (#79) * added slice property & tests * changed toml * created branch for intersect_flex function * new test function * added tests for intersect_flex frames * all test are passing * test ignore all for intersect frame * fixed documentation * deleted req docs * added DST testcase * not working help * Added back missing file * added valuerror for sod with less than daily freq * deleted unnecessary files * tests for indexable * tests for indexable with 2 obj * added oneliner in docs and test for 3 obj. case --------- Co-authored-by: Alina Voilova Co-authored-by: rwijtvliet * Plot children (#87) * changed to poetry * fixed pint problem (groups in unitdef.txt) and pint-pandas dependency problem by fixing pandas to 2.0 * ci pipeline * ci pipeline * ci with poetry * solve dependency problems between pandas and pint-pandas * workaround pint-pandas bug * typo * seaborn pinned version to 0.8 * fixed to_excel function, updated version of pint * fixed arithmatic on pflines without overlap * small changes small changes * more consistent functions to get random pfline * deleted comment * change the python version for push request to 3.11 * test * Removed unused dependency * updated toml * added exception if no clipboard available * updated toml * fixed pfline_excelclipboad.py * changed lock file for pre-commit * install poetry libraries in pre-commit step * use black on all files in pre-commit * updated flake8 version in pre-commit.yaml * exclude .venv folder from flake8 * changed setup.cfg to ignore flake8 error messages * initial commit * first try at plotting children * bar plot with children * created plot_children(),fixed bug with darken * area plots for children stacked on top of each other. for daily it plots only parent * changed the logic of all plot_timeseries_as functions, now based on frequency * created a function to test plotting pfline * created slice attr, wrote tests for it * more flexible intersec function with ignore freq, tz, start_of_day + tests * small changes to intersect * intersect_flex function is finished, more testing with frames needed * finished intersect_flex, more testing with frames needed * added children bool to plot pfstate * added hash function for colors for children * deleted unnecessary test * changed hash function, and width of hline * deleted unnecessary test * plot with children * changed plot_pfstate to work with new logic * tests for plot function * added function to set limits to plot pfstate * fixed strict variable for test cases * Deleted unnecessary files * changed yaml file to exclude python 3.10 with mac 14 --------- Co-authored-by: rwijtvliet Co-authored-by: Alina Voilova * Structure (#90) * changed to poetry * fixed pint problem (groups in unitdef.txt) and pint-pandas dependency problem by fixing pandas to 2.0 * ci pipeline * ci pipeline * ci with poetry * solve dependency problems between pandas and pint-pandas * workaround pint-pandas bug * typo * seaborn pinned version to 0.8 * fixed to_excel function, updated version of pint * fixed arithmatic on pflines without overlap * small changes small changes * more consistent functions to get random pfline * deleted comment * change the python version for push request to 3.11 * test * Removed unused dependency * updated toml * added exception if no clipboard available * updated toml * fixed pfline_excelclipboad.py * changed lock file for pre-commit * install poetry libraries in pre-commit step * use black on all files in pre-commit * updated flake8 version in pre-commit.yaml * exclude .venv folder from flake8 * changed setup.cfg to ignore flake8 error messages * initial commit * first try at plotting children * bar plot with children * created plot_children(),fixed bug with darken * area plots for children stacked on top of each other. for daily it plots only parent * changed the logic of all plot_timeseries_as functions, now based on frequency * created a function to test plotting pfline * created slice attr, wrote tests for it * more flexible intersec function with ignore freq, tz, start_of_day + tests * small changes to intersect * intersect_flex function is finished, more testing with frames needed * finished intersect_flex, more testing with frames needed * added children bool to plot pfstate * added hash function for colors for children * deleted unnecessary test * changed hash function, and width of hline * deleted unnecessary test * plot with children * changed plot_pfstate to work with new logic * tests for plot function * refactoring * more powerful peak/offpeak functions * removed longer_or_shorter from frequency tools; Use the up_or_down function instead * tests for peakfn and peakconvert * fixed test * removed all Union and replaced with | --------- Co-authored-by: rwijtvliet Co-authored-by: Alina Voilova * Portfolyo Release 0.6.0 * Portfolyo Release 0.6.0 (#91) * 0.6.0 (#93) * 0.6.0 (#94) --------- Co-authored-by: Stefan Keidel <1188614+stefankeidel@users.noreply.github.com> Co-authored-by: Alina Voilova <91426818+Pizza2Pizza@users.noreply.github.com> Co-authored-by: Alina Voilova --- .github/workflows/ci-on-pullreq.yaml | 7 +- .gitignore | 2 + .readthedocs.yml | 12 +- README.rst | 17 + dev_scripts/sphinx_autorun.sh | 0 docs/core/pfline.rst | 37 +- docs/core/toplevel.rst | 33 + docs/index.rst | 3 +- docs/requirements-docs.txt | 14 - docs/savefig/fig_hedge.png | Bin 32520 -> 31045 bytes docs/savefig/fig_offtake.png | Bin 64560 -> 111624 bytes docs/savefig/fig_plot_pfl.png | Bin 28115 -> 39293 bytes docs/savefig/fig_plot_pfs.png | Bin 43127 -> 37893 bytes docs/specialized_topics/resampling.rst | 2 +- docs/tutorial/part3.ipynb | 1910 +++---- docs/tutorial/part4.ipynb | 556 +- poetry.lock | 1778 ++++--- portfolyo/__init__.py | 17 +- portfolyo/core/mixins/__init__.py | 4 - portfolyo/core/mixins/plot.py | 361 -- portfolyo/core/mixins/text.py | 248 - portfolyo/core/pfline/arithmatic.py | 16 +- portfolyo/core/pfline/children.py | 10 +- portfolyo/core/pfline/classes.py | 173 +- portfolyo/core/pfline/decorators.py | 19 +- portfolyo/core/pfline/flat_methods.py | 98 +- portfolyo/core/pfline/interop.py | 32 +- portfolyo/core/pfline/nested_methods.py | 43 +- portfolyo/core/pfline/plot.py | 174 + portfolyo/core/pfline/prices.py | 97 - portfolyo/core/pfline/text.py | 135 + portfolyo/core/pfstate/arithmatic.py | 10 +- portfolyo/core/pfstate/pfstate.py | 66 +- portfolyo/core/pfstate/pfstate_helper.py | 7 +- portfolyo/core/pfstate/plot.py | 83 + portfolyo/core/pfstate/text.py | 42 + portfolyo/core/shared/__init__.py | 1 + .../core/{mixins => shared}/excelclipboard.py | 13 +- portfolyo/core/{ => shared}/ndframelike.py | 13 +- portfolyo/core/shared/text.py | 84 + portfolyo/dev/develop.py | 42 +- portfolyo/dev/mockup.py | 7 +- portfolyo/prices/__init__.py | 1 - portfolyo/prices/convert.py | 502 -- portfolyo/prices/hedge.py | 146 - portfolyo/prices/utils.py | 190 - portfolyo/testing/__init__.py | 7 - portfolyo/tools/__init__.py | 13 +- portfolyo/tools/changefreq.py | 35 +- portfolyo/tools/changeyear.py | 11 +- portfolyo/tools/duration.py | 27 +- portfolyo/tools/frame.py | 8 +- portfolyo/tools/freq.py | 54 +- portfolyo/tools/hedge.py | 114 + portfolyo/tools/intersect.py | 163 +- portfolyo/tools/isboundary.py | 54 +- portfolyo/tools/peakconvert.py | 426 ++ portfolyo/tools/{peakperiod.py => peakfn.py} | 98 +- portfolyo/tools/product.py | 67 + portfolyo/tools/standardize.py | 150 +- portfolyo/tools/startofday.py | 61 +- portfolyo/{testing => tools}/testing.py | 28 +- portfolyo/tools/trim.py | 22 +- portfolyo/tools/types.py | 7 + portfolyo/tools/tzone.py | 31 +- portfolyo/tools/unit.py | 53 +- portfolyo/{ => tools}/visualize/__init__.py | 3 +- portfolyo/{ => tools}/visualize/categories.py | 10 +- portfolyo/{ => tools}/visualize/colors.py | 29 +- portfolyo/tools/visualize/plot.py | 324 ++ portfolyo/tools/wavg.py | 97 +- portfolyo/tools2/changeyear.py | 79 + portfolyo/tools2/concat.py | 150 + portfolyo/tools2/intersect.py | 44 + portfolyo/tools2/plot.py | 146 + portfolyo/tools2/types.py | 12 + portfolyo/visualize/plot.py | 331 -- profile_data | Bin 0 -> 470294 bytes profile_output.txt | 4735 +++++++++++++++++ pyproject.toml | 9 +- setup.cfg | 2 +- tests/core/pfline/test_flat.py | 9 +- .../test_pfline_arithmatic_kind_and_error.py | 24 +- .../core/pfline/test_pfline_excelclipboard.py | 2 +- tests/core/pfline/test_pfline_init.py | 34 +- tests/core/pfline/test_pfline_text.py | 1 + tests/core/pfline/test_slice.py | 187 + .../pfstate/test_pfstate_excelclipboard.py | 3 +- tests/core/pfstate/test_pfstate_init.py | 21 +- tests/core/pfstate/test_slice_state.py | 162 + tests/dev/test_develop.py | 122 +- tests/prices/test_hedge.py.bak | 86 - tests/{ => tools}/prices/test_convert.py.bak | 83 +- .../{ => tools}/prices/test_convert_data.xlsx | Bin tests/tools/test_changefreq_fromexcel.py.bak | 4 +- tests/tools/test_freq.py | 7 +- tests/tools/test_hedge.py | 148 + tests/{prices => tools}/test_hedge_data.xlsx | Bin tests/tools/test_intersect.py | 49 +- tests/tools/test_intersect_flex.py | 303 ++ tests/tools/test_intersect_flex_frame.py | 175 + tests/tools/test_isboundary.py | 10 +- tests/tools/test_peakconvert.py | 119 + .../{test_peakperiod.py => test_peakfn.py} | 169 +- .../test_utils.py => tools/test_product.py} | 97 +- tests/tools/test_right.py | 75 +- tests/tools/test_standardize.py | 61 +- tests/tools/test_startofday.py | 416 +- tests/tools/test_wavg.py | 4 +- tests/tools/visualize/test_plot.py | 79 + tests/tools2/test_concat_error_cases.py | 136 + tests/tools2/test_concat_pfline.py | 151 + tests/tools2/test_concat_pfstate.py | 100 + tests/tools2/test_indexable.py | 222 + tests/utils.py | 1 + 115 files changed, 12461 insertions(+), 5004 deletions(-) mode change 100644 => 100755 dev_scripts/sphinx_autorun.sh create mode 100644 docs/core/toplevel.rst delete mode 100644 docs/requirements-docs.txt delete mode 100644 portfolyo/core/mixins/__init__.py delete mode 100644 portfolyo/core/mixins/plot.py delete mode 100644 portfolyo/core/mixins/text.py create mode 100644 portfolyo/core/pfline/plot.py delete mode 100644 portfolyo/core/pfline/prices.py create mode 100644 portfolyo/core/pfline/text.py create mode 100644 portfolyo/core/pfstate/plot.py create mode 100644 portfolyo/core/pfstate/text.py create mode 100644 portfolyo/core/shared/__init__.py rename portfolyo/core/{mixins => shared}/excelclipboard.py (53%) rename portfolyo/core/{ => shared}/ndframelike.py (87%) create mode 100644 portfolyo/core/shared/text.py delete mode 100644 portfolyo/prices/__init__.py delete mode 100644 portfolyo/prices/convert.py delete mode 100644 portfolyo/prices/hedge.py delete mode 100644 portfolyo/prices/utils.py delete mode 100644 portfolyo/testing/__init__.py create mode 100644 portfolyo/tools/hedge.py create mode 100644 portfolyo/tools/peakconvert.py rename portfolyo/tools/{peakperiod.py => peakfn.py} (58%) create mode 100644 portfolyo/tools/product.py rename portfolyo/{testing => tools}/testing.py (76%) create mode 100644 portfolyo/tools/types.py rename portfolyo/{ => tools}/visualize/__init__.py (76%) rename portfolyo/{ => tools}/visualize/categories.py (93%) rename portfolyo/{ => tools}/visualize/colors.py (61%) create mode 100644 portfolyo/tools/visualize/plot.py create mode 100644 portfolyo/tools2/changeyear.py create mode 100644 portfolyo/tools2/concat.py create mode 100644 portfolyo/tools2/intersect.py create mode 100644 portfolyo/tools2/plot.py create mode 100644 portfolyo/tools2/types.py delete mode 100644 portfolyo/visualize/plot.py create mode 100755 profile_data create mode 100755 profile_output.txt create mode 100644 tests/core/pfline/test_slice.py create mode 100644 tests/core/pfstate/test_slice_state.py delete mode 100644 tests/prices/test_hedge.py.bak rename tests/{ => tools}/prices/test_convert.py.bak (66%) rename tests/{ => tools}/prices/test_convert_data.xlsx (100%) create mode 100644 tests/tools/test_hedge.py rename tests/{prices => tools}/test_hedge_data.xlsx (100%) create mode 100644 tests/tools/test_intersect_flex.py create mode 100644 tests/tools/test_intersect_flex_frame.py create mode 100644 tests/tools/test_peakconvert.py rename tests/tools/{test_peakperiod.py => test_peakfn.py} (54%) rename tests/{prices/test_utils.py => tools/test_product.py} (54%) create mode 100644 tests/tools/visualize/test_plot.py create mode 100644 tests/tools2/test_concat_error_cases.py create mode 100644 tests/tools2/test_concat_pfline.py create mode 100644 tests/tools2/test_concat_pfstate.py create mode 100644 tests/tools2/test_indexable.py diff --git a/.github/workflows/ci-on-pullreq.yaml b/.github/workflows/ci-on-pullreq.yaml index 88659e8..ac41777 100644 --- a/.github/workflows/ci-on-pullreq.yaml +++ b/.github/workflows/ci-on-pullreq.yaml @@ -9,8 +9,11 @@ jobs: fail-fast: true matrix: os: ["ubuntu-latest", "macos-latest", "windows-latest"] - python-version: ["3.9", "3.10", "3.11", "3.12"] - + python-version: ["3.10", "3.11", "3.12"] + exclude: + # Exclude Python 3.10 on macOS latest + - os: "macos-latest" + python-version: "3.10" steps: - name: Checkout source uses: actions/checkout@v2 diff --git a/.gitignore b/.gitignore index 70db76d..4c73403 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ coverage.xml *.py,cover .hypothesis/ .pytest_cache/ +test-output.xml cover/ # Translations @@ -160,3 +161,4 @@ cython_debug/ .issues/ .DS_Store test.xlsx + diff --git a/.readthedocs.yml b/.readthedocs.yml index d4e0ea0..fa67133 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,16 +5,16 @@ build: tools: python: "3.10" jobs: - post_create_environment: - # Install poetry - # https://python-poetry.org/docs/#installing-manually + + post_install: - pip install poetry # Tell poetry to not use a virtual environment - - poetry config virtualenvs.create false - post_install: # Install dependencies with 'docs' dependency group # https://python-poetry.org/docs/managing-dependencies/#dependency-groups - - poetry install --with docs + - poetry export -f requirements.txt --without-hashes --without-urls --with docs -o requirements.txt + - pip install -r requirements.txt + #- pip list + sphinx: configuration: docs/conf.py diff --git a/README.rst b/README.rst index 4d6b5c3..62d5318 100644 --- a/README.rst +++ b/README.rst @@ -1,3 +1,4 @@ +========= portfolyo ========= @@ -28,6 +29,8 @@ portfolyo Portfolyo is a Python package to analyse and manipulate timeseries related to power and gas offtake portfolios. + +------------ Installation ------------ @@ -45,6 +48,7 @@ NB: this package is under active development and the API will change without pri portfolyo = "x.y.z" +------------- Documentation ------------- @@ -52,6 +56,8 @@ Documentation is hosted on readthedocs: https://portfolyo.readthedocs.io/ + +---------- Repository ---------- @@ -60,6 +66,7 @@ The git repository is hosted on github: http://www.github.com/rwijtvliet/portfolyo +---------- Developing ---------- @@ -74,6 +81,16 @@ the commit hooks. Feature branches are merged into the ``develop`` branch via pull request. + +Internal dependencies +--------------------- + +Inside the package, modules depend on each other in the following chain. A module may depend on another module if it is further to the left: + +tools >> pfline >> pfstate >> tools2 + + +---------- Publishing ---------- diff --git a/dev_scripts/sphinx_autorun.sh b/dev_scripts/sphinx_autorun.sh old mode 100644 new mode 100755 diff --git a/docs/core/pfline.rst b/docs/core/pfline.rst index e3a8678..3cb34a9 100644 --- a/docs/core/pfline.rst +++ b/docs/core/pfline.rst @@ -252,6 +252,30 @@ 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 --- + import portfolyo as pf, pandas as pd + index = pd.date_range('2024', freq='AS', periods=3) + input_df = pd.DataFrame({'w':[200, 220, 300], 'p': [100, 150, 200]}, index) + pfl = pf.PfLine(input_df) + # --- hide: stop --- + # continuation of previous code example + pfl.slice['2024':'2026'] # excludes 2026; 2026 interpreted as timestamp 2026-01-01 00:00:00 + # --- hide: start --- + print(pfl.slice['2024':'2026']) + # --- hide: stop --- + + + + +Concatenation +============= + +Portfolio lines can be concatenated with the ``portfolio.concat()`` function. This only works if the input portfolio lines have contain compatible information (the same frequency, timezone, start-of-day, kind, etc) and, crucially, their indices are gapless and without overlap. To remove any overlap, use the ``.slice[]`` property. + .. exec_code:: # --- hide: start --- @@ -261,9 +285,12 @@ 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 + index2 = pd.date_range('2025', freq='AS', periods=3) # 2 years' overlap with pfl + pfl2 = pf.PfLine(pd.DataFrame({'w':[22, 30, 40], 'p': [15, 20, 21]}, index)) + # first two datapoints (until/excl 2026) from pfl, last two datapoints (from/incl 2026) from pfl2 + pf.concat([pfl.slice[:'2026'], pfl2.slice['2026':]]) # --- hide: start --- - print(pfl.loc['2024':'2025']) + print(pf.concat([pfl.slice[:'2026'], pfl2.slice['2026':]])) # --- hide: stop --- @@ -731,7 +758,7 @@ Using the ``.hedge_with()`` method, the volume timeseries in a portfolio line is Peak and offpeak ---------------- -For portfolio lines with (quarter)hourly data, the ``.po()`` method splits the values in peak and offpeak. We can again specify if we want monthly, quarterly, or yearly values. +For markets that have a concept of "peak" and "offpeak" periods, the ``.po()`` method splits the values in peak and offpeak. We need to specifiy a ``PeakFunction`` to determine which periods are peak - we can create one with ``portfolyo.create_peakfn()``, or we use the one for the German power market which is provided under ``portfolyo.germanpower_peakfn``. We can again specify if we want monthly, quarterly, or yearly values. .. exec_code:: @@ -741,9 +768,9 @@ For portfolio lines with (quarter)hourly data, the ``.po()`` method splits the v offtake = pf.PfLine(pf.dev.w_offtake(index)) # mock offtake volumes # --- hide: stop --- # continuation of previous code example - offtake.po() + offtake.po(pf.germanpower_peakfn) # --- hide: start --- - print(repr(offtake.po())) + print(repr(offtake.po(pf.germanpower_peakfn))) NB: be cautious in using the output of this method. The values in the "sub-dataframes" do not apply to the entire time period, so the usual relations (e.g. energy = power * duration) do not hold if the duration of the entire time period is used. For convenience, the relevant duration (of only the peak or only the offpeak hours) is included in the dataframe. diff --git a/docs/core/toplevel.rst b/docs/core/toplevel.rst new file mode 100644 index 0000000..7bd08e7 --- /dev/null +++ b/docs/core/toplevel.rst @@ -0,0 +1,33 @@ +.. |_| unicode:: 0xA0 + :trim: + +=============== +Top-level tools +=============== + +Some tools for working with ``pandas.Series``, ``pandas.DataFrame``, ``portfolyo.PfLine`` and ``portfolyo.PfState`` objects are available at the root of the package. They are concisely listed below. + +---------------------- +Work on pandas objects +---------------------- + +* ``portfolyo.asfreq_avg()`` Changes the frequency of a Series or DataFrame with "averagable" data. See :doc:`this page<../specialized_topics/resampling>` for more information. + +* ``portfolyo.asfreq_sum()`` Changes the frequency of a Series or DataFrame with "summable" data. See :doc:`this page<../specialized_topics/resampling>` for more information. + +* ``portfolyo.wavg()`` Calculates weighted average of a Series or DataFrame. + +* ``portfolyo.standardize()`` Ensures/asserts a Series or DataFrame follows necessary rules to initialize PfLine with. + +------------------------- +Work on portfolyo objects +------------------------- + +* ``portfolyo.concat()`` Concatenates PfLines (or PfStates) into one PfLine (or PfState). + +* ``portfolyo.plot_pfstates()`` Plots several PfStates in one figure. + +* ``portfolyo.intersection()`` Intersect several dataframes and/or series and/or Pflines and/or PfStates. + + + diff --git a/docs/index.rst b/docs/index.rst index f396077..370b62d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -68,6 +68,7 @@ Contents core/pfline core/pfstate core/interoperability + core/toplevel .. toctree:: :maxdepth: 1 @@ -94,4 +95,4 @@ Contents :maxdepth: 2 :caption: Full reference - full_reference \ No newline at end of file + full_reference diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt deleted file mode 100644 index c6f63b7..0000000 --- a/docs/requirements-docs.txt +++ /dev/null @@ -1,14 +0,0 @@ -sphinx -sphinx-autobuild -# These are dependencies of various sphinx extensions for documentation. -ipython==8.12 # readthedocs needs python <=3.8, and this only works with ipython <=8.12 -matplotlib -numpydoc -sphinx-copybutton -sphinx-exec-code -sphinx_rtd_theme - -insegel - -nbsphinx -pandoc \ No newline at end of file diff --git a/docs/savefig/fig_hedge.png b/docs/savefig/fig_hedge.png index a487121b74282eeee336c33dbb7494db14f1bc4e..0d1ca1344e8de68ce7960ff98ae028f46d8a8917 100644 GIT binary patch literal 31045 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
  • -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

    GF{tQz{R{Giwup4h-IDl6pkaK3`%+WY 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�@jb#9Vkjf~VoqasL3e?Vak8DwLjUvrq@} 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%0A#930H0!tU;zH}Bq=%M!soDfxYM zyz-MLPbybV)XrUtQUamtD~p_ov-5RY{>=$w7NY$N^8r=bg6QbzHAGa|X20Ff<=2Vy zHF!x&6O`Iz!9LGI(;~a?mReg|^FZD2XVSUw@Pj8Fp2>_}oM^o&VG>GXZ+kn>NucPO zqs46V#wQnQ^G)dp>c|4C?3iCzorcN)bsd2$1a-fQuD%@RfhjPRAzv(MTXLhRY=-Kf zap1s#E#ujZN#h}3bJHocN|Te5>QG*dQ5s~|HR|i=s28^0j_&aG*}R5r`YvQ&bPlD0 zNcAD?SKz6%dg{@@C1t8-$8B%Mx9tFU^8wmt9vg!lotEhsLyO(PifF7huzB zSUwuqI9N5Fzcp2V-`Bl>NIW23xv^x6?KkOqkOoFDk3fMHVTys(7H~K|VgXkk5hz<; z;&u4=?{r*US%4RG1zSto$llvx2j>0?pLEFrW7Pu5eXY?Z#0Mq>0#6(izA^{~_p#c0;OIOE+UZoQJ$slA`0Ir7 zXSmTs=$`OqIP94|Zv?cZp%_*3e*5M+-=C(IOkEes=E5v9*U=k@9kRAEMxe(lK0>E* zSEXF7np07o5_UQzG7`u;)%8x#KaBi&5RF%+{s{>B`oC(Q^i1&ik^j?S>vLc~2ll_t c>XcQ(rY~+f#`e_XFz`F{{ZaP{*MLiZ0i~9ed;kCd literal 64560 zcmeFY^;cBy7e6|5hqQFVARQ7ifOHB1N=dhLk94PkbT**ZB2aEoyBbJE+myF0sy@$fkO zp9S1buGT#C_fLJmO|YC5_1r)p0@HurNZ%w&Y(b#=Y$e&(+R!Y-qn9tIj-TXH=h#T) z(ClGllexJ)@P$~QSfZHjW+ue^O2-g%l8=VlsUG+hbi36XK@{;-o`^n3q;xQ$uk{EV+`IEsnOt!C+ER&ZzzU6Vo;a{vzT*z);2dqAdhld1VH%R^0 z3vf}~U9;2Ddn}kghuTV(=0t{`lqwtzK6K1DwGhCa8YH7j6)8Z@=fv0MtFMKxZlSoj zeh7(&(JO^`&f3GVMO*63b0pA{!#MtDOCi+%-q$P)-G@Zp%C1 z`hl3mI5#?!;a#ad>%aC?p#1Nly`M)&}_4iT1=UufB=KKESN)$ zJ!qwr$;OGDoxPDa`0uNq9U;Ub<2CXo`|1A$<=tl_vF3zIESsLO&7)9O)XkKrB1^OE zc>~YKZ>HKL_CI!W5?-@_aM2%m>*ms922PT#X+0l=KkluMFw;^Y&`i7r103B6y)LQ2 zEl=BXFPG<+!kW^1ggwQvV1Z0>-pECXC$`ci_rK_$wigvlMR5_GEsuQ5K5catjGard zv|T0>$2LAM_SP?$eQTz^JWKvX%UJF7k-C@rVdP())z<rVP<0s?o+SDDXW>R#7TPOh0%p2@8cMB@rSo2I1v%kolKDP5%_&Z(h;-;6 zOUdsNPp}MsV}Y>@w%ur+>`picK;%25=jPHL4Fr8(ME+NFHV$Tit0v*5>nq3p!k&k} zll44L)?YuI(*5P*?tE}obRf=I@K(NT(+MA(Uw&fS-r#Zem?^u%sX_O>$RMj{(@Alc7F zFA~RBRzHCXEq^XsV=My^lay?0+`9WI&4Uahd5D^-!@n50<-asj+8Yx4U&-wANjc?N z@JI3ZpT_JS9*%OJ-}>Hcu}MaiSGHhZuln$GoP_bL8?4=tH8`!|gQ_`kWMpKT9

    a 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 Vk=vL?7Y1JUm9_2`DL(t>zX3sh$}Io@ diff --git a/docs/savefig/fig_plot_pfl.png b/docs/savefig/fig_plot_pfl.png index 03698fa7342334fb8719cfb5abf0098cde8c448c..c870aceb94c7261ebdca201b3948d24a8115a5ca 100644 GIT binary patch literal 39293 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 LBlbpCvT<3J<9(;GHyP%HLu_hXgNs@L~)4<0uW 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 Rr0`MfP2@^w2C{soPZ`U3y} diff --git a/docs/savefig/fig_plot_pfs.png b/docs/savefig/fig_plot_pfs.png index a00e5dedb5c03afe737427465f69ed908388476b..a3022e32039d272e0fbc98730a8a8dd55e6a8fdd 100644 GIT binary patch literal 37893 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 literal 43127 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 (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/poetry.lock b/poetry.lock index 582f065..a38d531 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,24 +2,24 @@ [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] @@ -42,82 +42,87 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.13.1" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] -[package.dependencies] -setuptools = {version = "*", markers = "python_version >= \"3.12\""} - [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "black" -version = "23.11.0" +version = "23.12.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, - {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, - {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, - {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, - {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, - {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, - {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, - {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, - {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, - {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, - {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, - {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, - {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, - {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, - {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, - {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, - {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, - {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, ] [package.dependencies] @@ -131,7 +136,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -153,15 +158,40 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.3)"] +[[package]] +name = "build" +version = "1.2.1" +description = "A simple, correct Python build frontend" +optional = false +python-versions = ">=3.8" +files = [ + {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, + {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} +packaging = ">=19.1" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] +test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] +typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +uv = ["uv (>=0.1.18)"] +virtualenv = ["virtualenv (>=20.0.35)"] + [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -380,13 +410,13 @@ files = [ [[package]] name = "comm" -version = "0.2.0" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" files = [ - {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, - {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -397,126 +427,126 @@ test = ["pytest"] [[package]] name = "contourpy" -version = "1.2.0" +version = "1.2.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, ] [package.dependencies] -numpy = ">=1.20,<2.0" +numpy = ">=1.20" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.dependencies] @@ -542,29 +572,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.0" +version = "1.8.1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, - {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, - {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, - {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, - {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, - {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, - {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, - {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, - {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, - {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, - {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, - {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, - {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, - {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, - {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, - {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, - {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, - {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, ] [[package]] @@ -591,13 +625,13 @@ files = [ [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] @@ -652,13 +686,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.19.0" +version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, - {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] @@ -666,18 +700,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -698,60 +732,60 @@ pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "fonttools" -version = "4.45.0" +version = "4.51.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18138744540413eb2ebeff6ce8b9d617926f1ed08da5d1676f99f1966988264e"}, - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3d240933045b9dbbe6e8c1e28ffe89be72c9be927b6e572e55be5e2b2604f7"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5853263505f407b69c0d1cbf3ed1c30f985b9505523989b20aa18a5231d4a08a"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c21f306f1e71146cf7587916d6de5e9c4bf26057aad602a6c7fad4b6e05bf1f"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1bb4f01018b9f4e2d7b07c2bf79e2ef498acb6f99321b72b5c44b1333481f569"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d0e6603c3b00604574d84fabbcf9dee81efa7c89d38ed4dcbf4e6c654e1ebb99"}, - {file = "fonttools-4.45.0-cp310-cp310-win32.whl", hash = "sha256:c3e676e50a0713c9a1e46185b806967d3c012643d1936ca814eb9ab62027c090"}, - {file = "fonttools-4.45.0-cp310-cp310-win_amd64.whl", hash = "sha256:e819f14d315024750b1ad2842da605051444b944cd983ea987359ace5213bcb9"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a6d68b97b967a3361e0ddf14425e4fe030c9f19462b445ce0b190c4a6834eb46"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619227c7b9088add4d4e5959bf0fa3c29a71c191baa8b989bf532645876b2168"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cafe001811ad1ac2a5d357fc99c490357d758569f69511d14da0311c02814e15"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:756c6f4324fd4bb4d7517462d7237ff65e45da7a002f9e6e08a48c25a11bf073"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ecc97628be1bf7fa93463e1e791915da66de51df8e655a5a6c846fd9b8ceaa98"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:636177ffc4479bc824a356c00a3c9a74a2ce591fa6057109321e0a0ffd126e40"}, - {file = "fonttools-4.45.0-cp311-cp311-win32.whl", hash = "sha256:cac462dbd9058778c89bc608ac29ba93ab3fbc37f305d260aa2d771cfb0fa694"}, - {file = "fonttools-4.45.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bd3f33a5d5630cc20cf3f8631074cac6eafdb2aa3ac8745966c3b4bf93656b4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5b3da7791a58c97763d1704c2b76a9d654b8f2ef233e64248960bd2c6e669fe4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fbc3d8acb578ba0932fcabc01a962f23b0dd254ab103dd0606128fff0175095"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f69e07ebfd89d96485349dc10bd81a027fc0e927f988fa31bd9cd06359e06ed"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b122fe802839bfc8f9603233e5fcbdc98b5e27876f7945b426adfea983918a7b"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8f8736e885700ae22970519b8f5c7f4c2f29c6e9459d05c649c4e99012c20b23"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:70f047ba37c6aac3d331b71bb784373e251bd86678da72526edc8585e79418e1"}, - {file = "fonttools-4.45.0-cp312-cp312-win32.whl", hash = "sha256:fdb43f68bce545f494fed1bfb60d2c32b53f410758919112923c2d600cb9a24c"}, - {file = "fonttools-4.45.0-cp312-cp312-win_amd64.whl", hash = "sha256:102a7ca8700a078265c002c29d2ae498edeb14b636375ceec2425b561ce08037"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4b154cbf93515e4eb477f5cf99de79b46c17229781f321907940bdbabbd64708"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f546a1b676622638a12c721d89cfb513ad7189548eadac885cdd555e35021557"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c5a0612049e0d06b467c3a0837d9efe37934acab64ba922f00e1d07c1555a7"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27166d00e0cd3ea49461b053f55e75676f1109e5483170a14d70c397d082a4c"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:980ba4e673439db22a00501fac087957ce0731351b042816f6c02df81cadc612"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83b70b99f3f55b046cb51ca20fc15702567710233b2cd757a79e1916c25a25f8"}, - {file = "fonttools-4.45.0-cp38-cp38-win32.whl", hash = "sha256:fe8ad943f62bf16273154ebcdf855c44a3b46eac36abea338c209209439b4eb6"}, - {file = "fonttools-4.45.0-cp38-cp38-win_amd64.whl", hash = "sha256:6fb1fdcee2b36e012283805ef0380e4508dbb504950b1c94d0343f8dbbad7d7e"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5bbcb75ffcea64543ab8203e132e2019b226f59a4a6958637e78c21f9ca560ff"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ade07953b35ebf66c445a5e02f28ecd038ea588dc7673c555afe319b6e3c5168"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54ac8be3f693062fc08550213edd40db8f4fe1dd095a1246ed18e887fc254d76"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc991712aaea9d545b13ec480aaf2ebd12ccdea180fce864dd9863f5134f5a06"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:420139743e21d832de230757fb7b0c285d8024d602af8064d9506fa055bb62ae"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:58da830a52c05f18a7cc8a279a8bdddf2e45cdc685b360699653fb3405557459"}, - {file = "fonttools-4.45.0-cp39-cp39-win32.whl", hash = "sha256:715e18f67f0587a16476c7f62b8ff9a165ddceb8c2a262fb08df9f71c7790f0e"}, - {file = "fonttools-4.45.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd26fda8c879558216458a801c1dba52f35dca0e96640fd9c75e86b6574cf1c3"}, - {file = "fonttools-4.45.0-py3-none-any.whl", hash = "sha256:835cf5d0e1b37bbed1d64c286611cc4da9ff19df952400f191ba9142b3cb97f6"}, - {file = "fonttools-4.45.0.tar.gz", hash = "sha256:c1c79d7d4093396892575115c214b24f09e68997cb5c0ab2d99bfdaff74c64b6"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -777,13 +811,13 @@ python-dateutil = "*" [[package]] name = "identify" -version = "2.5.32" +version = "2.5.35" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"}, - {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -791,13 +825,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -830,24 +864,6 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] -[[package]] -name = "importlib-resources" -version = "6.1.1" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -872,13 +888,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.26.0" +version = "6.29.4" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.26.0-py3-none-any.whl", hash = "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c"}, - {file = "ipykernel-6.26.0.tar.gz", hash = "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404"}, + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, ] [package.dependencies] @@ -892,7 +908,7 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=20" +pyzmq = ">=24" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -901,45 +917,45 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.17.2" +version = "8.23.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.23.0-py3-none-any.whl", hash = "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1"}, + {file = "ipython-8.23.0.tar.gz", hash = "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} +traitlets = ">=5.13.0" +typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] kernel = ["ipykernel"] +matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] +test = ["pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] [[package]] name = "jedi" @@ -962,13 +978,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -979,13 +995,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.20.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, - {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1000,13 +1016,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.11.1" +version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.11.1-py3-none-any.whl", hash = "sha256:f596778ab612b3fd29f72ea0d990393d0540a5aab18bf0407a46632eab540779"}, - {file = "jsonschema_specifications-2023.11.1.tar.gz", hash = "sha256:c9b234904ffe02f079bf91b14d79987faa685fd4b39c377a0996954c0090b9ca"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] [package.dependencies] @@ -1014,17 +1030,16 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, ] [package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" @@ -1037,13 +1052,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.5.0" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, - {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -1053,17 +1068,17 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyterlab-pygments" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] [[package]] @@ -1196,117 +1211,116 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "matplotlib" -version = "3.8.2" +version = "3.8.4" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, + {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, + {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, + {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, + {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, + {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, + {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" +numpy = ">=1.21" packaging = ">=20.0" pillow = ">=8" pyparsing = ">=2.3.1" @@ -1314,13 +1328,13 @@ python-dateutil = ">=2.7" [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] @@ -1361,13 +1375,13 @@ files = [ [[package]] name = "nbclient" -version = "0.9.0" +version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, - {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, ] [package.dependencies] @@ -1379,24 +1393,23 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.11.0" -description = "Converting Jupyter Notebooks" +version = "7.16.3" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, - {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, ] [package.dependencies] beautifulsoup4 = "*" bleach = "!=5.0.0" defusedxml = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} jinja2 = ">=3.0" jupyter-core = ">=4.7" jupyterlab-pygments = "*" @@ -1416,24 +1429,24 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.4" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, ] [package.dependencies] -fastjsonschema = "*" +fastjsonschema = ">=2.15" jsonschema = ">=2.6" -jupyter-core = "*" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" traitlets = ">=5.1" [package.extras] @@ -1461,13 +1474,13 @@ traitlets = ">=5" [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -1486,63 +1499,62 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.26.2" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, - {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, - {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, - {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, - {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, - {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, - {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, - {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, - {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, - {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, - {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "numpydoc" -version = "1.6.0" +version = "1.7.0" description = "Sphinx extension to support docstrings in Numpy format" optional = false python-versions = ">=3.8" files = [ - {file = "numpydoc-1.6.0-py3-none-any.whl", hash = "sha256:b6ddaa654a52bdf967763c1e773be41f1c3ae3da39ee0de973f2680048acafaa"}, - {file = "numpydoc-1.6.0.tar.gz", hash = "sha256:ae7a5380f0a06373c3afe16ccd15bd79bc6b07f2704cbc6f1e7ecc94b4f5fc0d"}, + {file = "numpydoc-1.7.0-py3-none-any.whl", hash = "sha256:5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9"}, + {file = "numpydoc-1.7.0.tar.gz", hash = "sha256:866e5ae5b6509dcf873fc6381120f5c31acf13b135636c1a81d68c166a95f921"}, ] [package.dependencies] -Jinja2 = ">=2.10" -sphinx = ">=5" +sphinx = ">=6" tabulate = ">=0.8.10" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -1567,13 +1579,13 @@ et-xmlfile = "*" [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -1612,7 +1624,6 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, ] @@ -1659,50 +1670,50 @@ ply = "*" [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -1710,70 +1721,89 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.1.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pint" @@ -1804,30 +1834,65 @@ files = [ [package.extras] test = ["codecov", "coveralls", "nbval", "pyarrow", "pytest", "pytest-cov", "pytest-mpl", "pytest-subtests"] +[[package]] +name = "pip" +version = "24.0" +description = "The PyPA recommended tool for installing Python packages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-24.0-py3-none-any.whl", hash = "sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc"}, + {file = "pip-24.0.tar.gz", hash = "sha256:ea9bd1a847e8c5774a5777bb398c19e80bcd4e2aa16a4b301b718fe6f593aba2"}, +] + +[[package]] +name = "pip-tools" +version = "7.4.1" +description = "pip-tools keeps your pinned dependencies fresh." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pip-tools-7.4.1.tar.gz", hash = "sha256:864826f5073864450e24dbeeb85ce3920cdfb09848a3d69ebf537b521f14bcc9"}, + {file = "pip_tools-7.4.1-py3-none-any.whl", hash = "sha256:4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9"}, +] + +[package.dependencies] +build = ">=1.0.0" +click = ">=8" +pip = ">=22.2" +pyproject_hooks = "*" +setuptools = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +wheel = "*" + +[package.extras] +coverage = ["covdefaults", "pytest-cov"] +testing = ["flit_core (>=2,<4)", "poetry_core (>=1.0.0)", "pytest (>=7.2.0)", "pytest-rerunfailures", "pytest-xdist", "tomli-w"] + [[package]] name = "platformdirs" -version = "3.11.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -1866,13 +1931,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.5.0" +version = "3.7.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, - {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, + {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, ] [package.dependencies] @@ -1884,13 +1949,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.41" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -1898,27 +1963,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.6" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -1962,13 +2027,13 @@ files = [ [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -1984,13 +2049,13 @@ files = [ [[package]] name = "pygments" -version = "2.17.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.1-py3-none-any.whl", hash = "sha256:1b37f1b1e1bff2af52ecaf28cc601e2ef7077000b227a0675da25aef85784bc4"}, - {file = "pygments-2.17.1.tar.gz", hash = "sha256:e45a0e74bf9c530f564ca81b8952343be986a29f6afe7f5ad95c5f06b7bdf5e8"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] @@ -1999,27 +2064,41 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -2053,13 +2132,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -2067,13 +2146,13 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -2160,104 +2239,99 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.1" +version = "26.0.0" description = "Python bindings for 0MQ" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, + {file = "pyzmq-26.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:a86409f3f8eae7af5a47babd831a119bdf552e831f04d2225a313305e8e35e7c"}, + {file = "pyzmq-26.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d36a46975925b8bf14b69fe6d4097bc96c91f94ceb954d56853a2211a5cc3433"}, + {file = "pyzmq-26.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcac700269d081ded42ed3833f9d0effe734148376204af9c0ef0fd25a3fea55"}, + {file = "pyzmq-26.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49efc420e36d2e8adc5dae41c2c1e8bb37a069e40a880cbe414a032136b194b0"}, + {file = "pyzmq-26.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02773b96ef6a17a57680c3609645785c390198be31a4505c01ce0c846f9e7d0e"}, + {file = "pyzmq-26.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ce2c53f4963a358ba91b58ccecb84fab6d5f0622230d105c2589f7556ec53cc9"}, + {file = "pyzmq-26.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:06525d996afdb0da3e8b7df0b654261455f6e86c2c3574c3f00d2bd335be78eb"}, + {file = "pyzmq-26.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bd3537f049dc0488adb3df29a77635eaff2a8d1d3d29a09714db6e2d10caba1a"}, + {file = "pyzmq-26.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9ce158ab54994c60fdde83300dc1e447446baacbe4ec9e4e80096f9b9a125c13"}, + {file = "pyzmq-26.0.0-cp310-cp310-win32.whl", hash = "sha256:271c9178a94b009651f8ad3ff9bb9ca45778aaf66c9e325a44d81a7498fcaa59"}, + {file = "pyzmq-26.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:4216eee101d104a017042f0e4af0a45875400ff3794f1a59476e210b1a9760e2"}, + {file = "pyzmq-26.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:44271793067025a07d38ad4be11f08187cce850fafd1890b42046abbcdca2fc0"}, + {file = "pyzmq-26.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:1e87178437460b6df18e761650ef080d3ad5a41813cc3df7f9fd78714fca04c0"}, + {file = "pyzmq-26.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0397c7431f3fc2bac497992d7447b036bc0d8bb3e15b158b2013201857ff2354"}, + {file = "pyzmq-26.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a5b4dc4d7a3f859026083906724ad1ae743261548b61d0d5abcf2d994122c2b"}, + {file = "pyzmq-26.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:952e85c5e86f9ba100b78b60719b76e1ff3e13bb403cb6de687bb92e7b2179e7"}, + {file = "pyzmq-26.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fdeac8612a9dca6fcad6cb43c7efb75f53ba75da981fbafa949ddcde1d5662"}, + {file = "pyzmq-26.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:39b8ed8d2e5da8b8351c6aa627601b3b52e8eb5e25cf6bcd26b6f012dec7870b"}, + {file = "pyzmq-26.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f6f618d7d7c9c37053a36e6dc5435c53e9e0c7a67e6fd00b69c209d07a8db4dc"}, + {file = "pyzmq-26.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72ae3078b1c47552e0e39fd81fc0472e880316897a733dbb3570819be19da48a"}, + {file = "pyzmq-26.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5d7fcc648445dbfd6ce9973ec7b4a33ee9307b7e88cf4816f4403ccbaf8de9ca"}, + {file = "pyzmq-26.0.0-cp311-cp311-win32.whl", hash = "sha256:9982799d7d7807beb1b26f1aa9a192baccb1a14c5d00eca881a42a0ae562671b"}, + {file = "pyzmq-26.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:60f91afc76a3fc5d65dfba4f6b6020c462674b5eab6cbf00dec133d79656072d"}, + {file = "pyzmq-26.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:120887d773e878136e9b33bbba656df0d4c6e2861694d07d058ec60ce1108b24"}, + {file = "pyzmq-26.0.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:469f4febd63c26b20132e54cc40048d5698123794b103758ccd21b8a45890dc3"}, + {file = "pyzmq-26.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c919895132cae5a458d5a17047fd33c9eb271f15bb3485add34429cfd7b76a71"}, + {file = "pyzmq-26.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e0e94ca9a8f23000d54e11ecd727b69fb1994baf3b6b1eedb881cdd3196ecec"}, + {file = "pyzmq-26.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a824b3301ddd003cdceb9b537804e751ac5922a845b19d4e50b4789d1cd28b24"}, + {file = "pyzmq-26.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af9f5b1b76753584c871c1c96db8a18650886b3adf9fc8c7d4019343eb329c28"}, + {file = "pyzmq-26.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9691a6ab55d011e83d7438f6711b93b7f8aa21ee8cf3e7ad6d6d9ea26a8f3a1f"}, + {file = "pyzmq-26.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58176e2437462568b5099acf17401be64205e175e72767a8250eef84ee9ec4f5"}, + {file = "pyzmq-26.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d492921b398d640a1f796306531bc6911a94ce5528b798ed14e0620abd9b948d"}, + {file = "pyzmq-26.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f85bb2c47b5fd70e3cbb280e380ab97bdf9f02e1a363cb472fe0a297ac24029d"}, + {file = "pyzmq-26.0.0-cp312-cp312-win32.whl", hash = "sha256:c2e36399f0433b14a91f956bd7ecf94799c57a6f992889d45440cb05b3de8025"}, + {file = "pyzmq-26.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:12ca1afb065e5b21a32b1e35bfcbc8762efc0f7555c166acaec36c93b52d7ccf"}, + {file = "pyzmq-26.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:f66c925f62ce28946525c32a094e346dd8da6c828d568d7ecda97f5ae36089c3"}, + {file = "pyzmq-26.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e495ff09514fc657c5fb2cba0aac082ce0494c6217230783297da9008333a8db"}, + {file = "pyzmq-26.0.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5736c9a54c27319a65ffc72dbf684538f2773237e94ba50b7f1f74f4e3cb9115"}, + {file = "pyzmq-26.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd62830100b9b1adb51da4094142bd680d51daf9a0f6f3f39e1f80474eddc011"}, + {file = "pyzmq-26.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a7ee271fac41ddc0ba11f4b128ddd5f2bf0a3186d25be331ed8bfbb253536"}, + {file = "pyzmq-26.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:694625c2c22be57149e9439757ee02ee4fb6432f7054dc5008bbbc33ef388d1c"}, + {file = "pyzmq-26.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:90ba8f7c6f34c2c11179b293050417c14661035969ef3f8867200ea6901f9000"}, + {file = "pyzmq-26.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab2e55046263c8b24e64116e80b63cf701df747b44aadcf317aa47c8af2dfe67"}, + {file = "pyzmq-26.0.0-cp37-cp37m-win32.whl", hash = "sha256:7353d231686bbc96c458b934f134ff9165a1e9dd0a2ea8f724469e44bcc2c07a"}, + {file = "pyzmq-26.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1df2b992eabc59f078ca916e9ac8b5bd463536bf7828c13940b35b8555ed7861"}, + {file = "pyzmq-26.0.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2397364289334840c81ff1ef95a5a5ee326de01c1437cc38f7e16785a7b653d9"}, + {file = "pyzmq-26.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c952cf06edbbd2d67f627037e2c8e3187ca834d6b9a222e3a3037f80d393a345"}, + {file = "pyzmq-26.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55f390adb763196d75a2e8c18277b4344f8a7f94f223b5d096324c5b47c2471e"}, + {file = "pyzmq-26.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1da5e11862a994360319df4f425e89662563683334e1079684eb77b9a6478ae2"}, + {file = "pyzmq-26.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72340614ea23904cff824109eb025648bdf32775d87f5814d3ba6f2335a853f3"}, + {file = "pyzmq-26.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa7431d12ebb5433a92e99dc326d45eaf52a90046032bac4c558b4bdeee5dc7a"}, + {file = "pyzmq-26.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a2b13008a693c0ffccaeeebcc5ab5f2398cced3b5bf482ba89a38fe56b00eb10"}, + {file = "pyzmq-26.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9d68284ce48617c97e675ed8a89db12a098eaa871a026999c9a10351f547f1fe"}, + {file = "pyzmq-26.0.0-cp38-cp38-win32.whl", hash = "sha256:8783857a8c8df648a70c81ea3ff53ee71e5bf18468ca5ac3414f419fe8f3bd93"}, + {file = "pyzmq-26.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:36d0f2fcbdba1fda8ff213bd17db7ddcba848aa70480ade3fe70401dce606511"}, + {file = "pyzmq-26.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:dd87df01bc8eca392f0d505924087ccafdc4885a498e68df9f09eca9fdc736f1"}, + {file = "pyzmq-26.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abc08b2e688714216870a6ab974733d4a1fcf0437d250ac8feed59c4c5c3f395"}, + {file = "pyzmq-26.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dd13a30454adcf2f361155ea563ec99036678131a17c6b1a3f74426212c14ddc"}, + {file = "pyzmq-26.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a0562054930471b386a44b0887504687c4e7adf4ba89bddc2e5959d16c371764"}, + {file = "pyzmq-26.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc7badded4b025dbc25f34b95503b71c952235e6e40de40995c0c120efb4ff6d"}, + {file = "pyzmq-26.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f971e77358384b8bcf3e9a7577cf84f97adbd6359f943e30cbff66087afcb279"}, + {file = "pyzmq-26.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ca4ebbef3f5fbd271eafc7c22ebbb88b74232f08b0e51759113f30a8d01f6843"}, + {file = "pyzmq-26.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc98fbd4ce4ef8a0fbe97ab6d495aaa7764461e5a45f24c04f1d234e7bb80293"}, + {file = "pyzmq-26.0.0-cp39-cp39-win32.whl", hash = "sha256:a5207bc2a923118e9afb57fee679be016ea138c27d1be5747118966e2d5d9450"}, + {file = "pyzmq-26.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:e0c08a6070358a2984900a4518e2dacbfaf24aac018ab086d7ac2f6069b13340"}, + {file = "pyzmq-26.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:eae3dcc185c405cf645480745c45346a1f42afce240f69a589095e41bd2b9e3d"}, + {file = "pyzmq-26.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:71a8f010e23dfd61c531084a2b72a81885017da28352540f0b7799ca8423c044"}, + {file = "pyzmq-26.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b48b7e417c56486932fb0c01fecd24916fe6bc359c03a654aa8c63fa33e3d76"}, + {file = "pyzmq-26.0.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2806942185b40a3477d9b300c6f71354dd2be37e3f61a43193c96caa51e284d1"}, + {file = "pyzmq-26.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed127aff75a3df142ae7a883c49a85b0b2f863b59fa1b8e4280335f5ebab5fd0"}, + {file = "pyzmq-26.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:903b77dd2f17286496fa3ec902bc523f4502b0c64a2892df4b021222a2ba95fe"}, + {file = "pyzmq-26.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:321a6872a9371709a62b3a4a14c1e9b5b47549371197c0c2164d2288510cd6d6"}, + {file = "pyzmq-26.0.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cac954dc83c84e9d9d65f2359d402d7e79ae094d7808d578c9e9cc2c350c5a64"}, + {file = "pyzmq-26.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac6f54c399638858e0b2a3153f23934604f3a8c9bb5a9cf865060cc658b1e096"}, + {file = "pyzmq-26.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40af30c4cd0a046029d7b5272d02a649f9b1f89fb1361bbc90ba08d55ac88273"}, + {file = "pyzmq-26.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:814245422f1c7707634397621dbcbeea7671fdc5c43d1ae592f4e0e45179e7fb"}, + {file = "pyzmq-26.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d3d7ef786e778351e6c51b45906e16506ad98bb78b99304032cb1876dfc81d2"}, + {file = "pyzmq-26.0.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:36a85da0eab4c5337d0de7f975cca011208a59e9d0637e0c1b571764f1dd4a8f"}, + {file = "pyzmq-26.0.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1d64889bfe4109f4a59a72b1d21416550465020642d6f556efd044951386bd38"}, + {file = "pyzmq-26.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fdea3e9e34c480bfccbb910f75380196ae9d1c12880c21743c845ebe6b13aa"}, + {file = "pyzmq-26.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7129efc54dc48f566eed5422bc555ba4e472e40a1f9de328577c90ade47ccf5d"}, + {file = "pyzmq-26.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ec5147095d6065b0e3a38a1a34f7859ab46496f3d5ce71134165893e9f83674"}, + {file = "pyzmq-26.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a1cc0445038a394479ad36b7e3cf55a19ee40099c031f65de872b8ee7025e79"}, + {file = "pyzmq-26.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b377b520e618c30c827966c274dd62ce7e15c72ce8767fae6193b6bdd1deb502"}, + {file = "pyzmq-26.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc907b26d287e6981d1e531c8fc21a0f94fe46a17493a8322eb3c75f8b561334"}, + {file = "pyzmq-26.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:580dd4b1c2edd51f284df0209bf439899f425ed00cb803a85ddc6cf10c866688"}, + {file = "pyzmq-26.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:08db8071020181173c70cf2dad239e5e21e5b2e95f95b0ece0da39a70f5a483c"}, + {file = "pyzmq-26.0.0.tar.gz", hash = "sha256:10ff405db5cee3bbd7aa143d78b25d90356097aed7864e50f0ae644e08759fe9"}, ] [package.dependencies] @@ -2265,13 +2339,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.31.0" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.31.0-py3-none-any.whl", hash = "sha256:381b11e53dd93babb55696c71cf42aef2d36b8a150c49bf0bc301e36d536c882"}, - {file = "referencing-0.31.0.tar.gz", hash = "sha256:cc28f2c88fbe7b961a7817a0abc034c09a1e36358f82fedb4ffdf29a25398863"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -2301,127 +2375,127 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.13.1" +version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.13.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:83feb0f682d75a09ddc11aa37ba5c07dd9b824b22915207f6176ea458474ff75"}, - {file = "rpds_py-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa84bbe22ffa108f91631935c28a623001e335d66e393438258501e618fb0dde"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04f8c76b8d5c70695b4e8f1d0b391d8ef91df00ef488c6c1ffb910176459bc6"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:032c242a595629aacace44128f9795110513ad27217b091e834edec2fb09e800"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91276caef95556faeb4b8f09fe4439670d3d6206fee78d47ddb6e6de837f0b4d"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d22f2cb82e0b40e427a74a93c9a4231335bbc548aed79955dde0b64ea7f88146"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c9e2794329ef070844ff9bfc012004aeddc0468dc26970953709723f76c8a5"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c797ea56f36c6f248656f0223b11307fdf4a1886f3555eba371f34152b07677f"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82dbcd6463e580bcfb7561cece35046aaabeac5a9ddb775020160b14e6c58a5d"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:736817dbbbd030a69a1faf5413a319976c9c8ba8cdcfa98c022d3b6b2e01eca6"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1f36a1e80ef4ed1996445698fd91e0d3e54738bf597c9995118b92da537d7a28"}, - {file = "rpds_py-0.13.1-cp310-none-win32.whl", hash = "sha256:4f13d3f6585bd07657a603780e99beda96a36c86acaba841f131e81393958336"}, - {file = "rpds_py-0.13.1-cp310-none-win_amd64.whl", hash = "sha256:545e94c84575057d3d5c62634611858dac859702b1519b6ffc58eca7fb1adfcf"}, - {file = "rpds_py-0.13.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:6bfe72b249264cc1ff2f3629be240d7d2fdc778d9d298087cdec8524c91cd11f"}, - {file = "rpds_py-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edc91c50e17f5cd945d821f0f1af830522dba0c10267c3aab186dc3dbaab8def"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eca04a365be380ca1f8fa48b334462e19e3382c0bb7386444d8ca43aa01c481"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e3ac5b602fea378243f993d8b707189f9061e55ebb4e56cb9fdef8166060f28"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfb5d2ab183c0efe5e7b8917e4eaa2e837aacafad8a69b89aa6bc81550eed857"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9793d46d3e6522ae58e9321032827c9c0df1e56cbe5d3de965facb311aed6aa"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cd935c0220d012a27c20135c140f9cdcbc6249d5954345c81bfb714071b985c"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37b08df45f02ff1866043b95096cbe91ac99de05936dd09d6611987a82a3306a"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad666a904212aa9a6c77da7dce9d5170008cda76b7776e6731928b3f8a0d40fa"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8a6ad8429340e0a4de89353447c6441329def3632e7b2293a7d6e873217d3c2b"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c40851b659d958c5245c1236e34f0d065cc53dca8d978b49a032c8e0adfda6e"}, - {file = "rpds_py-0.13.1-cp311-none-win32.whl", hash = "sha256:4145172ab59b6c27695db6d78d040795f635cba732cead19c78cede74800949a"}, - {file = "rpds_py-0.13.1-cp311-none-win_amd64.whl", hash = "sha256:46a07a258bda12270de02b34c4884f200f864bba3dcd6e3a37fef36a168b859d"}, - {file = "rpds_py-0.13.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:ba4432301ad7eeb1b00848cf46fae0e5fecfd18a8cb5fdcf856c67985f79ecc7"}, - {file = "rpds_py-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d22e0660de24bd8e9ac82f4230a22a5fe4e397265709289d61d5fb333839ba50"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76a8374b294e4ccb39ccaf11d39a0537ed107534139c00b4393ca3b542cc66e5"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d152ec7bb431040af2500e01436c9aa0d993f243346f0594a15755016bf0be1"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a2044b870df7c9360bb3ce7e12f9ddf8e72e49cd3a353a1528cbf166ad2383"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:960e7e460fda2d0af18c75585bbe0c99f90b8f09963844618a621b804f8c3abe"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37f79f4f1f06cc96151f4a187528c3fd4a7e1065538a4af9eb68c642365957f7"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd4ea56c9542ad0091dfdef3e8572ae7a746e1e91eb56c9e08b8d0808b40f1d1"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0290712eb5603a725769b5d857f7cf15cf6ca93dda3128065bbafe6fdb709beb"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0b70c1f800059c92479dc94dda41288fd6607f741f9b1b8f89a21a86428f6383"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3dd5fb7737224e1497c886fb3ca681c15d9c00c76171f53b3c3cc8d16ccfa7fb"}, - {file = "rpds_py-0.13.1-cp312-none-win32.whl", hash = "sha256:74be3b215a5695690a0f1a9f68b1d1c93f8caad52e23242fcb8ba56aaf060281"}, - {file = "rpds_py-0.13.1-cp312-none-win_amd64.whl", hash = "sha256:f47eef55297799956464efc00c74ae55c48a7b68236856d56183fe1ddf866205"}, - {file = "rpds_py-0.13.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e4a45ba34f904062c63049a760790c6a2fa7a4cc4bd160d8af243b12371aaa05"}, - {file = "rpds_py-0.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20147996376be452cd82cd6c17701daba69a849dc143270fa10fe067bb34562a"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b9535aa22ab023704cfc6533e968f7e420affe802d85e956d8a7b4c0b0b5ea"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4fa1eeb9bea6d9b64ac91ec51ee94cc4fc744955df5be393e1c923c920db2b0"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b2415d5a7b7ee96aa3a54d4775c1fec140476a17ee12353806297e900eaeddc"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:577d40a72550eac1386b77b43836151cb61ff6700adacda2ad4d883ca5a0b6f2"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af2d1648eb625a460eee07d3e1ea3a4a6e84a1fb3a107f6a8e95ac19f7dcce67"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5b769396eb358d6b55dbf78f3f7ca631ca1b2fe02136faad5af74f0111b4b6b7"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:249c8e0055ca597707d71c5ad85fd2a1c8fdb99386a8c6c257e1b47b67a9bec1"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:fe30ef31172bdcf946502a945faad110e8fff88c32c4bec9a593df0280e64d8a"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2647192facf63be9ed2d7a49ceb07efe01dc6cfb083bd2cc53c418437400cb99"}, - {file = "rpds_py-0.13.1-cp38-none-win32.whl", hash = "sha256:4011d5c854aa804c833331d38a2b6f6f2fe58a90c9f615afdb7aa7cf9d31f721"}, - {file = "rpds_py-0.13.1-cp38-none-win_amd64.whl", hash = "sha256:7cfae77da92a20f56cf89739a557b76e5c6edc094f6ad5c090b9e15fbbfcd1a4"}, - {file = "rpds_py-0.13.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:e9be1f7c5f9673616f875299339984da9447a40e3aea927750c843d6e5e2e029"}, - {file = "rpds_py-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:839676475ac2ccd1532d36af3d10d290a2ca149b702ed464131e450a767550df"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90031658805c63fe488f8e9e7a88b260ea121ba3ee9cdabcece9c9ddb50da39"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ba9fbc5d6e36bfeb5292530321cc56c4ef3f98048647fabd8f57543c34174ec"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08832078767545c5ee12561ce980714e1e4c6619b5b1e9a10248de60cddfa1fd"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19f5aa7f5078d35ed8e344bcba40f35bc95f9176dddb33fc4f2084e04289fa63"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80080972e1d000ad0341c7cc58b6855c80bd887675f92871221451d13a975072"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ee352691c4434eb1c01802e9daa5edcc1007ff15023a320e2693fed6a661b"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d20da6b4c7aa9ee75ad0730beaba15d65157f5beeaca54a038bb968f92bf3ce3"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:faa12a9f34671a30ea6bb027f04ec4e1fb8fa3fb3ed030893e729d4d0f3a9791"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7cf241dbb50ea71c2e628ab2a32b5bfcd36e199152fc44e5c1edb0b773f1583e"}, - {file = "rpds_py-0.13.1-cp39-none-win32.whl", hash = "sha256:dab979662da1c9fbb464e310c0b06cb5f1d174d09a462553af78f0bfb3e01920"}, - {file = "rpds_py-0.13.1-cp39-none-win_amd64.whl", hash = "sha256:a2b3c79586636f1fa69a7bd59c87c15fca80c0d34b5c003d57f2f326e5276575"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5967fa631d0ed9f8511dede08bc943a9727c949d05d1efac4ac82b2938024fb7"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8308a8d49d1354278d5c068c888a58d7158a419b2e4d87c7839ed3641498790c"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0580faeb9def6d0beb7aa666294d5604e569c4e24111ada423cf9936768d95c"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2da81c1492291c1a90987d76a47c7b2d310661bf7c93a9de0511e27b796a8b46"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c9a1dc5e898ce30e2f9c0aa57181cddd4532b22b7780549441d6429d22d3b58"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4ae6f423cb7d1c6256b7482025ace2825728f53b7ac58bcd574de6ee9d242c2"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3179e0815827cf963e634095ae5715ee73a5af61defbc8d6ca79f1bdae1d1d"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9f8930092558fd15c9e07198625efb698f7cc00b3dc311c83eeec2540226a8"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1d388d2f5f5a6065cf83c54dd12112b7389095669ff395e632003ae8999c6b8"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:08b335fb0c45f0a9e2478a9ece6a1bfb00b6f4c4780f9be3cf36479c5d8dd374"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d11afdc5992bbd7af60ed5eb519873690d921425299f51d80aa3099ed49f2bcc"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8c1f6c8df23be165eb0cb78f305483d00c6827a191e3a38394c658d5b9c80bbd"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:528e2afaa56d815d2601b857644aeb395afe7e59212ab0659906dc29ae68d9a6"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df2af1180b8eeececf4f819d22cc0668bfadadfd038b19a90bd2fb2ee419ec6f"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88956c993a20201744282362e3fd30962a9d86dc4f1dcf2bdb31fab27821b61f"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee70ee5f4144a45a9e6169000b5b525d82673d5dab9f7587eccc92794814e7ac"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5fd099acaee2325f01281a130a39da08d885e4dedf01b84bf156ec2737d78fe"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9656a09653b18b80764647d585750df2dff8928e03a706763ab40ec8c4872acc"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ba239bb37663b2b4cd08e703e79e13321512dccd8e5f0e9451d9e53a6b8509a"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3f55ae773abd96b1de25fc5c3fb356f491bd19116f8f854ba705beffc1ddc3c5"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f4b15a163448ec79241fb2f1bc5a8ae1a4a304f7a48d948d208a2935b26bf8a5"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1a3b2583c86bbfbf417304eeb13400ce7f8725376dc7d3efbf35dc5d7052ad48"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f1059ca9a51c936c9a8d46fbc2c9a6b4c15ab3f13a97f1ad32f024b39666ba85"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f55601fb58f92e4f4f1d05d80c24cb77505dc42103ddfd63ddfdc51d3da46fa2"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcfd5f91b882eedf8d9601bd21261d6ce0e61a8c66a7152d1f5df08d3f643ab1"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6574f619e8734140d96c59bfa8a6a6e7a3336820ccd1bfd95ffa610673b650a2"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4b9d3f5c48bbe8d9e3758e498b3c34863f2c9b1ac57a4e6310183740e59c980"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdd6f8738e1f1d9df5b1603bb03cb30e442710e5672262b95d0f9fcb4edb0dab"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c2bf286e5d755a075e5e97ba56b3de08cccdad6b323ab0b21cc98875176b03"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d4b390ee70ca9263b331ccfaf9819ee20e90dfd0201a295e23eb64a005dbef"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:db8d0f0ad92f74feb61c4e4a71f1d573ef37c22ef4dc19cab93e501bfdad8cbd"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2abd669a39be69cdfe145927c7eb53a875b157740bf1e2d49e9619fc6f43362e"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c173f529666bab8e3f948b74c6d91afa22ea147e6ebae49a48229d9020a47c4"}, - {file = "rpds_py-0.13.1.tar.gz", hash = "sha256:264f3a5906c62b9df3a00ad35f6da1987d321a053895bd85f9d5c708de5c0fbf"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, ] [[package]] name = "setuptools" -version = "69.0.1" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.1-py3-none-any.whl", hash = "sha256:6875bbd06382d857b1b90cd07cee6a2df701a164f241095706b5192bc56c5c62"}, - {file = "setuptools-69.0.1.tar.gz", hash = "sha256:f25195d54deb649832182d6455bffba7ac3d8fe71d35185e738d2198a4310044"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -2473,7 +2547,6 @@ babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} docutils = ">=0.18.1,<0.21" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" packaging = ">=21.0" Pygments = ">=2.14" @@ -2530,13 +2603,13 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] [[package]] name = "sphinx-exec-code" -version = "0.10" +version = "0.12" description = "Execute code blocks in Sphinx and display the output" optional = false python-versions = "*" files = [ - {file = "sphinx-exec-code-0.10.tar.gz", hash = "sha256:a5b8e207548cd3944b61315c8df5f3fab6732341b53dc056e6efd0358cc0bdb1"}, - {file = "sphinx_exec_code-0.10-py3-none-any.whl", hash = "sha256:2597460a7062bfd8ef1b108a8cec1dc10250d56a19034830b038ac653dee1902"}, + {file = "sphinx-exec-code-0.12.tar.gz", hash = "sha256:6b964eaa3d170d8a44e4db698b25e64c03a65681392f45a8f4a51c09f0ee70c9"}, + {file = "sphinx_exec_code-0.12-py3-none-any.whl", hash = "sha256:a4133e05147a2ef2d256bfb69872c3803aa566eacf88a28ae991f549527d3c72"}, ] [[package]] @@ -2560,56 +2633,50 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, - {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" +version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, - {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, - {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -2642,38 +2709,34 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" +version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, - {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" +version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, - {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -2740,92 +2803,93 @@ files = [ [[package]] name = "tornado" -version = "6.3.3" +version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, + {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.3" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.6" +version = "20.25.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, - {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] @@ -2833,13 +2897,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "wcwidth" -version = "0.2.11" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.11-py2.py3-none-any.whl", hash = "sha256:c4b153acf29f1f0d7fb1b00d097cce82b73de7a2016321c8d7ca71bd76dd848b"}, - {file = "wcwidth-0.2.11.tar.gz", hash = "sha256:25eb3ecbec328cdb945f56f2a7cfe784bdf7a73a8197398c7a7c65e7fe93e9ae"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -2853,22 +2917,36 @@ files = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +[[package]] +name = "wheel" +version = "0.43.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" -python-versions = "^3.9" -content-hash = "cc0cdc76ab8b5f234e70e625215e81e9936fdf1b69afc7403abd9436ace0f73a" +python-versions = "^3.10" +content-hash = "5085caf9cd6ead045ce676f3da63e5c4748183431443114e96452e676b692a80" diff --git a/portfolyo/__init__.py b/portfolyo/__init__.py index a10d888..8fe3f38 100644 --- a/portfolyo/__init__.py +++ b/portfolyo/__init__.py @@ -1,19 +1,26 @@ """Package to analyse and manipulate timeseries related to power and gas offtake portfolios.""" - from . import _version, dev, tools from .core import extendpandas # extend functionalty of pandas from .core import suppresswarnings -from .core.mixins.plot import plot_pfstates from .core.pfline import Kind, PfLine, Structure, create from .core.pfstate import PfState -from .prices.hedge import hedge -from .prices.utils import is_peak_hour +from .tools import testing +from .tools2.changeyear import map_to_year +from .tools2.concat import general as concat +from .tools2.intersect import indexable as intersection +from .tools2.plot import plot_pfstates +from .tools.changefreq import averagable as asfreq_avg +from .tools.changefreq import summable as asfreq_sum from .tools.changeyear import characterize_index, map_frame_to_year from .tools.freq import FREQUENCIES +from .tools.hedge import hedge +from .tools.peakfn import PeakFunction +from .tools.peakfn import factory as create_peakfn +from .tools.product import germanpower_peakfn, is_peak_hour from .tools.standardize import frame as standardize from .tools.tzone import force_agnostic, force_aware -from .tools.unit import Q_, ureg, Unit +from .tools.unit import Q_, Unit, ureg from .tools.wavg import general as wavg VOLUME = Kind.VOLUME diff --git a/portfolyo/core/mixins/__init__.py b/portfolyo/core/mixins/__init__.py deleted file mode 100644 index 70a6808..0000000 --- a/portfolyo/core/mixins/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from . import text -from .excelclipboard import ExcelClipboardOutput -from .plot import PfLinePlot, PfStatePlot -from .text import PfLineText, PfStateText diff --git a/portfolyo/core/mixins/plot.py b/portfolyo/core/mixins/plot.py deleted file mode 100644 index 460cb67..0000000 --- a/portfolyo/core/mixins/plot.py +++ /dev/null @@ -1,361 +0,0 @@ -""" -Module with mixins, to add 'plot-functionality' to PfLine and PfState classes. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Dict - -import matplotlib -import numpy as np -from matplotlib import pyplot as plt - -from ... import tools -from ... import visualize as vis - -if TYPE_CHECKING: # needed to avoid circular imports - from ..pfline import PfLine - from ..pfstate import PfState - - -DEFAULTHOW = {"r": "bar", "q": "bar", "p": "hline", "w": "area", "f": "area"} -DEFAULTFMT = { - "w": "{:,.1f}", - "q": "{:,.0f}", - "p": "{:,.2f}", - "r": "{:,.0f}", - "f": "{:.0%}", -} - - -def defaultkwargs(col: str, is_cat: bool): - """Styling and type of graph, depending on column ``col`` and whether or not the x-axis - is a category axis (``is_cat``).""" - kwargs = {} - kwargs["alpha"] = 0.8 - # Add defaults for each column. - kwargs["color"] = getattr(vis.Colors.Wqpr, col, "grey") - kwargs["labelfmt"] = DEFAULTFMT.get(col, "{:.2f}") - kwargs["how"] = DEFAULTHOW.get(col, "hline") - kwargs["cat"] = is_cat - # Override specific cases. - if not is_cat and col == "p": - kwargs["how"] = "step" - if is_cat and col == "f": - kwargs["how"] = "bar" - return kwargs - - -class PfLinePlot: - def plot_to_ax( - self: PfLine, ax: plt.Axes, col: str, how: str, labelfmt: str, **kwargs - ) -> None: - """Plot a timeseries of the PfLine to a specific axes. - - Parameters - ---------- - ax : plt.Axes - The axes object to which to plot the timeseries. - col : str - The column to plot. One of {'w', 'q', 'p', 'r'}. - how : str - How to plot the data. One of {'jagged', 'bar', 'area', 'step', 'hline'}. - labelfmt : str - Labels are added to each datapoint in the specified format. ('' to add no labels) - Any additional kwargs are passed to the pd.Series.plot function. - """ - if col not in self.kind.available: - raise ValueError( - f"For this PfLine, parameter ``col`` must be one of {', '.join(self.kind.available)}; got {col}." - ) - vis.plot_timeseries(ax, getattr(self, col), how, labelfmt, **kwargs) - - def plot(self: PfLine, cols: str = None) -> plt.Figure: - """Plot one or more timeseries of the PfLine. - - Parameters - ---------- - cols : str, optional - The columns to plot. Default: plot volume (in [MW] for daily values and - shorter, [MWh] for monthly values and longer) and price `p` [Eur/MWh] - (if available). - - Returns - ------- - plt.Figure - The figure object to which the series was plotted. - """ - # Plot on category axis if freq monthly or longer, else on time axis. - is_category = tools.freq.shortest(self.index.freq, "MS") == "MS" - - # If columns are specified, plot these. Else: take defaults, based on what's available - if cols is None: - cols = "" - if "q" in self.kind.available: - cols += "q" if is_category else "w" - if "p" in self.kind.available: - cols += "p" - else: - cols = [col for col in cols if col in self.kind.available] - if not cols: - raise ValueError("No columns to plot.") - - # Create the plots. - size = (10, len(cols) * 3) - fig, axes = plt.subplots( - len(cols), 1, sharex=True, sharey=False, squeeze=False, figsize=size - ) - - for col, ax in zip(cols, axes.flatten()): - kwargs = defaultkwargs(col, is_category) - s = getattr(self, col) - vis.plot_timeseries(ax, s, **kwargs) - - return fig - - -class PfStatePlot: - # def plot_to_ax( - # self: PfState, ax: plt.Axes, line: str = "offtake", col: str = None, **kwargs - # ) -> None: - # """Plot a timeseries of a PfState in the portfolio state to a specific axes. - - # Parameters - # ---------- - # ax : plt.Axes - # The axes object to which to plot the timeseries. - # line : str, optional - # The pfline to plot. One of {'offtake' (default), 'sourced', 'unsourced', - # 'netposition', 'procurement', 'sourcedfraction'}. - # col : str, optional - # The column to plot. Default: plot volume `w` [MW] (if available) or else - # price `p` [Eur/MWh]. - # Any additional kwargs are passed to the pd.Series.plot function. - # """ - # if line == "offtake": - # how = DEFAULTHOW.get(col, "step") - # (-self.offtake).plot_to_ax(ax, col, how) - # ax.bar_label( - # ax.containers[0], label_type="edge", fmt="%,.0f".replace(",", " ") - # ) - - # elif line.endswith("sourcedfraction"): # (un)sourcedfraction - # fractions = getattr(self, line) - # vis.plot_timeseries(ax, fractions, how="bar", color="grey") - # ax.bar_label( - # ax.containers[0], - # label_type="edge", - # labels=fractions.apply("{:.0%}".format), - # ) # print labels on top of each bar - - # elif line == "sourced": - # self.sourced.plot_to_ax( - # ax, - # col, - # ) - # if col == "p": - - # vis.plot_timeseries(ax, self.unsourcedprice["p"], how="bar", alpha=0.0) - # ax.bar_label( - # ax.containers[0], label_type="center", fmt="%.2f" - # ) # print labels on top of each bar - - def plot(self: PfState) -> plt.Figure: - """Plot the portfolio state. - - Parameters - ---------- - None - - Returns - ------- - plt.Figure - The figure object to which the series was plotted. - """ - gridspec = {"width_ratios": [1, 1], "height_ratios": [4, 1]} - fig, axes = plt.subplots( - 2, 2, sharex=True, gridspec_kw=gridspec, figsize=(10, 6) - ) - axes = axes.flatten() - axes[0].sharey(axes[1]) - - # If freq is MS or longer: use categorical axes. Plot volumes in MWh. - # If freq is D or shorter: use time axes. Plot volumes in MW. - is_category = tools.freq.shortest(self.index.freq, "MS") == "MS" - - # Volumes. - if is_category: - so, ss = -1 * self.offtakevolume.q, self.sourced.q - kwargs = defaultkwargs("q", is_category) - else: - so, ss = -1 * self.offtakevolume.w, self.sourced.w - kwargs = defaultkwargs("w", is_category) - vis.plot_timeseries(axes[0], so, **kwargs) - vis.plot_timeseries(axes[1], ss, **kwargs) - - # Procurement Price. - vis.plot_timeseries(axes[2], self.pnl_cost.p, **defaultkwargs("p", is_category)) - - # Sourced fraction. - vis.plot_timeseries( - axes[3], self.sourcedfraction, **defaultkwargs("f", is_category) - ) - - # Empty. - - # Set titles. - axes[0].set_title("Offtake volume") - axes[1].set_title("Sourced volume") - axes[2].set_title("Procurement price") - axes[3].set_title("Sourced fraction") - - # Format tick labels. - formatter = matplotlib.ticker.FuncFormatter( - lambda x, p: "{:,.0f}".format(x).replace(",", " ") - ) - axes[0].yaxis.set_major_formatter(formatter) - axes[1].yaxis.set_major_formatter(formatter) - axes[3].yaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1.0)) - - # Set ticks. - axes[0].xaxis.set_tick_params(labeltop=False, labelbottom=True) - axes[1].xaxis.set_tick_params(labeltop=False, labelbottom=True) - axes[2].xaxis.set_tick_params(labeltop=False, labelbottom=False) - axes[3].xaxis.set_tick_params(labeltop=False, labelbottom=False) - - fig.tight_layout() - return fig - - -def plot_pfstates(dic: Dict[str, PfState], freq: str = "MS") -> plt.Figure: - """Plot multiple PfState instances. - - Parameters - ---------- - dic : Dict[str, PfState] - Dictionary with PfState instances as values, and their names as the keys. - - Returns - ------- - plt.Figure - The figure object to which the instances were plotted. - """ - - gridspec = {"width_ratios": [0.3, 1, 1], "height_ratios": [4, 1] * len(dic)} - figsize = (15, 5 * len(dic)) - fig, axes = plt.subplots(len(dic) * 2, 3, gridspec_kw=gridspec, figsize=figsize) - axesgroups = axes.flatten().reshape((len(dic), 6)) - - # Share x axes. - sharex = axesgroups[:, (1, 2, 4)].flatten() - for ax1, ax2 in zip(sharex[1:], sharex[:-1]): - ax1.sharex(ax2) - # Share y axes. - sharey = axesgroups[:, 2] - for ax1, ax2 in zip(sharey[1:], sharey[:-1]): - ax1.sharey(ax2) - - # TODO: resample all to have same index (frequency and length). - - for i, ((pfname, pfs), axes) in enumerate(zip(dic.items(), axesgroups)): - # If freq is MS or longer: use categorical axes. Plot volumes in MWh. - # If freq is D or shorter: use time axes. Plot volumes in MW. - is_category = tools.freq.shortest(pfs.index.freq, "MS") == "MS" - - # Portfolio name. - axes[0].text( - 0, - 1, - pfname.replace(" ", "\n"), - fontsize=12, - fontweight="bold", - verticalalignment="top", - horizontalalignment="left", - ) - axes[0].axis("off") - - # Volumes. - if is_category: - s, kwargs = -1 * pfs.offtakevolume.q, defaultkwargs("q", is_category) - else: - s, kwargs = -1 * pfs.offtakevolume.w, defaultkwargs("w", is_category) - vis.plot_timeseries(axes[1], s, **kwargs) - - # Sourced fraction. - vis.plot_timeseries( - axes[2], pfs.sourcedfraction, **defaultkwargs("f", is_category) - ) - - # Empty. - axes[3].axis("off") - - # Procurement Price. - vis.plot_timeseries(axes[4], pfs.pnl_cost.p, **defaultkwargs("p", is_category)) - - # Empty. - axes[5].axis("off") - - # Tick formatting. - axes[2].yaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1.0)) - axes[1].yaxis.set_major_formatter( - matplotlib.ticker.FuncFormatter( - lambda x, p: "{:,.0f}".format(x).replace(",", " ") - ) - ) - - for a, ax in enumerate(axes): - if i == 0 and a in [1, 2]: - ax.xaxis.set_tick_params(labelbottom=False, labeltop=True, pad=25) - else: - ax.xaxis.set_tick_params(labelbottom=False, labeltop=False) - - if i == 0: - axes[1].set_title("Offtake Volume &\nprocurement price", y=1.27) - axes[2].set_title("Sourced fraction", y=1.27) - - return - draw_horizontal_lines(fig, axes) # draw horizontal lines between portfolios - - -def draw_horizontal_lines(fig, axes): - """Function to draw horizontal lines between multiple portfolios. - This function does not return anything, but tries to plot a 2D line after every 2 axes, eg. - after (0,2), (0,4),... beacuse each portfolio requires 2x4 axes in the fig (where rows=2, columns=4). - - Parameters - ---------- - fig : plt.subplots() - axes : plt.subplots() - """ - # rearange the axes for no overlap - fig.tight_layout() - - # Get the bounding boxes of the axes including text decorations - r = fig.canvas.get_renderer() - bboxes = np.array( - [ - ax.get_tightbbox(r).transformed(fig.transFigure.inverted()) - for ax in axes.flat - ], - matplotlib.transforms.Bbox, - ).reshape(axes.shape) - - """TO CORRECT: the horizontal line is not exactly in the middle of two graphs. - It is more inclined towards the second or next graph in the queue. - Each pftstate has 4x4 grid and this is plotted in the same graph, but as subgraphs. - """ - - # Get the minimum and maximum extent, get the coordinate half-way between those - ymax = ( - np.array(list(map(lambda b: b.y1, bboxes.flat))).reshape(axes.shape).max(axis=1) - ) - ymin = ( - np.array(list(map(lambda b: b.y0, bboxes.flat))).reshape(axes.shape).min(axis=1) - ) - ys = np.c_[ymax[2:-1:2], ymin[1:-2:2]].mean(axis=1) - ys = [ymax[0], *ys] - - # Draw a horizontal lines at those coordinates - for y in ys: - line = plt.Line2D([0, 1], [y, y], transform=fig.transFigure, color="black") - fig.add_artist(line) diff --git a/portfolyo/core/mixins/text.py b/portfolyo/core/mixins/text.py deleted file mode 100644 index 5945006..0000000 --- a/portfolyo/core/mixins/text.py +++ /dev/null @@ -1,248 +0,0 @@ -"""String representation of PfLine and PfState objects.""" -from __future__ import annotations - -from typing import TYPE_CHECKING, Dict, Iterable - -import colorama -import pandas as pd - -from ... import tools -from .. import pfline - -if TYPE_CHECKING: - from ..pfline import PfLine - from ..pfstate import PfState - -COLORS = ["WHITE", "YELLOW", "CYAN", "GREEN", "RED", "BLUE", "MAGENTA", "BLACK"] -TREECOLORS = [colorama.Style.BRIGHT + getattr(colorama.Fore, f) for f in COLORS] -_UNITS = {"w": "MW", "q": "MWh", "p": "Eur/MWh", "r": "Eur"} -VALUEFORMAT = {"w": "{:,.1f}", "q": "{:,.0f}", "p": "{:,.2f}", "r": "{:,.0f}"} -DATETIMEFORMAT = "%Y-%m-%d %H:%M:%S %z" -COLWIDTHS = {"ts": 25, "w": 12, "q": 11, "p": 11, "r": 13} -MAX_DEPTH = 6 - - -def _remove_color(text: str) -> str: - """Remove all color from text.""" - for color in [colorama.Style.RESET_ALL, *TREECOLORS]: - text = text.replace(color, "") - return text - - -def _df_with_strvalues(df: pd.DataFrame, units: Dict = _UNITS): - """Turn dataframe with single column names ('w', 'p', etc) into text strings.""" - if isinstance(df.columns, pd.MultiIndex): - raise ValueError("Dataframe must have single column index; has MultiIndex.") - str_series = {} - for name, s in df.items(): - sin = s.pint.to(units.get(name)).pint.magnitude - formt = VALUEFORMAT.get(name).format - sout = sin.apply(formt).str.replace(",", " ", regex=False) - str_series[name] = sout.mask(s.isna(), "") - return pd.DataFrame(str_series) - - -def _df_with_strindex(df: pd.DataFrame, num_of_ts: int): - """Turn datetime index of dataframe into text, and reduce number of rows.""" - df.index = df.index.map( - lambda ts: ts.strftime(DATETIMEFORMAT).ljust(COLWIDTHS["ts"]) - ) - if len(df.index) > num_of_ts: - i1, i2 = num_of_ts // 2, (num_of_ts - 1) // 2 - inter = pd.DataFrame([[".."] * len(df.columns)], [".."], df.columns) - df = pd.concat([df.iloc[:i1], inter, df.iloc[-i2:]]) - return df - - -def _what(pfl: PfLine) -> str: - return { - pfline.Kind.VOLUME: "volume", - pfline.Kind.PRICE: "price", - pfline.Kind.REVENUE: "revenue", - pfline.Kind.COMPLETE: "complete", - }[pfl.kind] - - -def _index_info(i: pd.DatetimeIndex) -> Iterable[str]: - """Info about the index.""" - return [ - f". Start: {i[0] } (incl) . Timezone : {i.tz or 'none'} ", - f". End : {tools.right.index(i)[-1]} (excl) . Start-of-day: {i[0].time()} ", - f". Freq : {i.freq} ({len(i)} datapoints)", - ] - - -def _children_info(pfl: PfLine) -> Iterable[str]: - """Info about the children of the portfolio line.""" - childtxt = [f"'{name}' ({_what(child)})" for name, child in pfl.items()] - return [". Children: " + ("none" if not childtxt else ", ".join(childtxt))] - - -def _treedict(depth: int, is_last_child: bool, has_children: bool) -> Dict[str, str]: - """Dictionary with 4 strings ('00', '01', '10', '11') that are used in drawing the tree.""" - colors = {"0": TREECOLORS[depth], "1": TREECOLORS[depth + 1]} - tree = {} - # 00 = first chars on header text line, #10 = first chars on other text lines - if depth == 0: - tree["00"] = colors["0"] + "─" - else: - tree["00"] = colors["0"] + ("└" if is_last_child else "├") - tree["10"] = " " if is_last_child else (colors["0"] + "│") - # 01 = following chars on header line, #11 = following chars on other text lines - tree["01"] = (colors["1"] + "●" + colors["0"]) if has_children else "─" - tree["01"] += "─" * (MAX_DEPTH - depth) + " " - tree["11"] = ((colors["1"] + "│") if has_children else " ") + colors["0"] - tree["11"] += " " * (MAX_DEPTH - depth + 3) - return tree - - -def _dataheader(cols: Iterable[str] = "wqpr", units: Dict = _UNITS) -> Iterable[str]: - out = [" " * 25] * 2 # width of timestamps - for c in cols: - width = COLWIDTHS[c] + 1 - out[0] += f"{c:>{width}}" - out[1] += f"{units[c]:>{width}}" - return out - - -# Main 3 functions that recursively call each other. - - -def _nestedtree( - name: str, - pfl: PfLine, - cols: Iterable[str], - num_of_ts: int, - depth: int = 0, - is_last: bool = True, - is_only: bool = False, -) -> Iterable[str]: - """Treeview of the portfolio line.""" - out = [] - tree = _treedict(depth, is_last, isinstance(pfl, pfline.NestedPfLine)) - # Name. - out.append(tree["00"] + tree["01"] + name) - # Top-level body block. - if is_only and depth > 0: - txtlines = ["(only contributor to parent data; has same values)"] - else: - txtlines = _flatdatablock(pfl, cols, num_of_ts) - for txtline in txtlines: - out.append(tree["10"] + tree["11"] + colorama.Style.RESET_ALL + txtline) - # Add children if any. - for txtline in _childrenlines(pfl, cols, num_of_ts, depth): - out.append(tree["10"] + txtline) - return out - - -def _flatdatablock(pfl: PfLine, cols: Iterable[str], num_of_ts: int) -> Iterable[str]: - """The timestamps and data to be shown in a block, next to the tree.""" - # Obtain dataframe with index = timestamp as string and columns = one or more of 'qwpr'. - df = pfl.df[list(cols)] - # . (roughly) reduce number of timestamps to increase speed of conversion to strings. - if len(df.index) > num_of_ts * 2: - df = pd.concat([df.iloc[:num_of_ts, :], df.iloc[-num_of_ts:, :]], axis=0) - # . turn values into strings. - df = _df_with_strvalues(df) - # . turn index into strings and reduce to wanted number of datapoints - df = _df_with_strindex(df, num_of_ts) - # . column withs - col_space = {k: v for k, v in COLWIDTHS.items() if k in df} - # Turn into list of strings. - df_str = df.to_string(col_space=col_space, index_names=False, header=False) - return df_str.split("\n") - - -def _childrenlines( - pfl: PfLine, cols: Iterable[str], num_of_ts: int, depth: int -) -> Iterable[str]: - """Treeview of only the children.""" - out = [] - if isinstance(pfl, pfline.FlatPfLine): - return out - for c, (name, child) in enumerate(pfl.items()): - is_last, is_only = (c == len(pfl) - 1), (len(pfl) == 1) - out.extend( - _nestedtree(name, child, cols, num_of_ts, depth + 1, is_last, is_only) - ) - return out - - -# Highest-level functions. - - -def pfl_as_string(pfl: PfLine, flatten: bool, num_of_ts: int, color: bool) -> str: - lines = [f"PfLine object with {_what(pfl)} information."] - lines.extend(_index_info(pfl.index)) - if isinstance(pfl, pfline.NestedPfLine): - lines.extend(_children_info(pfl)) - cols = pfl.kind.available - if flatten: - lines.extend(_dataheader(cols)) - lines.extend([""]) - lines.extend(_flatdatablock(pfl, cols, num_of_ts)) - else: - spaces = " " * (MAX_DEPTH + 5) - lines.extend([spaces + txtline for txtline in _dataheader(cols)]) - lines.extend(_nestedtree("(this pfline)", pfl, cols, num_of_ts)) - txt = "\n".join(lines) - return txt if color else _remove_color(txt) - - -def pfs_as_string(pfs: PfState, num_of_ts: int, color: bool) -> str: - lines = ["PfState object."] - lines.extend(_index_info(pfs.index)) - spaces = " " * (MAX_DEPTH + 5) - lines.extend([spaces + txtline for txtline in _dataheader("wqpr")]) - lines.extend(_nestedtree("offtake", pfs.offtakevolume, "wq", num_of_ts)) - lines.extend(_nestedtree("pnl_cost", pfs.pnl_cost, "wqpr", num_of_ts)) - txt = "\n".join(lines) - return txt if color else _remove_color(txt) - - -class PfLineText: - def __repr__(self): - return pfl_as_string(self, True, 20, False) - - def print( - self: PfLine, flatten: bool = False, num_of_ts: int = 5, color: bool = True - ) -> None: - """Treeview of the portfolio line. - - Parameters - ---------- - flatten : bool, optional (default: False) - if True, show only the top-level (aggregated) information. - num_of_ts : int, optional (default: 5) - How many timestamps to show for each PfLine. - color : bool, optional (default: True) - Make tree structure clearer by including colors. May not work on all output - devices. - - Returns - ------- - None - """ - print(pfl_as_string(self, flatten, num_of_ts, color)) - - -class PfStateText: - def __repr__(self): - return pfs_as_string(self, 5, False) - - def print(self: PfState, num_of_ts: int = 5, color: bool = True) -> None: - """Treeview of the portfolio state. - - Parameters - ---------- - num_of_ts : int, optional (default: 5) - How many timestamps to show for each PfLine. - color : bool, optional (default: True) - Make tree structure clearer by including colors. May not work on all output - devices. - - Returns - ------- - None - """ - print(pfs_as_string(self, num_of_ts, color)) diff --git a/portfolyo/core/pfline/arithmatic.py b/portfolyo/core/pfline/arithmatic.py index bf0d41f..7acea4f 100644 --- a/portfolyo/core/pfline/arithmatic.py +++ b/portfolyo/core/pfline/arithmatic.py @@ -2,12 +2,12 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Union +from typing import TYPE_CHECKING, Any import numpy as np import pandas as pd -from ... import testing, tools +from ... import tools from . import classes, create, interop from .enums import Kind, Structure @@ -23,7 +23,7 @@ def assert_objects_indexcompatibility(fn): def wrapper(o1, o2, *args, **kwargs): try: - testing.assert_indices_compatible(o1.index, o2.index) + tools.testing.assert_indices_compatible(o1.index, o2.index) except AssertionError as e: raise NotImplementedError from e return fn(o1, o2, *args, **kwargs) @@ -185,7 +185,7 @@ def __rmul__(self: PfLine, other: Any) -> PfLine: @Prep.standardize_other # other converted to None, a PfLine, or dimless Series @Prep.raiseerror_if_otherNone # other is now a PfLine or dimless Series... @Prep.assert_objects_indexcompatibility # ... with a compatible index - def __truediv__(self: PfLine, other: Any) -> Union[PfLine, pd.Series]: + def __truediv__(self: PfLine, other: Any) -> PfLine | pd.Series: if isinstance(other, pd.Series): return Multiply.pfline_and_series(self, 1 / other) else: @@ -195,7 +195,7 @@ def __truediv__(self: PfLine, other: Any) -> Union[PfLine, pd.Series]: @Prep.raiseerror_if_otherNone # other is now a PfLine or dimless Series @Prep.raiseerror_if_otherdimlessseries # other is now a PfLine... @Prep.assert_objects_indexcompatibility # ... with a compatible index - def __rtruediv__(self: PfLine, other: Any) -> Union[PfLine, pd.Series]: + def __rtruediv__(self: PfLine, other: Any) -> PfLine | pd.Series: return Divide.two_pflines(other, self) # NB order! @Prep.standardize_other # other converted to None, a PfLine, or dimless Series @@ -285,12 +285,10 @@ def nestedpfline_and_series(pfl: NestedPfLine, s: pd.Series) -> NestedPfLine: class Divide: @Prep.ensure_pflines_flat # pfl1 and pfl2 are now both flat - def two_pflines(pfl1: PfLine, pfl2: PfLine) -> Union[pd.Series, PfLine]: + def two_pflines(pfl1: PfLine, pfl2: PfLine) -> pd.Series | PfLine: return Divide.two_flatpflines(pfl1, pfl2) - def two_flatpflines( - pfl1: FlatPfLine, pfl2: FlatPfLine - ) -> Union[pd.Series, FlatPfLine]: + def two_flatpflines(pfl1: FlatPfLine, pfl2: FlatPfLine) -> pd.Series | FlatPfLine: if pfl1.kind is pfl2.kind: if pfl1.kind is Kind.COMPLETE: raise NotImplementedError( diff --git a/portfolyo/core/pfline/children.py b/portfolyo/core/pfline/children.py index 18942ec..c118f34 100644 --- a/portfolyo/core/pfline/children.py +++ b/portfolyo/core/pfline/children.py @@ -1,9 +1,9 @@ from __future__ import annotations import warnings -from typing import TYPE_CHECKING, Any, Mapping, Union +from typing import TYPE_CHECKING, Any, Mapping -from ... import testing, tools +from ... import tools from . import create if TYPE_CHECKING: @@ -11,9 +11,7 @@ class ChildFunctionality(Mapping): - def set_child( - self: NestedPfLine, name: str, child: Union[PfLine, Any] - ) -> NestedPfLine: + def set_child(self: NestedPfLine, name: str, child: PfLine | Any) -> NestedPfLine: """Set/add/update child; returns new pfline instance without changing current instance.""" if name in ["w", "q", "p", "r"]: raise ValueError("Name cannot be one of 'w', 'q', 'p', 'r'.") @@ -28,7 +26,7 @@ def set_child( f"Incompatible kinds; the portfolio line has {self.kind} but the child has {child.kind}." ) try: - testing.assert_indices_compatible(self.index, child.index) + tools.testing.assert_indices_compatible(self.index, child.index) except AssertionError as e: raise ValueError( "Index of new child is not compatible with the existing data." diff --git a/portfolyo/core/pfline/classes.py b/portfolyo/core/pfline/classes.py index 8c6dd0b..7e0b2bc 100644 --- a/portfolyo/core/pfline/classes.py +++ b/portfolyo/core/pfline/classes.py @@ -2,25 +2,19 @@ import abc import dataclasses -from typing import Any, Callable, Dict, Iterable, Mapping, Union # noqa +from typing import Callable, Dict # noqa import numpy as np import pandas as pd from ... import tools -from ..mixins import ExcelClipboardOutput, PfLinePlot, PfLineText -from ..ndframelike import NDFrameLike -from . import ( - create, - dataframeexport, - decorators, - flat_methods, - nested_methods, - prices, - children, -) +from ..shared.excelclipboard import ExcelClipboardOutput +from ..shared.ndframelike import NDFrameLike +from . import children, create, dataframeexport, flat_methods, nested_methods from .arithmatic import PfLineArithmatic from .enums import Kind, Structure +from .plot import PfLinePlot +from .text import PfLineText def constructor(structure: Structure, kind: Kind) -> type: @@ -86,43 +80,60 @@ def __post_init__(self): err = f"Expected columns {self.kind.available}, received {self.df.columns}." assert set(self.df.columns) == set(self.kind.available), err + @property + @abc.abstractmethod + def kind(self) -> Kind: + ... + + @property + @abc.abstractmethod + def structure(self) -> Structure: + ... + @property def index(self) -> pd.DatetimeIndex: """Index of the data, containing the left-bound timestamps of the delivery periods.""" return self.df.index - @abc.abstractproperty - def w(self) -> pd.Series: # override if applicable + @property + @abc.abstractmethod + def w(self) -> pd.Series: """Return (flat) volume timeseries in [MW].""" ... - @abc.abstractproperty - def q(self) -> pd.Series: # override if applicable + @property + @abc.abstractmethod + def q(self) -> pd.Series: """Return (flat) volume timeseries in [MWh].""" ... - @abc.abstractproperty - def p(self) -> pd.Series: # override if applicable + @property + @abc.abstractmethod + def p(self) -> pd.Series: """Return (flat) price timeseries in [Eur/MWh].""" ... - @abc.abstractproperty - def r(self) -> pd.Series: # override if applicable + @property + @abc.abstractmethod + def r(self) -> pd.Series: """Return (flat) revenue timeseries in [Eur].""" ... - @abc.abstractproperty - def volume(self) -> PfLine: # override if applicable + @property + @abc.abstractmethod + def volume(self) -> PfLine: """Return volume-only PfLine.""" ... - @abc.abstractproperty - def price(self) -> PfLine: # override if applicable + @property + @abc.abstractmethod + def price(self) -> PfLine: """Return price-only PfLine.""" ... - @abc.abstractproperty - def revenue(self) -> PfLine: # override if applicable + @property + @abc.abstractmethod + def revenue(self) -> PfLine: """Return revenue-only PfLine""" ... @@ -132,40 +143,16 @@ def flatten(self) -> PfLine: ... @abc.abstractmethod - def map_to_year(self, year: int, holiday_country: str = None) -> PfLine: - """Transfer the data to a hypothetical other year. - - Parameters - ---------- - year : int - Year to transfer the data to. - holiday_country : str, optional (default: None) - Country or region for which to assume the holidays. E.g. 'DE' (Germany), 'NL' - (Netherlands), or 'USA'. See ``holidays.list_supported_countries()`` for - allowed values. - - Returns - ------- - PfLine - - Notes - ----- - Useful for daily (and shorter) data. Copies over the data but takes weekdays (and - holidays) of target year into consideration. See ``portfolyo.map_frame_as_year()`` - for more information. - Inaccurate for monthly data and longer, because we only have one value per month, - and can therefore not take different number of holidays/weekends (i.e., offpeak - hours) into consideration. - """ - ... - - @abc.abstractmethod - def po(self: PfLine, freq: str = "MS") -> pd.DataFrame: - """Decompose the portfolio line into peak and offpeak values. Takes simple averages - of volume [MW] and price [Eur/MWh] - does not hedge! + def po( + self: PfLine, peak_fn: tools.peakfn.PeakFunction, freq: str = "MS" + ) -> pd.DataFrame: + """Decompose the portfolio line into peak and offpeak values. Takes simple (duration- + weighted) averages of volume [MW] and price [Eur/MWh] - does not hedge! Parameters ---------- + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. freq : {'MS' (months, default), 'QS' (quarters), 'AS' (years)} Frequency of resulting dataframe. @@ -185,8 +172,8 @@ def hedge_with( self: PfLine, p: PricePfLine, how: str = "val", + peak_fn: tools.peakfn.PeakFunction = None, freq: str = "MS", - po: bool = None, ) -> PfLine: """Hedge the volume in the portfolio line with a price curve. @@ -196,11 +183,17 @@ def hedge_with( Portfolio line with prices to be used in the hedge. how : str, optional (Default: 'val') Hedge-constraint. 'vol' for volumetric hedge, 'val' for value hedge. + peak_fn : PeakFunction, optional (default: None) + To hedge with peak and offpeak products: function that returns boolean + Series indicating if timestamps in index lie in peak period. + If None, hedge with base products. freq : {'D' (days), 'MS' (months, default), 'QS' (quarters), 'AS' (years)} Frequency of hedging products. E.g. 'QS' to hedge with quarter products. - po : bool, optional - Type of hedging products. Set to True to split hedge into peak and offpeak. - (Default: split if volume timeseries has hourly values or shorter.) + + See also + -------- + portfolyo.create_peakfn + portfolyo.germanpower_peakfn Returns ------- @@ -211,7 +204,7 @@ def hedge_with( Notes ----- - - If the PfLine contains prices, these are ignored. + If the PfLine contains prices, these are ignored. """ ... @@ -267,39 +260,29 @@ class CompletePfLine: r: pd.Series = property(lambda self: self.df["r"]) -class FlatPfLine(PfLine): - """Flat portfolio line, i.e., without children. Only has a single dataframe. - - Notes - ----- - * If the timeseries or values in ``data`` do not have a ``pint`` data type, the - standard units are assumed (MW, MWh, Eur, Eur/MWh). - * If the timeseries or values in ``data`` do have a ``pint`` data type, they are - converted into the standard units. - """ - +class FlatPfLine: structure = Structure.FLAT dataframe = dataframeexport.Flat.dataframe flatten = flat_methods.flatten - po = prices.Flat.po - hedge_with = prices.Flat.hedge_with - # map_to_year => on child classes + po = flat_methods.po + hedge_with = flat_methods.hedge_with loc = flat_methods.loc + slice = flat_methods.slice __getitem__ = flat_methods.__getitem__ # __bool__ => on child classes __eq__ = flat_methods.__eq__ -class NestedPfLine(PfLine, children.ChildFunctionality): +class NestedPfLine(children.ChildFunctionality): structure = Structure.NESTED dataframe = dataframeexport.Nested.dataframe flatten = nested_methods.flatten - po = prices.Nested.po - hedge_with = prices.Nested.hedge_with - map_to_year = nested_methods.map_to_year + po = nested_methods.po + hedge_with = nested_methods.hedge_with loc = nested_methods.loc + slice = nested_methods.slice __bool__ = nested_methods.__bool__ __eq__ = nested_methods.__eq__ @@ -319,13 +302,6 @@ def asfreq(self, freq: str = "MS") -> FlatVolumePfLine: newdf["w"] = newdf["q"] / tools.duration.index(newdf.index) # TODO: check unit return FlatVolumePfLine(newdf) - @decorators.map_to_year_warning - def map_to_year(self, year: int, holiday_country: str = None) -> FlatVolumePfLine: - df = self.df[["w"]] # Averageble data to allow mapping unequal-length periods - newdf = tools.changeyear.map_frame_to_year(df, year, holiday_country) - newdf["q"] = newdf["w"] * tools.duration.index(newdf.index) - return FlatVolumePfLine(newdf) - def __bool__(self) -> bool: return not np.allclose(self.df["w"].pint.magnitude, 0.0) @@ -360,12 +336,6 @@ def asfreq(self, freq: str = "MS") -> FlatPricePfLine: ) return FlatPricePfLine(newdf) - @decorators.map_to_year_warning - def map_to_year(self, year: int, holiday_country: str = None) -> FlatVolumePfLine: - df = self.df[["p"]] # Averageble data to allow mapping unequal-length periods - newdf = tools.changeyear.map_frame_to_year(df, year, holiday_country) - return FlatPricePfLine(newdf) - def __bool__(self) -> bool: return not np.allclose(self.df["p"].pint.magnitude, 0.0) @@ -400,15 +370,6 @@ def asfreq(self, freq: str = "MS") -> FlatRevenuePfLine: ) return FlatRevenuePfLine(newdf) - @decorators.map_to_year_warning - def map_to_year(self, year: int, holiday_country: str = None) -> FlatVolumePfLine: - # Assume that revenue is scales proportionately with duration of period. - # E.g. 290 Eur in leapyear Feb --> 280 Eur in non-leapyear Feb. - df = self.df[["r"]] * tools.duration.index(self.df.index) # Make averageble - newdf = tools.changeyear.map_frame_to_year(df, year, holiday_country) - newdf = newdf / tools.duration.index(newdf.index) # Make summable again - return FlatRevenuePfLine(newdf) - def __bool__(self) -> bool: return not np.allclose(self.df["r"].pint.magnitude, 0.0) @@ -457,14 +418,6 @@ def asfreq(self, freq: str = "MS") -> FlatCompletePfLine: newdf["p"] = newdf["r"] / newdf["q"] return FlatCompletePfLine(newdf) - @decorators.map_to_year_warning - def map_to_year(self, year: int, holiday_country: str = None) -> FlatVolumePfLine: - df = self.df[["w", "p"]] # Averagable - newdf = tools.changeyear.map_frame_to_year(df, year, holiday_country) - newdf["q"] = newdf["w"] * tools.duration.index(newdf.index) - newdf["r"] = newdf["q"] * newdf["p"] - return FlatCompletePfLine(newdf) - def __bool__(self) -> bool: return not ( np.allclose(self.df["w"].pint.magnitude, 0.0) diff --git a/portfolyo/core/pfline/decorators.py b/portfolyo/core/pfline/decorators.py index dfbf707..06e9d37 100644 --- a/portfolyo/core/pfline/decorators.py +++ b/portfolyo/core/pfline/decorators.py @@ -1,15 +1,12 @@ """Module with decorators to catch (and possibly correct) common situations.""" - -import warnings - from ... import tools def assert_longest_allowed_freq(freq): def decorator(fn): def wrapped(self, *args, **kwargs): - if tools.freq.longer_or_shorter(self.index.freq, freq) == 1: + if tools.freq.up_or_down(self.index.freq, freq) == 1: raise ValueError( "The frequency of the index is too long; longest allowed:" f" {freq}; passed: {self.index.freq}." @@ -24,7 +21,7 @@ def wrapped(self, *args, **kwargs): def assert_shortest_allowed_freq(freq): def decorator(fn): def wrapped(self, *args, **kwargs): - if tools.freq.longer_or_shorter(self.index.freq, freq) == -1: + if tools.freq.up_or_down(self.index.freq, freq) == -1: raise ValueError( "The frequency of the index is too short; shortest allowed:" f" {freq}; passed: {self.index.freq}." @@ -34,15 +31,3 @@ def wrapped(self, *args, **kwargs): return wrapped return decorator - - -def map_to_year_warning(map_to_year): - def wrapped(self, *args, **kwargs): - if tools.freq.shortest(self.index.freq, "MS") == "MS": - warnings.warn( - "This PfLine has a monthly frequency or longer; changing the year is inaccurate, as" - " details (number of holidays, weekends, offpeak hours, etc) cannot be taken into account." - ) - return map_to_year(self, *args, **kwargs) - - return wrapped diff --git a/portfolyo/core/pfline/flat_methods.py b/portfolyo/core/pfline/flat_methods.py index 90a27e4..ed8a117 100644 --- a/portfolyo/core/pfline/flat_methods.py +++ b/portfolyo/core/pfline/flat_methods.py @@ -2,21 +2,77 @@ from typing import TYPE_CHECKING, Any -from ... import testing +import pandas as pd + +from ... import tools +from ...tools.peakconvert import tseries2poframe +from . import classes +from .enums import Kind if TYPE_CHECKING: - from .classes import FlatPfLine + from .classes import FlatPfLine, PfLine, PricePfLine def flatten(self: FlatPfLine) -> FlatPfLine: return self +def po( + self: PfLine, peak_fn: tools.peakfn.PeakFunction, freq: str = "MS" +) -> pd.DataFrame: + df_dict = {} + + # Always include duration. + duration = tools.duration.index(self.df.index) + df_dict["duration"] = tseries2poframe(duration, peak_fn, freq, True) + + # Add volume. + if self.kind in [Kind.VOLUME, Kind.COMPLETE]: + df_dict["q"] = tseries2poframe(self.q, peak_fn, freq, True) + df_dict["w"] = df_dict["q"] / df_dict["duration"] + + # Add revenue. + if self.kind in [Kind.REVENUE, Kind.COMPLETE]: + df_dict["r"] = tseries2poframe(self.r, peak_fn, freq, True) + + # Add price. + if self.kind is Kind.PRICE: + df_dict["p"] = tseries2poframe(self.p, peak_fn, freq, False) + elif self.kind is Kind.COMPLETE: + df_dict["p"] = df_dict["r"] / df_dict["q"] + + # Turn into dataframe. + return pd.DataFrame({k: df.stack() for k, df in df_dict.items()}) + + +def hedge_with( + self: PfLine, + prices: PricePfLine, + how: str = "val", + peak_fn: tools.peakfn.PeakFunction = None, + freq: str = "MS", +) -> FlatPfLine: + if self.kind not in [Kind.VOLUME, Kind.COMPLETE]: + raise ValueError( + "Cannot hedge a PfLine that does not contain volume information." + ) + if self.index.freq not in ["15T", "H", "D"]: + raise ValueError( + "Can only hedge a PfLine with daily or (quarter)hourly information." + ) + + wout, pout = tools.hedge.hedge(self.w, prices.p, how, peak_fn, freq) + df = pd.DataFrame({"w": wout, "p": pout}) + df["q"] = df["w"] * tools.duration.index(df.index) + df["r"] = df["p"] * df["q"] + return classes.FlatCompletePfLine(df) + + def __eq__(self: FlatPfLine, other: Any) -> bool: if not isinstance(other, self.__class__): return False try: - testing.assert_frame_equal(self.df, other.df, rtol=1e-7) + tools.testing.assert_frame_equal(self.df, other.df, rtol=1e-7) return True except AssertionError: return False @@ -31,6 +87,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.""" @@ -39,4 +100,35 @@ def __init__(self, pfl: FlatPfLine): def __getitem__(self, arg) -> FlatPfLine: newdf = self.pfl.df.loc[arg] + try: + tools.standardize.assert_frame_standardized(newdf) + except AssertionError as e: + raise ValueError( + "Timeseries not in expected form. See ``portfolyo.standardize()`` for more information." + ) from e + + 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: + mask = pd.Index([True] * len(self.pfl.df)) + if arg.start is not None: + mask &= self.pfl.index >= arg.start + if arg.stop is not None: + mask &= self.pfl.index < arg.stop + + newdf = self.pfl.df.loc[mask] + try: + tools.standardize.assert_frame_standardized(newdf) + except AssertionError as e: + raise ValueError( + "Timeseries not in expected form. See ``portfolyo.standardize()`` for more information." + ) from e return self.pfl.__class__(newdf) # use same (leaf) class diff --git a/portfolyo/core/pfline/interop.py b/portfolyo/core/pfline/interop.py index d0c7534..22bfd41 100644 --- a/portfolyo/core/pfline/interop.py +++ b/portfolyo/core/pfline/interop.py @@ -4,12 +4,12 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Dict, Iterable, Mapping, Union +from typing import TYPE_CHECKING, Any, Dict, Iterable, Mapping import numpy as np import pandas as pd -from ... import testing, tools +from ... import tools from . import classes, create if TYPE_CHECKING: # needed to avoid circular imports @@ -44,12 +44,12 @@ class InOp: inop = inop.to_df() """ - w: Union[tools.unit.Q_, pd.Series] = None - q: Union[tools.unit.Q_, pd.Series] = None - p: Union[tools.unit.Q_, pd.Series] = None - r: Union[tools.unit.Q_, pd.Series] = None - nodim: Union[tools.unit.Q_, pd.Series] = None # explicitly dimensionless - agn: Union[float, pd.Series] = None # agnostic + w: tools.unit.Q_ | pd.Series = None + q: tools.unit.Q_ | pd.Series = None + p: tools.unit.Q_ | pd.Series = None + r: tools.unit.Q_ | pd.Series = None + nodim: tools.unit.Q_ | pd.Series = None # explicitly dimensionless + agn: float | pd.Series = None # agnostic def __post_init__(self): # Add correct units and check type. @@ -116,7 +116,9 @@ def make_consistent(self) -> InOp: # Volumes. if w is not None and q is not None: try: - testing.assert_series_equal(w, q / q.index.duration, check_names=False) + tools.testing.assert_series_equal( + w, q / q.index.duration, check_names=False + ) except AssertionError as e: raise ValueError("Values for w and q are not consistent.") from e elif w is not None and q is None: @@ -157,7 +159,7 @@ def make_consistent(self) -> InOp: ign2 = np.isclose(p.pint.m, 0) & (q.isna() | np.isinf(q.pint.m)) ignore = ign1 | ign2 try: - testing.assert_series_equal( + tools.testing.assert_series_equal( r[~ignore], p[~ignore] * q[~ignore], check_names=False ) except AssertionError as e: @@ -217,8 +219,8 @@ def __eq__(self, other) -> bool: def _set_unit( - v: Union[float, int, tools.unit.Q_, pd.Series], attr: str -) -> Union[float, tools.unit.Q, pd.Series]: + v: float | int | tools.unit.Q_ | pd.Series, attr: str +) -> float | tools.unit.Q | pd.Series: """Set unit (if none set yet) or convert to unit.""" if v is None: return None @@ -303,7 +305,7 @@ def _unit2attr(unit) -> str: def _from_data( - data: Union[float, tools.unit.Q_, pd.Series, Dict, pd.DataFrame, Iterable, Mapping] + data: float | tools.unit.Q_ | pd.Series | Dict | pd.DataFrame | Iterable | Mapping, ) -> InOp: """Turn ``data`` into a InterOp object.""" @@ -399,7 +401,7 @@ def _equal(inop1: InOp, inop2: InOp) -> InOp: return False if isinstance(val1, pd.Series): try: - testing.assert_series_equal(val1, val2, check_names=False) + tools.testing.assert_series_equal(val1, val2, check_names=False) except AssertionError: return False elif val1 != val2: @@ -409,7 +411,7 @@ def _equal(inop1: InOp, inop2: InOp) -> InOp: def pfline_or_nodimseries( data: Any, ref_index: pd.DatetimeIndex, agn_default: str = None -) -> Union[None, pd.Series, FlatPfLine]: +) -> None | pd.Series | FlatPfLine: """Turn ``data`` into PfLine if dimension-aware. If not, turn into Series.""" # Already a PfLine. diff --git a/portfolyo/core/pfline/nested_methods.py b/portfolyo/core/pfline/nested_methods.py index dbe1c4b..7a04946 100644 --- a/portfolyo/core/pfline/nested_methods.py +++ b/portfolyo/core/pfline/nested_methods.py @@ -2,23 +2,35 @@ from typing import TYPE_CHECKING, Any -if TYPE_CHECKING: - from .classes import NestedPfLine, FlatPfLine +import pandas as pd +from ... import tools from . import classes from .enums import Structure +if TYPE_CHECKING: + from .classes import FlatPfLine, NestedPfLine, PricePfLine + def flatten(self: NestedPfLine) -> FlatPfLine: constructor = classes.constructor(Structure.FLAT, self.kind) return constructor(self.df) # use flattened toplevel dataframe for initialisation -def map_to_year(self: NestedPfLine, year: int, holiday_country: str) -> NestedPfLine: - newchildren = { - name: child.map_to_year(year, holiday_country) for name, child in self.items() - } - return self.__class__(newchildren) +def po( + self: NestedPfLine, peak_fn: tools.peakfn.PeakFunction, freq: str = "MS" +) -> pd.DataFrame: + return self.flatten().po(peak_fn, freq) + + +def hedge_with( + self: NestedPfLine, + p: PricePfLine, + how: str = "val", + peak_fn: tools.peakfn.PeakFunction = None, + freq: str = "MS", +) -> FlatPfLine: + return self.flatten().hedge_with(p, how, peak_fn, freq) def __bool__(self: NestedPfLine) -> bool: @@ -37,6 +49,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 +63,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/pfline/plot.py b/portfolyo/core/pfline/plot.py new file mode 100644 index 0000000..a59ff1c --- /dev/null +++ b/portfolyo/core/pfline/plot.py @@ -0,0 +1,174 @@ +""" +Module with mixins, to add 'plot-functionality' to PfLine and PfState classes. +""" + +from __future__ import annotations + +import hashlib +from typing import TYPE_CHECKING, Dict, Tuple + +import pandas as pd +from matplotlib import pyplot as plt + +from ... import tools +from . import classes +from .enums import Kind + +if TYPE_CHECKING: + from .classes import PfLine + + +DEFAULTFMT = { + "w": "{:,.1f}", + "q": "{:,.0f}", + "p": "{:,.2f}", + "r": "{:,.0f}", + "f": "{:.0%}", +} + + +def defaultkwargs(name: str, col: str): + # Get plot default kwargs. + if name is None: # no children + kwargs = { + "color": getattr(tools.visualize.Colors.Wqpr, col, "grey"), + "alpha": 0.7, + "labelfmt": DEFAULTFMT.get(col, "{:.2f}"), + } + elif name == "": # parent with children + kwargs = { + "color": "grey", + "alpha": 0.7, + "labelfmt": DEFAULTFMT.get(col, "{:.2f}"), + } + else: # child with name + hashed_value = hashlib.sha256(name.encode()).hexdigest() + hashed_int = int(hashed_value, 16) + index = hashed_int % len(tools.visualize.Colors.General) + kwargs = { + "color": list(tools.visualize.Colors.General)[index].value, + "alpha": 0.9, + "labelfmt": "", # no labels on children + "label": name, + "linewidth": 0.9, + } + + return kwargs + + +def plotfn_and_kwargs( + col: str, freq: str, name: str +) -> Tuple[tools.visualize.PlotTimeseriesToAxFunction, Dict]: + """Get correct function to plot as well as default kwargs. ``col``: one of 'qwprf', + ``freq``: frequency; ``name``: name of the child. If name is emptystring, it is the + parent of a plot which also has children. If it is None, there are no children.""" + # Get plot function. + if tools.freq.shortest(freq, "MS") == "MS": # categorical + if name == "" or name is None: # parent + fn = tools.visualize.plot_timeseries_as_bar + else: # child + fn = tools.visualize.plot_timeseries_as_hline + else: # timeaxis + if col in ["w", "q"]: + if name == "" or name is None: # parent + fn = tools.visualize.plot_timeseries_as_area + else: # child + fn = tools.visualize.plot_timeseries_as_step + else: # col in ['p', 'r'] + if name == "" or name is None: # parent + fn = tools.visualize.plot_timeseries_as_step + else: # child + fn = tools.visualize.plot_timeseries_as_step + + kwargs = defaultkwargs(name, col) + + return fn, kwargs + + +class PfLinePlot: + def plot_to_ax( + self: PfLine, + ax: plt.Axes, + children: bool = False, + kind: Kind = None, + **kwargs, + ) -> None: + """Plot a specific dimension (i.e., kind) of the PfLine to a specific axis. + + Parameters + ---------- + ax : plt.Axes + The axes object to which to plot the timeseries. + children : bool, optional (default: False) + If True, plot also the direct children of the PfLine. + kind : Kind, optional (default: None) + What dimension of the data to plot. Ignored unless PfLine.kind is COMPLETE. + **kwargs + Any additional kwargs are passed to the pd.Series.plot function when drawing + the parent. + + Returns + ------- + None + """ + # Ensure ``kind`` is volume, price, or revenue. + if self.kind is not Kind.COMPLETE: + kind = self.kind + elif kind not in [Kind.VOLUME, Kind.PRICE, Kind.REVENUE]: + raise ValueError( + "To plot a complete portfolio line, the dimension to be plotted must be specified. " + f"Parameter ``kind`` must be one of {{Kind.VOLUME, Kind.PRICE, Kind.REVENUE}}; got {kind}." + ) + + # Create function to select correct series of the pfline. + def col_and_series(pfl: classes.PfLine) -> Tuple[str, pd.Series]: + if kind is Kind.PRICE: + return "p", pfl.p + elif kind is Kind.REVENUE: + return "r", pfl.r + elif tools.freq.longest(pfl.index.freq, "D") == "D": # timeaxis + return "w", pfl.w # kind is Kind.VOLUME + else: + return "q", pfl.q # kind is Kind.VOLUME + + # Plot top-level data first. + col, s = col_and_series(self) + # s = s.pint.m + fn, d_kwargs = plotfn_and_kwargs(col, self.index.freq, "" if children else None) + fn(ax, s, **(d_kwargs | kwargs)) + + # Plot children if wanted and available. + if not children or not isinstance(self, classes.NestedPfLine): + return + for name, child in self.items(): + col, s = col_and_series(child) + # s = s.pint.m + fn, d_kwargs = plotfn_and_kwargs(col, self.index.freq, name) + fn(ax, s, **d_kwargs) + ax.legend() + + def plot(self, children: bool = False) -> plt.Figure: + """Plot the PfLine. + + Parameters + ---------- + children : bool, optional (default: False) + If True, plot also the direct children of the PfLine. + + Returns + ------- + plt.Figure + The figure object to which the series was plotted. + """ + + if self.kind is not Kind.COMPLETE: + # one axes + fig, ax = plt.subplots(1, 1, squeeze=True, figsize=(10, 3)) + self.plot_to_ax(ax, children) + + else: + fig, axes = plt.subplots(3, 1, sharex=True, squeeze=True, figsize=(10, 9)) + for ax, kind in zip(axes, [Kind.VOLUME, Kind.PRICE, Kind.REVENUE]): + self.plot_to_ax(ax, children, kind) + + return fig diff --git a/portfolyo/core/pfline/prices.py b/portfolyo/core/pfline/prices.py deleted file mode 100644 index df00b61..0000000 --- a/portfolyo/core/pfline/prices.py +++ /dev/null @@ -1,97 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pandas as pd - -from ... import tools -from ...prices import convert, hedge -from ...prices.utils import duration_bpo -from . import classes -from .enums import Kind, Structure - -if TYPE_CHECKING: - from .classes import FlatPfLine, NestedPfLine, PfLine, PricePfLine - - -class Flat: - def po(self: FlatPfLine, freq: str = "MS") -> pd.DataFrame: - if self.index.freq not in ["15T", "H"]: - raise ValueError( - "Only PfLines with (quarter)hourly values can be turned into peak and offpeak values." - ) - if freq not in ["MS", "QS", "AS"]: - raise ValueError( - f"Value of paramater ``freq`` must be one of {'MS', 'QS', 'AS'} (got: {freq})." - ) - - prods = ("peak", "offpeak") - - # Get values. - dfs = [] - for col in ("w", "p"): - if col in self.kind.available: - vals = convert.tseries2bpoframe(self.df[col], freq) - vals.columns = pd.MultiIndex.from_product([vals.columns, [col]]) - dfs.append(vals) - df = pd.concat(dfs, axis=1) - - # Add duration. - durs = duration_bpo(df.index) - durs.columns = pd.MultiIndex.from_product([durs.columns, ["duration"]]) - df = pd.concat([df, durs], axis=1) - - # Add additional values and sort. - for prod in prods: - if "q" in self.kind.available: - df[(prod, "q")] = df[(prod, "w")] * df[(prod, "duration")] - if "r" in self.kind.available: - df[(prod, "r")] = ( - df[(prod, "q")] * df[(prod, "p")] - ).pint.to_base_units() - colidx = pd.MultiIndex.from_product([prods, ("duration", *self.kind.available)]) - return df[colidx] - - def hedge_with( - self: FlatPfLine, - p: PricePfLine, - how: str = "val", - freq: str = "MS", - po: bool = None, - ) -> FlatPfLine: - if self.kind is Kind.PRICE: - raise ValueError( - "Cannot hedge a PfLine that does not contain volume information." - ) - if self.index.freq not in ["15T", "H", "D"]: - raise ValueError( - "Can only hedge a PfLine with daily or (quarter)hourly information." - ) - if po is None: - po = self.index.freq in ["15T", "H"] # default: peak/offpeak if possible - if po and self.index.freq not in ["15T", "H"]: - raise ValueError( - "Can only hedge with peak and offpeak products if PfLine has (quarter)hourly information." - ) - - wout, pout = hedge.hedge(self.w, p.p, how, freq, po) - df = pd.DataFrame({"w": wout, "p": pout}) - df["q"] = df["w"] * tools.duration.index(df.index) - df["r"] = df["p"] * df["q"] - constructor = classes.constructor(Structure.FLAT, Kind.COMPLETE) - return constructor(df) - # TODO: move to tools or elsewhere, and reference from there. - - -class Nested: - def po(self: NestedPfLine, freq: str = "MS") -> pd.DataFrame: - return self.flatten().po(freq) - - def hedge_with( - self: NestedPfLine, - p: PfLine, - how: str = "val", - freq: str = "MS", - po: bool = None, - ) -> FlatPfLine: - return self.flatten().hedge_with(p, how, freq, po) diff --git a/portfolyo/core/pfline/text.py b/portfolyo/core/pfline/text.py new file mode 100644 index 0000000..a8c196a --- /dev/null +++ b/portfolyo/core/pfline/text.py @@ -0,0 +1,135 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Iterable + +import colorama +import pandas as pd + +from ..shared import text as shared_text +from . import classes +from .enums import Kind + +if TYPE_CHECKING: + from .classes import PfLine + + +def _what(pfl: PfLine) -> str: + return { + Kind.VOLUME: "volume", + Kind.PRICE: "price", + Kind.REVENUE: "revenue", + Kind.COMPLETE: "complete", + }[pfl.kind] + + +def _children_info(pfl: PfLine) -> Iterable[str]: + """Info about the children of the portfolio line.""" + childtxt = [f"'{name}' ({_what(child)})" for name, child in pfl.items()] + return [". Children: " + ("none" if not childtxt else ", ".join(childtxt))] + + +def _flatdatablock(pfl: PfLine, cols: Iterable[str], num_of_ts: int) -> Iterable[str]: + """The timestamps and data to be shown in a block, next to the tree.""" + # Obtain dataframe with index = timestamp as string and columns = one or more of 'qwpr'. + df = pfl.df[list(cols)] + # . (roughly) reduce number of timestamps to increase speed of conversion to strings. + if len(df.index) > num_of_ts * 2: + df = pd.concat([df.iloc[:num_of_ts, :], df.iloc[-num_of_ts:, :]], axis=0) + # . turn values into strings. + df = shared_text.df_with_strvalues(df) + # . turn index into strings and reduce to wanted number of datapoints + df = shared_text.df_with_strindex(df, num_of_ts) + # . column withs + col_space = {k: v for k, v in shared_text.COLWIDTHS.items() if k in df} + # Turn into list of strings. + df_str = df.to_string(col_space=col_space, index_names=False, header=False) + return df_str.split("\n") + + +def _childrenlines( + pfl: PfLine, cols: Iterable[str], num_of_ts: int, depth: int +) -> Iterable[str]: + """Treeview of only the children.""" + out = [] + if isinstance(pfl, classes.FlatPfLine): + return out + for c, (name, child) in enumerate(pfl.items()): + is_last, is_only = (c == len(pfl) - 1), (len(pfl) == 1) + out.extend( + nestedtree(name, child, cols, num_of_ts, depth + 1, is_last, is_only) + ) + return out + + +# Highest-level functions. + + +def nestedtree( + name: str, + pfl: PfLine, + cols: Iterable[str], + num_of_ts: int, + depth: int = 0, + is_last: bool = True, + is_only: bool = False, +) -> Iterable[str]: + """Treeview of the portfolio line.""" + out = [] + tree = shared_text.treedict(depth, is_last, isinstance(pfl, classes.NestedPfLine)) + # Name. + out.append(tree["00"] + tree["01"] + name) + # Top-level body block. + if is_only and depth > 0: + txtlines = ["(only contributor to parent data; has same values)"] + else: + txtlines = _flatdatablock(pfl, cols, num_of_ts) + for txtline in txtlines: + out.append(tree["10"] + tree["11"] + colorama.Style.RESET_ALL + txtline) + # Add children if any. + for txtline in _childrenlines(pfl, cols, num_of_ts, depth): + out.append(tree["10"] + txtline) + return out + + +def pfl_as_string(pfl: PfLine, flatten: bool, num_of_ts: int, color: bool) -> str: + lines = [f"PfLine object with {_what(pfl)} information."] + lines.extend(shared_text.index_info(pfl.index)) + if isinstance(pfl, classes.NestedPfLine): + lines.extend(_children_info(pfl)) + cols = pfl.kind.available + if flatten: + lines.extend(shared_text.dataheader(cols)) + lines.extend([""]) + lines.extend(_flatdatablock(pfl, cols, num_of_ts)) + else: + spaces = " " * (shared_text.MAX_DEPTH + 5) + lines.extend([spaces + txtline for txtline in shared_text.dataheader(cols)]) + lines.extend(nestedtree("(this pfline)", pfl, cols, num_of_ts)) + txt = "\n".join(lines) + return txt if color else shared_text.remove_color(txt) + + +class PfLineText: + def __repr__(self): + return pfl_as_string(self, True, 20, False) + + def print( + self: PfLine, flatten: bool = False, num_of_ts: int = 5, color: bool = True + ) -> None: + """Treeview of the portfolio line. + + Parameters + ---------- + flatten : bool, optional (default: False) + if True, show only the top-level (aggregated) information. + num_of_ts : int, optional (default: 5) + How many timestamps to show for each PfLine. + color : bool, optional (default: True) + Make tree structure clearer by including colors. May not work on all output + devices. + + Returns + ------- + None + """ + print(pfl_as_string(self, flatten, num_of_ts, color)) diff --git a/portfolyo/core/pfstate/arithmatic.py b/portfolyo/core/pfstate/arithmatic.py index b31f925..dec9526 100644 --- a/portfolyo/core/pfstate/arithmatic.py +++ b/portfolyo/core/pfstate/arithmatic.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Union +from typing import TYPE_CHECKING, Any import pandas as pd @@ -13,8 +13,6 @@ if TYPE_CHECKING: # needed to avoid circular imports from . import PfState -from ... import testing - class Prep: def assert_objects_indexcompatibility(fn): @@ -22,7 +20,7 @@ def assert_objects_indexcompatibility(fn): def wrapper(o1, o2, *args, **kwargs): try: - testing.assert_indices_compatible(o1.index, o2.index) + tools.testing.assert_indices_compatible(o1.index, o2.index) except AssertionError as e: raise NotImplementedError from e return fn(o1, o2, *args, **kwargs) @@ -38,9 +36,7 @@ def wrapper(pfs: PfState, other: Any): return wrapper - def _prep_data( - value, refindex: pd.DatetimeIndex - ) -> Union[pd.Series, PfLine, PfState]: + def _prep_data(value, refindex: pd.DatetimeIndex) -> pd.Series | PfLine | PfState: """Turn ``value`` into PfLine or PfState if possible. If not, turn into (normal or unit-aware) Series.""" # None. diff --git a/portfolyo/core/pfstate/pfstate.py b/portfolyo/core/pfstate/pfstate.py index b90b79c..0a0407a 100644 --- a/portfolyo/core/pfstate/pfstate.py +++ b/portfolyo/core/pfstate/pfstate.py @@ -12,11 +12,13 @@ import pandas as pd from ... import tools -from ..mixins import ExcelClipboardOutput, PfStatePlot, PfStateText -from ..ndframelike import NDFrameLike from ..pfline import PfLine, create +from ..shared.excelclipboard import ExcelClipboardOutput +from ..shared.ndframelike import NDFrameLike from . import pfstate_helper from .arithmatic import PfStateArithmatic +from .plot import PfStatePlot +from .text import PfStateText @dataclasses.dataclass(frozen=True, repr=False) @@ -222,26 +224,56 @@ def asfreq(self, freq: str = "MS") -> PfState: # from ABC return PfState(offtakevolume, unsourcedprice, sourced) def hedge_of_unsourced( - self: PfState, how: str = "val", freq: str = "MS", po: bool = None + self: PfState, + how: str = "val", + peak_fn: tools.peakfn.PeakFunction = None, + freq: str = "MS", ) -> PfLine: """Hedge the unsourced volume, at unsourced prices in the portfolio. + Parameters + ---------- + how : str, optional (Default: 'val') + Hedge-constraint. 'vol' for volumetric hedge, 'val' for value hedge. + peak_fn : PeakFunction, optional (default: None) + To hedge with peak and offpeak products: function that returns boolean + Series indicating if timestamps in index lie in peak period. + If None, hedge with base products. + freq : {'D' (days), 'MS' (months, default), 'QS' (quarters), 'AS' (years)} + Frequency of hedging products. E.g. 'QS' to hedge with quarter products. + See also -------- - PfLine.hedge + PfLine.hedge_with + portfolyo.create_peakfn + portfolyo.germanpower_peakfn Returns ------- PfLine Hedge (volumes and prices) of unsourced volume. """ - return self.unsourced.volume.hedge_with(self.unsourcedprice, how, freq, po) + return self.unsourced.volume.hedge_with(self.unsourcedprice, how, peak_fn, freq) def source_unsourced( - self: PfState, how: str = "val", freq: str = "MS", po: bool = None + self: PfState, + how: str = "val", + peak_fn: tools.peakfn.PeakFunction = None, + freq: str = "MS", ) -> PfState: """Simulate PfState if unsourced volume is hedged and sourced at market prices. + Parameters + ---------- + how : str, optional (Default: 'val') + Hedge-constraint. 'vol' for volumetric hedge, 'val' for value hedge. + peak_fn : PeakFunction, optional (default: None) + To hedge with peak and offpeak products: function that returns boolean + Series indicating if timestamps in index lie in peak period. + If None, hedge with base products. + freq : {'D' (days), 'MS' (months, default), 'QS' (quarters), 'AS' (years)} + Frequency of hedging products. E.g. 'QS' to hedge with quarter products. + See also -------- .hedge_of_unsourced() @@ -249,9 +281,9 @@ def source_unsourced( Returns ------- PfState - which is fully hedged at time scales of `freq` or longer. + which is fully hedged at time scales of ``freq`` or longer. """ - tosource = self.hedge_of_unsourced(how, freq, po) + tosource = self.hedge_of_unsourced(how, peak_fn, freq) return self.__class__( self.offtakevolume, self.unsourcedprice, self.sourced + tosource ) @@ -280,6 +312,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 +328,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/portfolyo/core/pfstate/pfstate_helper.py b/portfolyo/core/pfstate/pfstate_helper.py index 550ad70..4500540 100644 --- a/portfolyo/core/pfstate/pfstate_helper.py +++ b/portfolyo/core/pfstate/pfstate_helper.py @@ -1,12 +1,11 @@ """Prepare/verify input data for PfState initialisation.""" - import warnings from typing import Any, Iterable import pandas as pd -from ... import testing, tools +from ... import tools from ..pfline import Kind, PfLine, create @@ -55,7 +54,7 @@ def prepare_unsourcedprice(unsourcedprice: Any, ref_idx: pd.DatetimeIndex) -> Pf ) unsourcedprice = unsourcedprice.price try: - testing.assert_indices_compatible(ref_idx, unsourcedprice.index) + tools.testing.assert_indices_compatible(ref_idx, unsourcedprice.index) except AssertionError as e: raise ValueError from e if len(tools.intersect.indices(ref_idx, unsourcedprice.index)) < len(ref_idx): @@ -74,7 +73,7 @@ def prepare_sourced(sourced: Any, ref_idx: pd.DatetimeIndex) -> PfLine: if sourced.kind is not Kind.COMPLETE: raise ValueError("Parameter ``sourced`` does not contain price and volume.") try: - testing.assert_indices_compatible(ref_idx, sourced.index) + tools.testing.assert_indices_compatible(ref_idx, sourced.index) except AssertionError as e: raise ValueError from e # HACK: Workaround for error in pandas intersection (#46702): diff --git a/portfolyo/core/pfstate/plot.py b/portfolyo/core/pfstate/plot.py new file mode 100644 index 0000000..975dac9 --- /dev/null +++ b/portfolyo/core/pfstate/plot.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import matplotlib +from matplotlib import pyplot as plt + +from ..pfline import Kind + +if TYPE_CHECKING: + from .pfstate import PfState + + +class PfStatePlot: + def plot(self: PfState, children: bool = False) -> plt.Figure: + """Plot the portfolio state. + + Parameters + ---------- + None + + Returns + ------- + plt.Figure + The figure object to which the series was plotted. + """ + gridspec = {"width_ratios": [1, 1, 1], "height_ratios": [4, 1]} + fig, (volumeaxes, priceaxes) = plt.subplots( + 2, 3, sharex=True, sharey="row", gridspec_kw=gridspec, figsize=(10, 6) + ) + + so, ss, usv = ( + -1 * self.offtakevolume, + self.sourced, + self.unsourced, + ) + + so.plot_to_ax(volumeaxes[0], children=children, kind=so.kind, labelfmt="") + ss.plot_to_ax(volumeaxes[1], children=children, kind=Kind.VOLUME, labelfmt="") + # Unsourced volume. + usv.plot_to_ax(volumeaxes[2], kind=Kind.VOLUME, labelfmt="") + # Procurement Price. + self.pnl_cost.plot_to_ax(priceaxes[0], kind=Kind.PRICE, labelfmt="") + self.sourced.plot_to_ax( + priceaxes[1], children=children, kind=Kind.PRICE, labelfmt="" + ) + # Unsourced price + self.unsourced.plot_to_ax(priceaxes[2], kind=Kind.PRICE, labelfmt="") + # Set titles. + volumeaxes[0].set_title("Offtake volume") + volumeaxes[1].set_title("Sourced volume") + volumeaxes[2].set_title("Unsourced volume") + priceaxes[0].set_title("Procurement price") + priceaxes[1].set_title("Sourced price") + priceaxes[2].set_title("Unsourced price") + + PfStatePlot.set_max_min_limits(volumeaxes) + PfStatePlot.set_max_min_limits(priceaxes) + + # Format tick labels. + formatter = matplotlib.ticker.FuncFormatter( + lambda x, p: "{:,.0f}".format(x).replace(",", " ") + ) + volumeaxes[0].yaxis.set_major_formatter(formatter) + priceaxes[0].yaxis.set_major_formatter(formatter) + # axes[3].yaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1.0)) + + # Set ticks. + for ax in volumeaxes: + ax.xaxis.set_tick_params(labeltop=False, labelbottom=True) + for ax in priceaxes: + ax.xaxis.set_tick_params(labeltop=False, labelbottom=False) + + fig.tight_layout() + return fig + + def set_max_min_limits(axes: plt.Axes): + limit = [ax.get_ylim() for ax in axes] + mins_vol, maxs_vol = zip(*limit) + + themin, themax = min(mins_vol), max(maxs_vol) + for ax in axes: + ax.set_ylim(themin * 1.1, themax * 1.1) diff --git a/portfolyo/core/pfstate/text.py b/portfolyo/core/pfstate/text.py new file mode 100644 index 0000000..0c70036 --- /dev/null +++ b/portfolyo/core/pfstate/text.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from ..pfline import text as pfline_text +from ..shared import text as shared_text + +if TYPE_CHECKING: + from .pfstate import PfState + + +def pfs_as_string(pfs: PfState, num_of_ts: int, color: bool) -> str: + lines = ["PfState object."] + lines.extend(shared_text.index_info(pfs.index)) + spaces = " " * (shared_text.MAX_DEPTH + 5) + lines.extend([spaces + txtline for txtline in shared_text.dataheader("wqpr")]) + lines.extend(pfline_text.nestedtree("offtake", pfs.offtakevolume, "wq", num_of_ts)) + lines.extend(pfline_text.nestedtree("pnl_cost", pfs.pnl_cost, "wqpr", num_of_ts)) + txt = "\n".join(lines) + return txt if color else shared_text.remove_color(txt) + + +class PfStateText: + def __repr__(self): + return pfs_as_string(self, 5, False) + + def print(self: PfState, num_of_ts: int = 5, color: bool = True) -> None: + """Treeview of the portfolio state. + + Parameters + ---------- + num_of_ts : int, optional (default: 5) + How many timestamps to show for each PfLine. + color : bool, optional (default: True) + Make tree structure clearer by including colors. May not work on all output + devices. + + Returns + ------- + None + """ + print(pfs_as_string(self, num_of_ts, color)) diff --git a/portfolyo/core/shared/__init__.py b/portfolyo/core/shared/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/portfolyo/core/shared/__init__.py @@ -0,0 +1 @@ + diff --git a/portfolyo/core/mixins/excelclipboard.py b/portfolyo/core/shared/excelclipboard.py similarity index 53% rename from portfolyo/core/mixins/excelclipboard.py rename to portfolyo/core/shared/excelclipboard.py index 6dd81f0..80d77ad 100644 --- a/portfolyo/core/mixins/excelclipboard.py +++ b/portfolyo/core/shared/excelclipboard.py @@ -5,25 +5,22 @@ from __future__ import annotations import functools -from typing import TYPE_CHECKING, Union import pandas as pd -if TYPE_CHECKING: # needed to avoid circular imports - from ..pfline import PfLine - from ..pfstate import PfState +from .ndframelike import NDFrameLike -def prepare_df(pfl_or_pfs: Union[PfLine, PfState]) -> pd.DataFrame: +def prepare_df(ndframelike: NDFrameLike) -> pd.DataFrame: """Prepare dataframe so it can easily be saved to excel or copied to clipboard.""" - return pfl_or_pfs.dataframe().pint.dequantify().tz_localize(None) + return ndframelike.dataframe().pint.dequantify().tz_localize(None) class ExcelClipboardOutput: # for both PfLine and PfState @functools.wraps(pd.DataFrame.to_clipboard) - def to_clipboard(self: Union[PfLine, PfState], *args, **kwargs) -> None: + def to_clipboard(self: NDFrameLike, *args, **kwargs) -> None: prepare_df(self).to_clipboard(*args, **kwargs) @functools.wraps(pd.DataFrame.to_excel) - def to_excel(self: Union[PfLine, PfState], *args, **kwargs) -> None: + def to_excel(self: NDFrameLike, *args, **kwargs) -> None: prepare_df(self).to_excel(*args, *kwargs) diff --git a/portfolyo/core/ndframelike.py b/portfolyo/core/shared/ndframelike.py similarity index 87% rename from portfolyo/core/ndframelike.py rename to portfolyo/core/shared/ndframelike.py index 560a576..ad9e512 100644 --- a/portfolyo/core/ndframelike.py +++ b/portfolyo/core/shared/ndframelike.py @@ -14,7 +14,8 @@ class NDFrameLike(abc.ABC): # Abstract methods to be implemented by descendents. - @abc.abstractproperty + @property + @abc.abstractmethod def index(self) -> pd.DatetimeIndex: """Left timestamp of time period corresponding to each data row.""" ... @@ -36,12 +37,20 @@ def asfreq(self, freq: str = "MS") -> NDFrameLike: """ ... - @abc.abstractproperty + @property + @abc.abstractmethod def loc(self): """Create a new instance with a subset of the rows (selection by row label(s) or a boolean array.)""" ... + @property + @abc.abstractmethod + 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/shared/text.py b/portfolyo/core/shared/text.py new file mode 100644 index 0000000..91332f8 --- /dev/null +++ b/portfolyo/core/shared/text.py @@ -0,0 +1,84 @@ +"""String representation of PfLine and PfState objects.""" + +from typing import Dict, Iterable + +import colorama +import pandas as pd + +from ... import tools + +COLORS = ["WHITE", "YELLOW", "CYAN", "GREEN", "RED", "BLUE", "MAGENTA", "BLACK"] +TREECOLORS = [colorama.Style.BRIGHT + getattr(colorama.Fore, f) for f in COLORS] +_UNITS = {"w": "MW", "q": "MWh", "p": "Eur/MWh", "r": "Eur"} +VALUEFORMAT = {"w": "{:,.1f}", "q": "{:,.0f}", "p": "{:,.2f}", "r": "{:,.0f}"} +DATETIMEFORMAT = "%Y-%m-%d %H:%M:%S %z" +COLWIDTHS = {"ts": 25, "w": 12, "q": 11, "p": 11, "r": 13} +MAX_DEPTH = 6 + + +def remove_color(text: str) -> str: + """Remove all color from text.""" + for color in [colorama.Style.RESET_ALL, *TREECOLORS]: + text = text.replace(color, "") + return text + + +def df_with_strvalues(df: pd.DataFrame, units: Dict = _UNITS): + """Turn dataframe with single column names ('w', 'p', etc) into text strings.""" + if isinstance(df.columns, pd.MultiIndex): + raise ValueError("Dataframe must have single column index; has MultiIndex.") + str_series = {} + for name, s in df.items(): + sin = s.pint.to(units.get(name)).pint.magnitude + formt = VALUEFORMAT.get(name).format + sout = sin.apply(formt).str.replace(",", " ", regex=False) + str_series[name] = sout.mask(s.isna(), "") + return pd.DataFrame(str_series) + + +def df_with_strindex(df: pd.DataFrame, num_of_ts: int): + """Turn datetime index of dataframe into text, and reduce number of rows.""" + df.index = df.index.map( + lambda ts: ts.strftime(DATETIMEFORMAT).ljust(COLWIDTHS["ts"]) + ) + if len(df.index) > num_of_ts: + i1, i2 = num_of_ts // 2, (num_of_ts - 1) // 2 + inter = pd.DataFrame([[".."] * len(df.columns)], [".."], df.columns) + df = pd.concat([df.iloc[:i1], inter, df.iloc[-i2:]]) + return df + + +def index_info(i: pd.DatetimeIndex) -> Iterable[str]: + """Info about the index.""" + return [ + f". Start: {i[0] } (incl) . Timezone : {i.tz or 'none'} ", + f". End : {tools.right.index(i)[-1]} (excl) . Start-of-day: {i[0].time()} ", + f". Freq : {i.freq} ({len(i)} datapoints)", + ] + + +def treedict(depth: int, is_last_child: bool, has_children: bool) -> Dict[str, str]: + """Dictionary with 4 strings ('00', '01', '10', '11') that are used in drawing the tree.""" + colors = {"0": TREECOLORS[depth], "1": TREECOLORS[depth + 1]} + tree = {} + # 00 = first chars on header text line, #10 = first chars on other text lines + if depth == 0: + tree["00"] = colors["0"] + "─" + else: + tree["00"] = colors["0"] + ("└" if is_last_child else "├") + tree["10"] = " " if is_last_child else (colors["0"] + "│") + # 01 = following chars on header line, #11 = following chars on other text lines + tree["01"] = (colors["1"] + "●" + colors["0"]) if has_children else "─" + tree["01"] += "─" * (MAX_DEPTH - depth) + " " + tree["11"] = ((colors["1"] + "│") if has_children else " ") + colors["0"] + tree["11"] += " " * (MAX_DEPTH - depth + 3) + return tree + + +def dataheader(cols: Iterable[str] = "wqpr", units: Dict = _UNITS) -> Iterable[str]: + out = [" " * 25] * 2 # width of timestamps + for c in cols: + width = COLWIDTHS[c] + 1 + out[0] += f"{c:>{width}}" + out[1] += f"{units[c]:>{width}}" + return out diff --git a/portfolyo/dev/develop.py b/portfolyo/dev/develop.py index 5c7f426..9a2e6b0 100644 --- a/portfolyo/dev/develop.py +++ b/portfolyo/dev/develop.py @@ -3,7 +3,7 @@ """ import datetime as dt -from typing import Dict, Union, Callable, Tuple +from typing import Callable, Dict, Tuple import numpy as np import pandas as pd @@ -28,35 +28,47 @@ def get_index( _seed: int = None, ) -> pd.DatetimeIndex: """Get index.""" + # Prepare values. if _seed: np.random.seed(_seed) if not periods: standard_len = INDEX_LEN.get(freq, 10) periods = np.random.randint(standard_len // 2, standard_len * 2) - if tools.freq.up_or_down(freq, "H") <= 0 and tz is None: - # Shorten index to not include timestamp that do not exist in Europe/Berlin. - periods = min(periods, 4000) if not startdate: - a, m, d = 2020, 1, 1 - a += np.random.randint(-4, 4) if _seed else (periods % 20 - 10) + a, m, d = 2016, 1, 1 # earliest possible + a += np.random.randint(0, 8) if _seed else (periods % 8) if tools.freq.up_or_down(freq, "MS") <= 0: m += np.random.randint(0, 12) if _seed else (periods % 12) if tools.freq.up_or_down(freq, "D") <= 0: d += np.random.randint(0, 28) if _seed else (periods % 28) - if tools.freq.up_or_down(freq, "H") <= 0 and tz is None: - # Start index after DST-start to not include timestamps that do not exist in Europe/Berlin. - m, d = 4, 2 startdate = f"{a}-{m}-{d}" if not start_of_day: start_of_day = dt.time(hour=0, minute=0) - starttime = f"{start_of_day.hour:02}:{start_of_day.minute:02}:00" - start = f"{startdate} {starttime}" - return pd.date_range(start, freq=freq, periods=periods, tz=tz) + # Create index. + start = tools.stamp.create(startdate, tz, start_of_day) + i = pd.date_range(start, periods=periods, freq=freq) # tz included in start + # Some checks. + if tools.freq.up_or_down(freq, "H") <= 0: + i = _shorten_index_if_necessary(i, start_of_day) + return i + + +def _shorten_index_if_necessary(i, start_of_day) -> pd.DatetimeIndex: + """Shorten index with (quarter)hourly values if necessary to ensure that an integer + number of calendar days is included.""" + if (i[-1] - i[0]).total_seconds() < 23 * 3600: + raise ValueError("Index must contain at least one full day") + # Must ensure that index is integer number of days. + for _ in range(0, 100): # max 100 quarterhours in a day (@ end of DST) + if tools.right.stamp(i[-1], i.freq).time() == start_of_day: + return i + i = i[:-1] + raise ValueError("Can't find timestamp to end index on.") def get_value( name: str = None, has_unit: bool = True, magn: float = None, *, _seed: int = None -) -> Union[float, tools.unit.Q_]: +) -> float | tools.unit.Q_: """Get a single value.""" if _seed: np.random.seed(_seed) @@ -198,7 +210,7 @@ def get_pfline( childcount : int, optional (default: 2) Number of children on each level. (Ignored if `nlevels` == 1) positive : bool, optional (default: False) - If True, return only positive values. If False, make 1/3 of pflines negative. + If True, return only positive values. If False, make 1/2 of pflines negative. _ancestornames : Tuple[str], optional (default: ()) Text to start the childrens' names with (concatenated with '-') _seed : int, optional (default: no seed value) @@ -222,7 +234,7 @@ def get_pfline( Kind.COMPLETE: "qr", }[kind] df = get_dataframe(i, columns, _seed=_seed) - if not positive and np.random.rand() < 0.33: + if not positive and np.random.randint(1, 4) == 1: df = -1 * df # HACK: `-df` leads to error in pint. Maybe fixed in future return create.flatpfline(df) # Create nested PfLine. diff --git a/portfolyo/dev/mockup.py b/portfolyo/dev/mockup.py index bb1bed7..210e69f 100644 --- a/portfolyo/dev/mockup.py +++ b/portfolyo/dev/mockup.py @@ -1,11 +1,12 @@ """Create somewhat realistic curves.""" + from typing import Tuple import numpy as np import pandas as pd -from ..prices.utils import is_peak_hour from ..tools import unit # noqa # ensure we use current ureg +from ..tools.product import germanpower_peakfn def w_offtake( @@ -106,7 +107,7 @@ def p_marketprices( if i.freq == "15T": # repeat every value 4 times b = np.array([[bb, bb, bb, bb] for bb in b]).flatten() b = b[: len(i)] # slice in case i is very short - pa = np.convolve(-1 + 2 * is_peak_hour(i), b / sum(b), mode="same") + pa = np.convolve(-1 + 2 * germanpower_peakfn(i), b / sum(b), mode="same") else: pa = np.zeros(len(i)) # Values @@ -167,7 +168,7 @@ def group_and_calc(s): return s.resample(freq, group_keys=False).apply(calc_wp) if sin.index.freq in ["15T", "H"]: - is_peak = is_peak_hour(sin.index) # avoid running on each ts individually + is_peak = germanpower_peakfn(sin.index) # avoid running on each ts individually df = sin.groupby(is_peak, group_keys=False).apply(group_and_calc) else: df = group_and_calc(sin) diff --git a/portfolyo/prices/__init__.py b/portfolyo/prices/__init__.py deleted file mode 100644 index 99a9527..0000000 --- a/portfolyo/prices/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import convert diff --git a/portfolyo/prices/convert.py b/portfolyo/prices/convert.py deleted file mode 100644 index 36fd045..0000000 --- a/portfolyo/prices/convert.py +++ /dev/null @@ -1,502 +0,0 @@ -""" -Convert volume [MW] and price [Eur/MWh] timeseries using base, peak, offpeak times. - -. Conversions without loss of information: -.. Base and peak values <--> Peak and offpeak values -.. Peak and offpeak values in dataframe with yearly/quarterly/monthly index <--> - peak and offpeak values in series with hourly (or shorter) index - -. Conversions with information loss: -.. Hourly varying values --> Peak and offpeak values. -""" - -import datetime as dt -import warnings -from typing import Iterable, Union - -import numpy as np -import pandas as pd - -from .. import tools -from . import utils - -Stamp = Union[dt.datetime, pd.Timestamp] -Value = Union[float, int, tools.unit.Q_] - -BPO = ("base", "peak", "offpeak") - - -def group_function(freq: str, po: bool = False): - """Function to group all rows that belong to same 'product'.""" - if freq == "MS": - if po: - return lambda ts: (ts.year, ts.month, utils.is_peak_hour(ts)) - else: - return lambda ts: (ts.year, ts.month) - elif freq == "QS": - if po: - return lambda ts: (ts.year, ts.quarter, utils.is_peak_hour(ts)) - else: - return lambda ts: (ts.year, ts.quarter) - elif freq == "AS": - if po: - return lambda ts: (ts.year, utils.is_peak_hour(ts)) - else: - return lambda ts: (ts.year,) - - raise ValueError( - f"Parameter ``freq`` must be one of 'MS', 'QS', 'AS'; got '{freq}'." - ) - - -def offpeak( - base: Union[Value, Iterable[Value]], - peak: Union[Value, Iterable[Value]], - ts_left: Union[Stamp, Iterable[Stamp]], - freq: str = None, -) -> Union[Value, pd.Series]: - """Offpeak value, given base and peak value and time interval they apply to. - - Parameters - ---------- - base : Union[Value, Iterable[Value]] - Base value - peak : Union[Value, Iterable[Value]] - Peak value - ts_left : Union[Stamp, Iterable[Stamp]] - (Left-bound) timestamp of period. - freq : {'MS' (month), 'QS' (quarter), 'AS' (year)}, optional - Length of delivery period. If none specified, use ``.freq`` attribute of - ``ts_left``. - - Returns - ------- - offpeak value(s) - """ - fr = utils.duration_bpo(ts_left, freq) # Series or DataFrame - b, p, o = fr["base"], fr["peak"], fr["offpeak"] - if isinstance(fr, pd.DataFrame): - b, p, o = b.values, p.values, o.values - return (base * b - peak * p) / o - - -def peak( - base: Union[Value, Iterable[Value]], - offpeak: Union[Value, Iterable[Value]], - ts_left: Union[Stamp, Iterable[Stamp]], - freq: str = None, -) -> Union[Value, pd.Series]: - """Peak value, given base and offpeak value and time interval they apply to. - - See also - -------- - .offpeak - """ - fr = utils.duration_bpo(ts_left, freq) # Series or DataFrame - b, p, o = fr["base"], fr["peak"], fr["offpeak"] - if isinstance(fr, pd.DataFrame): - b, p, o = b.values, p.values, o.values - - return (base * b - offpeak * o) / p - - -def base( - peak: Union[Value, Iterable[Value]], - offpeak: Union[Value, Iterable[Value]], - ts_left: Union[Stamp, Iterable[Stamp]], - freq: str = None, -) -> Union[Value, pd.Series]: - """Base value, given peak and offpeak value and time interval they apply to. - - See also - -------- - .offpeak - """ - fr = utils.duration_bpo(ts_left, freq) # Series or DataFrame - b, p, o = fr["base"], fr["peak"], fr["offpeak"] - if isinstance(fr, pd.DataFrame): - b, p, o = b.values, p.values, o.values - return (peak * p + offpeak * o) / b - - -def complete_bpoframe(partial_bpoframe: pd.DataFrame, prefix: str = "") -> pd.DataFrame: - """ - Add missing information to bpoframe (Dataframe with base, peak, offpeak values). - - Parameters - ---------- - partial_bpoframe : DataFrame - Dataframe with at least 2 columns with names in {'base', 'peak', 'offpeak'}. - Datetimeindex with frequency in {'MS', 'QS', 'AS'}. - prefix : str, optional (default: '') - If specified, add this to the column names to search for in the provided dataframe - (and to the column names in the returned dataframes). - - Returns - ------- - DataFrame - If exactly one of {'base', 'peak', 'offpeak'} is missing, calculate value - of missing column from other two columns and return complete dataframe. - - Notes - ----- - Can only be used for values that are 'averagable' over a time period, like power [MW] - and price [Eur/MWh]. Not for e.g. energy [MWh], revenue [Eur], and duration [h]. - - In: - - peak offpeak - ts_left - 2020-01-01 00:00:00+01:00 42.530036 30.614701 - 2020-02-01 00:00:00+01:00 33.295167 15.931557 - ... ... - 2020-11-01 00:00:00+01:00 49.110873 33.226004 - 2020-12-01 00:00:00+01:00 57.872246 35.055449 - 12 rows × 2 columns - - Out: - - base peak offpeak - ts_left - 2020-01-01 00:00:00+01:00 35.034906 42.530036 30.614701 - 2020-02-01 00:00:00+01:00 21.919009 33.295167 15.931557 - ... ... ... - 2020-11-01 00:00:00+01:00 38.785706 49.110873 33.226004 - 2020-12-01 00:00:00+01:00 43.519745 57.872246 35.055449 - 12 rows × 3 columns - """ - col2bpo = {f"{prefix}{bpo}": bpo for bpo in BPO} - series = {col2bpo[c]: s for c, s in partial_bpoframe.iteritems() if c in col2bpo} - - if len(series) > 2: # i.e., 3 - return partial_bpoframe - if len(series) < 2: - raise ValueError( - f"At least 2 of {', '.join(col2bpo.keys())} must be present as columns." - ) - df = partial_bpoframe.copy() - durations = utils.duration_bpo(df.index) - b, p, o = durations["base"], durations["peak"], durations["offpeak"] - if "offpeak" not in series: - df[f"{prefix}offpeak"] = (series["base"] * b - series["peak"] * p) / o - elif "peak" not in series: - df[f"{prefix}peak"] = (series["base"] * b - series["offpeak"] * o) / p - else: - df[f"{prefix}base"] = (series["peak"] * p + series["offpeak"] * o) / b - - return df[col2bpo.keys()] # correct order - - -def tseries2singlebpo(s: pd.Series, prefix: str = "") -> pd.Series: - """ - Aggregate timeseries with varying values to a single base, peak and offpeak value. - - Parameters - ---------- - s : Series - Timeseries with hourly or quarterhourly frequency. - prefix : str, optional (default: '') - If specified, add this to the index of the returned Series. - - Returns - ------- - Series - Index: base, peak, offpeak. - - Notes - ----- - Can only be used for values that are 'averagable' over a time period, like power [MW] - and price [Eur/MWh]. Not for e.g. energy [MWh], revenue [Eur], and duration [h]. - - In: - - ts_left - 2020-01-01 00:00:00+01:00 41.88 - 2020-01-01 01:00:00+01:00 38.60 - 2020-01-01 02:00:00+01:00 36.55 - ... - 2020-12-31 21:00:00+01:00 52.44 - 2020-12-31 22:00:00+01:00 51.86 - 2020-12-31 23:00:00+01:00 52.26 - Freq: H, Name: p, Length: 8784, dtype: float64 - - Out: - - base 31.401369 - peak 51.363667 - offpeak 20.311204 - dtype: float64 - """ - # Handle possible units. - sin, units = (s.pint.magnitude, s.pint.units) if hasattr(s, "pint") else (s, None) - - # Do calculations. Use normal mean, because all rows have same duration. - is_peak = utils.is_peak_hour(sin.index) - sout = pd.Series( - { - f"{prefix}base": sin.mean(), - f"{prefix}peak": sin[is_peak].mean(), - f"{prefix}offpeak": sin[~is_peak].mean(), - } - ) - - # Handle possible units. - if units is not None: - sout = sout.astype(f"pint[{units}]") - return sout - - -def tseries2bpoframe(s: pd.Series, freq: str = "MS", prefix: str = "") -> pd.DataFrame: - """ - Aggregate timeseries with varying values to a dataframe with base, peak and offpeak - timeseries, grouped by provided time interval. - - Parameters - ---------- - s : Series - Timeseries with hourly or quarterhourly frequency. - freq : {'MS' (month, default) 'QS' (quarter), 'AS' (year)} - Target frequency. - prefix : str, optional (default: '') - If specified, add this to the column names of the returned dataframe. - - Returns - ------- - DataFrame - Dataframe with base, peak and offpeak values (as columns). Index: downsampled - timestamps at provided frequency. - - Notes - ----- - Can only be used for values that are 'averagable' over a time period, like power [MW] - and price [Eur/MWh]. Not for e.g. energy [MWh], revenue [Eur], and duration [h]. - - In: - - ts_left - 2020-01-01 00:00:00+01:00 41.88 - 2020-01-01 01:00:00+01:00 38.60 - 2020-01-01 02:00:00+01:00 36.55 - ... - 2020-12-31 21:00:00+01:00 52.44 - 2020-12-31 22:00:00+01:00 51.86 - 2020-12-31 23:00:00+01:00 52.26 - Freq: H, Name: p, Length: 8784, dtype: float64 - - Out: - - base peak offpeak - ts_left - 2020-01-01 00:00:00+01:00 35.034906 42.530036 30.614701 - 2020-02-01 00:00:00+01:00 21.919009 33.295167 15.931557 - ... ... ... - 2020-11-01 00:00:00+01:00 38.785706 49.110873 33.226004 - 2020-12-01 00:00:00+01:00 43.519745 57.872246 35.055449 - 12 rows × 3 columns - """ - if freq not in ("MS", "QS", "AS"): - raise ValueError( - f"Parameter ``freq`` must be one of 'MS', 'QS', 'AS'; got '{freq}'." - ) - - # Remove partial data - s = tools.trim.frame(s, freq) - - # Handle possible units. - sin, units = (s.pint.magnitude, s.pint.units) if hasattr(s, "pint") else (s, None) - - # Do calculations. Use normal mean, because all rows have same duration. - sout = sin.resample(freq, group_keys=True).apply( - lambda s: tseries2singlebpo(s, prefix) - ) - - # Handle possible units. - if units is not None: - sout = sout.astype(f"pint[{units}]") - return sout.unstack() - - -def bpoframe2tseries( - bpoframe: pd.DataFrame, freq: str = "H", prefix: str = "" -) -> pd.Series: - """ - Convert a dataframe with base, peak and/or offpeak values, to a single (quarter)hourly - timeseries. - - Parameters - ---------- - bpoframe : DataFrame - Dataframe with values. Columns must include at least 2 of {'peak', 'offpeak', - 'base'}. Datetimeindex with frequency in {'MS', 'QS', 'AS'}. - freq : {'H' (hour, default) '15T' (quarterhour)} - Target frequency. - prefix : str, optional (default: '') - If specified, add this to the column names to search for in the provided dataframe. - - Returns - ------- - Series - Timeseries with values as provided in `bpoframe`. - - Notes - ----- - Can only be used for values that are 'averagable' over a time period, like power [MW] - and price [Eur/MWh]. Not for e.g. energy [MWh], revenue [Eur], and duration [h]. - - In: - - peak offpeak - ts_left - 2020-01-01 00:00:00+01:00 42.530036 30.614701 - 2020-02-01 00:00:00+01:00 33.295167 15.931557 - ... ... - 2020-11-01 00:00:00+01:00 49.110873 33.226004 - 2020-12-01 00:00:00+01:00 57.872246 35.055449 - 12 rows × 2 columns - - Out: - - ts_left - 2020-01-01 00:00:00+01:00 30.614701 - 2020-01-01 01:00:00+01:00 30.614701 - 2020-01-01 02:00:00+01:00 30.614701 - ... - 2020-12-31 21:00:00+01:00 35.055449 - 2020-12-31 22:00:00+01:00 35.055449 - 2020-12-31 23:00:00+01:00 35.055449 - Freq: H, Length: 8784, dtype: float64 - """ - if freq not in ("H", "15T"): - raise ValueError(f"Parameter ``freq`` must be 'H' or '15T'; got '{freq}'.") - - df = bpoframe.rename({f"{prefix}{bpo}": bpo for bpo in BPO}, axis=1) # remove prefx - df = complete_bpoframe(df) # make sure we have peak and offpeak columns - df = tools.changefreq.averagable(df[["peak", "offpeak"]], freq) - df["ispeak"] = utils.is_peak_hour(df.index) - - return df["offpeak"].where(df["ispeak"], df["peak"]) - - -def tseries2tseries(s: pd.Series, freq: str = "MS") -> pd.Series: - """ - Transform timeseries (with possibly variable values) to one with (at certain - frequency) uniform peak and offpeak values. - - Parameters - ---------- - s : Series - Timeseries with hourly or quarterhourly frequency. - freq : {'MS' (month, default) 'QS' (quarter), 'AS' (year)} - Target frequency within which peak and offpeak values will be uniform. - - Returns - ------- - Series - Timeseries where each peak hour within the target frequency has the same - value. Idem for offpeak hours. Index: as original series. - - Notes - ----- - Can only be used for values that are 'averagable' over a time period, like power [MW] - and price [Eur/MWh]. Not for e.g. energy [MWh], revenue [Eur], and duration [h]. - - In: - - ts_left - 2020-01-01 00:00:00+01:00 41.88 - 2020-01-01 01:00:00+01:00 38.60 - 2020-01-01 02:00:00+01:00 36.55 - ... - 2020-12-31 21:00:00+01:00 52.44 - 2020-12-31 22:00:00+01:00 51.86 - 2020-12-31 23:00:00+01:00 52.26 - Freq: H, Name: p, Length: 8784, dtype: float64 - - Out: - - ts_left - 2020-01-01 00:00:00+01:00 30.614701 - 2020-01-01 01:00:00+01:00 30.614701 - 2020-01-01 02:00:00+01:00 30.614701 - ... - 2020-12-31 21:00:00+01:00 35.055449 - 2020-12-31 22:00:00+01:00 35.055449 - 2020-12-31 23:00:00+01:00 35.055449 - Freq: H, Name: p, Length: 8784, dtype: float64 - """ - if s.index.freq not in ("H", "15T"): - raise ValueError( - f"Frequency of provided timeseries must be hourly or quarterhourly; got '{s.index.freq}'." - ) - - # Handle possible units. - sin, units = (s.pint.magnitude, s.pint.units) if hasattr(s, "pint") else (s, None) - - # Return normal mean, because all rows have same duration. - sout = sin.groupby(group_function(freq, True)).transform(np.mean) - - # Handle possible units. - if units is not None: - sout = sout.astype(f"pint[{units}]") - return sout - - -def bpoframe2bpoframe( - bpoframe: pd.DataFrame, freq: str = "AS", prefix: str = "" -) -> pd.DataFrame: - """ - Convert a dataframe with base, peak and/or offpeak values to a similar dataframe - with a different frequency. - - Parameters - ---------- - bpoframe : DataFrame - Columns must include at least 2 of {'peak', 'offpeak', 'base'}. Datetimeindex - with frequency in {'MS', 'QS', 'AS'}. - freq : {'MS' (month), 'QS' (quarter), 'AS' (year, default)} - Target frequency. - prefix : str, optional (default: '') - If specified, add this to the column names to search for in the provided dataframe - (and to the column names in the returned dataframes). - - Returns - ------- - DataFrame - Dataframe with base, peak and offpeak values (as columns). Index: timestamps at - provided frequency. - - Notes - ----- - Can only be used for values that are 'averagable' over a time period, like power [MW] - and price [Eur/MWh]. Not for e.g. energy [MWh], revenue [Eur], and duration [h]. - - In: - - base peak offpeak - ts_left - 2020-01-01 00:00:00+01:00 35.034906 42.530036 30.614701 - 2020-02-01 00:00:00+01:00 21.919009 33.295167 15.931557 - ... ... ... - 2020-11-01 00:00:00+01:00 38.785706 49.110873 33.226004 - 2020-12-01 00:00:00+01:00 43.519745 57.872246 35.055449 - 12 rows × 3 columns - - Out: - - base peak offpeak - ts_left - 2020-01-01 00:00:00+01:00 30.490036 38.003536 26.312894 - 2020-04-01 00:00:00+02:00 25.900919 35.295167 20.681892 - 2020-07-01 00:00:00+02:00 32.706785 44.033511 26.371498 - 2020-10-01 00:00:00+02:00 39.455197 54.468722 31.063728 - """ - if freq not in ("MS", "QS", "AS"): - raise ValueError( - f"Parameter ``freq`` must be one of 'MS', 'QS', 'AS'; got {freq}." - ) - if tools.freq.up_or_down(bpoframe.index.freq, freq) == 1: - warnings.warn( - "This conversion includes upsampling, e.g. from yearly to monthly values." - ) - - return tseries2bpoframe(bpoframe2tseries(bpoframe, "H", prefix), freq, prefix) diff --git a/portfolyo/prices/hedge.py b/portfolyo/prices/hedge.py deleted file mode 100644 index 30e9f7e..0000000 --- a/portfolyo/prices/hedge.py +++ /dev/null @@ -1,146 +0,0 @@ -"""Functionality to hedge an offtake profile with a price profile.""" - -from typing import Tuple - -import pandas as pd - -from .. import tools -from . import convert, utils - - -def _hedge(df: pd.DataFrame, how: str, po: bool) -> pd.Series: - """ - Hedge a power timeseries, for given price timeseries. - - Parameters - ---------- - df : pd.DataFrame - with 'w' [MW] and 'p' [Eur/MWh] columns. - how : str. One of {'vol', 'val'} - Hedge-constraint. 'vol' for volumetric hedge, 'val' for value hedge. - po : bool - Set to True to split hedge into peak and offpeak values. (Only sensible - for timeseries with freq=='H' or shorter.) - - Returns - ------- - pd.Series - With float values or quantities. - If po==False, Series with index ['w', 'p'] (power and price in entire period). - If po==True, Series with multiindex ['peak', 'offpeak'] x ['w', 'p'] (power and - price, split between peak and offpeak intervals in the period.) - - Notes - ----- - If the index of `df` doesn't have a .duration attribute, all rows are assumed to be - of equal duration. - """ - - # Split into peak and offpeak. - - if po: - apply_f = lambda df: _hedge(df, how, po=False) # noqa - # s = df.groupby(utils.is_peak_hour).apply(apply_f) # calls group_f on EACH ts - is_peak_hour = utils.is_peak_hour(df.index) - s = df.groupby(is_peak_hour).apply(apply_f) # calls group_f on index - return s.rename(index={True: "peak", False: "offpeak"}).stack() - - # Don't split into peak and offpeak. - - if df.index.freq: - # Use magnitude only, so that, if w and p are float series, their return - # series are also floats (instead of dimensionless Quantities). - df["dur"] = df.index.duration.pint.m - else: - df["dur"] = 1 - - # Get single power and price values. - p_hedge = (df.p * df.dur).sum() / df.dur.sum() - if how == "vol": # volume hedge - # solve for w_hedge: sum (w * duration) == w_hedge * sum (duration) - w_hedge = (df.w * df.dur).sum() / df.dur.sum() - elif how == "val": # value hedge - # solve for w_hedge: sum (w * duration * p) == w_hedge * sum (duration * p) - w_hedge = (df.w * df.dur * df.p).sum() / (df.dur * df.p).sum() - else: - raise ValueError(f"Parameter `how` must be 'val' or 'vol'; got {how}.") - return pd.Series({"w": w_hedge, "p": p_hedge}) - - -def hedge( - w: pd.Series, - p: pd.Series, - how: str = "val", - freq: str = "MS", - po: bool = None, -) -> Tuple[pd.Series]: - """ - Make hedge of power timeseries, for given price timeseries. - - Parameters - ---------- - w : Series - Power timeseries with hourly or quarterhourly frequency. - p: Series - Price timeseries with same frequency. - how : str, optional (Default: 'val') - Hedge-constraint. 'vol' for volumetric hedge, 'val' for value hedge. - freq : {'D' (days), 'MS' (months, default), 'QS' (quarters), 'AS' (years)} - Frequency of hedging products. E.g. 'QS' to hedge with quarter products. - po : bool, optional - Type of hedging products. Set to True to split hedge into peak and offpeak. - (Default: split if volume timeseries has hourly values or shorter and hedging - products have monthly frequency or longer.) - - Returns - ------- - Tuple[pd.Series] - Power timeseries and price timeseries with hedge of `w` (with same index). - """ - if w.index.freq is None or p.index.freq is None: - raise ValueError( - "Parameters ``w`` and ``p`` must have a DatetimeIndex with a set frequency attribute." - ) - if w.index.freq != p.index.freq: - raise ValueError( - f"Parameters ``w`` and ``p`` must have same frequency; got {w.index.freq} and {p.index.freq}." - ) - if w.index.freq not in ["15T", "H", "D"]: - raise ValueError("Can only hedge a timeseries with daily (or shorter) values.") - if freq not in ["D", "MS", "QS", "AS"]: - raise ValueError( - f"Parameter ``freq`` must be one of 'D', 'MS', 'QS', 'AS'; got '{freq}'." - ) - if po is None: # default: split in peak/offpeak if frequency is short enough - po = w.index.freq in ["15T", "H"] and freq != "D" - if po and not (w.index.freq in ["15T", "H"] and freq != "D"): - raise ValueError( - "Split into peak and offpeak only possible when (a) hedging with monthly (or " - "longer) products, and (b) if timeseries have hourly (or shorter) values." - ) - - # Handle possible units. - win, wunits = (w.pint.magnitude, w.pint.units) if hasattr(w, "pint") else (w, None) - pin, punits = (p.pint.magnitude, p.pint.units) if hasattr(p, "pint") else (p, None) - - # Only keep full periods of overlapping timestamps. - i = win.index.intersection(pin.index) - df = tools.trim.frame(pd.DataFrame({"w": win, "p": pin}).loc[i, :], freq) - if len(df) == 0: - return df["w"], df["p"] # No full periods; don't do hedge; return empty series - - # Do actual hedge. - group_f = convert.group_function(freq, po) - grouped_i = pd.MultiIndex.from_arrays(group_f(df.index)) # calls group_f on index - apply_f = lambda df: _hedge(df, how, False) # noqa - # vals = df.groupby(group_f).apply(apply_f) # calls group_f on EACH ts - vals = df.groupby(grouped_i).apply(apply_f) - vals.index = pd.MultiIndex.from_tuples(vals.index) - for c in ["w", "p"]: - df[c] = df[c].groupby(grouped_i).transform(lambda gr: vals.loc[gr.name, c]) - - # Handle possible units. - if wunits or punits: - df = df.astype({"w": f"pint[{wunits:P}]", "p": f"pint[{punits:P}]"}) - - return df["w"], df["p"] diff --git a/portfolyo/prices/utils.py b/portfolyo/prices/utils.py deleted file mode 100644 index e872d42..0000000 --- a/portfolyo/prices/utils.py +++ /dev/null @@ -1,190 +0,0 @@ -"""Utilities for calculating / manipulating price data.""" - -import datetime as dt -import warnings -from typing import Tuple, Union - -import pandas as pd - -from .. import tools -from ..tools.unit import Q_ - -german_peakperiod = tools.peakperiod.factory(dt.time(8), dt.time(20), [1, 2, 3, 4, 5]) - - -def is_peak_hour( - ts_left: Union[pd.Timestamp, pd.DatetimeIndex] -) -> Union[bool, pd.Series]: - """ - Boolean value indicating if a timestamp is in a peak period or not. - - Parameters - ---------- - ts_left : Union[pd.Timestamp, pd.DatetimeIndex] - Timestamp(s) for which to calculate if it falls in a peak period. - - More precisely: if timestamp lies in one of the (left-closed) time intervals that - define the peak hour periods. - - Returns - ------- - bool (if ts_left is Timestamp) or Series (if ts_left is DatetimeIndex). - """ - if isinstance(ts_left, pd.Timestamp): - warnings.warn( - "Calling this function with a single timestamp is deprecated and will be removed in a future version", - FutureWarning, - ) - return is_peak_hour(pd.DatetimeIndex([ts_left], freq="15T"))[0] - - return german_peakperiod(ts_left) - - -def duration_base( - ts_left: Union[pd.Timestamp, pd.DatetimeIndex], freq: str = None -) -> Union[Q_, pd.Series]: - """ - Total duration of base periods in a timestamp. - - See also - -------- - .tools.duration - """ - if isinstance(ts_left, pd.DatetimeIndex): - hours = (duration_base(ts, freq) for ts in ts_left) # has unit - return pd.Series(hours, ts_left, dtype="pint[h]") - - # Assume it's a single timestamp. - return tools.duration.stamp(ts_left, freq) - - -def duration_peak( - ts_left: Union[pd.Timestamp, pd.DatetimeIndex], freq: str = None -) -> Union[Q_, pd.Series]: - """ - Total duration of peak periods in a timestamp. - - See also - -------- - .tools.duration - """ - if freq is None: - freq = ts_left.freq - - if freq not in tools.freq.FREQUENCIES: - raise ValueError( - f"Parameter ``freq`` must be one of {', '.join(tools.freq.FREQUENCIES)}; got {freq}." - ) - - if isinstance(ts_left, pd.DatetimeIndex): - if freq in ["15T", "H"]: - return tools.duration.index(ts_left, freq) * is_peak_hour(ts_left) - elif freq == "D": - hours = ts_left.map(lambda ts: ts.isoweekday() < 6) * 12.0 # no unit - return pd.Series(hours, ts_left, dtype="pint[h]") # works even during dst - else: - # dur = ts_left.map(duration_peak) # crashes due to behaviour of .map method - hours = (duration_peak(ts, freq) for ts in ts_left) # has unit - return pd.Series(hours, ts_left, dtype="pint[h]") - - # Assume it's a single timestamp. - if freq in ["15T", "H"]: - return tools.duration.stamp(ts_left, freq) * is_peak_hour(ts_left) - elif freq == "D": - return Q_(0.0 if ts_left.isoweekday() >= 6 else 12.0, "h") - else: - ts_right = tools.right.stamp(ts_left, freq) - days = pd.date_range(ts_left, ts_right, freq="D", inclusive="left") - return Q_(sum(days.map(lambda day: day.isoweekday() < 6) * 12.0), "h") - - -def duration_offpeak( - ts_left: Union[pd.Timestamp, pd.DatetimeIndex], freq: str = None -) -> Union[Q_, pd.Series]: - """ - Total duration of offpeak periods in a timestamp. - - See also - -------- - .tools.duration - """ - return duration_base(ts_left, freq) - duration_peak(ts_left, freq) - - -def duration_bpo( - ts_left: Union[pd.Timestamp, pd.DatetimeIndex], freq: str = None -) -> Union[pd.Series, pd.DataFrame]: - """ - Duration of base, peak and offpeak periods in a timestamp. - - Parameters - ---------- - ts_left : Union[pd.Timestamp, pd.DatetimeIndex] - Timestamp(s) for which to calculate the base, peak and offpeak durations. - freq : {'15T' (quarter-hour), 'H' (hour), 'D' (day), 'MS' (month), 'QS' (quarter), - 'AS' (year)}, optional - Frequency to use in determining the durations. - If none specified, use ``.freq`` attribute of ``ts_left``. - - Returns - ------- - Series (if ts_left is Timestamp) or DataFrame (if ts_left is DatetimeIndex). - """ - if freq is None and isinstance(ts_left, pd.DatetimeIndex): - freq = ts_left.freq - - b = duration_base(ts_left, freq) # quantity or pint-series - p = duration_peak(ts_left, freq) # quantity or pint-series - - if isinstance(ts_left, pd.DatetimeIndex): - return pd.DataFrame({"base": b, "peak": p, "offpeak": b - p}, dtype="pint[h]") - - # Assume it's a single timestamp. - return pd.Series({"base": b, "peak": p, "offpeak": b - p}, dtype="pint[h]") - - -def delivery_period( - ts_trade: pd.Timestamp, - period_type: str = "m", - front_count: int = 1, - start_of_day: dt.time = None, -) -> Tuple[pd.Timestamp]: - """ - Find start and end of delivery period. - - Parameters - ---------- - ts_trade : pd.Timestamp - Trading day. The time part of the timestamp is ignored and assumed to be after - the start_of_day of the market. - period_type : {'d' (day), 'm' (month, default), 'q' (quarter), 's' (season), 'a' (year)} - front_count : int, optional (default: 1) - 1 = next/coming (full) period, 2 = period after that, etc. - start_of_day : dt.time, optional (default: midnight) - Start of day for delivery periods with a longer-than-daily frequency. - - Returns - ------- - (pd.Timestamp, pd.Timestamp) - Left (inclusive) and right (exclusive) timestamp of delivery period. - """ - ts_trade = ts_trade.replace(hour=23, minute=59) # ensure after start_of_day - if period_type in ["m", "q", "a"]: - freq = period_type.upper() + "S" - ts_left = tools.floor.stamp(ts_trade, freq, front_count, start_of_day) - ts_right = tools.right.stamp(ts_left, freq) - elif period_type == "d": - ts_left = tools.floor.stamp(ts_trade, "D", front_count, start_of_day) - ts_right = tools.right.stamp(ts_left, "D") - elif period_type == "s": - front_count_q = front_count * 2 - 1 - ts_left, ts_right = delivery_period(ts_trade, "q", front_count_q, start_of_day) - ts_right = tools.right.stamp(ts_right, "QS") # make 6 months long - if ts_left.month % 2 == 1: # season must start on even month - ts_left = tools.right.stamp(ts_left, "QS") - ts_right = tools.right.stamp(ts_right, "QS") - else: - raise ValueError( - f"Parameter ``period_type`` must be one of 'd', 'm', 'q', 's', 'a'; got '{period_type}'." - ) - return ts_left, ts_right diff --git a/portfolyo/testing/__init__.py b/portfolyo/testing/__init__.py deleted file mode 100644 index 98cdf23..0000000 --- a/portfolyo/testing/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .testing import ( - assert_frame_equal, - assert_index_equal, - assert_indices_compatible, - assert_series_equal, - assert_value_equal, -) diff --git a/portfolyo/tools/__init__.py b/portfolyo/tools/__init__.py index 8e6f519..694d064 100644 --- a/portfolyo/tools/__init__.py +++ b/portfolyo/tools/__init__.py @@ -1,6 +1,6 @@ """General tools; mainly to use on pandas objects.""" -# Unsure why this is needed, but remove and can no longer import portfolyo +# Unsure why this is needed. from . import ( ceil, changefreq, @@ -9,16 +9,23 @@ floor, frame, freq, + hedge, intersect, isboundary, leftandright, - peakperiod, + peakconvert, + peakfn, + product, right, righttoleft, + round, + stamp, standardize, + startofday, trim, + types, tzone, unit, + visualize, wavg, - startofday, ) diff --git a/portfolyo/tools/changefreq.py b/portfolyo/tools/changefreq.py index 72d3477..dd6a0f9 100644 --- a/portfolyo/tools/changefreq.py +++ b/portfolyo/tools/changefreq.py @@ -1,14 +1,15 @@ """Functions to change frequency of a pandas dataframe.""" -from typing import Any, Union +from typing import Any import pandas as pd - -from . import startofday as tools_startofday +from . import duration as tools_duration from . import freq as tools_freq from . import right as tools_right +from . import startofday as tools_startofday from . import trim as tools_trim +from .types import Series_or_DataFrame def _astype(s: pd.Series, dtype: Any) -> pd.Series: @@ -28,9 +29,11 @@ def _emptyseries(s_ref: pd.Series, freq) -> pd.Series: def _downsample_avgable(s: pd.Series, freq: str) -> pd.Series: """Downsample averagble series.""" # For averagable series: first make summable. - summable = s.mul(s.index.duration, axis=0) # now has a pint dtype + duration = tools_duration.frame(s) + summable = s.mul(duration, axis=0) # now has a pint dtype summable2 = _downsample_summable(summable, freq) - s2 = summable2.div(summable2.index.duration, axis=0) + duration2 = tools_duration.frame(summable2) + s2 = summable2.div(duration2, axis=0) s2 = _astype(s2, s.dtype) return s2.rename(s.name) @@ -69,9 +72,11 @@ def _downsample_summable(s: pd.Series, freq: str) -> pd.Series: def _upsample_summable(s: pd.Series, freq: str) -> pd.Series: """Upsample summable series.""" # For summable series: first make averagable. - avgable = s.div(s.index.duration, axis=0) # now has a pint dtype + duration = tools_duration.frame(s) + avgable = s.div(duration, axis=0) # now has a pint dtype avgable2 = _upsample_avgable(avgable, freq) - s2 = avgable2.mul(avgable2.index.duration, axis=0) + duration2 = tools_duration.frame(avgable2) + s2 = avgable2.mul(duration2, axis=0) s2 = _astype(s2, s.dtype) return s2.rename(s.name) @@ -190,22 +195,20 @@ def index(i: pd.DatetimeIndex, freq: str = "MS") -> pd.DatetimeIndex: return _upsample_avgable(pd.Series(0, i), freq).index -def summable( - fr: Union[pd.Series, pd.DataFrame], freq: str = "MS" -) -> Union[pd.Series, pd.DataFrame]: +def summable(fr: Series_or_DataFrame, freq: str = "MS") -> Series_or_DataFrame: f""" Resample and aggregate a DataFrame or Series with 'time-summable' quantities. Parameters ---------- - fr : pd.Series or pd.DataFrame + fr : Series or DataFrame Pandas Series or DataFrame to be resampled. freq : {{{', '.join(tools_freq.FREQUENCIES)}}}, optional (default: 'MS') Target frequency. Returns ------- - DataFrame or Series + Series or DataFrame Notes ----- @@ -228,22 +231,20 @@ def summable( return _general(True, fr, freq) -def averagable( - fr: Union[pd.Series, pd.DataFrame], freq: str = "MS" -) -> Union[pd.Series, pd.DataFrame]: +def averagable(fr: Series_or_DataFrame, freq: str = "MS") -> Series_or_DataFrame: f""" Resample and aggregate a DataFrame or Series with 'time-averagable' quantities. Parameters ---------- - fr : pd.Series or pd.DataFrame + fr : Series or DataFrame Pandas Series or DataFrame to be resampled. freq : {{{', '.join(tools_freq.FREQUENCIES)}}}, optional (default: 'MS') Target frequency. Returns ------- - DataFrame or Series + Series or DataFrame Notes ----- diff --git a/portfolyo/tools/changeyear.py b/portfolyo/tools/changeyear.py index 22a9485..00f7617 100644 --- a/portfolyo/tools/changeyear.py +++ b/portfolyo/tools/changeyear.py @@ -7,7 +7,7 @@ # . Daylight-savings time will likely start and end at a different day. # . Weekdays and holidays are not at the same date. -from typing import Callable, Union +from typing import Callable import holidays import pandas as pd @@ -16,6 +16,7 @@ from . import freq as tools_freq from . import right as tools_right from . import unit as tools_unit +from .types import Series_or_DataFrame docstringliteral_notes = """ * Function is meant for data that spans full months. Using partial months may lead @@ -364,10 +365,10 @@ def map_index_to_year( @additional_notes def map_frame_to_index( - source: Union[pd.Series, pd.DataFrame], + source: Series_or_DataFrame, idx_target: pd.DatetimeIndex, holiday_country: str = None, -) -> Union[pd.Series, pd.DataFrame]: +) -> Series_or_DataFrame: """Transfer the data in a Series or DataFrame to a hypothetical other index according to certain rules (see Notes). What would the data have looked like if it had occured in a different year? @@ -406,10 +407,10 @@ def map_frame_to_index( @additional_notes def map_frame_to_year( - source: Union[pd.Series, pd.DataFrame], + source: Series_or_DataFrame, target_year: int, holiday_country: str = None, -) -> Union[pd.Series, pd.DataFrame]: +) -> Series_or_DataFrame: """Transfer the data in a Series or DataFrame to a hypothetical other year according to certain rules (see Notes). What would the data have looked like if it had occured in a different year? diff --git a/portfolyo/tools/duration.py b/portfolyo/tools/duration.py index b003717..cc5dded 100644 --- a/portfolyo/tools/duration.py +++ b/portfolyo/tools/duration.py @@ -1,7 +1,4 @@ -""" -Duration of delivery periods. -""" - +"""Duration of delivery periods.""" import pandas as pd @@ -41,11 +38,11 @@ def stamp(ts: pd.Timestamp, freq: str) -> tools_unit.Q_: def index(i: pd.DatetimeIndex) -> pd.Series: - """Duration of a timestamp. + """Duration of the timestamps in an index. Parameters ---------- - i : pd.DatetimeIndex + i : DatetimeIndex Index for which to calculate the duration. Returns @@ -60,4 +57,20 @@ def index(i: pd.DatetimeIndex) -> pd.Series: # Individual calculations for non-fixed-duration frequencies. h = (tools_right.index(i) - i).map(lambda td: td.total_seconds() / 3600) - return pd.Series(h, i).astype("pint[h]").rename("duration") + return pd.Series(h, i, dtype="pint[h]").rename("duration") + + +def frame(fr: pd.Series | pd.DataFrame) -> pd.Series: + """Duration of the timestamps in the index of a Series or DataFrame. + + Parameters + ---------- + fr : Series or DataFrame + Object with index for which to calculate the duration. + + Returns + ------- + pint-Series + With ``i`` as its index, and the corresponding duration as the values. + """ + return index(fr.index) diff --git a/portfolyo/tools/frame.py b/portfolyo/tools/frame.py index af2ca9d..512b085 100644 --- a/portfolyo/tools/frame.py +++ b/portfolyo/tools/frame.py @@ -3,15 +3,15 @@ """ import functools -from typing import Any, Iterable, Union +from typing import Any, Iterable import numpy as np import pandas as pd +from .types import Series_or_DataFrame -def fill_gaps( - fr: Union[pd.Series, pd.DataFrame], maxgap: int = 2 -) -> Union[pd.Series, pd.DataFrame]: + +def fill_gaps(fr: Series_or_DataFrame, maxgap: int = 2) -> Series_or_DataFrame: """Fill gaps in series by linear interpolation. Parameters diff --git a/portfolyo/tools/freq.py b/portfolyo/tools/freq.py index 61fa4f2..d2f3e34 100644 --- a/portfolyo/tools/freq.py +++ b/portfolyo/tools/freq.py @@ -2,11 +2,11 @@ Tools for dealing with frequencies. """ -from typing import Union - import numpy as np import pandas as pd +from .types import Series_or_DataFrame + # Allowed frequencies. # Perfect containment; a short-frequency time period always entirely falls within a single high-frequency time period. # AS -> 4 QS; QS -> 3 MS; MS -> 28-31 D; D -> 23-25 H; H -> 4 15T @@ -53,6 +53,7 @@ def up_or_down( backup_common_ts = pd.Timestamp("2020-02-03 04:05:06") if common_ts is None: common_ts = standard_common_ts + ts1 = common_ts + pd.tseries.frequencies.to_offset(freq_source) ts2 = common_ts + pd.tseries.frequencies.to_offset(freq_target) if ts1 > ts2: @@ -65,40 +66,6 @@ def up_or_down( return 0 # only if both give the same answer. -def longer_or_shorter(freq: str, freq_ref: str, common_ts: pd.Timedelta = None) -> int: - """ - Compare frequency with reference frequency to see if it is longer or shorter. - - Parameters - ---------- - freq, freq_ref : frequencies to compare. - common_ts : timestamp, optional - Timestamp to use as anchor from which to compare the two. - - Returns - ------- - * 1 if frequency ``freq`` is longer than the reference frequency ``freq_ref``. - * 0 if frequencies are the same. - * -1 if frequency ``freq`` is shorter than the reference frequency ``freq_ref``. - - Notes - ----- - Arbitrarily using a time point as anchor to calculate the length of the time period - from. May have influence on the ratio (duration of a month, quarter, year etc are - influenced by this), but, for most common frequencies, not on which is longer. - - Examples - -------- - >>> freq.longer_or_shorter('D', 'MS') - -1 - >>> freq.longer_or_shorter('MS', 'D') - 1 - >>> freq.longer_or_shorter('MS', 'MS') - 0 - """ - return up_or_down(freq, freq_ref, common_ts) - - def _longestshortest(shortest: bool, *freqs: str): """Determine which frequency denotes the shortest or longest time period.""" common_ts = pd.Timestamp("2020-01-01") @@ -147,7 +114,7 @@ def longest(*freqs: str) -> str: return _longestshortest(False, *freqs) -def to_offset(freq: str) -> Union[pd.Timedelta, pd.DateOffset]: +def to_offset(freq: str) -> pd.Timedelta | pd.DateOffset: """Object that can be added to a left-bound timestamp to find corresponding right-bound timestamp. Parameters @@ -230,7 +197,7 @@ def set_to_index( Parameters ---------- i : pd.DatetimeIndex - wanted : str, optional + wanted : str, optional (default: None) Frequency to set. If none provided, try to infer. strict : bool, optional (default: False) If True, raise ValueError if a valid frequency is not found. @@ -270,8 +237,8 @@ def set_to_index( def set_to_frame( - fr: Union[pd.Series, pd.DataFrame], wanted: str = None, strict: bool = False -) -> Union[pd.Series, pd.DataFrame]: + fr: Series_or_DataFrame, wanted: str = None, strict: bool = False +) -> Series_or_DataFrame: """Try to read, infer, or force frequency of frame's index. Parameters @@ -284,7 +251,7 @@ def set_to_frame( Returns ------- - Union[pd.Series, pd.DataFrame] + pd.Series | pd.DataFrame Same type as ``fr``, with, if possible, a valid value for ``fr.index.freq``. """ # Handle non-datetime-indices. @@ -293,6 +260,5 @@ def set_to_frame( "The data does not have a datetime index and can therefore not have a frequency." ) - fr = fr.copy() - fr.index = set_to_index(fr.index, wanted, strict) - return fr + i = set_to_index(fr.index, wanted, strict) + return fr.set_axis(i, axis=0) diff --git a/portfolyo/tools/hedge.py b/portfolyo/tools/hedge.py new file mode 100644 index 0000000..b728bbc --- /dev/null +++ b/portfolyo/tools/hedge.py @@ -0,0 +1,114 @@ +"""Functionality to hedge an offtake profile with a price profile.""" + +from typing import Tuple + +import pandas as pd + +from . import duration as tools_duration +from . import intersect as tools_intersect +from . import peakconvert as tools_peakconvert +from . import peakfn as tools_peakfn +from . import trim as tools_trim +from . import wavg as tools_wavg + + +def one_hedge(df: pd.DataFrame, how: str) -> pd.Series: + """Hedge over all timestamps in dataframe. Dataframe must have columns + 'w', 'p', 'duration'. Returns Series with index 'w', 'p', with hedge values. + for the entire period.""" + # Prepare weights. + if how == "val": # value hedge + # solve for w_hedge: sum(w * duration * p) == w_hedge * sum(duration * p) + # so: w_hedge = sum(w * duration * p) / sum(duration * p) + weights = df["p"] * df["duration"] + else: # how == "vol": # volume hedge + # solve for w_hedge: sum(w * duration) == w_hedge * sum(duration) + # so: w_hedge = sum(w * duration) / sum(duration) + weights = df["duration"] + + p_hedge = tools_wavg.series(df["p"], df["duration"]) + w_hedge = tools_wavg.series(df["w"], weights) + return pd.Series({"w": w_hedge, "p": p_hedge}) + + +def hedge( + w: pd.Series, + p: pd.Series, + how: str = "val", + peak_fn: tools_peakfn.PeakFunction = None, + freq: str = "MS", +) -> Tuple[pd.Series, pd.Series]: + """ + Make hedge of power timeseries, for given price timeseries. + + Parameters + ---------- + w : Series + Power timeseries with spot market frequency. + p: Series + Price timeseries with same frequency. + how : str, optional (Default: 'val') + Hedge-constraint. 'vol' for volumetric hedge, 'val' for value hedge. + peak_fn : PeakFunction, optional (default: None) + Function that returns boolean Series indicating if timestamps in index lie in peak period. + If None, hedge with base products. + freq : {'D' (days), 'MS' (months), 'QS' (quarters), 'AS' (years)}, optional (default: 'MS') + Frequency of hedging products. E.g. 'QS' to hedge with quarter products. + + Returns + ------- + Tuple[Series, Series] + Power timeseries and price timeseries with hedge of ``w`` (with same index). + """ + if w.index.freq is None or p.index.freq is None: + raise ValueError( + "Parameters ``w`` and ``p`` must have a DatetimeIndex with a set frequency attribute." + ) + if w.index.freq != p.index.freq: + raise ValueError( + f"Parameters ``w`` and ``p`` must have same frequency; got {w.index.freq} and {p.index.freq}." + ) + if w.index.freq not in ["15T", "H", "D"]: + raise ValueError("Can only hedge a timeseries with daily (or shorter) values.") + if freq not in ["D", "MS", "QS", "AS"]: + raise ValueError( + f"Parameter ``freq`` must be one of 'D', 'MS', 'QS', 'AS'; got '{freq}'." + ) + if peak_fn is not None and not (w.index.freq in ["15T", "H"] and freq != "D"): + raise ValueError( + "Split into peak and offpeak only possible when (a) hedging with monthly (or " + "longer) products, and (b) if timeseries have hourly (or shorter) values." + ) + if how not in ["vol", "val"]: + raise ValueError(f"Parameter `how` must be 'val' or 'vol'; got {how}.") + + # Handle possible units. + win, wunits = (w.pint.magnitude, w.pint.units) if hasattr(w, "pint") else (w, None) + pin, punits = (p.pint.magnitude, p.pint.units) if hasattr(p, "pint") else (p, None) + + # Only keep full periods of overlapping timestamps. + + win, pin = tools_intersect.frames(win, pin) + dfin = tools_trim.frame(pd.DataFrame({"w": win, "p": pin}), freq) + if len(dfin) == 0: + return ( + dfin["w"], + dfin["p"], + ) # No full periods; don't do hedge; return empty series + + # Do actual hedge. + # . helper values + dfin["duration"] = tools_duration.index(dfin.index) + grouping = tools_peakconvert.group_index(dfin.index, peak_fn, freq) + # . calculation + vals = dfin.groupby(grouping).apply(lambda subdf: one_hedge(subdf, how)) + vals.index = pd.MultiIndex.from_tuples(vals.index) + # . broadcast to original timeseries + dfout = vals.loc[grouping, :].set_axis(dfin.index) + wout, pout = dfout["w"], dfout["p"] + + # Handle possible units. + if wunits or punits: + wout, pout = wout.astype(f"pint[{wunits}]"), pout.astype(f"pint[{punits}]") + + return wout, pout diff --git a/portfolyo/tools/intersect.py b/portfolyo/tools/intersect.py index fa940a2..c953d38 100644 --- a/portfolyo/tools/intersect.py +++ b/portfolyo/tools/intersect.py @@ -1,7 +1,13 @@ -from typing import List, Union +from datetime import datetime +from typing import List, Tuple import pandas as pd +from . import freq as tools_freq +from . import right as tools_right +from . import trim as tools_trim +from .types import Series_or_DataFrame + def indices(*idxs: pd.DatetimeIndex) -> pd.DatetimeIndex: """Intersect several DatetimeIndices. @@ -57,25 +63,168 @@ def indices(*idxs: pd.DatetimeIndex) -> pd.DatetimeIndex: return pd.DatetimeIndex(sorted(list(values)), freq=freq, name=name, tz=tz) +def indices_flex( + *idxs: pd.DatetimeIndex, + ignore_freq: bool = False, + ignore_tz: bool = False, + ignore_start_of_day: bool = False, +) -> Tuple[pd.DatetimeIndex]: + """Intersect several DatetimeIndices, but allow for more flexibility of ignoring + certain properties. + + Parameters + ---------- + *idxs : pd.DatetimeIndex + The indices to intersect. + ignore_freq: bool, optional (default: False) + If True, do the intersection even if the frequencies do not match; drop the + time periods that do not (fully) exist in either of the frames. + ignore_tz: bool, optional (default: False) + If True, ignore the timezones; perform the intersection using 'wall time'. + ignore_start_of_day: bool, optional (default: False) + If True, perform the intersection even if the frames have a different start-of-day. + The start-of-day of the original frames is preserved, even if the frequency is shorter + than daily. + + Returns + ------- + Tuple[pd.DatetimeIndex] + The intersection for each datetimeindex (in same order as input idxs). + + See also + -------- + indices + """ + if len(idxs) == 0: + raise ValueError("Must specify at least one index.") + + if len(idxs) == 1: + return idxs[0] + # convert tuple object into a list + idxs = list(idxs) + + # If we land here, we have at least 2 indices. + distinct_freqs = set([i.freq for i in idxs]) + if len(distinct_freqs) != 1 and ignore_freq is False: + raise ValueError(f"Indices must have equal frequencies; got {distinct_freqs}.") + + distinct_tzs = set([i.tz for i in idxs]) + if len(distinct_tzs) != 1 and ignore_tz is False: + raise ValueError(f"Indices must have equal timezones; got {distinct_tzs}.") + + empty_idx = [len(i) == 0 for i in idxs] + if any(empty_idx): + return pd.DatetimeIndex([]) + + # If we land here, we have at least 2 indices, all are not empty. + + distinct_sod = set([i[0].time() for i in idxs]) + if len(distinct_sod) != 1 and ignore_start_of_day is False: + raise ValueError(f"Indices must have equal start-of-day; got {distinct_sod}.") + for i in range(len(idxs)): + if len(distinct_sod) != 1 and tools_freq.up_or_down(idxs[i].freq, "D") == -1: + raise ValueError( + "Downsample all indices to daily-or-longer, or trim them so they have the same start-of-day, before attempting to calculate the intersection" + ) + + freq, name, tz = [], [], [] + for i in range(len(idxs)): + freq.append(idxs[i].freq) + name.append(idxs[i].name) + tz.append(idxs[i].tz) + + longest_freq = freq[0] + if ignore_freq is True and len(distinct_freqs) != 1: + # Find the longest frequency + longest_freq = tools_freq.longest(*freq) + # trim datetimeindex + for i in range(len(idxs)): + # if idxs[i].freq is not the same as longest freq, we trim idxs[i] + if idxs[i].freq != longest_freq: + idxs[i] = tools_trim.index(idxs[i], longest_freq) + + if ignore_tz is True and len(distinct_tzs) != 1: + # set timezone to none for all values + for i in range(len(idxs)): + idxs[i] = idxs[i].tz_localize(None) + + if ignore_start_of_day is True and len(distinct_sod) != 1: + # Save a copy of the original hours and minutes + start_of_day = [x[0].time() for x in idxs] + # Set the time components to midnight for each index in the list + idxs = [index.normalize() for index in idxs] + + # Calculation is cumbersome: pandas DatetimeIndex.intersection not working correctly on timezone-aware indices (#46702) + values = set(idxs[0]) + # intersection is not working on datetimeindex with different freq->we need to use mask + for i in idxs[1:]: + values = values.intersection(set(i)) + values = sorted(values) + + if len(values) == 0: + return tuple([pd.DatetimeIndex([]) for _ in idxs]) + + idxs_out = [] + for i in range(len(idxs)): + start = min(values) + # end = stamp(start, longest_freq._prefix) + end = max(values) + end = tools_right.stamp(end, longest_freq) + + if ignore_start_of_day is True: + start = datetime.combine(pd.to_datetime(start).date(), start_of_day[i]) + end = datetime.combine(pd.to_datetime(end).date(), start_of_day[i]) + # inclusive = "left" + + idxs_out.append( + pd.date_range( + start=start, + end=end, + freq=freq[i], + name=name[i], + tz=tz[i], + inclusive="left", + ) + ) + + return tuple(idxs_out) + + def frames( - *frames: Union[pd.Series, pd.DataFrame] -) -> List[Union[pd.Series, pd.DataFrame]]: + *frames: Series_or_DataFrame, + ignore_freq: bool = False, + ignore_tz: bool = False, + ignore_start_of_day: bool = False, +) -> List[Series_or_DataFrame]: """Intersect several dataframes and/or series. Parameters ---------- *frames : pd.Series and/or pd.DataFrame The frames to intersect. + ignore_freq: bool, optional (default: False) + If True, do the intersection even if the frequencies do not match; drop the + time periods that do not (fully) exist in either of the frames. + ignore_tz: bool, optional (default: False) + If True, ignore the timezones; perform the intersection using 'wall time'. + ignore_start_of_day: bool, optional (default: False) + If True, perform the intersection even if the frames have a different start-of-day. + The start-of-day of the original frames is preserved, even if the frequency is shorter + than daily. Returns ------- - list of series and/or dataframes - As input, but trimmed to their intersection. + As input, but trimmed to their intersection. Notes ----- The indices must have equal frequency, timezone, start-of-day. Otherwise, an error is raised. If there is no overlap, empty frames are returned. """ - common_index = indices(*[fr.index for fr in frames]) - return [fr.loc[common_index] for fr in frames] + new_idxs = indices_flex( + *[fr.index for fr in frames], + ignore_freq=ignore_freq, + ignore_tz=ignore_tz, + ignore_start_of_day=ignore_start_of_day, + ) + return [fr.loc[i] for i, fr in zip(new_idxs, frames)] diff --git a/portfolyo/tools/isboundary.py b/portfolyo/tools/isboundary.py index e6208ef..001a5e4 100644 --- a/portfolyo/tools/isboundary.py +++ b/portfolyo/tools/isboundary.py @@ -3,7 +3,7 @@ """ import datetime as dt -from typing import Union +from typing import overload import numpy as np import pandas as pd @@ -17,23 +17,59 @@ # i = pd.date_range('2020-01-01', freq='MS', periods=12) # i.is_year_start # array([False, False, False, False, False, False, False, False, False, False, False, True]) -def is_year_start(i: Union[pd.Timestamp, pd.DatetimeIndex]) -> Union[bool, np.ndarray]: +@overload +def is_year_start(i: pd.Timestamp) -> bool: + ... + + +@overload +def is_year_start(i: pd.DatetimeIndex) -> np.ndarray: + ... + + +def is_year_start(i: pd.Timestamp | pd.DatetimeIndex) -> bool | np.ndarray: return (i.day == 1) & (i.month == 1) -def is_quarter_start( - i: Union[pd.Timestamp, pd.DatetimeIndex] -) -> Union[bool, np.ndarray]: +@overload +def is_quarter_start(i: pd.Timestamp) -> bool: + ... + + +@overload +def is_quarter_start(i: pd.DatetimeIndex) -> np.ndarray: + ... + + +def is_quarter_start(i: pd.Timestamp | pd.DatetimeIndex) -> bool | np.ndarray: return (i.day == 1) & ((i.month - 1) % 3 == 0) -def is_month_start(i: Union[pd.Timestamp, pd.DatetimeIndex]) -> Union[bool, np.ndarray]: +@overload +def is_month_start(i: pd.Timestamp) -> bool: + ... + + +@overload +def is_month_start(i: pd.DatetimeIndex) -> np.ndarray: + ... + + +def is_month_start(i: pd.Timestamp | pd.DatetimeIndex) -> bool | np.ndarray: return i.day == 1 -def is_X_start( - i: Union[pd.Timestamp, pd.DatetimeIndex], freq: str -) -> Union[bool, np.ndarray]: +@overload +def is_X_start(i: pd.Timestamp) -> bool: + ... + + +@overload +def is_X_start(i: pd.DatetimeIndex) -> np.ndarray: + ... + + +def is_X_start(i: pd.Timestamp | pd.DatetimeIndex, freq: str) -> bool | np.ndarray: if freq == "MS": return is_month_start(i) elif freq == "QS": diff --git a/portfolyo/tools/peakconvert.py b/portfolyo/tools/peakconvert.py new file mode 100644 index 0000000..7729f64 --- /dev/null +++ b/portfolyo/tools/peakconvert.py @@ -0,0 +1,426 @@ +"""Module to convert between timeseries and base/peak/offpeak-values.""" + +import warnings + +import pandas as pd + +from . import changefreq as tools_changefreq +from . import duration as tools_duration +from . import freq as tools_freq +from . import peakfn as tools_peakfn +from . import trim as tools_trim +from . import wavg as tools_wavg + +BPO = ["base", "peak", "offpeak"] + + +def group_index( + i: pd.DatetimeIndex, peak_fn: tools_peakfn.PeakFunction, freq: str +) -> pd.MultiIndex: + """Multiindex, that is the same for all rows that belong to same delivery period.""" + # Grouping due to delivery period. + groups = [i.year] + if freq == "MS": + groups.append(i.month) + elif freq == "QS": + groups.append(i.quarter) + elif freq == "AS": + pass + else: + raise ValueError( + f"Parameter ``freq`` must be one of 'MS', 'QS', 'AS'; got '{freq}'." + ) + + # Add grouping due to peak. + if peak_fn is not None: + groups.append(peak_fn(i)) + + return pd.MultiIndex.from_arrays(groups) + + +def complete_bpoframe( + df: pd.DataFrame, peak_fn: tools_peakfn.PeakFunction, is_summable: bool = False +) -> pd.DataFrame: + """Complete a dataframe so it contains arbitrage-free base, peak, and offpeak values. + + Parameters + ---------- + df : DataFrame + With at least 2 of following columns: {'base', 'peak', 'offpeak'}. If all 3 are + present, no verification is done. Additional columns are dropped. DatetimeIndex + with freq in {'MS', 'QS', 'AS'}. + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. + is_summable : bool, optional (default: False) + True if data is summable, False if it is averagable. + + Returns + ------- + DataFrame + Same as ``df``, with all 3 columns ('base', 'peak', 'offpeak'). + + In: + + peak offpeak + ts_left + 2020-01-01 00:00:00+01:00 42.530036 30.614701 + 2020-02-01 00:00:00+01:00 33.295167 15.931557 + ... ... + 2020-11-01 00:00:00+01:00 49.110873 33.226004 + 2020-12-01 00:00:00+01:00 57.872246 35.055449 + 12 rows × 2 columns + + Out: + + base peak offpeak + ts_left + 2020-01-01 00:00:00+01:00 35.034906 42.530036 30.614701 + 2020-02-01 00:00:00+01:00 21.919009 33.295167 15.931557 + ... ... ... + 2020-11-01 00:00:00+01:00 38.785706 49.110873 33.226004 + 2020-12-01 00:00:00+01:00 43.519745 57.872246 35.055449 + 12 rows × 3 columns + """ + # Guard clauses. + found = [c for c in df if c in BPO] + if len(found) <= 1: # too few present + raise ValueError( + f"At least 2 of 'base', 'peak', 'offpeak' must be in columns; found {found}." + ) + elif len(found) == 3: # all present, nothing to do + return df[BPO] # correct order + + # Make copy of relevant columns, and fill. + df = df[found].copy() + if is_summable: + # Solve: peak + offpeak = base + if "peak" not in df: + df["peak"] = df["base"] - df["offpeak"] + elif "offpeak" not in df: + df["offpeak"] = df["base"] - df["peak"] + else: # 'base' not in df + df["base"] = df["peak"] + df["offpeak"] + else: + # Solve: peak * duration_peak + offpeak * duration_offpeak = base * duration_base + # (with: duration_offpeak = duration_base - duration_peak) + b = tools_duration.index(df.index).pint.m # as float + p = tools_peakfn.peak_duration(df.index, peak_fn).pint.m # as float + if "peak" not in df: + # df["peak"] = (df["base"] * b - df["offpeak"] * (b - p)) / p + df["peak"] = (df["base"] - df["offpeak"]) * b / p + df["offpeak"] + elif "offpeak" not in df: + df["offpeak"] = (df["base"] * b - df["peak"] * p) / (b - p) + else: # 'base' not in df + # df["base"] = (df["peak"] * p + df["offpeak"] * (b - p)) / b + df["base"] = (df["peak"] - df["offpeak"]) * p / b + df["offpeak"] + + return df[BPO] # correct order + + +def _tseries2po( + s: pd.Series, peak_fn: tools_peakfn.PeakFunction, is_summable: bool +) -> pd.Series: + """ + Aggregate timeseries with varying (float) values to a single base, peak and offpeak + (float) value. + + In: + + ts_left + 2020-01-01 00:00:00+01:00 41.88 + 2020-01-01 01:00:00+01:00 38.60 + 2020-01-01 02:00:00+01:00 36.55 + ... + 2020-12-31 21:00:00+01:00 52.44 + 2020-12-31 22:00:00+01:00 51.86 + 2020-12-31 23:00:00+01:00 52.26 + Freq: H, Name: p, Length: 8784, dtype: float64 + + Out: + + peak 51.363667 + offpeak 20.311204 + dtype: float64 + """ + is_peak = peak_fn(s.index) + duration = tools_duration.index(s.index).pint.m # floats + if is_summable: + return pd.Series( + { + "peak": s[is_peak].sum(), + "offpeak": s[~is_peak].sum(), + } + ) + else: + return pd.Series( + { + "peak": tools_wavg.series(s[is_peak], duration[is_peak]), + "offpeak": tools_wavg.series(s[~is_peak], duration[~is_peak]), + } + ) + + +def tseries2poframe( + s: pd.Series, + peak_fn: tools_peakfn.PeakFunction, + freq: str = "MS", + is_summable: bool = False, +) -> pd.DataFrame: + """ + Aggregate timeseries with varying values to a dataframe with peak and offpeak + timeseries, grouped by specified frequency. + + Parameters + ---------- + s : Series + Timeseries with hourly or quarterhourly frequency. + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. + freq : str, optional (default: 'MS') + Target frequency; monthly-or-longer. + is_summable : bool, optional (default: False) + True if data is summable, False if it is averagable. + + Returns + ------- + DataFrame + Dataframe with base, peak and offpeak values (as columns). Index: downsampled + timestamps at provided frequency. + + In: + + ts_left + 2020-01-01 00:00:00+01:00 41.88 + 2020-01-01 01:00:00+01:00 38.60 + 2020-01-01 02:00:00+01:00 36.55 + ... + 2020-12-31 21:00:00+01:00 52.44 + 2020-12-31 22:00:00+01:00 51.86 + 2020-12-31 23:00:00+01:00 52.26 + Freq: H, Name: p, Length: 8784, dtype: float64 + + Out: + + peak offpeak + ts_left + 2020-01-01 00:00:00+01:00 42.530036 30.614701 + 2020-02-01 00:00:00+01:00 33.295167 15.931557 + ... ... + 2020-11-01 00:00:00+01:00 49.110873 33.226004 + 2020-12-01 00:00:00+01:00 57.872246 35.055449 + 12 rows × 3 columns + """ + if tools_freq.up_or_down(freq, "MS") < 0: + raise ValueError(f"Parameter ``freq`` be monthly-or-longer; got '{freq}'.") + + # Remove partial data. + s = tools_trim.frame(s, freq) + + # Handle possible units. + sin, units = (s.pint.magnitude, s.pint.units) if hasattr(s, "pint") else (s, None) + + # Do calculations. + sout = sin.resample(freq, group_keys=True).apply( + lambda s: _tseries2po(s, peak_fn, is_summable) + ) + + # Handle possible units. + if units is not None: + sout = sout.astype(f"pint[{units}]") + return sout.unstack() # peak, offpeak as columns + + +def poframe2tseries( + df: pd.DataFrame, + peak_fn: tools_peakfn.PeakFunction, + freq: str = "H", + is_summable: bool = False, +) -> pd.Series: + """ + Convert a dataframe with peak and offpeak values, to a single timeseries. + + Parameters + ---------- + df : DataFrame + Dataframe with values. Columns must include at least {'peak', 'offpeak'}. + Datetimeindex with monthly-or-longer frequency. + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. + freq : str + Target frequency; short enough for ``peak_fn``. + is_summable : bool, optional (default: False) + True if data is summable, False if it is averagable. + + Returns + ------- + Series + Timeseries with values as provided in ``df``. + + In: + + peak offpeak + ts_left + 2020-01-01 00:00:00+01:00 42.530036 30.614701 + 2020-02-01 00:00:00+01:00 33.295167 15.931557 + ... ... + 2020-11-01 00:00:00+01:00 49.110873 33.226004 + 2020-12-01 00:00:00+01:00 57.872246 35.055449 + 12 rows × 2 columns + + Out: + + ts_left + 2020-01-01 00:00:00+01:00 30.614701 + 2020-01-01 01:00:00+01:00 30.614701 + 2020-01-01 02:00:00+01:00 30.614701 + ... + 2020-12-31 21:00:00+01:00 35.055449 + 2020-12-31 22:00:00+01:00 35.055449 + 2020-12-31 23:00:00+01:00 35.055449 + Freq: H, Length: 8784, dtype: float64 + """ + # Prep. + if "peak" not in df or "offpeak" not in df: # ensure peak and offpeak available + df = complete_bpoframe(df, peak_fn) + df = df[["peak", "offpeak"]] + + # Stretch the dataframe to higher frequency + if is_summable: + df2 = tools_changefreq.summable(df, freq) + else: + df2 = tools_changefreq.averagable(df, freq) + df2["ispeak"] = peak_fn(df2.index) # will raise error if frequency not short enough + + return df2["offpeak"].where(df2["ispeak"], df2["peak"]) + + +# def tseries2tseries( +# s: pd.Series, +# peak_fn: tools_peakfn.PeakFunction, +# freq: str = "MS", +# is_summable: bool = False, +# ) -> pd.Series: +# """ +# Transform timeseries (with possibly variable values) to one with (at certain +# frequency) uniform peak and offpeak values. +# +# Parameters +# ---------- +# s : Series +# Timeseries with hourly or quarterhourly frequency. +# peak_fn : PeakFunction, optional (default: None) +# Function that returns boolean Series indicating if timestamps in index lie in peak period. +# freq : {'MS' (month, default) 'QS' (quarter), 'AS' (year)} +# Target frequency within which peak and offpeak values will be uniform. +# is_summable : bool, optional (default: False) +# True if data is summable, False if it is averagable. +# +# Returns +# ------- +# Series +# Timeseries where each peak hour within the target frequency has the same +# value. Idem for offpeak hours. Index: as original series. +# +# In: +# +# ts_left +# 2020-01-01 00:00:00+01:00 41.88 +# 2020-01-01 01:00:00+01:00 38.60 +# 2020-01-01 02:00:00+01:00 36.55 +# ... +# 2020-12-31 21:00:00+01:00 52.44 +# 2020-12-31 22:00:00+01:00 51.86 +# 2020-12-31 23:00:00+01:00 52.26 +# Freq: H, Name: p, Length: 8784, dtype: float64 +# +# Out: +# +# ts_left +# 2020-01-01 00:00:00+01:00 30.614701 +# 2020-01-01 01:00:00+01:00 30.614701 +# 2020-01-01 02:00:00+01:00 30.614701 +# ... +# 2020-12-31 21:00:00+01:00 35.055449 +# 2020-12-31 22:00:00+01:00 35.055449 +# 2020-12-31 23:00:00+01:00 35.055449 +# Freq: H, Name: p, Length: 8784, dtype: float64 +# """ +# # Remove partial data. +# s = tools_trim.frame(s, freq) +# +# # Handle possible units. +# sin, units = (s.pint.magnitude, s.pint.units) if hasattr(s, "pint") else (s, None) +# +# # Calculate. +# # grouping will raise error if frequency not short enough +# grouping = group_arrays(sin.index, freq, peak_fn) +# fn = tools_changefreq.summable if is_summable else tools_changefreq.averagable +# sout = sin.groupby(grouping).transform( +# +# # Handle possible units. +# if units is not None: +# sout = sout.astype(f"pint[{units}]") +# return sout +# + + +def poframe2poframe( + df: pd.DataFrame, + peak_fn: tools_peakfn.PeakFunction, + freq: str = "AS", + is_summable: bool = False, +) -> pd.DataFrame: + """ + Convert a dataframe with peak and offpeak values to a similar dataframe + with a different frequency. + + Parameters + ---------- + df : DataFrame + Columns must include at least {'peak', 'offpeak'}. Datetimeindex with monthly- + or-longer frequency. + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. + freq : str, optional (default: 'AS') + Target frequency; monthly-or-longer. + is_summable : bool, optional (default: False) + True if data is summable, False if it is averagable. + + Returns + ------- + DataFrame + Dataframe with base, peak and offpeak values (as columns). Index: timestamps at + specified frequency. + + In: + + peak offpeak + ts_left + 2020-01-01 00:00:00+01:00 42.530036 30.614701 + 2020-02-01 00:00:00+01:00 33.295167 15.931557 + ... ... + 2020-11-01 00:00:00+01:00 49.110873 33.226004 + 2020-12-01 00:00:00+01:00 57.872246 35.055449 + 12 rows × 3 columns + + Out: + + peak offpeak + ts_left + 2020-01-01 00:00:00+01:00 38.003536 26.312894 + 2020-04-01 00:00:00+02:00 35.295167 20.681892 + 2020-07-01 00:00:00+02:00 44.033511 26.371498 + 2020-10-01 00:00:00+02:00 54.468722 31.063728 + """ + if tools_freq.up_or_down(freq, "MS") < 0: + raise ValueError(f"Parameter ``freq`` be monthly-or-longer; got '{freq}'.") + + if tools_freq.up_or_down(df.index.freq, freq) == 1: + warnings.warn( + "This conversion includes upsampling, e.g. from yearly to monthly values." + " The result will be uniform at the frequency of the original frame ``df``." + ) + + upsampled = poframe2tseries(df, peak_fn, "H", is_summable) + downsampled = tseries2poframe(upsampled, peak_fn, freq, is_summable) + return downsampled diff --git a/portfolyo/tools/peakperiod.py b/portfolyo/tools/peakfn.py similarity index 58% rename from portfolyo/tools/peakperiod.py rename to portfolyo/tools/peakfn.py index 3ce1bf1..7e933d7 100644 --- a/portfolyo/tools/peakperiod.py +++ b/portfolyo/tools/peakfn.py @@ -1,17 +1,20 @@ -""" -Module to work with peak and offpeak hours. -""" +""" Module to work with peak and offpeak periods. """ + import datetime as dt from typing import Callable, Iterable import numpy as np import pandas as pd +from . import changefreq as tools_changefreq +from . import duration as tools_duration from . import freq as tools_freq from . import right as tools_right PeakFunction = Callable[[pd.DatetimeIndex], pd.Series] +MIDNIGHT = dt.time(hour=0) + def factory( peak_left: dt.time = None, @@ -48,26 +51,25 @@ def factory( - If they are both None, each day is entirely peak or entirely offpeak. The function can be used for indices with a daily frequency or shorter. """ - midnight = dt.time(hour=0) if peak_left is None: - peak_left = midnight + peak_left = MIDNIGHT if peak_right is None: - peak_right = midnight + peak_right = MIDNIGHT if isoweekdays is None: isoweekdays = [1, 2, 3, 4, 5] # Characterize the input. - check_time = not (peak_left == midnight and peak_right == midnight) + must_check_time = not (peak_left == MIDNIGHT and peak_right == MIDNIGHT) weekday_count = sum(wd in isoweekdays for wd in (1, 2, 3, 4, 5, 6, 7)) - check_date = 0 < weekday_count < 7 - if not check_time and not check_date: + must_check_date = 0 < weekday_count < 7 + if not must_check_time and not must_check_date: raise ValueError( "Input specifies no special cases; all time periods included or all time periods " f"excluded; got {peak_left}-{peak_right} on {weekday_count} days of the week." ) # Find longest frequency for which peak and offpeak can be calculated - if not check_time: + if not must_check_time: longest_freq = "D" elif peak_left.minute == 0 and peak_right.minute == 0: longest_freq = "H" @@ -85,7 +87,7 @@ def filter_time(i: pd.DatetimeIndex) -> np.ndarray: time_left = i.time time_right = tools_right.index(i).time mask = True - if peak_left != midnight: + if peak_left != MIDNIGHT: cond1 = time_left >= peak_left cond2 = time_right > peak_left if any(offenders := ~cond1 & cond2): @@ -93,7 +95,7 @@ def filter_time(i: pd.DatetimeIndex) -> np.ndarray: f"Found timestamps that are partly peak and partly offpeak: {i[offenders]}" ) mask &= cond1 - if peak_right != midnight: + if peak_right != MIDNIGHT: cond1 = time_left < peak_right cond2 = time_right <= peak_right if any(offenders := cond1 & ~cond2): @@ -103,17 +105,81 @@ def filter_time(i: pd.DatetimeIndex) -> np.ndarray: mask &= cond1 return mask - def is_peakhour(i: pd.DatetimeIndex) -> pd.Series: + def peak_fn(i: pd.DatetimeIndex) -> pd.Series: # Check if function works for this frequency. if tools_freq.up_or_down(i.freq, longest_freq) > 0: raise ValueError( f"Peak periods can only be calculated for indices with frequency of {longest_freq} or shorter." ) mask = True - if check_time: + if must_check_time: mask &= filter_time(i) - if check_date: + if must_check_date: mask &= filter_date(i) return pd.Series(mask, i) - return is_peakhour + return peak_fn + + +def peak_duration(i: pd.DatetimeIndex, peak_fn: PeakFunction) -> pd.Series: + """ + Duration of peak periods in each element of a datetimeindex. + + Parameters + ---------- + i : pd.DatetimeIndex + Index for which to calculate the durations. May be in any frequency. + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. + + Returns + ------- + Series + with ``i`` as index, and duration of peak hours during each timeperiod in ``i``. + + Notes + ----- + ``peak_fn`` might only work on indices with daily-or-shorter, hourly-or-shorter, or + quarterhourly-or-shorter frequency. ``i`` is resampled to account for this; the returned + Series has the original index. + """ + eval_i = i # index to evaluate if peak or offpeak + for eval_freq in ("D", "H", "15T"): + if tools_freq.up_or_down(eval_i.freq, eval_freq) > 0: # upsampling necessary + eval_i = tools_changefreq.index(eval_i, eval_freq) + try: + eval_bool = peak_fn(eval_i) # boolean series + except ValueError: + pass # maybe we need to upsample more + else: + eval_duration = eval_bool * tools_duration.index(eval_i) # pint-series + return tools_changefreq.summable(eval_duration, i.freq).rename("duration") + + # Couldn't determine the duration. + raise ValueError( + "Couldn't calculate the duration of the peak period for the provided index." + ) + + +def offpeak_duration(i: pd.DatetimeIndex, peak_fn: PeakFunction) -> pd.Series: + """ + Duration of offpeak periods in each element of a datetimeindex. + + Parameters + ---------- + i : pd.DatetimeIndex + Index for which to calculate the durations. + peak_fn : PeakFunction + Function that returns boolean Series indicating if timestamps in index lie in peak period. + + Returns + ------- + Series + with ``i`` as index, and duration of offpeak hours during each timeperiod in ``i``. + + Notes + ----- + ``peak_fn`` might only work on indices with daily-or-shorter, hourly-or-shorter, or + quarterhourly-or-shorter frequency. ``i`` is resampled to account for this. + """ + return tools_duration.index(i) - peak_duration(i, peak_fn) diff --git a/portfolyo/tools/product.py b/portfolyo/tools/product.py new file mode 100644 index 0000000..c9fbb0e --- /dev/null +++ b/portfolyo/tools/product.py @@ -0,0 +1,67 @@ +"""Utilities for calculating / manipulating price data.""" + +import datetime as dt +from typing import Tuple + +import pandas as pd + +from . import floor as tools_floor +from . import peakfn as tools_peakfn +from . import right as tools_right + +germanpower_peakfn = tools_peakfn.factory(dt.time(8), dt.time(20), [1, 2, 3, 4, 5]) + + +def is_peak_hour(i: pd.DatetimeIndex) -> pd.Series: + raise DeprecationWarning( + "``pf.is_peak_hour`` has been deprecated and will be removed in a future version." + " Use ``pf.germanpower_peakfn`` instead, or create your own peak function with" + " ``pf.create_peakfn()``." + ) + + +def delivery_period( + ts_trade: pd.Timestamp, + period_type: str = "m", + front_count: int = 1, + start_of_day: dt.time = None, +) -> Tuple[pd.Timestamp, pd.Timestamp]: + """ + Find start and end of delivery period. + + Parameters + ---------- + ts_trade : pd.Timestamp + Trading day. The time part of the timestamp is ignored and assumed to be after + the start_of_day of the market. + period_type : {'d' (day), 'm' (month, default), 'q' (quarter), 's' (season), 'a' (year)} + front_count : int, optional (default: 1) + 1 = next/coming (full) period, 2 = period after that, etc. + start_of_day : dt.time, optional (default: midnight) + Start of day for delivery periods with a daily-or-longer frequency. + + Returns + ------- + (pd.Timestamp, pd.Timestamp) + Left (inclusive) and right (exclusive) timestamp of delivery period. + """ + ts_trade = ts_trade.replace(hour=23, minute=59) # ensure after start_of_day + if period_type in ["m", "q", "a"]: + freq = period_type.upper() + "S" + ts_left = tools_floor.stamp(ts_trade, freq, front_count, start_of_day) + ts_right = tools_right.stamp(ts_left, freq) + elif period_type == "d": + ts_left = tools_floor.stamp(ts_trade, "D", front_count, start_of_day) + ts_right = tools_right.stamp(ts_left, "D") + elif period_type == "s": + front_count_q = front_count * 2 - 1 + ts_left, ts_right = delivery_period(ts_trade, "q", front_count_q, start_of_day) + ts_right = tools_right.stamp(ts_right, "QS") # make 6 months long + if ts_left.month % 2 == 1: # season must start on even month + ts_left = tools_right.stamp(ts_left, "QS") + ts_right = tools_right.stamp(ts_right, "QS") + else: + raise ValueError( + f"Parameter ``period_type`` must be one of 'd', 'm', 'q', 's', 'a'; got '{period_type}'." + ) + return ts_left, ts_right diff --git a/portfolyo/tools/standardize.py b/portfolyo/tools/standardize.py index 93f32db..054811c 100644 --- a/portfolyo/tools/standardize.py +++ b/portfolyo/tools/standardize.py @@ -2,54 +2,57 @@ Standardizing series and dataframes to use as input for PfLine. """ -from typing import Union - import pandas as pd from pytz import AmbiguousTimeError, NonExistentTimeError from . import freq as tools_freq +from . import right as tools_right from . import righttoleft as tools_righttoleft from . import tzone as tools_tzone +from .types import Series_or_DataFrame -# TODO: remove 'Europe/Berlin' as default for ``tz``, use None instead. def frame( - fr: Union[pd.Series, pd.DataFrame], + fr: Series_or_DataFrame, force: str = None, bound: str = "left", *, - tz: str = "Europe/Berlin", + tz: str = None, floating: bool = True, - index_col: str = None, - force_freq: str = None, -) -> Union[pd.Series, pd.DataFrame]: +) -> Series_or_DataFrame: """Standardize a series or dataframe. Parameters ---------- fr : pd.Series or pd.DataFrame force : {'aware', 'agnostic'}, optional (default: None) - Force ``fr`` to be timezone aware or timezone agnostic. If None: keep index - as-is. + Force returned frame to be timezone aware or timezone agnostic. Timezone aware + means that the index has a timezone, like UTC or Europe/Berlin. Timezone agnostic + means that the index shows wall time with 24h days without DST. If None: keep + timezone as-is. bound : {'left', 'right'}, optional (default: 'left') - If 'left' ('right'), specifies that input timestamps are left-(right-)bound. + If 'right', specifies that input timestamps are right-bound, and will change to + left-bound. tz : str, optional (default: None) - The timezone in which to interpret non-localized values. If ``force`` == - 'aware': also the timezone to localize to. Ignored if ``force`` is None. + Timezone. Timezone to convert the values into and/or to interpret values in. + - If ``force`` is None, this argument is ignored. + - If the index is timezone agnostic and ``force`` is 'aware', the frame values + are interpreted as being in this timezone. E.g., if 'Europe/Berlin', the final + Sunday in March already has 23h; all that's needed is to set the timezone. + - If the index is timezone agnostic and ``force`` is 'agnostic', the same is + done, but followed with a conversion to timezone-agnostic frame. + - If the index is timezone aware and ``force`` is 'aware', the values are + converted to timezone ``tz``. See parameter ``floating``. + - If the index is timezone aware and ``force`` is 'agnostic', this argument is + ignored. floating : bool, optional (default: True) If ``force`` == 'aware': how to convert to ``tz`` if ``fr`` has other timezone. Keep local time (``floating`` == True) or keep universal time (``floating`` == False). Ignored if ``force`` == 'agnostic' or None. - index_col : str, optional - Column to create the timestamp from. Use existing index if none specified. - Ignored if ``fr`` is not a DataFrame. - force_freq : str, optional - If a frequency cannot be inferred from the data (e.g. due to gaps), it is - resampled at this frequency. Default: raise Exception. Returns ------- - Union[pd.Series, pd.DataFrame] + pd.Series | pd.DataFrame Same type as ``fr``, with a left-bound DatetimeIndex, a valid frequency, and wanted timezone. @@ -57,21 +60,16 @@ def frame( ----- It is assumed that we are dealing with "time-averable" data, such as values in [MW] or [Eur/MWh]. This is especially important when converting daily (and longer) values - between a tz-agnostic context and a tz-aware context with DST-transitions. + between a tz-agnostic context and a tz-aware context with DST-transitions. The value + on a 23-hour day is used as-is when convertintg to a 24-hour day. See also -------- ``portfolyo.force_aware`` ``portfolyo.force_agnostic`` """ - kwargs = {"tz": tz, "floating": floating, "force_freq": force_freq} - # Set index. - if index_col and isinstance(fr, pd.DataFrame): - fr = fr.set_index(index_col) - else: - fr = fr.copy() # don't change passed-in fr - fr.index = pd.DatetimeIndex(fr.index) # turn / try to turn into datetime + fr = fr.set_axis(pd.DatetimeIndex(fr.index)) # turn / try to turn into datetime # We want to cover 2 additional cases for convenience sake: # a. The user passes a frame that still needs to be localized (--> freq unknown) @@ -85,14 +83,7 @@ def frame( # The data may be right-bound. if bound == "right": # right -> left - for how in ["A", "B"]: - try: - fr_left = fr.set_axis(tools_righttoleft.index(fr.index, how)) - return frame(fr_left, force, "left", **kwargs) - except ValueError as e: - if how == "B": - raise ValueError("Cannot make this frame left-bound.") from e - pass + return _fix_rightbound(fr, force, tz, floating) # Now the data is left-bound. # If the frequency is not found, and it is tz-naive, the index may need to be localized. @@ -106,46 +97,23 @@ def frame( else: # Could be localized. Again remove localization if force == 'agnostic' or None. force_to = force or "agnostic" - return frame(fr_aware, force_to, "left", **kwargs) + return frame(fr_aware, force_to, "left", tz=tz, floating=floating) # All options to infer frequency have been exhausted. One may or may not have been found. # Does the user want to force a frequency? - if not freq_input and force_freq: - # No freq has been found, but user specifies which freq it should be. - fr_withfreq = fr.asfreq(force_freq) - return frame(fr_withfreq, force, "left", tz=tz, floating=floating) - - elif not freq_input and not force_freq: + if not freq_input: # No freq has been bound, and user specifies no freq either. raise ValueError( - "A frequency could not be inferred for this data. Force a frequency (by passing the" - " ``force_freq`` parameter), or localize the data in advance (with ``fr.tz_localize()``)." + "A frequency could not be inferred for this data. This can be because there are" + " gaps in the data (use ``fr.asfreq()`` to replace gaps with NaN), or because" + " the index must be localized (with ``fr.tz_localize()``)." ) - elif freq_input and force_freq and force_freq != freq_input: - # Freq has been found, but user specifies it should be a different freq. - raise ValueError( - f"This data seems to have a frequency {freq_input}, which is different from the frequency" - f" the user wants to force on it {force_freq}. Note that the ``force_freq`` parameter is" - " for filling gaps in the input data. It should not be used for resampling! If the" - " data has e.g. daily values but you want monthly values, use ``force_freq='D'``, and" - " pass the return value to one of the functions in the ``portfolyo.tools.changefreq`` module." - ) - - # Now the data has frequency set. It is tz-aware (possibly with wrong tz) or tz-agnostic. + # Now the data has frequency set. It is tz-aware (possibly with wrong tz) or tz-agnostic. # Fix timezone. - if force == "aware": - fr = tools_tzone.force_aware(fr, tz, floating=floating) - elif force == "agnostic" or force == "naive": - fr = tools_tzone.force_agnostic(fr) - elif force is None: # don't try to fix timezone. - pass - else: - raise ValueError( - f"Parameter ``force`` must be one of 'aware', 'agnostic'; got {force}." - ) + fr = _fix_timezone(fr, force, tz, floating) # Check if index is OK; otherwise raise error. try: @@ -154,12 +122,39 @@ def frame( raise ValueError("Could not standardize this frame") from e # Standardize index name. - fr.index.name = "ts_left" + fr = _standardize_index_name(fr) # After standardizing timezone, the frequency should have been set. - return tools_freq.set_to_frame(fr, freq_input, strict=force_freq) + return tools_freq.set_to_frame(fr, freq_input, strict=True) -def assert_frame_standardized(fr: Union[pd.Series, pd.DataFrame]): +def _fix_rightbound(fr, force, tz, floating): + for how in ["A", "B"]: + try: + i_left = tools_righttoleft.index(fr.index, how) + fr_left = fr.set_axis(i_left) + return frame(fr_left, force, "left", tz=tz, floating=floating) + except ValueError: + pass + raise ValueError("Cannot make this frame left-bound.") + + +def _fix_timezone(fr, force, tz, floating): + if force is None: + return fr + elif force == "aware": + return tools_tzone.force_aware(fr, tz, floating=floating) + elif force == "agnostic" or force == "naive": + return tools_tzone.force_agnostic(fr) + raise ValueError( + f"Parameter ``force`` must be None, 'aware' or 'agnostic'; got {force}." + ) + + +def _standardize_index_name(fr: Series_or_DataFrame) -> Series_or_DataFrame: + return fr.rename_axis(index="ts_left") + + +def assert_frame_standardized(fr: Series_or_DataFrame) -> None: """Assert that series or dataframe is standardized.""" assert_index_standardized(fr.index) @@ -189,7 +184,7 @@ def assert_index_standardized(i: pd.DatetimeIndex, __right: bool = False): if i[0].minute != startminute: err = ("right-bound", "15 min past the") if __right else ("", "at a full") raise AssertionError( - f"An index with {err[0]} quarterhourly values must start {err[1]} hour; found {i[0]}." + f"The first element in an index with {err[0]} quarterhourly values must be {err[1]} hour; found {i[0]}." ) if any(not_ok := [ts.minute not in (0, 15, 30, 45) for ts in i]): @@ -205,7 +200,20 @@ def assert_index_standardized(i: pd.DatetimeIndex, __right: bool = False): ) # Check time-of-day. - if tools_freq.up_or_down(freq, "D") >= 0: + if tools_freq.up_or_down(freq, "H") <= 0: # hour or shorter + if not __right: + start = i[0] + end = tools_right.stamp(i[-1], i.freq) + else: + start = tools_righttoleft.index(i)[0] + end = i[-1] + if start.time() != end.time(): + raise AssertionError( + "An index must contain full days. For hourly-or-shorter values, this means " + f"that the start time of the first period ({start}) must equal the end time of the " + f"last period ({end}), which is not the case." + ) + else: # days or longer if not len(times := set(i.time)) == 1: raise AssertionError( "In an index with daily-or-longer values, all timestamps (all periods) should" diff --git a/portfolyo/tools/startofday.py b/portfolyo/tools/startofday.py index 14c6af9..50e6cf7 100644 --- a/portfolyo/tools/startofday.py +++ b/portfolyo/tools/startofday.py @@ -2,16 +2,15 @@ Tools to get/set start-of-day. """ +import datetime as dt import pandas as pd + from . import freq as tools_freq -import datetime as dt -from typing import Union +from . import right as tools_right -def get( - i: pd.DatetimeIndex, returntype: str = "time" -) -> Union[dt.time, str, dt.timedelta]: +def get(i: pd.DatetimeIndex, returntype: str = "time") -> dt.time | str | dt.timedelta: """Get start-of-day of an index. Parameters @@ -25,7 +24,7 @@ def get( Returns ------- - Union[dt.time, str] + dt.time | str | dt.timedelta """ start_of_day = i[0].time() if returntype == "time": @@ -39,31 +38,51 @@ def get( ) -def set(i: pd.DatetimeIndex, start_of_day: dt.time = None) -> pd.DatetimeIndex: - """Set the start-of-day of an index by changing the time-part of the index elements. +def set(i: pd.DatetimeIndex, start_of_day: dt.time) -> pd.DatetimeIndex: + """Set the start-of-day of an index. Done by changing the time-part of the index + elements (if index has daily-or-longer frequency) or by trimming the index (if index + has hourly-or-shorter frequency). Parameters ---------- i : pd.DatetimeIndex - Index; must have a daily (or longer) frequency. - start_of_day : dt.time, optional (default: midnight) - The new time that replaces the time-part of index elements. + start_of_day : dt.time Returns ------- pd.DatetimeIndex - With adjusted time-part. Date-part is unchanged, so new timestamps are on same - calendar day as original timestamps. + With wanted start-of-day. """ - if tools_freq.up_or_down(i.freq, "D") < 0: - raise ValueError( - "Can only set the start-of-day of an index with daily (or longer) frequency." - ) - - if start_of_day is None: - start_of_day = dt.time(hour=0, minute=0, second=0) - elif start_of_day.second != 0 or start_of_day.minute % 15 != 0: + if start_of_day.second != 0 or start_of_day.minute % 15 != 0: raise ValueError("Start of day must coincide with a full quarterhour.") + if tools_freq.up_or_down(i.freq, "D") >= 0: + return _set_to_longfreq(i, start_of_day) + else: + return _set_to_shortfreq(i, start_of_day) + + +def _set_to_longfreq(i: pd.DatetimeIndex, start_of_day: dt.time) -> pd.DatetimeIndex: + """Set start-of-day of index with daily-or-longer frequency.""" tss = (ts.replace(hour=start_of_day.hour, minute=start_of_day.minute) for ts in i) return pd.DatetimeIndex(tss, freq=i.freq, tz=i.tz) + + +def _set_to_shortfreq(i: pd.DatetimeIndex, start_of_day: dt.time) -> pd.DatetimeIndex: + """Set start-of-day of index with hourly-or-shorter frequency. Destructive; values + at start and/or end of index are removed to get wanted start_of_day.""" + # Remove from start if necessary. + for _ in range(0, 100): # max 100 quarterhours in a day (@ end of DST) + if i[0].time() == start_of_day: + break + i = i[1:] + else: + raise ValueError("Did not find any timestamp with correct time at index start.") + # Remove from end if necessary. + for _ in range(0, 100): # max 100 quarterhours in a day (@ end of DST) + if tools_right.stamp(i[-1], i.freq).time() == start_of_day: + break + i = i[:-1] + else: + raise ValueError("Did not find any timestamp with correct time at index end.") + return i diff --git a/portfolyo/testing/testing.py b/portfolyo/tools/testing.py similarity index 76% rename from portfolyo/testing/testing.py rename to portfolyo/tools/testing.py index a90f901..b3a9933 100644 --- a/portfolyo/testing/testing.py +++ b/portfolyo/tools/testing.py @@ -6,8 +6,8 @@ import numpy as np import pandas as pd import pint -from .. import tools -from ..tools.unit import Q_ + +from . import unit as tools_unit def assert_value_equal(left: Any, right: Any): @@ -35,8 +35,8 @@ def assert_frame_equal(left: pd.DataFrame, right: pd.DataFrame, *args, **kwargs) @functools.wraps(pd.testing.assert_series_equal) def assert_series_equal(left: pd.Series, right: pd.Series, *args, **kwargs): - leftm, leftu = tools.unit.split_magn_unit(left) - rightm, rightu = tools.unit.split_magn_unit(right) + leftm, leftu = tools_unit.split_magn_unit(left) + rightm, rightu = tools_unit.split_magn_unit(right) # Magnitudes must be the same. leftm = leftm.replace([np.inf, -np.inf], np.nan) @@ -65,21 +65,21 @@ def assert_indices_compatible(left: pd.DatetimeIndex, right: pd.DatetimeIndex): def assert_w_q_compatible(freq: str, w: pd.Series, q: pd.Series): """Assert if timeseries with power- and energy-values are consistent.""" if freq == "15T": - assert_series_equal(q, w * Q_(0.25, "h"), check_names=False) + assert_series_equal(q, w * tools_unit.Q_(0.25, "h"), check_names=False) elif freq == "H": - assert_series_equal(q, w * Q_(1.0, "h"), check_names=False) + assert_series_equal(q, w * tools_unit.Q_(1.0, "h"), check_names=False) elif freq == "D": - assert (q >= w * Q_(22.99, "h")).all() - assert (q <= w * Q_(25.01, "h")).all() + assert (q >= w * tools_unit.Q_(22.99, "h")).all() + assert (q <= w * tools_unit.Q_(25.01, "h")).all() elif freq == "MS": - assert (q >= w * 27 * Q_(24.0, "h")).all() - assert (q <= w * 32 * Q_(24.0, "h")).all() + assert (q >= w * 27 * tools_unit.Q_(24.0, "h")).all() + assert (q <= w * 32 * tools_unit.Q_(24.0, "h")).all() elif freq == "QS": - assert (q >= w * 89 * Q_(24.0, "h")).all() - assert (q <= w * 93 * Q_(24.0, "h")).all() + assert (q >= w * 89 * tools_unit.Q_(24.0, "h")).all() + assert (q <= w * 93 * tools_unit.Q_(24.0, "h")).all() elif freq == "AS": - assert (q >= w * Q_(8759.9, "h")).all() - assert (q <= w * Q_(8784.1, "h")).all() + assert (q >= w * tools_unit.Q_(8759.9, "h")).all() + assert (q <= w * tools_unit.Q_(8784.1, "h")).all() else: raise ValueError(f"Uncaught value for freq: {freq}.") diff --git a/portfolyo/tools/trim.py b/portfolyo/tools/trim.py index bf34278..2322f86 100644 --- a/portfolyo/tools/trim.py +++ b/portfolyo/tools/trim.py @@ -2,15 +2,15 @@ Trim objects to only contain 'full' delivery periods. """ -from typing import Union +from typing import overload import pandas as pd from . import ceil as tools_ceil from . import floor as tools_floor from . import freq as tools_freq -from . import startofday as tools_startofday from . import right as tools_right +from . import startofday as tools_startofday def index(i: pd.DatetimeIndex, freq: str) -> pd.DatetimeIndex: @@ -47,21 +47,29 @@ def index(i: pd.DatetimeIndex, freq: str) -> pd.DatetimeIndex: return i[mask_start & mask_end] -def frame( - fr: Union[pd.Series, pd.DataFrame], freq: str -) -> Union[pd.Series, pd.DataFrame]: +@overload +def frame(fr: pd.Series, freq: str) -> pd.Series: + ... + + +@overload +def frame(fr: pd.DataFrame, freq: str) -> pd.DataFrame: + ... + + +def frame(fr: pd.Series | pd.DataFrame, freq: str) -> pd.Series | pd.DataFrame: f"""Trim index of series or dataframe to only keep full periods of certain frequency. Parameters ---------- - fr : Union[pd.Series, pd.DataFrame] + fr : Series or DataFrame The (untrimmed) pandas series or dataframe. freq : {{{', '.join(tools_freq.FREQUENCIES)}}} Frequency to trim to. E.g. 'MS' to only keep full months. Returns ------- - Union[pd.Series, pd.DataFrame] + Series or DataFrame Subset of ``fr``, with same frequency. Notes diff --git a/portfolyo/tools/types.py b/portfolyo/tools/types.py new file mode 100644 index 0000000..5e9ba5d --- /dev/null +++ b/portfolyo/tools/types.py @@ -0,0 +1,7 @@ +"""Help the type checker.""" + +from typing import TypeVar + +import pandas as pd + +Series_or_DataFrame = TypeVar("Series_or_DataFrame", pd.Series, pd.DataFrame) diff --git a/portfolyo/tools/tzone.py b/portfolyo/tools/tzone.py index 41d563a..6a2b381 100644 --- a/portfolyo/tools/tzone.py +++ b/portfolyo/tools/tzone.py @@ -1,11 +1,10 @@ """Tools to deal with timezones.""" -from typing import Union - import pandas as pd import pytz from . import freq as tools_freq +from .types import Series_or_DataFrame """ (hourly means: hourly or shorter) @@ -56,8 +55,8 @@ def force_aware( - fr: Union[pd.Series, pd.DataFrame], tz: str, *, floating: bool = True -) -> Union[pd.Series, pd.DataFrame]: + fr: Series_or_DataFrame, tz: str, *, floating: bool = True +) -> Series_or_DataFrame: """Convert/set series or dataframe to a specific timezone. Parameters @@ -136,9 +135,7 @@ def force_aware( return fr_out -def force_agnostic( - fr: Union[pd.Series, pd.DataFrame] -) -> Union[pd.Series, pd.DataFrame]: +def force_agnostic(fr: Series_or_DataFrame) -> Series_or_DataFrame: """Turn a frame (series or dataframe) into timezone-agnostic frame. Parameters @@ -195,9 +192,7 @@ def force_agnostic( return fr_out -def _A_to_A( - fr: Union[pd.Series, pd.DataFrame], *, tz, floating -) -> Union[pd.Series, pd.DataFrame]: +def _A_to_A(fr: Series_or_DataFrame, *, tz: str, floating: bool) -> Series_or_DataFrame: if isinstance(tz, str): # convert to make comparison (below) possible tz = pytz.timezone(tz) @@ -215,17 +210,15 @@ def _A_to_A( return _B_to_A(_A_to_B(fr), tz=tz) -def _A_to_B(fr: Union[pd.Series, pd.DataFrame]) -> Union[pd.Series, pd.DataFrame]: +def _A_to_B(fr: Series_or_DataFrame) -> Series_or_DataFrame: return _aware_to_agnostic(fr) -def _B_to_A( - fr: Union[pd.Series, pd.DataFrame], *, tz -) -> Union[pd.Series, pd.DataFrame]: +def _B_to_A(fr: Series_or_DataFrame, *, tz) -> Series_or_DataFrame: return _agnostic_to_aware(fr, tz) -def _idx_after_conversion(fr: Union[pd.Series, pd.DataFrame], tz) -> pd.DatetimeIndex: +def _idx_after_conversion(fr: Series_or_DataFrame, tz) -> pd.DatetimeIndex: fr = tools_freq.set_to_frame(fr) freq_input = fr.index.freq if not freq_input: @@ -238,9 +231,7 @@ def _idx_after_conversion(fr: Union[pd.Series, pd.DataFrame], tz) -> pd.Datetime return idx -def _agnostic_to_aware( - fr: Union[pd.Series, pd.DataFrame], tz: str -) -> Union[pd.Series, pd.DataFrame]: +def _agnostic_to_aware(fr: Series_or_DataFrame, tz: str) -> Series_or_DataFrame: """Recalculate values in tz-agnostic series or dataframe, to get a tz-aware one. (i.e., B to A).""" if tz_input := fr.index.tz: @@ -263,9 +254,7 @@ def _agnostic_to_aware( return fr.loc[mapping_onto_input_index].set_axis(idx_out) -def _aware_to_agnostic( - fr: Union[pd.Series, pd.DataFrame] -) -> Union[pd.Series, pd.DataFrame]: +def _aware_to_agnostic(fr: Series_or_DataFrame) -> Series_or_DataFrame: """Recalculate values in tz-aware series or dataframe, to get a tz-agnostic one. (i.e., A to B).""" if not fr.index.tz: diff --git a/portfolyo/tools/unit.py b/portfolyo/tools/unit.py index b6175a7..6da956a 100644 --- a/portfolyo/tools/unit.py +++ b/portfolyo/tools/unit.py @@ -3,7 +3,7 @@ """ from pathlib import Path -from typing import Tuple, Union +from typing import Tuple, overload import pandas as pd import pint @@ -53,9 +53,29 @@ def from_name(name: str) -> pint.Unit: raise ValueError(f"No standard unit found for name '{name}'.") +@overload +def defaultunit(val: int | float) -> float: + ... + + +@overload +def defaultunit(val: pint.Quantity) -> pint.Quantity: + ... + + +@overload +def defaultunit(val: pd.Series) -> pd.Series: + ... + + +@overload +def defaultunit(val: pd.DataFrame) -> pd.DataFrame: + ... + + def defaultunit( - val: Union[int, float, pint.Quantity, pd.Series, pd.DataFrame], -) -> Union[float, pint.Quantity, pd.Series, pd.DataFrame]: + val: int | float | pint.Quantity | pd.Series | pd.DataFrame, +) -> float | pint.Quantity | pd.Series | pd.DataFrame: """Convert ``val`` to base units. Also turns dimensionless values into floats. Parameters @@ -101,15 +121,26 @@ def defaultunit( raise TypeError("``val`` must be an int, float, Quantity, Series, or DataFrame.") +@overload +def split_magn_unit(val: int | float) -> Tuple[float, None]: + ... + + +@overload +def split_magn_unit(val: pint.Quantity) -> Tuple[float, None | pint.Unit]: + ... + + +@overload +def split_magn_unit( + val: pd.Series, +) -> Tuple[pd.Series, None | pint.Unit | pd.Series]: + ... + + def split_magn_unit( - val: Union[int, float, pint.Quantity, pd.Series] -) -> Union[ - Tuple[float, None], - Tuple[float, pint.Unit], - Tuple[pd.Series, None], - Tuple[pd.Series, pint.Unit], - Tuple[pd.Series, pd.Series], -]: + val: int | float | pint.Quantity | pd.Series, +) -> Tuple[float, None | pint.Unit] | Tuple[pd.Series, None | pint.Unit | pd.Series]: """Split ``val`` into magnitude and units. If ``val`` is a Series with uniform dimension, the unit is returned as a pint Unit. If not, it is returned as a Series. """ diff --git a/portfolyo/visualize/__init__.py b/portfolyo/tools/visualize/__init__.py similarity index 76% rename from portfolyo/visualize/__init__.py rename to portfolyo/tools/visualize/__init__.py index 0cb9e32..bfbe431 100644 --- a/portfolyo/visualize/__init__.py +++ b/portfolyo/tools/visualize/__init__.py @@ -1,9 +1,8 @@ from .colors import Color, Colors from .plot import ( - plot_timeseries, + PlotTimeseriesToAxFunction, plot_timeseries_as_area, plot_timeseries_as_bar, plot_timeseries_as_hline, - plot_timeseries_as_jagged, plot_timeseries_as_step, ) diff --git a/portfolyo/visualize/categories.py b/portfolyo/tools/visualize/categories.py similarity index 93% rename from portfolyo/visualize/categories.py rename to portfolyo/tools/visualize/categories.py index 7fc7efa..0136710 100644 --- a/portfolyo/visualize/categories.py +++ b/portfolyo/tools/visualize/categories.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -from typing import Any, Iterable, Union +from typing import Any, Iterable import numpy as np import pandas as pd -from .. import tools +from .. import unit as tools_unit @dataclass @@ -35,16 +35,16 @@ def categories(self, max_count: int = None) -> Iterable[Category]: def _get_subset(self, attr: str, max_count: int = None) -> Iterable: values = [getattr(cat, attr) for cat in self.categories(max_count)] - if not isinstance(values[0], tools.unit.Q_): + if not isinstance(values[0], tools_unit.Q_): return np.array(values) unit = values[0].units magnitudes = [value.to(unit).m for value in values] - return tools.unit.PA_(magnitudes, unit) + return tools_unit.PA_(magnitudes, unit) def x(self, max_count: int = None) -> Iterable[int]: return self._get_subset("x", max_count) - def y(self, max_count: int = None) -> Iterable[Union[float, tools.unit.Q_]]: + def y(self, max_count: int = None) -> Iterable[float | tools_unit.Q_]: return self._get_subset("y", max_count) def ts(self, max_count: int = None) -> Iterable[pd.Timestamp]: diff --git a/portfolyo/visualize/colors.py b/portfolyo/tools/visualize/colors.py similarity index 61% rename from portfolyo/visualize/colors.py rename to portfolyo/tools/visualize/colors.py index 28be08e..3a86c12 100644 --- a/portfolyo/visualize/colors.py +++ b/portfolyo/tools/visualize/colors.py @@ -2,6 +2,7 @@ import colorsys from collections import namedtuple +from enum import Enum import matplotlib as mpl import numpy as np @@ -18,7 +19,7 @@ def lighten(self, value): def darken(self, value): """Darken the color by fraction ``value`` (between 0 and 1).""" - return self.lighten(self, -value) + return self.lighten(-value) light = property(lambda self: self.lighten(0.3)) xlight = property(lambda self: self.lighten(0.6)) @@ -27,20 +28,22 @@ def darken(self, value): class Colors: - class General: - PURPLE = Color(0.549, 0.110, 0.706) - GREEN = Color(0.188, 0.463, 0.165) - BLUE = Color(0.125, 0.247, 0.600) - ORANGE = Color(0.961, 0.533, 0.114) - RED = Color(0.820, 0.098, 0.114) - YELLOW = Color(0.945, 0.855, 0.090) - LBLUE = Color(0.067, 0.580, 0.812) - LGREEN = Color(0.325, 0.773, 0.082) - BLACK = Color(0, 0, 0) - WHITE = Color(1, 1, 1) + class General(Enum): + DARK_BURGUNDY = Color(0.2667, 0.0000, 0.0745) + BROWN_SUGAR = Color(0.3765, 0.2902, 0.1804) + DUSTY_GRAY = Color(0.5529, 0.5176, 0.3765) + MOONSTONE = Color(0.7647, 0.7569, 0.6118) + CORAL = Color(0.9608, 0.3412, 0.4980) + ORANGE = Color(0.9608, 0.5098, 0.1140) + RED = Color(0.8196, 0.0980, 0.1137) + YELLOW = Color(0.9451, 0.8549, 0.0902) + LBLUE = Color(0.0667, 0.5804, 0.8118) + LGREEN = Color(0.3255, 0.7725, 0.0824) + BLACK = Color(0.0000, 0.0000, 0.0000) + WHITE = Color(1.0000, 1.0000, 1.0000) class Wqpr: # Standard colors when plotting a portfolio w = Color(*mpl.colors.to_rgb("#0E524F")).lighten(0.15) q = Color(*mpl.colors.to_rgb("#0E524F")) r = Color(*mpl.colors.to_rgb("#8B7557")) - p = Color(*mpl.colors.to_rgb("#E53454")) + p = Color(*mpl.colors.to_rgb("#cd3759")) diff --git a/portfolyo/tools/visualize/plot.py b/portfolyo/tools/visualize/plot.py new file mode 100644 index 0000000..09c27f4 --- /dev/null +++ b/portfolyo/tools/visualize/plot.py @@ -0,0 +1,324 @@ +""" +Visualize portfolio lines, etc. +""" + +from typing import Callable + +import matplotlib as mpl +import pandas as pd +from matplotlib import pyplot as plt + +from .. import freq as tools_freq +from .. import unit as tools_unit +from .categories import Categories +from .colors import Colors + +mpl.style.use("seaborn-v0_8") + +# Plotting philosophy for timeseries: +# Not all plot types (bar, line, step, etc.) are suitable for all quantities. +# +# Data dimensionality vs plot type +# -------------------------------- +# +# For data that represents an *aggregated* value for each period, like [MWh], [Eur], it +# makes sense to plot the x-axis as *categories*, i.e., without taking the duration of +# each period into consideration. Jan and Feb have distinct durations, but are shown +# identically. This data is best plotted as bars, but markers (e.g. short horizontal lines) +# are also possible. +# +# For data that can be integrated over time (like [MW]), it makes sense to plot the +# x-axis as a *timeline*, with each datapoint having its correct duration. E.g., for monthly +# values: Jan taking up more x-space than Feb. This data can be plotted as a hline, step, +# or area graph. The area graph underlines that the area under the curve has a meaning; +# in this case, MWh. +# +# For data that is neither (like [Eur/MWh]), both categorical and timeline plots can be +# used, though the area graph does not make much sense. +# +# +# Frequency vs plot type +# ---------------------- +# +# A categorical x-axis loses its clarity if there are many datapoints. We are most +# commonly dealing with timeseries spanning at least a quarter. If this data is plotted +# with a frequency of daily or shorter, the number of datapoints is very high, and we should +# try to use timeline x-axis. This means that we cannot (easily) plot [MWh] and [Eur] values, +# and by default we should only plot [MW] and [Eur/MWh] values. +# If the data is plotted with a frequency of monthly or longer, we usually want to see +# aggregated values and must therefore plot on categorical x-axes. This means we cannot +# (easily) plot [MW] values, and by default we should only plot [MWh] and [Eur/MWh] values. +# +# +# This module is able to plot all graph types on both timeline x-axis and on categorical +# x-axis, and add the data labels if there are not too many. It is up to the caller to +# pick the correct graph type. +# + +MAX_XLABELS = 15 + + +class ContinuousValuesNotSupported(Exception): + pass + + +class CategoricalValuesNotSupported(Exception): + pass + + +PlotTimeseriesToAxFunction = Callable[[plt.Axes, pd.Series, ...], None] + +docstringliteral_plotparameters = """ +Other parameters +---------------- +labelfmt : str, optional (default: '') + Labels are added to each datapoint in the specified format. ('' to add no labels) +**kwargs : any formatting are passed to the Axes plot method being used.""" + + +def append_to_doc(text): + def decorator(fn): + fn.__doc__ += f"\n{text}" + return fn + + return decorator + + +@append_to_doc(docstringliteral_plotparameters) +def plot_timeseries_as_bar( + ax: plt.Axes, + s: pd.Series, + labelfmt: str = "", + width: float = 0.8, + **kwargs, +) -> None: + """Plot timeseries ``s`` to axis ``ax``, as bars. + On plots with categorical (i.e, non-continuous) time axis.""" + if not is_categorical(s): + raise ContinuousValuesNotSupported( + "This plot is not compatible with continous values" + ) + check_ax_s_compatible(ax, s) + s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) + + categories = Categories(s) + ax.bar(categories.x(), categories.y(), width=width, **kwargs) + ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) + set_data_labels( + ax, categories.x(MAX_XLABELS), categories.y(MAX_XLABELS), labelfmt, True + ) + ax.autoscale() + + +@append_to_doc(docstringliteral_plotparameters) +def plot_timeseries_as_area( + ax: plt.Axes, + s: pd.Series, + labelfmt: str = "", + **kwargs, +) -> None: + """Plot timeseries ``s`` to axis ``ax``, as stepped area between 0 and value. + On plots with continuous (i.e., non-categorical) time axis.""" + if is_categorical(s): + raise CategoricalValuesNotSupported( + "This plot is not compatible with categorical values" + ) + check_ax_s_compatible(ax, s) + s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) + + splot = s.copy() # modified with additional (repeated) datapoint + splot[splot.index.right[-1]] = splot.values[-1] + + bottom = [0.0 for i in range(0, splot.size)] + # make bottom into pintarray + bottom = bottom * splot.values[0].units + + ax.fill_between( + splot.index, + bottom, + [sum(x) for x in zip(bottom, splot.values)], + step="post", + **kwargs, + ) + delta = s.index.right - s.index + set_data_labels(ax, s.index + 0.5 * delta, s.values, labelfmt, True) + ax.autoscale() + + +@append_to_doc(docstringliteral_plotparameters) +def plot_timeseries_as_step( + ax: plt.Axes, s: pd.Series, labelfmt: str = "", **kwargs +) -> None: + """Plot timeseries ``s`` to axis ``ax``, as stepped line (horizontal and vertical lines). + On plots with continuous (i.e., non-categorical) time axis.""" + if is_categorical(s): + raise CategoricalValuesNotSupported( + "This plot is not compatible with categorical values" + ) + check_ax_s_compatible(ax, s) + s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) + + splot = s.copy() # modified with additional (repeated) datapoint + splot[splot.index.right[-1]] = splot.values[-1] + + ax.step(splot.index, splot.values, where="mid", **kwargs) + delta = s.index.right - s.index + set_data_labels(ax, s.index + 0.5 * delta, s.values, labelfmt, True) + ax.autoscale() + + +@append_to_doc(docstringliteral_plotparameters) +def plot_timeseries_as_hline( + ax: plt.Axes, s: pd.Series, labelfmt: str = "", **kwargs +) -> None: + """Plot timeseries ``s`` to axis ``ax``, as horizontal lines. + On plots with categorical (i.e., non-continuous) time axis.""" + if not is_categorical(s): + raise ContinuousValuesNotSupported( + "This plot is not compatible with continous time axis" + ) + check_ax_s_compatible(ax, s) + s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) + categories = Categories(s) + # Center around x-tick: + ax.hlines(categories.y(), categories.x() - 0.4, categories.x() + 0.4, **kwargs) + ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) + set_data_labels(ax, categories.x(), categories.y(), labelfmt, True) + ax.autoscale() + # Adjust the margins around the plot + ax.margins(x=0.2, y=0.2) + + +def set_portfolyo_attr(ax, name, val): + """ + Sets attribute ax._portfolyo which is a dictionary: ._portfolyo = {'unit': ..., 'freq': ..., ...} + If dictionary doesn't exist yet, creates an empty dictionary + """ + pattr = getattr(ax, "_portfolyo", {}) + pattr[name] = val + setattr(ax, "_portfolyo", pattr) + + +def get_portfolyo_attr(ax, name, default_val=None): + """ + Gets values from dictionary ax._portfolyo, if it doesn't exist returns None. + """ + pattr = getattr(ax, "_portfolyo", {}) + return pattr.get(name, default_val) + + +def is_categorical(s: pd.Series) -> bool: + """The function checks whether frequency of panda Series falls into continous or categorical group""" + return tools_freq.up_or_down(s.index.freq, "D") == 1 + + +def prepare_ax_and_s(ax: plt.Axes, s: pd.Series, unit=None) -> pd.Series: + """Ensure axes ``ax`` has unit associated with it and checks compatibility with series + ``s``. Also sets y label as unit abbreviation. + + Notes + ----- + - If axes already has unit, convert series to same unit. If not, convert series to pint + base units and set that as axis unit. Assumes that series with float or int values is + dimensionless. + - Changes ``ax`` in-place. + - In order to plot in not-base-units, provide a custom value for the ``unit`` parameter + when calling this function for the first time for a given ``ax``. Ignored on subsequent + calls and a unit is already associated with the axes. + """ + # Make sure series has pint unit. + if s.dtype == float or s.dtype == int: + s = s.astype("pint[1]") + # Find preexisting unit. + axunit = get_portfolyo_attr(ax, "unit", None) + + # Axes already has unit. Convert series to that unit; ignore any supplied custom unit. + if axunit is not None: + if axunit.dimensionality != s.pint.dimensionality: # check compatibilty + raise ValueError( + f"Cannot plot series with units {s.pint.units} on axes with units {axunit}." + ) + return s.astype(f"pint[{axunit}]") + + # Axes does not have unit. + if unit is not None: + # Custom unit is provided. Convert series to that unit. + if unit.dimensionality != s.pint.dimensionality: # check compatibility + raise ValueError( + f"Cannot convert series with units {s.pint.units} to units {unit}." + ) + s = s.astype(unit) + set_portfolyo_attr(ax, "unit", unit) + else: + # No custom unit provided. Convert series to base units. + s = s.pint.to_base_units() + set_portfolyo_attr(ax, "unit", s.pint.units) + # Get unit attribute + unit = get_portfolyo_attr(ax, "unit") + name_unit = tools_unit.to_name(unit) + # Define color mapping based on 'Wqpr' class attributes + unit_colors = { + "w": Colors.Wqpr.w, + "q": Colors.Wqpr.q, + "r": Colors.Wqpr.r, + "p": Colors.Wqpr.p, + } + # Set default color if name_unit not found + default_color = "white" + # Get background color based on name_unit + background_color = unit_colors.get(name_unit, default_color) + ax.set_ylabel(f"{unit:~P}", backgroundcolor=background_color.lighten(0.3)) + return s + + +def check_ax_s_compatible(ax: plt.Axes, s: pd.Series): + """Ensure axes ``ax`` has frequency associated with it and checks compatibility with series + ``s``. + If axes `ax`` has frequency, compare to pd.Series frequency. If they are equal, return s, if not equal, return error. + If axes `ax`` doesn't have frequency, assign frequency of s to it. + """ + # Find preexisting frequency. + axfreq = get_portfolyo_attr(ax, "freq", None) + series_freq = s.index.freq + # Axes does not have frequency. + if axfreq is None: + set_portfolyo_attr(ax, "freq", series_freq) + else: + if get_portfolyo_attr(ax, "freq") != series_freq: + raise AttributeError( + "The frequency of PFLine is not compatible with current axes" + ) + + +def set_data_labels( + ax: plt.Axes, xx, yy, labelfmt, outside: bool = False, maxcount: int = 24 +): + """Add labels to axis ``ax``, at locations (``xx``, ``yy``), formatted with + ``labelfmt``. Don't add labels if more than ``maxcount`` datapoints. If ``outside``, + put labels of negative values *below* the datapoint.""" + # Don't label if no formatting speficied. + if not labelfmt: + return + # Don't label if too many numbers. + if len(xx) > maxcount: + return + + # Add labels. + for x, y in zip(xx, yy): + lbl = labelfmt.format(y.magnitude).replace(",", " ") + xytext = (0, -10) if outside and y.magnitude < 0 else (0, 10) + ax.annotate( + lbl, + (x, y), + textcoords="offset points", + xytext=xytext, + ha="center", + va="top" if y.magnitude < 0 else "bottom", + rotation=90, + ) + + # Increase axis range to give label space to stay inside box. + miny, maxy = ax.get_ylim() + delta = 0.5 + miny2, maxy2 = (1 + delta) * miny - delta * maxy, (1 + delta) * maxy - delta * miny + ax.set_ylim(miny2, maxy2) diff --git a/portfolyo/tools/wavg.py b/portfolyo/tools/wavg.py index add0d43..6b01092 100644 --- a/portfolyo/tools/wavg.py +++ b/portfolyo/tools/wavg.py @@ -1,4 +1,4 @@ -from typing import Iterable, Mapping, Union +from typing import Iterable, Mapping, overload import numpy as np import pandas as pd @@ -13,64 +13,80 @@ # Developer notes: # The following behaviour is wanted in calculating the weighted average: -# weights values rule | result +# weights values rule result # sum of weights != 0 -# 1, -1, 2 10, 20, 30 normal | (10*1 + 20*-1 + 30*2 ) / (1 + -1 + 2) -# 1, -1, 2 10, NaN, 30 NaN if values include NaN | NaN -# 1, 0, 2 10, NaN, 30 ignore NaN if weight = 0 | (10*1 + 30*2) / (1 + 2) +# 1, -1, 2 10, 20, 30 "normal" (10*1 + 20*-1 + 30*2 ) / (1 + -1 + 2) +# 1, -1, 2 10, NaN, 30 NaN if values include NaN NaN +# 1, 0, 2 10, NaN, 30 ignore NaN if weight = 0 (10*1 + 30*2) / (1 + 2) # --> Remove all values for which weight == 0. # --> If remaining values conain NaN --> result is NaN. # --> Otherwise, calculate the result normally. # sum of weights == 0 but not all 0 -# 1, 1, -2 10, 20, 30 Inf if values distinct | Inf -# 1, 1, -2 10, 10, 10 value if values identical | 10 -# 1, -1, 0 10, 10, 30 ignore value if weight = 0 | 10 -# 1, 1, -2 10, 10, NaN NaN if values include NaN | NaN (done) -# 1, -1, 0 10, 10, NaN ignore NaN if weight = 0 | 10 -# 1, -1, 0 NaN, NaN, NaN NaN if values are all NaN | NaN +# 1, 1, -2 10, 20, 30 NaN if values distinct NaN +# 1, 1, -2 10, 10, 10 value if values identical 10 +# 1, -1, 0 10, 10, 30 ignore value if weight = 0 10 +# 1, 1, -2 10, 10, NaN NaN if values include NaN NaN +# 1, -1, 0 10, 10, NaN ignore NaN if weight = 0 10 +# 1, -1, 0 NaN, NaN, NaN NaN if values are all NaN NaN # --> Remove all values for which weight == 0. # --> If remaining values contain NaN --> result is NaN # --> Otherwise, if remaining values are identical --> result is that value # --> Otherwise, result is Inf. # all weights are 0 -# 0, 0, 0 10, 20, 30 Inf if values distinct | Inf -# 0, 0, 0 10, 10, 10 value if values identical | 10 -# 0, 0, 0 10, 10, NaN NaN if values include NaN | NaN +# 0, 0, 0 10, 20, 30 NaN if values distinct NaN +# 0, 0, 0 10, 10, 10 Value if values identical 10 +# 0, 0, 0 10, 10, NaN NaN if values include NaN NaN # --> If values contain NaN --> result is NaN # --> Otherwise, if values are identical --> result is that value -# --> Otherwise, result is Inf. +# --> Otherwise, result is NaN. RESULT_IF_WEIGHTSUM0_VALUESNOTUNIFORM = np.nan +@overload +def general( + fr: pd.Series, weights: Iterable | Mapping | pd.Series = None, axis: int = 0 +) -> float: + ... + + +@overload +def general( + fr: pd.DataFrame, + weights: Iterable | Mapping | pd.Series | pd.DataFrame = None, + axis: int = 0, +) -> pd.Series: + ... + + def general( - fr: Union[pd.Series, pd.DataFrame], - weights: Union[Iterable, pd.Series, pd.DataFrame] = None, + fr: pd.Series | pd.DataFrame, + weights: Iterable | Mapping | pd.Series | pd.DataFrame = None, axis: int = 0, -) -> Union[pd.Series, float]: +) -> float | tools_unit.Q_ | pd.Series: """ Weighted average of series or dataframe. Parameters ---------- - fr : Union[pd.Series, pd.DataFrame] + fr : pd.Series | pd.DataFrame The input values. - weights : Union[Iterable, pd.Series, pd.DataFrame], optional - The weights. If provided as a Series, the weights and values are aligned along - its index. If no weights are provided, the normal (unweighted) average is returned - instead. + weights : Iterable | Mapping | pd.Series | pd.DataFrame, optional + The weights. If provided as a Mapping or Series, the weights and values + are aligned along its index. If no weights are provided, the normal + (unweighted) average is returned instead. axis : int, optional Calculate each column's average over all rows (if axis==0, default) or each row's average over all columns (if axis==1). Ignored for Series. Returns ------- - Union[pd.Series, float] - The weighted average. A single float if `fr` is a Series; a Series if - `fr` is a Dataframe. + float | Q_ | pd.Series + The weighted average. A single float or single Quantitiy if ``fr`` is a Series; + a Series if ``fr`` is a Dataframe. """ if isinstance(fr, pd.DataFrame): return dataframe(fr, weights, axis) @@ -83,8 +99,8 @@ def general( def series( - s: pd.Series, weights: Union[Iterable, Mapping, pd.Series] = None -) -> Union[float, tools_unit.Q_]: + s: pd.Series, weights: Iterable | Mapping | pd.Series = None +) -> float | tools_unit.Q_: """ Weighted average of series. @@ -92,14 +108,14 @@ def series( ---------- s : pd.Series The input values. - weights : Union[Iterable, Mapping, pd.Series], optional + weights : Iterable | Mapping | pd.Series, optional The weights. If provided as a Mapping or Series, the weights and values are aligned along their indices/keys. If no weights are provided, the normal (unweighted) average is returned instead. Returns ------- - Union[float, Quantity] + float | Quantity The weighted average. Notes @@ -117,6 +133,11 @@ def series( s = s.loc[weights.index] except KeyError as e: # more weights than values raise ValueError("No values found for one or more weights.") from e + + # Unweighted average if all weights the same but not all 0. + if weights.nunique() == 1 and not np.isclose(weights.iloc[0], 0): + return s.mean() + # Replace NaN with 0 in locations where it doesn't change the result. replaceable = s.isna() & (weights == 0.0) s[replaceable] = 0.0 @@ -153,7 +174,7 @@ def series( def dataframe( df: pd.DataFrame, - weights: Union[Iterable, Mapping, pd.Series, pd.DataFrame] = None, + weights: Iterable | Mapping | pd.Series | pd.DataFrame = None, axis: int = 0, ) -> pd.Series: """ @@ -163,7 +184,7 @@ def dataframe( ---------- df : pd.DataFrame The input values. - weights : Union[Iterable, Mapping, pd.Series, pd.DataFrame], optional + weights : Iterable | Mapping | pd.Series | pd.DataFrame, optional The weights. If provided as a Series or Mapping, its index are is used for alignment (with ``df``'s index if axis==0, or its columns if axis==1). If no weights are provided, the normal (unweighted) average is returned instead. @@ -306,8 +327,8 @@ def dataframe_columnwavg_with_weightsseries( def _dataframe_columnwavg_with_weightssumnot0( df: pd.DataFrame, - weights: Union[pd.Series, pd.DataFrame], - weightssum: Union[float, tools_unit.Q_, pd.Series], + weights: pd.Series | pd.DataFrame, + weightssum: float | tools_unit.Q_ | pd.Series, ) -> Iterable[pd.Series]: # Calculate the weighted average if sum of weights != 0. weight_is0 = weights == 0.0 @@ -320,7 +341,7 @@ def _dataframe_columnwavg_with_weightssumnot0( def _dataframe_columnwavg_with_weightssum0notall0( - df: pd.DataFrame, weights: Union[pd.Series, pd.DataFrame] + df: pd.DataFrame, weights: pd.Series | pd.DataFrame ) -> Iterable[pd.Series]: # Calculate the weighted average if sum of weights == 0, but not all weights are 0. @@ -399,7 +420,7 @@ def rowvalue_uniformity(df: pd.DataFrame) -> pd.Series: # or uniform NaN, this value/NaN is found in buffer. uniform = pd.Series(True, df.index) buffer = pd.Series(np.nan, df.index) # define to ensure exists even if df empty - for i, (c, s) in enumerate(df.items()): + for i, (_, s) in enumerate(df.items()): if i == 0: # define here to ensure ``values`` has pint dtype if df does too to_type = float if pd.api.types.is_integer_dtype(s.dtype) else s.dtype @@ -416,9 +437,7 @@ def rowvalue_uniformity(df: pd.DataFrame) -> pd.Series: return buffer -def weights_as_series( - weights: Union[Iterable, Mapping], refindex: Iterable -) -> pd.Series: +def weights_as_series(weights: Iterable | Mapping, refindex: Iterable) -> pd.Series: if isinstance(weights, pd.Series): return weights if isinstance(weights, Mapping): diff --git a/portfolyo/tools2/changeyear.py b/portfolyo/tools2/changeyear.py new file mode 100644 index 0000000..b3274ab --- /dev/null +++ b/portfolyo/tools2/changeyear.py @@ -0,0 +1,79 @@ +"""Map series with quarterhourly, hourly, or daily values onto another index or year, +trying to align weekdays, holidays, and dst-changeover days. Always takes values from +same calender month (but different year).""" + +import warnings + +from .. import tools +from ..core.pfline import Kind, PfLine, Structure + + +def map_to_year(pfl: PfLine, year: int, holiday_country: str) -> PfLine: + """Transfer the data to a hypothetical other year. + + Parameters + ---------- + pfl : PfLine + Portfolio line that must be mapped. + year : int + Year to transfer the data to. + holiday_country : str, optional (default: None) + Country or region for which to assume the holidays. E.g. 'DE' (Germany), 'NL' + (Netherlands), or 'USA'. See ``holidays.list_supported_countries()`` for + allowed values. + + Returns + ------- + PfLine + + Notes + ----- + Useful for daily (and shorter) data. Copies over the data but takes weekdays (and + holidays) of target year into consideration. See ``portfolyo.map_frame_as_year()`` + for more information. + Inaccurate for monthly data and longer, because we only have one value per month, + and can therefore not take different number of holidays/weekends (i.e., offpeak + hours) into consideration. + """ + + # Guard clause. + if tools.freq.shortest(pfl.index.freq, "MS") == "MS": + warnings.warn( + "This PfLine has a monthly frequency or longer; changing the year is inaccurate, as" + " details (number of holidays, weekends, offpeak hours, etc) cannot be taken into account." + ) + + # Do mapping. + + if pfl.structure is Structure.NESTED: + return PfLine( + { + name: map_to_year(child, year, holiday_country) + for name, child in pfl.items() + } + ) + + # pfl is FlatPfLine. + + if pfl.kind is Kind.VOLUME: + df = pfl.dataframe( + "w" + ) # Averageble data to allow mapping unequal-length periods + df2 = tools.changeyear.map_frame_to_year(df, year, holiday_country) + elif pfl.kind is Kind.PRICE: + df = pfl.dataframe( + "p" + ) # Averageble data to allow mapping unequal-length periods + df2 = tools.changeyear.map_frame_to_year(df, year, holiday_country) + elif pfl.kind is Kind.REVENUE: + # Assume that revenue is scales proportionately with duration of period. + # E.g. 290 Eur in leapyear Feb --> 280 Eur in non-leapyear Feb. + df = pfl.dataframe("r") + df *= tools.duration.index(df.index) # Make averageble + df2 = tools.changeyear.map_frame_to_year(df, year, holiday_country) + df2 /= tools.duration.index(df2.index) # Make summable again + else: # CompletePfLine + df = pfl.dataframe(["w", "p"]) # Averagable + df2 = tools.changeyear.map_frame_to_year(df, year, holiday_country) + + return PfLine(df2) diff --git a/portfolyo/tools2/concat.py b/portfolyo/tools2/concat.py new file mode 100644 index 0000000..ff13e1b --- /dev/null +++ b/portfolyo/tools2/concat.py @@ -0,0 +1,150 @@ +# import pandas as pd +# import portfolyo as pf +from __future__ import annotations + +from typing import Iterable + +import pandas as pd + +from .. import tools +from ..core import pfstate +from ..core.pfline import PfLine, create +from ..core.pfline.enums import Structure +from ..core.pfstate import PfState + + +def general(pfl_or_pfs: Iterable[PfLine | PfState]) -> None: + """ + Based on passed parameters calls either concat_pflines() or concat_pfstates(). + + Parameters + ---------- + pfl_or_pfs: Iterable[PfLine | PfState] + The input values. Can be either a list of Pflines or PfStates to concatenate. + + Returns + ------- + None + + Notes + ----- + Input portfolio lines must contain compatible information, i.e., same frequency, + timezone, start-of-day, and kind. Their indices must be gapless and without overlap. + + For nested pflines, the number and names of their children must match; concatenation + is done on a name-by-name basis. + + Concatenation returns the same result regardless of input order. + + """ + if all(isinstance(item, PfLine) for item in pfl_or_pfs): + return concat_pflines(pfl_or_pfs) + elif all(isinstance(item, PfState) for item in pfl_or_pfs): + return concat_pfstates(pfl_or_pfs) + else: + raise NotImplementedError( + "Concatenation is implemented only for PfState or PfLine." + ) + + +def concat_pflines(pfls: Iterable[PfLine]) -> PfLine: + """ + Concatenate porfolyo lines along their index. + + Parameters + ---------- + pfls: Iterable[PfLine] + The input values. + + Returns + ------- + PfLine + Concatenated version of PfLines. + + Notes + ----- + Input portfolio lines must contain compatible information, i.e., same frequency, + timezone, start-of-day, and kind. Their indices must be gapless and without overlap. + + For nested pflines, the number and names of their children must match; concatenation + is done on a name-by-name basis. + + Concatenation returns the same result regardless of input order. + """ + if len(pfls) < 2: + raise NotImplementedError( + "Cannot perform operation with less than 2 portfolio lines." + ) + if len({pfl.kind for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different kinds.") + if len({pfl.index.freq for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different frequencies.") + if len({pfl.index.tz for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different time zones.") + if len({tools.startofday.get(pfl.index, "str") for pfl in pfls}) != 1: + raise TypeError( + "Not possible to concatenate PfLines of different start_of_day." + ) + # we can concatenate only pflines of the same type: nested of flat + # with this test and check whether pfls are the same types and they have the same number of children + if len({pfl.structure for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different structures.") + if pfls[0].structure is Structure.NESTED: + child_names = pfls[0].children.keys() + for pfl in pfls: + diffs = set(child_names) ^ set(pfl.children.keys()) + if len(diffs) != 0: + raise TypeError( + "Not possible to concatenate PfLines with different children names." + ) + # If we reach here, all pfls have same kind, same number and names of children. + + # concat(a,b) and concat(b,a) should give the same result: + sorted_pfls = sorted(pfls, key=lambda pfl: pfl.index[0]) + if pfls[0].structure is Structure.FLAT: + # create flat dataframe of parent + dataframes_flat = [pfl.df for pfl in sorted_pfls] + # concatenate dataframes into one + concat_data = pd.concat(dataframes_flat, axis=0) + try: + # Call create.flatpfline() and catch any ValueError + return create.flatpfline(concat_data) + except ValueError as e: + # Handle the error + raise ValueError( + "Error by creating PfLine. PfLine is either not gapless or has overlaps" + ) from e + child_data = {} + child_names = pfls[0].children.keys() + for cname in child_names: + # for every name in children need to concatenate elements + child_values = [pfl.children[cname] for pfl in sorted_pfls] + child_data[cname] = concat_pflines(child_values) + + # create pfline from dataframes: -> + # call the constructor of pfl to check check gaplesnes and overplap + return create.nestedpfline(child_data) + + +def concat_pfstates(pfss: Iterable[PfState]) -> PfState: + """ + Concatenate porfolyo states along their index. + + Parameters + ---------- + pfss: Iterable[PfState] + The input values. + + Returns + ------- + PfState + Concatenated version of PfStates. + + """ + if len(pfss) < 2: + print("Concatenate needs at least two elements.") + return + offtakevolume = concat_pflines([pfs.offtakevolume for pfs in pfss]) + sourced = concat_pflines([pfs.sourced for pfs in pfss]) + unsourcedprice = concat_pflines([pfs.unsourcedprice for pfs in pfss]) + return pfstate.PfState(offtakevolume, unsourcedprice, sourced) diff --git a/portfolyo/tools2/intersect.py b/portfolyo/tools2/intersect.py new file mode 100644 index 0000000..41d2278 --- /dev/null +++ b/portfolyo/tools2/intersect.py @@ -0,0 +1,44 @@ +from typing import List + +from ..tools import intersect as tools_intersect +from .types import Indexable + + +def indexable( + *objs: Indexable, + ignore_freq: bool = False, + ignore_tz: bool = False, + ignore_start_of_day: bool = False, +) -> List[Indexable]: + """Intersect several dataframes and/or series. + + Parameters + ---------- + *objs : pd.Series and/or pd.DataFrame and/or PfLines and/or PfStates + The indexable objects to intersect. + ignore_freq: bool, optional (default: False) + If True, do the intersection even if the frequencies do not match; drop the + time periods that do not (fully) exist in either of the frames. + ignore_tz: bool, optional (default: False) + If True, ignore the timezones; perform the intersection using 'wall time'. + ignore_start_of_day: bool, optional (default: False) + If True, perform the intersection even if the frames have a different start-of-day. + The start-of-day of the original frames is preserved, even if the frequency is shorter + than daily. + + Returns + ------- + As input, but trimmed to their intersection. + + Notes + ----- + The indices must have equal frequency, timezone, start-of-day. Otherwise, an error + is raised. If there is no overlap, empty frames are returned. + """ + new_idxs = tools_intersect.indices_flex( + *[o.index for o in objs], + ignore_freq=ignore_freq, + ignore_tz=ignore_tz, + ignore_start_of_day=ignore_start_of_day, + ) + return [o.loc[i] for i, o in zip(new_idxs, objs)] diff --git a/portfolyo/tools2/plot.py b/portfolyo/tools2/plot.py new file mode 100644 index 0000000..9117b36 --- /dev/null +++ b/portfolyo/tools2/plot.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +from typing import Dict + +import matplotlib +import numpy as np +from matplotlib import pyplot as plt + +from .. import tools +from ..core.pfline.plot import defaultkwargs +from ..core.pfstate import PfState +from ..tools import visualize as vis + + +def plot_pfstates(dic: Dict[str, PfState], freq: str = "MS") -> plt.Figure: + """Plot multiple PfState instances. + + Parameters + ---------- + dic : Dict[str, PfState] + Dictionary with PfState instances as values, and their names as the keys. + + Returns + ------- + plt.Figure + The figure object to which the instances were plotted. + """ + + gridspec = {"width_ratios": [0.3, 1, 1], "height_ratios": [4, 1] * len(dic)} + figsize = (15, 5 * len(dic)) + fig, axes = plt.subplots(len(dic) * 2, 3, gridspec_kw=gridspec, figsize=figsize) + axesgroups = axes.flatten().reshape((len(dic), 6)) + + # Share x axes. + sharex = axesgroups[:, (1, 2, 4)].flatten() + for ax1, ax2 in zip(sharex[1:], sharex[:-1]): + ax1.sharex(ax2) + # Share y axes. + sharey = axesgroups[:, 2] + for ax1, ax2 in zip(sharey[1:], sharey[:-1]): + ax1.sharey(ax2) + + # TODO: resample all to have same index (frequency and length). + + for i, ((pfname, pfs), axes) in enumerate(zip(dic.items(), axesgroups)): + # If freq is MS or longer: use categorical axes. Plot volumes in MWh. + # If freq is D or shorter: use time axes. Plot volumes in MW. + is_category = tools.freq.shortest(pfs.index.freq, "MS") == "MS" + + # Portfolio name. + axes[0].text( + 0, + 1, + pfname.replace(" ", "\n"), + fontsize=12, + fontweight="bold", + verticalalignment="top", + horizontalalignment="left", + ) + axes[0].axis("off") + + # Volumes. + if is_category: + s, kwargs = -1 * pfs.offtakevolume.q, defaultkwargs("q", is_category) + else: + s, kwargs = -1 * pfs.offtakevolume.w, defaultkwargs("w", is_category) + vis.plot_timeseries(axes[1], s, **kwargs) + + # Sourced fraction. + vis.plot_timeseries( + axes[2], pfs.sourcedfraction, **defaultkwargs("f", is_category) + ) + + # Empty. + axes[3].axis("off") + + # Procurement Price. + vis.plot_timeseries(axes[4], pfs.pnl_cost.p, **defaultkwargs("p", is_category)) + + # Empty. + axes[5].axis("off") + + # Tick formatting. + axes[2].yaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1.0)) + axes[1].yaxis.set_major_formatter( + matplotlib.ticker.FuncFormatter( + lambda x, p: "{:,.0f}".format(x).replace(",", " ") + ) + ) + + for a, ax in enumerate(axes): + if i == 0 and a in [1, 2]: + ax.xaxis.set_tick_params(labelbottom=False, labeltop=True, pad=25) + else: + ax.xaxis.set_tick_params(labelbottom=False, labeltop=False) + + if i == 0: + axes[1].set_title("Offtake Volume &\nprocurement price", y=1.27) + axes[2].set_title("Sourced fraction", y=1.27) + + return + draw_horizontal_lines(fig, axes) # draw horizontal lines between portfolios + + +def draw_horizontal_lines(fig, axes): + """Function to draw horizontal lines between multiple portfolios. + This function does not return anything, but tries to plot a 2D line after every 2 axes, eg. + after (0,2), (0,4),... beacuse each portfolio requires 2x4 axes in the fig (where rows=2, columns=4). + + Parameters + ---------- + fig : plt.subplots() + axes : plt.subplots() + """ + # rearange the axes for no overlap + fig.tight_layout() + + # Get the bounding boxes of the axes including text decorations + r = fig.canvas.get_renderer() + bboxes = np.array( + [ + ax.get_tightbbox(r).transformed(fig.transFigure.inverted()) + for ax in axes.flat + ], + matplotlib.transforms.Bbox, + ).reshape(axes.shape) + + """TO CORRECT: the horizontal line is not exactly in the middle of two graphs. + It is more inclined towards the second or next graph in the queue. + Each pftstate has 4x4 grid and this is plotted in the same graph, but as subgraphs. + """ + + # Get the minimum and maximum extent, get the coordinate half-way between those + ymax = ( + np.array(list(map(lambda b: b.y1, bboxes.flat))).reshape(axes.shape).max(axis=1) + ) + ymin = ( + np.array(list(map(lambda b: b.y0, bboxes.flat))).reshape(axes.shape).min(axis=1) + ) + ys = np.c_[ymax[2:-1:2], ymin[1:-2:2]].mean(axis=1) + ys = [ymax[0], *ys] + + # Draw a horizontal lines at those coordinates + for y in ys: + line = plt.Line2D([0, 1], [y, y], transform=fig.transFigure, color="black") + fig.add_artist(line) diff --git a/portfolyo/tools2/types.py b/portfolyo/tools2/types.py new file mode 100644 index 0000000..8805c4d --- /dev/null +++ b/portfolyo/tools2/types.py @@ -0,0 +1,12 @@ +"""Help the type checker.""" + +from typing import TypeVar + +import pandas as pd + +from ..core.pfline import PfLine +from ..core.pfstate import PfState + +Indexable = TypeVar( + "Series_DataFrame_PfLine_PfState", pd.Series, pd.DataFrame, PfLine, PfState +) diff --git a/portfolyo/visualize/plot.py b/portfolyo/visualize/plot.py deleted file mode 100644 index bfdba2f..0000000 --- a/portfolyo/visualize/plot.py +++ /dev/null @@ -1,331 +0,0 @@ -""" -Visualize portfolio lines, etc. -""" - -import matplotlib as mpl -import numpy as np -import pandas as pd -from matplotlib import pyplot as plt - -from .. import tools -from .categories import Categories, Category # noqa - -mpl.style.use("seaborn-v0_8") - -# Plotting philosophy for timeseries: -# Not all plot types (bar, line, step, etc.) are suitable for all quantities. -# -# Data dimensionality vs plot type -# -------------------------------- -# -# For data that represents an *aggregated* value for each period, like [MWh], [Eur], it -# makes sense to plot the x-axis as *categories*, i.e., without taking the duration of -# each period into consideration. Jan and Feb have distinct durations, but are shown -# identically. This data is best plotted as bars, but markers (e.g. short horizontal lines) -# are also possible. -# -# For data that can be integrated over time (like [MW]), it makes sense to plot the -# x-axis as a *timeline*, with each datapoint having its correct duration. E.g., for monthly -# values: Jan taking up more x-space than Feb. This data can be plotted as a hline, step, -# or area graph. The area graph underlines that the area under the curve has a meaning; -# in this case, MWh. -# -# For data that is neither (like [Eur/MWh]), both categorical and timeline plots can be -# used, though the area graph does not make much sense. -# -# -# Frequency vs plot type -# ---------------------- -# -# A categorical x-axis loses its clarity if there are many datapoints. We are most -# commonly dealing with timeseries spanning at least a quarter. If this data is plotted -# with a frequency of daily or shorter, the number of datapoints is very high, and we should -# try to use timeline x-axis. This means that we cannot (easily) plot [MWh] and [Eur] values, -# and by default we should only plot [MW] and [Eur/MWh] values. -# If the data is plotted with a frequency of monthly or longer, we usually want to see -# aggregated values and must therefore plot on categorical x-axes. This means we cannot -# (easily) plot [MW] values, and by default we should only plot [MWh] and [Eur/MWh] values. -# -# -# This module is able to plot all graph types on both timeline x-axis and on categorical -# x-axis, and add the data labels if there are not too many. It is up to the caller to -# pick the correct graph type. -# - -MAX_XLABELS = 20 - - -def use_categories(ax: plt.Axes, s: pd.Series, cat: bool = None) -> bool: - """Determine if plot should be made with category axis (True) or datetime axis (False).""" - # We use categorical data if... - if (ax.lines or ax.collections or ax.containers) and ax.xaxis.have_units(): - return True # ...ax already has category axis; or - elif cat is None and tools.freq.shortest(s.index.freq, "MS") == "MS": - return True # ...it's the default for the given frequency; or - elif cat is True: - return True # ...user wants it. - return False - - -docstringliteral_plotparameters = """ -Other parameters ----------------- -labelfmt : str, optional (default: '') - Labels are added to each datapoint in the specified format. ('' to add no labels) -cat : bool, optional - If False, plots x-axis as timeline with timestamps spaced according to their - duration. If True, plots x-axis categorically, with timestamps spaced equally. - Disregarded if ``ax`` already has values (then: use whatever is already set). - Default: use True if ``s`` has a monthly frequency or longer, False if the frequency - is shorter than monthly. -**kwargs : any formatting are passed to the Axes plot method being used.""" - - -def append_to_doc(text): - def decorator(fn): - fn.__doc__ += f"\n{text}" - return fn - - return decorator - - -@append_to_doc(docstringliteral_plotparameters) -def plot_timeseries_as_jagged( - ax: plt.Axes, s: pd.Series, labelfmt: str = "", cat: bool = None, **kwargs -) -> None: - """Plot timeseries ``s`` to axis ``ax``, as jagged line and/or as markers. Use kwargs - ``linestyle`` and ``marker`` to specify line style and/or marker style. (Default: line only). - """ - s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) - - if use_categories(ax, s, cat): - categories = Categories(s) - ax.plot(categories.x(), categories.y(), **kwargs) - ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) - set_data_labels(ax, categories.x(), categories.y(), labelfmt, False) - - else: - ax.plot(s.index, s.values, **kwargs) - set_data_labels(ax, s.index, s.values, labelfmt, False) - - -@append_to_doc(docstringliteral_plotparameters) -def plot_timeseries_as_bar( - ax: plt.Axes, s: pd.Series, labelfmt: str = "", cat: bool = None, **kwargs -) -> None: - """Plot timeseries ``s`` to axis ``ax``, as bars. Ideally, only used for plots with - categorical (i.e, non-time) x-axis.""" - s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) - - if use_categories(ax, s, cat): - categories = Categories(s) - ax.bar(categories.x(), categories.y(), 0.8, **kwargs) - ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) - set_data_labels(ax, categories.x(), categories.y(), labelfmt, True) - - else: - # Bad combination: bar graph on time-axis. But allow anyway. - - # This is slow if there are many elements. - # x = s.index + 0.5 * (s.index.right - s.index) - # width = pd.Timedelta(hours=s.index.duration.median().to("h").magnitude * 0.8) - # ax.bar(x.values, s.values, width, **kwargs) - - # This is faster. - delta = s.index.right - s.index - x = np.array(list(zip(s.index + 0.1 * delta, s.index + 0.9 * delta))).flatten() - magnitudes = np.array([[v, 0] for v in s.values.quantity.magnitude]).flatten() - values = tools.unit.PA_(magnitudes, s.values.quantity.units) - ax.fill_between(x, 0, values, step="post", **kwargs) - - set_data_labels(ax, s.index + 0.5 * delta, s.values, labelfmt, True) - - -@append_to_doc(docstringliteral_plotparameters) -def plot_timeseries_as_area( - ax: plt.Axes, s: pd.Series, labelfmt: str = "", cat: bool = None, **kwargs -) -> None: - """Plot timeseries ``s`` to axis ``ax``, as stepped area between 0 and value. Ideally, - only used for plots with time (i.e., non-categorical) axis.""" - s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) - - splot = s.copy() # modified with additional (repeated) datapoint - splot[splot.index.right[-1]] = splot.values[-1] - - if use_categories(ax, s, cat): - # Bad combination: area graph on categorical axis. But allow anyway. - - categories = Categories(s) - ctgr_extra = Categories(splot) - # Center around x-tick: - ax.fill_between(ctgr_extra.x() - 0.5, 0, ctgr_extra.y(), step="post", **kwargs) - ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) - set_data_labels(ax, categories.x(), categories.y(), labelfmt, True) - - else: - ax.fill_between(splot.index, 0, splot.values, step="post", **kwargs) - delta = s.index.right - s.index - set_data_labels(ax, s.index + 0.5 * delta, s.values, labelfmt, True) - - -@append_to_doc(docstringliteral_plotparameters) -def plot_timeseries_as_step( - ax: plt.Axes, s: pd.Series, labelfmt: str = "", cat: bool = None, **kwargs -) -> None: - """Plot timeseries ``s`` to axis ``ax``, as stepped line (horizontal and vertical lines). - Ideally, only used for plots with time (i.e., non-categorical) axis.""" - s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) - - splot = s.copy() # modified with additional (repeated) datapoint - splot[splot.index.right[-1]] = splot.values[-1] - - if use_categories(ax, s, cat): - # Bad combination: step graph on categorical axis. But allow anyway. - - categories = Categories(s) - ctgr_extra = Categories(splot) - # Center around x-tick: - ax.step(ctgr_extra.x() - 0.5, ctgr_extra.y(), where="post", **kwargs) - ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) - set_data_labels(ax, categories.x(), categories.y(), labelfmt, True) - - else: - ax.step(splot.index, splot.values, where="post", **kwargs) - delta = s.index.right - s.index - set_data_labels(ax, s.index + 0.5 * delta, s.values, labelfmt, True) - - -@append_to_doc(docstringliteral_plotparameters) -def plot_timeseries_as_hline( - ax: plt.Axes, s: pd.Series, labelfmt: str = "", cat: bool = None, **kwargs -) -> None: - """Plot timeseries ``s`` to axis ``ax``, as horizontal lines. Ideally, only used for - plots with time (i.e., non-categorical) axis.""" - s = prepare_ax_and_s(ax, s) # ensure unit compatibility (if possible) - - if use_categories(ax, s, cat): - # Bad combination: hline graph on categorical axis. But allow anyway. - - categories = Categories(s) - # Center around x-tick: - ax.hlines(categories.y(), categories.x() - 0.5, categories.x() + 0.5, **kwargs) - ax.set_xticks(categories.x(MAX_XLABELS), categories.labels(MAX_XLABELS)) - set_data_labels(ax, categories.x(), categories.y(), labelfmt, True) - - else: - delta = s.index.right - s.index - ax.hlines(s.values, s.index, s.index.right, **kwargs) - set_data_labels(ax, s.index + 0.5 * delta, s.values, labelfmt, False) - - -def plot_timeseries( - ax: plt.Axes, - s: pd.Series, - how: str = "jagged", - labelfmt: str = None, - cat: bool = None, - **kwargs, -) -> None: - """Plot timeseries to given axis. - - Parameters - ---------- - ax : plt.Axes - Axes to plot to. - s : pd.Series - Timeseries to plot - how : str, optional (default: 'jagged') - How to plot the data; one of {'jagged', 'bar', 'area', 'step', 'hline'}. - labelfmt : str, optional (default: '') - Labels are added to each datapoint in the specified format. ('' to add no labels) - cat : bool, optional (default: True if frequency is monthly or larger) - Plot as categorical x-axis. - """ - if how == "jagged": - plot_timeseries_as_jagged(ax, s, labelfmt, cat, **kwargs) - elif how == "bar": - plot_timeseries_as_bar(ax, s, labelfmt, cat, **kwargs) - elif how == "area": - plot_timeseries_as_area(ax, s, labelfmt, cat, **kwargs) - elif how == "step": - plot_timeseries_as_step(ax, s, labelfmt, cat, **kwargs) - elif how == "hline": - plot_timeseries_as_hline(ax, s, labelfmt, cat, **kwargs) - else: - raise ValueError( - f"Parameter ``how`` must be one of 'jagged', 'bar', 'area', 'step', 'hline'; got {how}." - ) - - -def prepare_ax_and_s(ax: plt.Axes, s: pd.Series, unit=None) -> pd.Series: - """Ensure axes ``ax`` has unit associated with it and checks compatibility with series - ``s``. Also sets y label as unit abbreviation. - - Notes - ----- - - If axes already has unit, convert series to same unit. If not, convert series to pint - base units and set that as axis unit. Assumes that series with float or int values is - dimensionless. - - Changes ``ax`` in-place. - - In order to plot in not-base-units, provide a custom value for the ``unit`` parameter - when calling this function for the first time for a given ``ax``. Ignored on subsequent - calls and a unit is already associated with the axes. - """ - # Make sure series has pint unit. - if s.dtype == float or s.dtype == int: - s = s.astype("pint[1]") - # Find preexisting unit. - axunit = getattr(ax, "_unit", None) - - # Axes already has unit. Convert series to that unit; ignore any supplied custom unit. - if axunit is not None: - if axunit.dimensionality != s.pint.dimensionality: # check compatibilty - raise ValueError( - f"Cannot plot series with units {s.pint.units} on axes with units {axunit}." - ) - return s.astype(axunit) - - # Axes does not have unit. - if unit is not None: - # Custom unit is provided. Convert series to that unit. - if unit.dimensionality != s.pint.dimensionality: # check compatibility - raise ValueError( - f"Cannot convert series with units {s.pint.units} to units {unit}." - ) - s = s.astype(unit) - setattr(ax, "_unit", unit) - else: - # No custom unit provided. Convert series to base units. - s = s.pint.to_base_units() - setattr(ax, "_unit", s.pint.units) - - ax.set_ylabel(f"{ax._unit:~P}") - return s - - -def set_data_labels( - ax: plt.Axes, xx, yy, labelfmt, outside: bool = False, maxcount: int = 24 -): - """Add labels to axis ``ax``, at locations (``xx``, ``yy``), formatted with - ``labelfmt``. Don't add labels if more than ``maxcount`` datapoints. If ``outside``, - put labels of negative values *below* the datapoint.""" - # Don't label if no formatting speficied. - if not labelfmt: - return - # Don't label if too many numbers. - if len(xx) > maxcount: - return - - # Add labels. - for x, y in zip(xx, yy): - lbl = labelfmt.format(y.magnitude).replace(",", " ") - xytext = (0, -10) if outside and y.magnitude < 0 else (0, 10) - ax.annotate(lbl, (x, y), textcoords="offset points", xytext=xytext, ha="center") - - # Increase axis range to give label space to stay inside box. - ylim = list(ax.get_ylim()) - if not np.isclose(ylim[0], 0) and ylim[0] < 0: - ylim[0] *= 1.1 - if not np.isclose(ylim[1], 0) and ylim[1] > 0: - ylim[1] *= 1.1 - ax.set_ylim(*ylim) diff --git a/profile_data b/profile_data new file mode 100755 index 0000000000000000000000000000000000000000..79ac9653e00f3439793ee94453d2cb1b75abf957 GIT binary patch literal 470294 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

    x@7P(GjDr1zYnl>WE?0Uur%9_{;Qk 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 +157553/155565 0.005 0.000 0.005 0.000 {built-in method builtins.len} + 5 0.005 0.001 0.005 0.001 {built-in method _posixsubprocess.fork_exec} + 4252 0.004 0.000 0.062 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1470(get_valid_values) + 1 0.004 0.004 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/generic.py:226(NDFrame) + 223 0.004 0.000 0.029 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1442(get_aliases) + 56522 0.004 0.000 0.004 0.000 {built-in method builtins.min} + 83972 0.004 0.000 0.005 0.000 {built-in method builtins.isinstance} + 1081 0.004 0.000 0.057 0.000 :1514(find_spec) +21198/21189 0.004 0.000 0.005 0.000 {method 'join' of 'str' objects} + 8 0.004 0.000 0.004 0.000 {built-in method posix.read} + 77916 0.004 0.000 0.004 0.000 {method 'lstrip' of 'str' objects} + 3516 0.003 0.000 0.003 0.000 {built-in method __new__ of type object at 0x1003ab388} + 9629 0.003 0.000 0.003 0.000 {method 'split' of 'str' objects} + 30 0.003 0.000 0.016 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:847(_rc_params_in_file) + 1803/284 0.003 0.000 0.007 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:87(_compile) + 1 0.003 0.003 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:2191(lstsq) + 6212 0.003 0.000 0.015 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2498(__init__) + 45 0.003 0.000 0.005 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:179(__new__) + 819 0.003 0.000 0.066 0.000 :901(_find_spec) + 7443 0.003 0.000 0.034 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:289(_compile) + 7317 0.003 0.000 0.003 0.000 {method 'expandtabs' of 'str' objects} + 1 0.002 0.002 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/scimath.py:1() + 954 0.002 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2781(__init__) + 7315 0.002 0.000 0.041 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:607(getdoc) + 833/1 0.002 0.000 1.007 1.007 :1002(_find_and_load) + 698 0.002 0.000 0.329 0.000 :916(get_code) + 1396 0.002 0.000 0.006 0.000 :361(cache_from_source) + 701 0.002 0.000 0.016 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2152(_signature_from_function) + 746 0.002 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:88(__setitem__) + 14602 0.002 0.000 0.002 0.000 {built-in method builtins.hasattr} + 117 0.002 0.000 0.076 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1598(pprint_setters) + 12710 0.002 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:234(__next) + 5863 0.002 0.000 0.005 0.000 :121(_path_join) + 45160 0.002 0.000 0.002 0.000 {method 'append' of 'list' objects} + 4252 0.002 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1555(aliased_name) + 5863 0.002 0.000 0.002 0.000 :123() + 385 0.002 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:292(_optimize_charset) + 1845 0.002 0.000 0.003 0.000 :166(_get_module_lock) + 794 0.002 0.000 0.008 0.000 :486(_init_module_attrs) + 556 0.002 0.000 0.002 0.000 {built-in method numpy.array} + 2129/633 0.002 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:175(getwidth) + 11722 0.002 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:165(__getitem__) + 794/1 0.001 0.000 1.007 1.007 :659(_load_unlocked) + 829/1 0.001 0.000 1.007 1.007 :967(_find_and_load_unlocked) + 965 0.001 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:35(update_wrapper) + 62 0.001 0.000 0.002 0.000 {built-in method builtins.eval} + 1845 0.001 0.000 0.002 0.000 :112(release) + 1845 0.001 0.000 0.002 0.000 :87(acquire) + 793/715 0.001 0.000 0.019 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2246(_signature_from_callable) + 5771 0.001 0.000 0.019 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:198(search) + 814 0.001 0.000 0.060 0.000 :1383(_get_spec) + 10485 0.001 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:255(get) + 405 0.001 0.000 0.015 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:414(dedent) + 698 0.001 0.000 0.279 0.000 :1036(get_data) + 1162 0.001 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:137(_type_check) + 1 0.001 0.001 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1() + 3451 0.001 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:713(__setattr__) + 1679 0.001 0.000 0.001 0.000 {method 'format' of 'str' objects} + 711/284 0.001 0.000 0.018 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:436(_parse_sub) + 175 0.001 0.000 0.001 0.000 {built-in method builtins.compile} + 44 0.001 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:345(namedtuple) + 7447 0.001 0.000 0.001 0.000 {built-in method builtins.setattr} + 4442 0.001 0.000 0.001 0.000 {built-in method builtins.sorted} + 786 0.001 0.000 0.001 0.000 :696(spec_from_file_location) + 12986 0.001 0.000 0.001 0.000 {method 'get' of 'dict' objects} + 105 0.001 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:170() + 31390 0.001 0.000 0.001 0.000 {built-in method builtins.callable} + 538 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:191(_collect_type_vars) + 1396 0.001 0.000 0.002 0.000 :127(_path_split) + 6320 0.001 0.000 0.001 0.000 :231(_verbose_message) + 5 0.001 0.000 0.001 0.000 {method 'readlines' of '_io._IOBase' objects} + 1678/210 0.001 0.000 0.001 0.000 {built-in method _abc._abc_subclasscheck} + 698/1 0.001 0.000 1.007 1.007 :844(exec_module) + 3783 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:173(append) + 2674 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:405(_strip_comment) + 15436 0.001 0.000 0.001 0.000 {method 'rstrip' of 'str' objects} + 794/792 0.001 0.000 0.193 0.000 :558(module_from_spec) + 1099/5 0.001 0.000 0.943 0.189 :1033(_handle_fromlist) + 515 0.001 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:739(__init__) + 5 0.001 0.000 0.011 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1677(_execute_child) + 698 0.001 0.000 0.041 0.000 :645(_compile_bytecode) + 31 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/function_base.py:24(linspace) + 2094 0.001 0.000 0.001 0.000 :79(_unpack_uint32) + 284 0.001 0.000 0.030 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:783(compile) + 3451 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:665(_is_dunder) + 3061 0.001 0.000 0.013 0.000 :135(_path_stat) + 698 0.001 0.000 0.001 0.000 :560(_classify_pyc) + 284 0.001 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:560(_compile_info) + 2 0.001 0.000 0.001 0.000 {built-in method _ctypes.POINTER} + 6817 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:670(__new__) + 3 0.001 0.000 0.001 0.000 {built-in method posix.open} + 586 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:65(getargs) + 4 0.001 0.000 0.001 0.000 {method 'read' of '_io.TextIOWrapper' objects} + 3283 0.001 0.000 0.001 0.000 :878(__exit__) + 5095 0.001 0.000 0.001 0.000 {method 'rpartition' of 'str' objects} + 195 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1110() + 6447 0.001 0.000 0.001 0.000 {method 'group' of 're.Match' objects} + 2086 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:947() + 9321 0.001 0.000 0.001 0.000 {method 'pop' of 'list' objects} + 830 0.001 0.000 0.001 0.000 :185(cb) + 272 0.001 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:433(_uniq) + 1738 0.001 0.000 0.001 0.000 {built-in method builtins.max} + 220 0.001 0.000 0.001 0.000 {built-in method _abc._abc_init} + 959/871 0.001 0.000 0.010 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:271(inner) + 1012 0.000 0.000 0.003 0.000 :203(_lock_unlock_module) + 317 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:142(decorator) + 786 0.000 0.000 0.004 0.000 :491(_get_cached) + 816 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:462(__setattr__) + 1484 0.000 0.000 0.005 0.000 :385(cached) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:492(inv) + 786 0.000 0.000 0.002 0.000 :1509(_get_spec) + 792 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:494(unwrap) + 3283 0.000 0.000 0.001 0.000 :874(__enter__) +2349/2179 0.000 0.000 0.001 0.000 {method 'update' of 'dict' objects} + 284 0.000 0.000 0.019 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:944(parse) + 3902 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:161(__len__) + 3984 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:250(match) + 830 0.000 0.000 0.001 0.000 :58(__init__) + 462 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/copy.py:66(copy) + 1427 0.000 0.000 0.001 0.000 :398(parent) + 1190 0.000 0.000 0.005 0.000 :145(_path_is_mode_type) + 1017 0.000 0.000 0.006 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:711(__setitem__) + 24 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:186(_collapse_string_to_ranges) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:596(Axis) + 814 0.000 0.000 0.061 0.000 :1415(find_spec) + 1981 0.000 0.000 0.000 0.000 {method 'match' of 're.Pattern' objects} + 92 0.000 0.000 0.035 0.000 :1565(_fill_cache) + 2 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/decoder.py:343(raw_decode) + 2792 0.000 0.000 0.001 0.000 :129() + 1879 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:112(__init__) + 6 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:34(__init__) + 3538/834 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:353(recursive_subclasses) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/islamic.py:42(_IslamicLunar) + 566/4 0.000 0.000 0.943 0.236 {built-in method builtins.__import__} + 33 0.000 0.000 0.009 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:809(_process_class) + 5422 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects} + 5958 0.000 0.000 0.000 0.000 {built-in method _imp.acquire_lock} + 5 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1207(_close_pipe_fds) + 3024 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2830() + 243 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:461(__init__) + 3637 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} + 5958 0.000 0.000 0.000 0.000 {built-in method _imp.release_lock} + 833 0.000 0.000 0.003 0.000 :156(__enter__) + 278 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:83(verify_matching_signatures) + 276 0.000 0.000 0.007 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:360(decorator) + 1126/1 0.000 0.000 1.007 1.007 :220(_call_with_frames_removed) + 1210 0.000 0.000 0.002 0.000 :1346(_path_importer_cache) + 819 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/_distutils_hack/__init__.py:89(find_spec) + 2386 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:287(tell) + 698 0.000 0.000 0.001 0.000 :593(_validate_timestamp_pyc) + 461 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/copy.py:258(_reconstruct) + 136 0.000 0.000 0.013 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:38(__call__) + 173 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:310(_to_rgba_no_colorcycle) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2978(__array_finalize__) + 1081 0.000 0.000 0.000 0.000 :64(_relax_case) + 94 0.000 0.000 0.005 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:1391(_preprocess_data) + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/__init__.py:1() + 160 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/shape_base.py:612(column_stack) + 5981 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects} + 6769 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects} + 306/12 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:809(_parseNoCache) + 1096 0.000 0.000 0.005 0.000 :154(_path_isfile) + 7715 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2548(name) + 4798 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1563() + 3698 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects} + 356 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:545(_finddoc) + 605 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:96(getargspec) + 162 0.000 0.000 0.006 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:377(_create_fn) + 1 0.000 0.000 0.000 0.000 {method 'dot' of 'numpy.ndarray' objects} + 2686 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:189(is_consecutive) + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:221() + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:58(bitname) + 698 0.000 0.000 0.000 0.000 :523(_check_name_wrapper) + 822 0.000 0.000 0.000 0.000 :351(__init__) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:453(polyfit) + 1 0.000 0.000 0.000 0.000 {method 'accumulate' of 'numpy.ufunc' objects} + 220 0.000 0.000 0.005 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:434(Union) + 1673 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock} + 105 0.000 0.000 0.112 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:159(_update_set_signature_and_docstring) + 425 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:356(_escape) + 487 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:928(_json_decode) + 833 0.000 0.000 0.001 0.000 :160(__exit__) + 698 0.000 0.000 0.003 0.000 :1077(path_stats) + 723 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:540(_init) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_methods.py:1() + 385 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:265(_compile_charset) + 223 0.000 0.000 0.030 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1422(__init__) + 5 0.000 0.000 0.011 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:756(__init__) + 6560 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2560(kind) + 92 0.000 0.000 0.000 0.000 :1594() + 12 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:462(search) + 284 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:977(__and__) + 700 0.000 0.000 0.000 0.000 :35(_new_module) + 3711 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} + 10 0.000 0.000 0.000 0.000 {pandas._libs.hashtable.object_hash} + 220 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:232(_remove_dups_flatten) + 746 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:44(_is_private) + 1835 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:159(isfunction) + 6345 0.000 0.000 0.000 0.000 {built-in method builtins.ord} + 831 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:447(_simple) + 954 0.000 0.000 0.005 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1542(is_alias) + 1507 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects} + 4253 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} + 1664 0.000 0.000 0.001 0.000 {built-in method _abc._abc_instancecheck} + 1215 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:128(_type_convert) + 284 0.000 0.000 0.010 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:622(_code) + 437 0.000 0.000 0.005 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1536(number_of_parameters) + 356 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:535(_findclass) + 2826 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects} + 757 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:203(sub) + 424 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:307(validate_color) + 715 0.000 0.000 0.019 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:3111(signature) + 626 0.000 0.000 0.007 0.000 {built-in method builtins.next} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/helpers.py:643() + 515 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:677(__init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_scalars.py:1() + 1333 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:670(_set) + 317 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/function_base.py:497(add_newdoc) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1588(_guarded_repr_or_str) + 316/273 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:485(_get_literal_prefix) + 276 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:376() + 1 0.000 0.000 0.064 0.064 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:248(git_pieces_from_vcs) + 322 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:71(join) + 3780 0.000 0.000 0.000 0.000 {built-in method posix.fspath} + 461 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:522(copy) + 458 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:268(to_rgba) + 1207 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects} + 92 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:671(_get_field) + 715 0.000 0.000 0.019 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2859(from_callable) + 2230 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} + 295 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:225(__init__) + 345 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:85(opengroup) + 909 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:65(wraps) + 220 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/abc.py:105(__new__) + 88 0.000 0.000 0.184 0.002 :1171(create_module) + 117 0.000 0.000 0.088 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1837(kwdoc) + 256/18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:409(generic_visit) + 65 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:128(deprecate) + 814 0.000 0.000 0.000 0.000 :811(find_spec) + 5 0.000 0.000 0.063 0.013 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:73(run_command) + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:1() + 75 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:3065(__str__) + 1262 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:82(groups) + 705 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:188(match) + 1664 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/abc.py:117(__instancecheck__) + 835 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:690(_get) + 1 0.000 0.000 0.000 0.000 {built-in method utcfromtimestamp} + 744 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:22(_is_dunder) + 286 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:218(_deduplicate) + 91 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:437() + 92 0.000 0.000 0.000 0.000 :1475(__init__) + 2 0.000 0.000 0.000 0.000 {method 'readline' of '_io.BufferedReader' objects} + 70 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:452(register_option) + 885 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:216(_is_nth_color) + 175 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:429(_tokenize) + 1610 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} + 432/357 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:933(__hash__) + 155 0.000 0.000 0.007 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:481(__call__) + 2223 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:743() + 746 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:33(_is_sunder) + 61 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:144() + 104 0.000 0.000 0.111 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:126(__init_subclass__) + 833 0.000 0.000 0.000 0.000 :152(__init__) + 2095 0.000 0.000 0.000 0.000 {built-in method from_bytes} + 5 0.000 0.000 0.052 0.010 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1090(communicate) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/generic.py:36(create_pandas_abc_type) + 849 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:514(_is_wrapper) + 92 0.000 0.000 0.001 0.000 :63(__init__) + 418 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/registry.py:172(__init__) + 650 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:804(fsencode) + 92 0.000 0.000 0.002 0.000 :1333(_path_hooks) + 167 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:958(__hash__) + 134 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:333(__init__) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:452(callback) + 1317 0.000 0.000 0.000 0.000 {method 'find' of 'bytearray' objects} + 241 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:516(_get_charset_prefix) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/frame.py:490(DataFrame) + 284 0.000 0.000 0.000 0.000 {built-in method _sre.compile} + 48 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:1347(_add_data_doc) + 698 0.000 0.000 0.000 0.000 :1006(__init__) + 312 0.000 0.000 0.000 0.000 {built-in method fromkeys} + 1 0.000 0.000 0.227 0.227 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/pyplot.py:4() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_cm_listed.py:1() +1598/1159 0.000 0.000 0.000 0.000 {built-in method builtins.hash} + 66 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:481(Literal) + 32 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1036(from_list) + 19 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:799(validate_cycler) + 863 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:466() + 1 0.000 0.000 0.000 0.000 {function SeedSequence.generate_state at 0x101314dc0} + 461 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects} + 88/54 0.000 0.000 0.133 0.002 :1179(exec_module) + 66 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4540(__init__) + 71 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:832(__getitem__) + 99 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:582(_find_data_type) + 1678/210 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/abc.py:121(__subclasscheck__) + 78/4 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:962(_parseCache) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/accessor.py:147(StringMethods) + 698 0.000 0.000 0.000 0.000 {built-in method _imp._fix_co_filename} + 802 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/types.py:171(__get__) + 574 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:12(_is_descriptor) + 261 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2582(__str__) + 495 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:60(isabs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/html/entities.py:1() + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:894(__init__) + 2636 0.000 0.000 0.000 0.000 {built-in method builtins.issubclass} + 61 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:628(__init__) + 568 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:619(isstring) + 80 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1122(_parse_unit_name) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/fromnumeric.py:1() + 306 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:148(__new__) + 424 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/function_base.py:348(iterable) + 814 0.000 0.000 0.000 0.000 {built-in method _imp.is_frozen} + 1013 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:455(is_egg) + 1510 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} + 1 0.000 0.000 0.030 0.030 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/multiarray.py:1() + 158 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:612(_is_type) + 342 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.add_docstring} + 22/3 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3983(streamline) + 728/559 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:756(__hash__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/series.py:244(Series) + 284 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:928(fix_flags) + 427 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:221(is_color_like) + 980 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:750(__eq__) + 518 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:741(__getitem__) + 67 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3948(__init__) + 150 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:868(_parse_flags) + 33 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:489(_init_fn) + 819 0.000 0.000 0.000 0.000 :736(find_spec) + 91 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:435(_mk_bitmap) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:440(__call__) + 1 0.000 0.000 0.215 0.215 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:1() + 53 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:240(_make_synonym_function) + 18 0.000 0.000 0.000 0.000 {method 'split' of 're.Pattern' objects} + 284 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:76(__init__) + 18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1866(__new__) + 798 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:966() + 177 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:296(_class_escape) + 519 0.000 0.000 0.000 0.000 {built-in method builtins.repr} + 45/12 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:759(__getitem__) + 511 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray} + 609 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:73(isclass) + 846 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:41(_get_sep) + 847 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:169(__setitem__) + 273 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:325(_subx) + 605 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:13(ismethod) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:619(get_exec_path) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:162(_register_known_types) + 564 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:180(validator) + 936 0.000 0.000 0.000 0.000 {built-in method builtins.iter} + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:489(__exit__) + 247 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:279(validate_color_for_prop_cycle) + 78 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:1840(_signature_bound_method) + 136 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/registry.py:254() + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:618(_find_new_) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:416(by_key) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/chinese.py:26(_ChineseLunisolar) + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:556(_select_from) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/hebrew.py:18(_HebrewLunisolar) + 306 0.000 0.000 0.000 0.000 {built-in method builtins.any} + 276 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:384() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:545() + 1 0.000 0.000 0.000 0.000 {built-in method posix.scandir} + 76 0.000 0.000 0.000 0.000 {method 'strftime' of 'datetime.date' objects} + 2 0.000 0.000 0.012 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/core.py:206(read_style_directory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:407(_Pickler) + 605 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:26(isfunction) + 345 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:97(closegroup) + 32 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:409(to_rgba_array) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_color_data.py:989() + 44/29 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/pint_eval.py:125(build_eval_tree) + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5() + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:140(formatargspec) + 675 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:928(__eq__) + 92 0.000 0.000 0.001 0.000 :1606(path_hook_for_FileFinder) + 86 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3754(__init__) + 737 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:565(__eq__) + 47 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1007(__init_subclass__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/base.py:303(Index) + 126/115 0.000 0.000 0.012 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:79(__call__) + 256/18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:403(visit) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/merge.py:1() + 115 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:88(f) + 1 0.000 0.000 0.092 0.092 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/__init__.py:1() + 586 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:41(iscode) + 45 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:164(__prepare__) + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_axes.py:46(Axes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:21() + 422 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:81(_combine_flags) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:136(ones) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:154(_subst_vars) + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:1() + 2403 0.000 0.000 0.000 0.000 {built-in method builtins.chr} + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:223(define_aliases) + 317 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/function_base.py:465(_needs_add_docstring) + 698 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:244(iter_fields) + 79 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:268(getuntil) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:64(parse_parts) + 55 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/warnings.py:458(__enter__) + 133/64 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3880(copy) + 29 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:597(from_string) + 794 0.000 0.000 0.000 0.000 :406(has_location) + 93 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:131(strseq) + 153 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:524(__init__) + 124 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:192() + 1199 0.000 0.000 0.000 0.000 {built-in method builtins.id} + 461 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/copyreg.py:94(__newobj__) + 40 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1149(__init__) + 132 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:419(visit_Constant) + 12 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:57() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:71(_UFuncCastingError) + 72/12 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4034(parseImpl) + 66 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:249(_flatten_literal_params) + 50 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:872(_ufunc_doc_signature_formatter) + 62/9 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3788(leave_whitespace) + 26 0.000 0.000 0.000 0.000 {built-in method posix.lstat} + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:283(disallowed) + 134 0.000 0.000 0.000 0.000 {built-in method _imp.is_builtin} + 1 0.000 0.000 0.020 0.020 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/__init__.py:25() + 771 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} + 7 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2810(__init__) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:63(_add_delegate_accessors) + 822 0.000 0.000 0.000 0.000 {method '__subclasses__' of 'type' objects} + 1 0.000 0.000 0.010 0.010 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1942(_communicate) + 70 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:257(rename_parameter) + 248/220 0.000 0.000 0.005 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:352(__getitem__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:1() + 51 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:909(__getitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/text.py:80(Text) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:63() + 200 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/pyplot.py:164(_copy_docstring_and_deprecators) + 460 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:348() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:294() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:408(__init__) + 42 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:985(__class_getitem__) + 76 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:91() + 557 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:477(_get_iscased) + 30/4 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3828(streamline) + 317 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/function_base.py:483(_add_docstring) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:661(_build_cache) + 1876 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:847() + 927 0.000 0.000 0.000 0.000 {method 'get' of 'mappingproxy' objects} + 698 0.000 0.000 0.000 0.000 :1031(get_filename) + 67 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1108() + 99 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:571(_get_mixins_) + 1 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.set_typeDict} + 736 0.000 0.000 0.000 0.000 :1481() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:822(StataMissingValue) + 356 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:81(ismethod) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1901(_wait) + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/__init__.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:32(_gen_cmap_registry) + 146 0.000 0.000 0.003 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/compat.py:29(tokenizer) + 111 0.000 0.000 0.000 0.000 {built-in method _codecs.utf_8_decode} + 137 0.000 0.000 0.000 0.000 {built-in method builtins.locals} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimelike.py:187(DatetimeLikeArrayMixin) + 915 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2865(parameters) + 301 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:78(readline) + 585 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:391() + 1 0.000 0.000 0.011 0.011 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/_structures.py:6(InfinityType) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:220(decorate) + 122 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:242(implement_func) + 122 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:841(copy_with) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/managers.py:1() + 22 0.000 0.000 0.000 0.000 {built-in method posix.readlink} + 214/116 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1872(default_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2697(MaskedArray) + 58 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3110(parseImpl) + 170 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:677(__init__) + 48 0.000 0.000 0.000 0.000 {method 'issuperset' of 'set' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:1() + 196 0.000 0.000 0.019 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:250(compile) + 306/282 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:171(__init__) + 792 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/locale.py:1() + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hmac.py:1() + 26 0.000 0.000 0.010 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:416(make_keyword_only) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:218(_parsegen) + 109 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/extension.py:35(_inherit_from_data) + 1 0.000 0.000 0.082 0.082 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:805(copy) + 148 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2873(replace) + 37 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:111(_float_to_str) + 147 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/TiffTags.py:26(__new__) + 39 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:107() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:1() + 111 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/codecs.py:319(decode) + 169 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2422(__new__) + 88 0.000 0.000 0.000 0.000 :1155(__init__) + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1284(getLogger) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/extension.py:128(wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1814(Parser) + 698 0.000 0.000 0.000 0.000 :841(create_module) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:1() + 27 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:154(_deprecated_property) + 190 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1765() + 373 0.000 0.000 0.000 0.000 {built-in method sys.intern} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/range.py:57(RangeIndex) + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:778(string_preprocessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/_mixins.py:97(NDArrayBackedExtensionArray) + 231 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:1748(_signature_get_user_defined_method) + 33 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:998(dataclass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:229(NameValidator) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/helpers.py:2() + 1 0.000 0.000 0.057 0.057 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:1() + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:197() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:16(_binary_method) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:163(_extend_dict) + 317 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:105(array_function_dispatch) + 165 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:140(validate_bool) + 9 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:475(_create_) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/config_init.py:1() + 110 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:416(_field_init) + 269/169 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1899(name) + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:561(_check_for_existing_members) + 1 0.000 0.000 0.073 0.073 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/frame.py:1() + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/series.py:1() + 42 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:234(contextmanager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/uuid.py:84(UUID) + 77 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:674(__getitem__) + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:497() + 1 0.000 0.000 0.019 0.019 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:27() + 133/64 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3883() + 44 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:66(__set_name__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/object_array.py:33(ObjectStringArrayMixin) + 84 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:244(make_alias) + 1 0.000 0.000 0.045 0.045 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/__init__.py:1() + 180 0.000 0.000 0.000 0.000 :175(_path_isabs) + 837 0.000 0.000 0.000 0.000 {method '__getitem__' of 'dict' objects} + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/common.py:40(_unpack_zerodim_and_defer) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/readers.py:1() + 6 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2257() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:685(__init__) + 130 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:967(__init__) + 1 0.000 0.000 0.137 0.137 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/api.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:2() + 276 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:340(doc) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:402(_create_cb_wrapper) + 1 0.000 0.000 0.044 0.044 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_axes.py:1() + 77 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:1866(_signature_is_builtin) + 1015 0.000 0.000 0.000 0.000 {method 'isupper' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:2507(extend_all) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:1() + 166 0.000 0.000 0.000 0.000 {method 'translate' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1839(ConciseDateConverter) + 38 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects} + 60 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:829(_open_file_or_url) + 1 0.000 0.000 0.057 0.057 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/generic.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/TiffTags.py:420(_populate) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/common.py:8(pyparsing_common) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:982() + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:295(detect_encoding) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:4() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:1() + 28 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:550(_frozen_get_del_attr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:84(TransformNode) + 843 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2552(default) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/_common.py:1() + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:117(Artist) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:73(ToolBase) + 1 0.000 0.000 0.024 0.024 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numerictypes.py:1() + 162 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:256(_node_not_implemented) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/contour.py:716(ContourSet) + 81 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:94(_create_delegator_property) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:471(_parse_headers) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_openpyxl.py:39(OpenpyxlWriter) + 44 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:51(__init__) + 10 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_fontconfig_pattern.py:80(parse_fontconfig_pattern) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:880(_get_root_units) + 6 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects} + 163 0.000 0.000 0.000 0.000 {built-in method builtins.all} + 1 0.000 0.000 0.313 0.313 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/__init__.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/datetimes.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/core.py:134(Locale) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:186(__init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/function_base.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:492(__new__) + 365 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:419(__hash__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:331(_Stream) + 170 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:771(__copy__) + 18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1846(_make_nmtuple) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:394(ParserElement) + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/base.py:1() + 142 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:753(_set_new_attribute) + 12 0.000 0.000 0.010 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:51(__missing__) + 91 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:432(__eq__) + 42 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2438(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:78() + 67 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1089(reversed) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_array_like.py:1() + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:334(normpath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:351(_sanity_check) + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1335(_fixupParents) + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/categorical.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:55(_chars_for_ranges) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/chebyshev.py:1995(Chebyshev) + 58 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:86(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:857(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_color_data.py:2() + 66 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1410(__add__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/hindu.py:22(_HinduLunisolar) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axes3d.py:42(Axes3D) + 154 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:790(preParse) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:316(delete_parameter) + 384 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:438() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:826(GroupBy) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:1() + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1() + 75 0.000 0.000 0.000 0.000 {built-in method builtins.sum} + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:682(_parse_args) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:44(from_string) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:1() + 29/15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:952(_get_root_units_recurse) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:150(dirname) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/path.py:24(Path) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/tseries/frequencies.py:1() + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3043(__init__) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:1() + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:81(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/markers.py:155(MarkerStyle) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:56(_make_str_method) + 5 0.000 0.000 0.000 0.000 {built-in method posix.waitpid} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/sample.py:1() + 18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:662(cycler) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/common.py:1656(pandas_dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:1028(BinGrouper) + 40/12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:805(_get_dimensionality_recurse) + 79 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:546(__init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1() + 55 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/warnings.py:477(__exit__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/cast.py:1() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/category.py:52(CategoricalIndex) + 3 0.000 0.000 0.000 0.000 {built-in method posix.uname} + 99 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:66(__call__) + 447 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:825(__iter__) + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:894(__getitem_inner__) + 65 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:442(__iadd__) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/path.py:191(_create_closed) + 423 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects} + 604 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1375(cast) + 301 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:128(__next__) + 1 0.000 0.000 0.022 0.022 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:1() + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:71(add_newdoc_for_scalar_type) + 60 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:742(__str__) + 347/1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__config__.py:19(_cleanup) + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1404(__init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:1737(Rolling) + 72 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:344(_tuple_str) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext_data.py:1() + 53 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:478(lru_cache) + 148 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:656(__hash__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:1() + 462 0.000 0.000 0.000 0.000 {built-in method builtins.vars} + 316 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:878(_convert_validator_spec) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:250(_cleanup) + 92 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:322(field) + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:2034(getLogger) + 42 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:517(decorating_function) + 1 0.000 0.000 0.016 0.016 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:1() + 11 0.000 0.000 0.000 0.000 {built-in method posix.pipe} + 257 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hmac.py:18() + 24 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:539(_repr_fn) + 37 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1324(__init_subclass__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:197() + 183 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:477(prefixed_lines) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:17() + 28 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:472(Optional) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:1() + 1 0.000 0.000 0.131 0.131 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/unit.py:1() + 12 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:223(from_string) + 590 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:509() + 16 0.000 0.000 0.000 0.000 {built-in method posix.close} + 10 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1205(_parse_units) + 68 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:293(header_source_parse) + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1() + 166 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/doc.py:11(create_section_header) + 227 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:419() + 479 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:202() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/generic.py:139(SeriesGroupBy) + 92 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:244(__init__) + 78 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:113(set_) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/quiver.py:1() + 49 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:131(get_object_signature) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/multi.py:216(MultiIndex) + 94 0.000 0.000 0.000 0.000 :159(_path_isdir) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/interval.py:186(IntervalArray) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:933(update) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:142(_check_size) + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:456(_generate_overlap_table) + 91 0.000 0.000 0.000 0.000 {method 'translate' of 'bytearray' objects} + 72 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:353() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/defchararray.py:1() + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/path.py:99(__init__) + 26 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6860(getdoc) + 120 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:181() + 235 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:78() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/warnings.py:181(_add_filter) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:1() + 259 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:935(__getitem__) + 137 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1745(set_whitespace_chars) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimelike.py:1() + 236 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:83() + 234 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:407(__iter__) + 1 0.000 0.000 0.064 0.064 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:637(get_versions) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/accessor.py:118(_forbid_nonstring_types) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:1345() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1192(__init_subclass__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:233(_wrap_chunks) + 48 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:572(_define_single_adder) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/interval.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/registry.py:248(load) + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/docstrings.py:7(make_flex_doc) + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_base.py:1() + 222 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1329() + 39/1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__config__.py:25() + 250 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:952(__eq__) + 91 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2384(__init__) + 1 0.000 0.000 1.007 1.007 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/__init__.py:1() + 5 0.000 0.000 0.000 0.000 {built-in method _imp.create_builtin} + 468 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:792(value) + 14 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:115(doc_note) + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:880(__getitem__) + 1 0.000 0.000 0.030 0.030 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:1() + 148 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:206(_check_generic) + 58 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:123(__exit__) + 1 0.000 0.000 0.033 0.033 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1() + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:404(tokenize) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:2() + 192 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:224(implements) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:494(find) + 1 0.000 0.000 0.000 0.000 {function Random.seed at 0x1013bb3a0} + 70 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:772(inner) + 55 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/warnings.py:437(__init__) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1937(__new__) + 238 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:93() + 66 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:358(__getitem__) + 237 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:88() + 1 0.000 0.000 0.252 0.252 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:1() + 263 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3767() + 41 0.000 0.000 0.000 0.000 {built-in method numpy.asarray} + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/algorithms.py:1() + 39 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1153(_dedup_candidates) + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:457() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:542(_AxesBase) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/shape_base.py:1() + 106 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:470(_init_param) + 227 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:410(__len__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:334(__init__) + 185 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:574(__hash__) + 73 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:707(get_name) + 106 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:404(_field_assign) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/npyio.py:1() + 26/14 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4287(parseImpl) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/array_manager.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/generic.py:11304(_add_numeric_operations) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/quoprimime.py:55() + 18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:269(_trim_arity) + 139 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1964(__eq__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/expanding.py:44(Expanding) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1() + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:358(_recursive_repr) + 53/29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/pint_eval.py:87(evaluate) + 170 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:89(__getitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_compat_pickle.py:9() + 83 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:754(encode) + 26 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1013(__next__) + 257 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hmac.py:19() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:1() + 1 0.000 0.000 0.087 0.087 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/generic.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:470(_push_exit_callback) + 171 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:837() + 75 0.000 0.000 0.000 0.000 {method 'copy' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/lzma.py:1() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/compat.py:1() + 233 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:946(_value_and_type_iter) + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:779(_get_dimensionality) + 157 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:597(_is_classvar) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1848() + 207 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/abc.py:7(abstractmethod) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:234(FixedForwardWindowIndexer) + 38/18 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4566(parseImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:1() + 155 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:474(__init__) + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:64() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3940(_ErrorStop) + 26 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:921(__init__) + 76 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:670(__eq__) + 248 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2271() + 194 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects} + 1 0.000 0.000 0.054 0.054 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_dtype_like.py:1() + 33 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:863() + 60 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2564(replace) + 1 0.000 0.000 0.018 0.018 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/secrets.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:1() + 23 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:213(__getattr__) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:981(parse_template) + 88 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:146(__init__) + 44 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:547(copy) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:1() + 222 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2264() + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:507() + 40 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:228(expanduser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/umath.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:1017(_decompose) + 67 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:204(__getitem__) + 30/9 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4577(leave_whitespace) + 160 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/shape_base.py:608(_column_stack_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/interval.py:1() + 7 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:528(_convert_) + 47 0.000 0.000 0.000 0.000 {built-in method numpy.empty} + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:226(_from_iter) + 77 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:1878(_signature_is_functionlike) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/polynomial.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/array.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:1136(_Unpickler) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:187(finalize) + 99 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:270(escape) + 1 0.000 0.000 0.045 0.045 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/random/_pickle.py:1() + 160 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher) + 222 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1335() + 58 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:261(helper) + 43 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:715(_from_parsed_parts) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/dtypes.py:66(_add_dtype_helper) + 103 0.000 0.000 0.000 0.000 {method 'setter' of 'property' objects} + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:1() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5100(parseImpl) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:213(__setitem__) + 135 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:920() + 1 0.000 0.000 0.021 0.021 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1() + 2 0.000 0.000 0.000 0.000 {built-in method posix.access} + 1 0.000 0.000 0.110 0.110 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/figure.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:174(Quantity) + 4/3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:397(_joinrealpath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ctypeslib.py:371() + 14 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hashlib.py:126(__get_openssl_constructor) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:34() + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:506(wrapper) + 237 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects} + 1 0.000 0.000 0.058 0.058 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/contour.py:1() + 1 0.000 0.000 0.013 0.013 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/arrow/array.py:1() + 58 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:114(__enter__) + 157 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:605(_is_initvar) + 140 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/base64.py:3() + 46 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:725(_format_parsed_parts) + 61 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:550(from_word) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/take.py:1() + 27 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:45(allow_rasterization) + 1 0.000 0.000 0.935 0.935 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/dev/develop.py:1() + 134/34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1904(__str__) + 43 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3107(_generateDefaultName) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:462(get) + 26 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6855(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/buddhist.py:22(_BuddhistLunisolar) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1841(_handle_exitstatus) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:357(validate_fontsize) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1888(_try_wait) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:238(pattern) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:20(Base) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1079(__new__) + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:866(stem) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/numpy/function.py:1() + 19 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:126(from_string) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_tricontour.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/base_parser.py:1() + 1 0.000 0.000 0.011 0.011 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/arrow/array.py:184(ArrowExtensionArray) + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:415(__getattr__) + 78 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:883() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/common.py:1() + 1 0.000 0.000 0.077 0.077 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_libs/tslibs/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/resources.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/__init__.py:1() + 24/19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:472(_define) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend.py:1() + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/copyreg.py:103(_slotnames) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:1() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1189(reversed) + 1 0.000 0.000 0.020 0.020 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axes3d.py:1() + 145 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:259(__iter__) + 41 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:571(eval_token) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/multi.py:1() + 10 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:438(children) + 102 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:44(__init__) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/asserters.py:1() + 265 0.000 0.000 0.000 0.000 {built-in method _sre.unicode_iscased} + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/lines.py:1() + 1 0.000 0.000 0.019 0.019 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:1() + 25 0.000 0.000 0.000 0.000 {built-in method unicodedata.name} + 170 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:474(predicate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:348(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:282(__init__) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:503(_cmpkey) + 6 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2253(pprint_styles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/construction.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:1() + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/ewm.py:1() + 22 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4989(parseImpl) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:532() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1() + 27 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/warnings.py:165(simplefilter) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:882(wrapper) + 1 0.000 0.000 0.122 0.122 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/__init__.py:1() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/common.py:1() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1() + 215 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:9() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/melt.py:1() + 1 0.000 0.000 0.022 0.022 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/figure.py:181(FigureBase) + 62 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3796() + 192 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:230(decorator) + 1 0.000 0.000 0.037 0.037 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/text.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:26(__init__) + 50 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1884(set_name) + 22 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/__init__.py:176(flex_method_SERIES) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/categorical.py:246(Categorical) + 22 0.000 0.000 0.004 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:339(yield_from_source_iterator) + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/codecs.py:309(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:107(__calc_date_time) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/accessor.py:68(forbid_nonstring_types) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend.py:342(Legend) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/warnings.py:130(filterwarnings) + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:8406(_replace_return_type) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/uuid.py:1() + 298 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1617(overload) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:271() + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:1233(formatannotation) + 29 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:575(_cmp_fn) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:331(_resolve) + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:144(Block) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/missing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/period.py:1() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/__init__.py:1() + 1 0.000 0.000 0.024 0.024 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:1() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/_io.py:1() + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:876(copy_with) + 228 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects} + 48 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:741(config_prefix) + 23 0.000 0.000 0.000 0.000 {built-in method _struct.calcsize} + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:997(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/interval.py:148(IntervalIndex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/pickle_compat.py:1() + 31 0.000 0.000 0.000 0.000 {built-in method numpy.arange} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:705(polyval) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:242(solve_dependencies) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1013(reset_cache) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/twodim_base.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:64(check_isinstance) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:553(_define_adder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/quoprimime.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:578(_ReducedHCT_Element) + 363 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:781(__iter__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/figure.py:2360(Figure) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:62(__init__) + 11 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects} + 45 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:730(implement_consistent_units_by_argument) + 33 0.000 0.000 0.009 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:1012(wrap) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:1() + 111 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:554() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/holiday_base.py:12() + 1 0.000 0.000 0.038 0.038 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/__init__.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/common.py:2() + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/__init__.py:1() + 170 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:953(copy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/_endian.py:1() + 105 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:86(copy) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:62(_process_keys) + 156 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1973(__hash__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:1() + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:73(_create_methods) + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:1() + 98 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:758(decode) + 23 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:177(decorator) + 2 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:1170(make_dataclass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/grouper.py:1() + 441 0.000 0.000 0.000 0.000 {built-in method builtins.globals} + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:702(_from_parts) + 1 0.000 0.000 0.041 0.041 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/__init__.py:1() + 14 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/__init__.py:438(flex_arith_method_FRAME) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/types.py:69(new_class) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1045(__del__) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha3_224} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/encoder.py:1() + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:8394(getdoc) + 4 0.000 0.000 0.000 0.000 {method 'fileno' of '_io.BufferedReader' objects} + 1 0.000 0.000 0.141 0.141 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/changeyear.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/helpers.py:541(_makeTags) + 16 0.000 0.000 0.000 0.000 {method 'splitlines' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/docstrings.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/_mixins.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/datetimes.py:1() + 1 0.000 0.000 0.021 0.021 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/api.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/holiday_base.py:51(HolidayBase) + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:59(parsestr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:1() + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:1() + 81 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/__init__.py:25(decorator) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1184(wait) + 47 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:752(__fspath__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:94(_add_aliases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:202() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/html.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py:155(DatetimeArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/timedeltas.py:1() + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:667(__init__) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:804(__mro_entries__) + 245 0.000 0.000 0.000 0.000 {built-in method _sre.unicode_tolower} + 65 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:205() + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:8389(__init__) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4263(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/period.py:114(PeriodArray) + 73 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:775(keys) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:299(parse_single) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/plotting/_core.py:1() + 1 0.000 0.000 0.020 0.020 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/compat/__init__.py:1() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:105(__init__) + 1 0.000 0.000 0.029 0.029 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1() + 2 0.000 0.000 0.010 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:403(select) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:150(__init__) + 24/19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2119(_define) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:309(_convert) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/core.py:49(use) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/_common.py:1() + 388 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1646(final) + 1 0.000 0.000 0.045 0.045 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/random/__init__.py:1() + 201 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:59(func) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:613(load_definitions) + 54 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2477(parseImpl) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/datetimelike.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/type_check.py:1() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:33(seterr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:29() + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4077(_generateDefaultName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1969() + 5 0.000 0.000 0.000 0.000 {built-in method _imp.exec_builtin} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/base.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:102(ExtensionArray) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:132(check_shape) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:1() + 14 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:618(set_parse_action) + 12 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1132(parse_string) + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:440() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/concat.py:1() + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1098(_make_child_relpath) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_compile.py:440(_bytes_to_codes) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/function_base.py:2285(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/pivot.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/TiffTags.py:20() + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_string_helpers.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/period.py:1() + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:543() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:235(register) + 72 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:771(wrap) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/timedeltas.py:103(TimedeltaArray) + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:218(_acquireLock) + 334 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:787(name) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/masked.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:264(get_aliased_and_aliases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_cm.py:1() + 17/10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:42(__init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/generic.py:1164(DataFrameGroupBy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:1() + 2 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:173(__init__) + 1 0.000 0.000 0.013 0.013 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/masked.py:100(BaseMaskedArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/xml.py:1() + 39 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:303(splitroot) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1() + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:24(_prevent_rasterization) + 223 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/prices/utils.py:1() + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1595(_array_str_implementation) + 114 0.000 0.000 0.000 0.000 {built-in method _struct.unpack} + 22 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5233(parseImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/numbers.py:1() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:377(_mac_os_check) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/array_ops.py:1() + 37 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:16(_fr0) + 53 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:182(_add_module) + 77 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:91(ismethoddescriptor) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hashlib.py:5() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/concat.py:1() + 6 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects} + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:637(_create_method) + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1166(glob) + 78 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4078() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2271() + 16 0.000 0.000 0.000 0.000 {built-in method time.strftime} + 168 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:183() + 69 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/signal.py:9() + 10/3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:14(__get__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:1() + 204 0.000 0.000 0.000 0.000 {method 'ljust' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/nanfunctions.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:101(Random) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tempfile.py:1() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/base.py:269(IndexOpsMixin) + 1 0.000 0.000 0.015 0.015 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/core.py:1() + 119 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:196() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:210(__init__) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:924() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/align.py:1() + 171 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1734(leave_whitespace) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:111() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/contexts.py:1() + 172 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/multiarray.py:153(concatenate) + 65 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:849(__iter__) + 1 0.000 0.000 0.018 0.018 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/compat/py3k.py:1() + 27 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:176(finalize) + 65 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:99(deprecated) + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:589(_hash_fn) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:4() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expressions.py:1() + 130 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:413(__getitem__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/plot.py:1() + 23/6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4607(streamline) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/signal.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/shape_base.py:1() + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:831(name) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:10() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1() + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/compressors.py:1() + 59 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:98(_compile) + 185 0.000 0.000 0.000 0.000 {method 'endswith' of 'bytes' objects} + 41 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:431(UnitsContainer) + 10/5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:973(__get__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pickle.py:1() + 9 0.000 0.000 0.017 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:729(__init_subclass__) + 22 0.000 0.000 0.000 0.000 {built-in method _abc._abc_register} + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1() + 53 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:284() + 1 0.000 0.000 0.015 0.015 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:1() + 2 0.000 0.000 0.000 0.000 {built-in method posix.mkdir} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:238(Dvi) + 1 0.000 0.000 0.016 0.016 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/api.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:467(Image) + 85 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:993() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:1() + 28 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects} + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/utils.py:5() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/bz2.py:1() + 100 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:234() + 77 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:286(isbuiltin) + 102 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:767() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/polynomial.py:1472(Polynomial) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:6133() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:971(__or__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/records.py:1() + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/describe.py:1() + 1 0.000 0.000 0.068 0.068 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:1() + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parquet.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:139(__new__) + 95 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:185(keys) + 81 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/__init__.py:14(set_module) + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:325(find_cookie) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/encoding.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/construction.py:1() + 143 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3970() + 26 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:164(islink) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gettext.py:1() + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5682(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_sysconfigdata__darwin_darwin.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/bezier.py:1() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/__init__.py:14() + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:33(parse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/_polybase.py:18(ABCPolyBase) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:119(clear) + 1 0.000 0.000 0.105 0.105 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/__init__.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/category.py:1() + 21 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:43(update) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:58(__getitem__) + 38 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:24(_fr1) + 1 0.000 0.000 0.010 0.010 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:5() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:2() + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:272(__getitem__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2928(_generateDefaultName) + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/__init__.py:14() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1411(get_type_hints) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:483(__init__) + 2 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:526(read_text) + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:462(_validate_linestyle) + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:77(__getitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/array.py:292(SparseArray) + 82 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:903() + 39 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1097(parse_unit_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/from_dataframe.py:1() + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:194(find_spec) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:300(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/missing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/categories.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry_helpers.py:1() + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:783(copy_with) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/python_parser.py:1() + 134 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/_distutils_hack/__init__.py:96() + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:940() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:736(_make_child) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:132(geterr) + 4 0.000 0.000 0.000 0.000 {built-in method posix.register_at_fork} + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/fft/_pocketfft.py:1() + 84 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:244() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numerictypes.py:441(_construct_lookups) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:21(_fileobj_to_fd) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:680(operate) + 105 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:88(do_copy) + 138 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:247() + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/util/hashing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/range.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:84(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:76(inner) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/struct.py:1() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:771(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:484(__new__) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1955() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/tile.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/pfstate.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/string_.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/accessor.py:1() + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:709(max) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/utils.py:12() + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:482(cycler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/localedata.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_nested_sequence.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/lines.py:216(Line2D) + 105 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:331(wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/testing/testing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:1() + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:227(_releaseLock) + 62 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1089(_init) + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:770(_hash_add) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/mlab.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:711(copy) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/path.py:202(_update_values) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:454(from_definition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:488(_read_tzfile) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/__init__.py:2() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:1() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:506(suppress_matplotlib_deprecation_warning) + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:955(__contains__) + 24/19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1441(_define) + 1 0.000 0.000 0.097 0.097 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:1() + 35 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/header.py:5() + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/common.py:34(wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:673() + 85 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1910(streamline) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:110(_create_delegator_method) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/utils.py:1() + 10/4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4271(streamline) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/text.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/fnmatch.py:1() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/eval.py:1() + 23 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5225(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/chebyshev.py:1() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:596(__sub__) + 38 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:91(_float_to_float) + 20 0.000 0.000 0.000 0.000 {built-in method _functools.reduce} + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:44(_bits_of) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:546(_cycler) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:368(__init__) + 1 0.000 0.000 0.083 0.083 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/matplotlib.py:1() + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1561(__or__) + 62 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2285(_register_style) + 141 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated} + 91 0.000 0.000 0.000 0.000 {built-in method sys._getframe} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/datetimelike.py:81(DatetimeIndexOpsMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:388(open) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:1() + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:52(__init__) + 1 0.000 0.000 0.110 0.110 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/numpy/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/ewm.py:124(ExponentialMovingWindow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/helpers.py:1027() + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_dtype_ctypes.py:100(dtype_from_ctypes_type) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:911(construct_from_string) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:760(get) + 84 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:149(lazy) + 97 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:6025() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/proj3d.py:1() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:260() + 127 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2435(__getnewargs__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/prices/convert.py:1() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:135(__hash__) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/textpath.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:799(singledispatch) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/_optional.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/wavg.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:149(PfLineArithmatic) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1689(isEnabledFor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/numeric.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:2() + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:423(register_extension_dtype) + 42 0.000 0.000 0.000 0.000 {method 'update' of 'set' objects} + 39 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:83() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1630(make_norm_from_scale) + 3 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2211(__init_subclass__) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:240(_check_versions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pprint.py:103(PrettyPrinter) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:450() + 31 0.000 0.000 0.000 0.000 {method 'reshape' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/interop.py:1() + 10 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5706(__init__) + 51 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2448(_generateDefaultName) + 129 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:24(__getitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/bz2.py:27(BZ2File) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:938(_create_pseudo_member_) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:219(__seqToRE) + 6 0.000 0.000 0.000 0.000 :415(spec_from_loader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/function_base.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_exceptions.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/managers.py:95(BaseBlockManager) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:12() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:843(is_one_of_factory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/markers.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/sorting.py:1() + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:1337(_to_unmasked_float_array) + 46 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:110(__init__) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:1179(construct_from_string) + 1 0.000 0.000 0.091 0.091 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colorbar.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_fontconfig_pattern.py:57(_make_fontconfig_parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/datetimelike.py:404(DatetimeTimedeltaMixin) + 5 0.000 0.000 0.003 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:178(from_string) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:920() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tokenize.py:319(read_or_stop) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:290(__getattr__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/bisect.py:1() + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:744() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6550(__new__) + 1 0.000 0.000 0.093 0.093 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__config__.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ntpath.py:2() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/_compat.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/gridspec.py:26(GridSpecBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arraylike.py:31(OpsMixin) + 161 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:200(escape_re_range_char) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2952(_update_from) + 92 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects} + 1 0.000 0.000 0.000 0.000 {method 'reduce' of 'numpy.ufunc' objects} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/decimal.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/contour.py:72(ContourLabeler) + 15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:468(__copy__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext_data.py:464() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:14(lighten) + 62 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:49() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_afm.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:321(extract) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:514(_get_config_or_cache_dir) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/scope.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/selectn.py:1() + 15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:85(_listify_validator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/base.py:19(BaseStringArrayMethods) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:67(zeros_like) + 68 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:479(set_raw) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/array_ops.py:408(get_array_op) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:511() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:336(_validate_cmap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/numpy_.py:1() + 134 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:93(__init__) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/__init__.py:1() + 1 0.000 0.000 0.021 0.021 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_fontconfig_pattern.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1671(FigureCanvasBase) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:3() + 48 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/arraysetops.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:1115(StataReader) + 76 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:640() + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:223(split) + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:203(_add_array_type) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axis3d.py:38(Axis) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:340() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:1() + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:46() + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:188(_filter_nodes) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/doc.py:93(window_agg_numba_parameters) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2808(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/__init__.py:182() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_table_schema.py:1() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:140(basename) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/engines.py:1() + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha3_256} + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:515(_cmpkey) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:206(BaseRegistry) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:849(__init__) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:237(getdoc) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:688(__delitem__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:2() + 297 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:434(BakomaFonts) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2607(__hash__) + 108 0.000 0.000 0.000 0.000 {built-in method _struct.pack} + 70 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:794(_is_dim) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/generic.py:1() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:78(_check_methods) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:1() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/api.py:1() + 47 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:697(__iter__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:290(update) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:737(_get_scale_docs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:327(f) + 53 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/pint_eval.py:69(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:1() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:78(__init__) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/decoder.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/string_arrow.py:1() + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:193(_checkLevel) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1479(__mul__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:74(_add_types) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:259(getwhile) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2544(_arraymethod) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:843(register) + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:337(__repr__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:17(TextWrapper) + 2 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/__init__.py:299(loads) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:255(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:34(ParseResults) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1215(__init__) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/boolean.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ctypeslib.py:1() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:431(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/decoder.py:284(__init__) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:725(__truediv__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/c_parser_wrapper.py:1() + 78 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:110(get) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/astype.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:435(joinpath) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/__init__.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_constrained_layout.py:1() + 59 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:601() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:10() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sas/sasreader.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/legendre.py:1() + 13 0.000 0.000 0.002 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:401(validate_font_properties) + 156 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:805(postParse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/timedeltas.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/core.py:1041(default_locale) + 119 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects} + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/codecs.py:260(__init__) + 1 0.000 0.000 0.238 0.238 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/plot.py:1() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:771() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:123(_add_integer_aliases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:479(HDFStore) + 57 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2275() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/api.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_char_codes.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/relativedelta.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/texmanager.py:1() + 10 0.000 0.000 0.000 0.000 {method 'tolist' of 'memoryview' objects} + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:434(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/nested_helper.py:1() + 55 0.000 0.000 0.000 0.000 {method 'mro' of 'type' objects} + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/abc.py:110(register) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/core.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/datetimes.py:103(DatetimeIndex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:48() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/flags.py:6(Flags) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/base.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/feather_format.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/base64mime.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/categories.py:22(Categories) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2106(IdentityTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/period.py:70(PeriodIndex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:99(_extend_docstrings) + 65 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:257(__bool__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:560(RawConfigParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:612(BaseGroupBy) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2929(charsAsStr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:870(Window) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/printing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/lzma.py:38(LZMAFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/category.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/twodim_base.py:534(vander) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numerictypes.py:514(_scalar_type_key) + 9 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/laguerre.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:159(Version) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/html/__init__.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:1066(expand_template) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:120(_WindowsFlavour) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:95(BinOp) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs.py:6754(refer_to_array_attribute) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/arrow/dtype.py:1() + 1 0.000 0.000 0.936 0.936 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/dev/__init__.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/uuid.py:138(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_openpyxl.py:1() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:381(__getattr__) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/__init__.py:2() + 1 0.000 0.000 0.020 0.020 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/matrixlib/defmatrix.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3086(ArrowStyle) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:1() + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:180(from_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:171(_expand_vars) + 89 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:802(__init__) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1927(_namedtuple_mro_entries) + 1 0.000 0.000 0.019 0.019 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/__init__.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/table.py:9() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/prices.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/compat/py3k.py:92(contextlib_nullcontext) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/numeric.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/numpy_.py:39(PandasArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:59(NDArrayOperatorsMixin) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:146(_munge_whitespace) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:465(register) + 62 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:96(lazy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzinfo.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/array_manager.py:99(BaseArrayManager) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:212(_validate_pathlike) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:841(outer) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:752(construct_from_string) + 55 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:394() + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:273(validate_color_or_auto) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:313(from_lines) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:76(CFUNCTYPE) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:843(TarInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:667(BaseGrouper) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5979() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/scanner.py:1() + 25 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:106(__eq__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:430(__enter__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextvars.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:450(StringConverter) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/accessor.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colorbar.py:195(Colorbar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/utils.py:1() + 44 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3986() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:90() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_base.py:1404(ExcelFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/numba_.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/GimpGradientFile.py:16() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansitowin32.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/numba_.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2293(BoxStyle) + 41 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:205() + 27 0.000 0.000 0.000 0.000 {method 'rsplit' of 'str' objects} + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:331(Version) + 57 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:152() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/base.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_normalize.py:3() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/changefreq.py:1() + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:249() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/fnmatch.py:80(translate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/orc.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/object_array.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/managers.py:972(BlockManager) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1146(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/plotting/_core.py:613(PlotAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimelike.py:1789(TimelikeOps) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gzip.py:1() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:818(_from_iterable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:269(close) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/custom.py:24(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_cm.py:158() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/numbers.py:4() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/format.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_validators.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:75(__call__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1086(enable_packrat) + 52 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/common.py:21(unpack_zerodim_and_defer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/tzone.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/fft/__init__.py:1() + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_md5} + 36 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:285(line) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:126(seed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:1() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:650(cache) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:307(_get_machar) + 3 0.000 0.000 0.000 0.000 {built-in method _csv.register_dialect} + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/charset.py:5() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:176(add_delegate_accessors) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:43(Tick) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:830(uname) + 64 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:805(__len__) + 25 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:949() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2578(Fixed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:3237(Table) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/thai.py:21(_ThaiLunisolar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/isboundary.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:1712(_add_arithmetic_ops) + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:1855(isscalar) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:360(add) + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:845() + 1 0.000 0.000 0.007 0.007 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arraylike.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:110(BaseWindow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:211(BboxBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pprint.py:11() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:747(get_symbol) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/hermite_e.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1697(Norm) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:83() + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:262() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1174(parse_units) + 57 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:265() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1584(_get_handles) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/__init__.py:1() + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:844() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:85(__call__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:1() + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:996(CheckButtons) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:350() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:631(DatetimeTZDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/array_manager.py:695(ArrayManager) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:44(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/twodim_base.py:158(eye) + 1 0.000 0.000 0.243 0.243 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_secondary_axes.py:11(SecondaryAxis) + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:815(__new__) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/abc.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/timedeltas.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:205(PintArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:25(ParseBaseException) + 96 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:778() + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4332() + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:80() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/texmanager.py:56(TexManager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/concat.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_print_versions.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/doc.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:588(matplotlib_fname) + 38 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:12(code_to_chars) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/arrow/dtype.py:195(construct_from_string) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_secondary_axes.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1434(is_dir) + 4/3 0.000 0.000 0.000 0.000 {method 'view' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/extension.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2264() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/_warnings.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:445(zip_children) + 36 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/api/types/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_util.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:123(CategoricalDtype) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1446(__radd__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:27(Collection) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2888(_hash_basis) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/table.py:37(Cell) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/base_parser.py:99(ParserBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:85(identchars) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/actions.py:3() + 12/2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1538(makeOptionalList) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_odfreader.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/islamic.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:30() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/hermite.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/registry.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1594(datetime) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5899(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/histograms.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:114(__call__) + 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.TextIOWrapper' objects} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:159(_commonType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:558(DataFrameFormatter) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:943() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:340(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/fractions.py:38(Fraction) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:5() + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:41(parse) + 60 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:956() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:43(Wqpr) + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_string_helpers.py:16(english_lower) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:49(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1209(resolve) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hmac.py:27(HMAC) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:101(push) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:139(finalize) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:69(PfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_text_helpers.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:2231(StataWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/babel_names.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:677(Bbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:153(RendererBase) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/path.py:1() + 60 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:404() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/dtype.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/plotting/_misc.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/common.py:1() + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1847() + 11 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:251(_inner) + 92 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2869(return_annotation) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:248(unregister) + 59 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:409(__subclasshook__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:653(PurePath) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:308(construct_from_string) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:315(_compile_repl) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:489(indent) + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:139(__init__) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:242(__set_name__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/standardize.py:1() + 2/1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:535(get_config_vars) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:91() + 16/4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:79(_convert) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:86(_get_system_version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/dates.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/matrixlib/defmatrix.py:73(matrix) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:30(Unit) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:989(__setitem__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4968(__init__) + 44 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:101(_float_conv) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:341(BaseExprVisitor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/einsumfunc.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/polyutils.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/inference.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:118() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:102(WrappedCythonOp) + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:1851(_str_equal) + 21 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:461(readlink) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/matplotlib.py:60(setup_matplotlib_handlers) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/defchararray.py:1922(chararray) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/api.py:1() + 29 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:112(__post_init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/expanding.py:1() + 53 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:280(replaced_by_pep8) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:27(Patch) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:1008(_sys_version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/freq.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:720(_create_comparison_method) + 1 0.000 0.000 0.011 0.011 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/fractions.py:4() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansitowin32.py:16(StreamWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/trim.py:1() + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_dtype_ctypes.py:71(_from_ctypes_scalar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/tseries/offsets.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:334(_init_dynamic_classes) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:363() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/types.py:100(prepare_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:1604(TarFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:151(_set_up_aliases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/clipboards.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:99(identbodychars) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/flat_helper.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/stride_tricks.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_asarray.py:1() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:990(addgroup) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1552(__call__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:584(_setResultsName) + 44 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:17() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/indexing.py:1() + 2 0.000 0.000 0.000 0.000 {built-in method time.tzset} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gzip.py:120(GzipFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/grouper.py:468(Grouping) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/create.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/dev/mockup.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/memmap.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:294(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_tripcolor.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/putmask.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/frame.py:1() + 32 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:1862(_str_lower_equal) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:378(DistributionFinder) + 72 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:551() + 1 0.000 0.000 0.149 0.149 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:2793(NavigationToolbar2) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/units.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/arrow_parser_wrapper.py:1() + 10 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1429(_parse_units) + 14 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:698() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/linecache.py:80(updatecache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/common.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_typing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/intersect.py:1() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:817(is_instance_factory) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/win32.py:4() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/extendpandas.py:10(apply) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:715(_generate_next_value_) + 56 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4031() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:302(from_string) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:767(__contains__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/categorical.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:102(BasicPythonHeader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:18(PolarTransform) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_odswriter.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/spines.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/win.py:2() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:445() + 55 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects} + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:694(__mro_entries__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/masked_reductions.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/measurement.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/common.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/mathtext.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/genericpath.py:39(isdir) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4633(_generateDefaultName) + 63 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects} + 23 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:173(array_function_from_dispatcher) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/__init__.py:37(set_function_name) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:716(_create_arithmetic_method) + 47 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4266() + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/string.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:54(literal_eval) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_bootlocale.py:33(getpreferredencoding) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_encoded_words.py:1() + 5 0.000 0.000 0.000 0.000 {built-in method posix.waitstatus_to_exitcode} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/dtype.py:42(SparseDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/managers.py:1835(SingleBlockManager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:213(_get_version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:1() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:634() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:262(_reset_cache) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:122(_add_methods) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:1564(_load_fontmanager) + 1 0.000 0.000 0.010 0.010 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:344(Slider) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/floor.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:211(_set_array_types) + 60 0.000 0.000 0.000 0.000 {method 'removeprefix' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:3809(PolygonSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/ufunclike.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_shape.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/appdirs.py:6() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:802(__init__) + 56 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:530(_select_from) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:434(__iter__) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/overrides.py:23(set_array_function_like_doc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/_random.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/compat.py:62(_test_array_function_protocol) + 1 0.000 0.000 0.009 0.009 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/flat_methods.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:96(__get__) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:956(getattr_maybe_raise) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/leftandright.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/units.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/layout_engine.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/gridspec.py:1() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/fromnumeric.py:3176(ndim) + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:44(_numeric_methods) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/nested_methods.py:1() + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2269() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:195(add_units) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/quiver.py:445(Quiver) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/__init__.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/__init__.py:8() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:1416(ArtistInspector) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:438() + 46 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:315(__subclasshook__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_distributor_init.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/categorical.py:122(_cat_compare_op) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:851(get_root_units) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1066(Path) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:152(__calc_timezone) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:1324(__init__) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:2259(_make_getset_interval) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:1() + 2 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/decoder.py:332(decode) + 2 0.000 0.000 0.008 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/__init__.py:32(message_from_string) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/_optional.py:91(import_optional_dependency) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_layoutgrid.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1138(home) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/text.py:1615(Annotation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/pfstate_helper.py:1() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:82(RLock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:105(Message) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:582(get_data_path) + 7 0.000 0.000 0.004 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/__init__.py:109(import_module) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:779(items) + 2 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1262(read_text) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:861(_DomainGreater) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/numeric.py:238(NumericArray) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:327(resolve) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:45(parse) + 57 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects} + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/re.py:331(filter) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:56(__init_subclass__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/isoparser.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_xlrd.py:1() + 5 0.000 0.000 0.003 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:67(numeric_parse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:763(GraphicsContextBase) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/__init__.py:480(flex_comp_method_FRAME) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4563(recurse) + 47 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4267() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/parsing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:31(DefinitionFile) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:178(_call_parse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_datasource.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/buddhist.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageColor.py:20() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:95(__calc_am_pm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:600(FrameApply) + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:36(_inplace_binary_method) + 96 0.000 0.000 0.000 0.000 {built-in method builtins.abs} + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:465(indent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:97(_determine_error_states) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:920(npy_ctypes_check) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/plotting/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/spss.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:119(Cycler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1419(exists) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha3_512} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3018(Regex) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:366(unregister) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_globals.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_common.py:1() + 1 0.000 0.000 0.084 0.084 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2323(setup_matplotlib) + 28 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:696() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:62(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/fft/helper.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:700(Popen) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6540(MaskedConstant) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:458(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:70(Term) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/merge.py:638(_MergeOperation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/python_parser.py:62(PythonParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:508(Formatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:264() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/peakperiod.py:16(factory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:2242(LogLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:31(General) + 4 0.000 0.000 0.000 0.000 {method 'read' of '_io.StringIO' objects} + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:958(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/api.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/pfstate.py:22(PfState) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/__init__.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/__init__.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/display.py:1() + 52 0.000 0.000 0.000 0.000 {method 'removesuffix' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/localization.py:1() + 2 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/hashlib.py:82(__get_builtin_constructor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/base.py:181(SelectionMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2750(GenericFixed) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/take.py:352(_view_wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_base.py:900(ExcelWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/string_arrow.py:63(ArrowStringArray) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/peakperiod.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/util/numba_.py:1() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5904(__add__) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axis3d.py:5() + 27 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:343() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:233(__init__) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:171(__init__) + 1 0.000 0.000 0.000 0.000 {built-in method posix.urandom} + 1 0.000 0.000 1.007 1.007 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/dev_scripts/heaviness.py:6(main) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/isoparser.py:22(_takes_ascii) + 1 0.000 0.000 0.011 0.011 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/ndframelike.py:1() + 5 0.000 0.000 0.000 0.000 :241(_requires_builtin_wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:664(_LocationIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_pyxlsb.py:18(PyxlsbReader) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1679(_make_norm_from_scale) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1697(__call__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:771() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:352(register) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_shake_128} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/stackplot.py:1() + 2 0.000 0.000 0.000 0.000 {built-in method posix.unsetenv} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/chinese.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:1077(poly1d) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:217(__init_subclass__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:877(to_units_container) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1814(__del__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shlex.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_tester.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:208(OffsetBox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:102(PfStateArithmatic) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:273() + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_shake_256} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:191() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/_constants.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/replace.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:441(_validate_papersize) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3533() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/api/extensions/__init__.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:970(json_load) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/duration.py:1() + 59 0.000 0.000 0.000 0.000 {method 'span' of 're.Match' objects} + 36 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:78() + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/invalid.py:40(make_invalid_op) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_pyxlsb.py:2() + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/fractions.py:276(_operator_fallbacks) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:84() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/grouper.py:57(Grouper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/utils.py:1() + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_tzpath.py:1() + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha3_384} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/ops.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1991(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/numbers.py:32(Complex) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sre_parse.py:289(seek) + 35 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:383(_check_int_field) + 1 0.000 0.000 0.000 0.000 {method 'sum' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:181(LegacyVersion) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:39(ExtensionDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/frozen.py:21(FrozenList) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/constants.py:14() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/initialise.py:2() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:415(_check_date_fields) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:174(_make_type_validator) + 60 0.000 0.000 0.000 0.000 {built-in method builtins.divmod} + 36 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/_numba/executor.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tempfile.py:627(SpooledTemporaryFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1615(__init__) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:64(_iter_definitions) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/charset.py:211(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:1034(NonUniformImage) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_base.py:518(BaseExcelReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/prices/hedge.py:1() + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:523() + 2 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5996(srange) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:2533(SpanSelector) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:6023() + 7 0.000 0.000 0.004 0.001 :1018(_gcd_import) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_xlsxwriter.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/gregorian.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/registry.py:167(EntityLoader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3001(Bar) + 2 0.000 0.000 0.011 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:562(version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:1341(TextBox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:390(render_pep440) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:1() + 2 0.000 0.000 0.000 0.000 {built-in method numpy.zeros} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzfile.py:1() + 1 0.000 0.000 0.096 0.096 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_libs/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/_binary.py:15() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageChops.py:18() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5111(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/__future__.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:306(decorator) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:156(has_symbol) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:152(validate_axisbelow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:665(Colormap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3749(ParseExpression) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:435(__exit__) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:131(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/masked_accumulations.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:3158(StataWriter117) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/table.py:239(Table) + 10 0.000 0.000 0.000 0.000 {method 'cast' of 'memoryview' objects} + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5249(_generateDefaultName) + 27 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects} + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/_mixins.py:77(ravel_compat) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:188(caching_module_getattr) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha224} + 1 0.000 0.000 0.000 0.000 {built-in method math.sqrt} + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:465(maybe_operate_rowwise) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/string_.py:230(StringArray) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2897(__hash__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/winterm.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/floating.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/times.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/api/indexers/__init__.py:1() + 26 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4279() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/common.py:430() + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:221() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:791(Thread) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/children.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/string.py:69(__init_subclass__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:93(raiseerror_if_otherNone) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/core.py:1150(parse_locale) + 35 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/multiarray.py:1080(copyto) + 38 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects} + 92 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:141() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:615(RangeSlider) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:716(TableBuilderAbstract) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:53(__init__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1602(__new__) + 1 0.000 0.000 0.000 0.000 {method 'newbyteorder' of 'numpy.generic' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:315(UnitsContainer) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:564(get_content_type) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:94(_append_doc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:821(PeriodDtype) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4331(_generateDefaultName) + 47 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:151() + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:19(type_aliases_gen) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3641(__init__) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cycler/__init__.py:190(change_key) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/base.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_cm_listed.py:2061() + 2 0.000 0.000 0.000 0.000 {built-in method posix.putenv} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1318(mkdir) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:844(SQLTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/startofday.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:162(Distribution) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:46(dont_init_twice) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2658(ConnectionStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/abc.py:59(Traversable) + 1 0.000 0.000 0.021 0.021 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/matrixlib/__init__.py:1() + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/numpy/function.py:48(__init__) + 56 0.000 0.000 0.000 0.000 {method '__init_subclass__' of 'object' objects} + 5 0.000 0.000 0.000 0.000 :1233(_get_parent_path) + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:48(add_flex_arithmetic_methods) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:670(Rectangle) + 5 0.000 0.000 0.000 0.000 :757(create_module) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_fontconfig_pattern.py:59(comma_separated) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:94(iter_definitions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:128(pyparsing_unicode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3612(__init__) + 2 0.000 0.000 0.000 0.000 {built-in method math.log} + 1 0.000 0.000 0.000 0.000 {method 'view' of 'numpy.generic' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:1942(IndexCol) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/round.py:1() + 2 0.000 0.000 0.002 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:536(distribution) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:120(CallbackRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/api.py:23(FFI) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:804(PolarAxes) + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2889() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/locale.py:386(normalize) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/locale.py:577(getlocale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/hindu.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:31(PintType) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:974(__truediv__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/missing.py:873(_datetimelike_compat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/spines.py:14(Spine) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:80(_invalidates_cache) + 38 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects} + 85 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_compat_pickle.py:167() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:584(_can_use) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_odswriter.py:30(ODSWriter) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4103(__init__) + 1 0.000 0.000 0.016 0.016 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/__init__.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:127(maybe_split) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:144(method_wraps) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_tight_layout.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:304(GPS) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1590(nocache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:241(parserinfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/_ranges.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:214(socket) + 15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:311(copy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:97(ColorSequenceRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:1037(IntervalDtype) + 1 0.000 0.000 0.088 0.088 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:526(ParserHelper) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:696(min) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:3205(RectangleSelector) + 2 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:281(__set_name__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_machar.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5322(__init__) + 1 0.000 0.000 0.004 0.004 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:214(parse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:787(JsonReader) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:508(_search_paths) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3089(re) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/arraypad.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:117(_get_system_version_tuple) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:169(_SixMetaPathImporter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/missing.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:289(wrapper) + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:21(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/base.py:37(DataManager) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:200(extract_stack) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1314(__init__) + 38 0.000 0.000 0.000 0.000 {built-in method _ctypes.sizeof} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/quantile.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:231(_ImageBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/colorsys.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:516(select_from) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/accessor.py:137(_map_and_wrap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5412(Forward) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1339(LocationEvent) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/__init__.py:1() + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py:115(_field_accessor) + 74 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:203(no_escape_re_range_char) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:51() + 2 0.000 0.000 0.000 0.000 :1216(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/pint_eval.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/testing.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1212(AnnotationBbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/ndframelike.py:11(NDFrameLike) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:388(realpath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:3127(view) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/concat.py:388(_Concatenator) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:312(_logged_cached) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/excelclipboard.py:22(ExcelClipboardOutput) + 71 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/signal.py:21() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:386(tzfile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:102(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/dataframeexport.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:52() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:118() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_common.py:132(_validate_fromutc_inputs) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/api/interchange/__init__.py:1() + 23 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects} + 70 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/signal.py:16() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:381(fill) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/_polybase.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/display.py:17(detect_console_encoding) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/tseries/frequencies.py:178(_FrequencyInferer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/string_.py:68(StringDtype) + 2 0.000 0.000 0.009 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:263(version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/quiver.py:235(QuiverKey) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triplot.py:1() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:229() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4535(ParseElementEnhance) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:609(gen_candidates) + 23 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:810(inner) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/datetimelike_accumulations.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/ceil.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/holiday_base.py:970(HolidaySum) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:2() + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/inference.py:328(is_hashable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/pyarrow.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/check.py:1() + 29 0.000 0.000 0.000 0.000 {method 'readline' of '_io.BytesIO' objects} + 43 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_compat_pickle.py:165() + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha1} + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/__init__.py:274(load) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImagePalette.py:19() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1693(Annulus) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6643(__setattr__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:848(Handler) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3685(parseImpl) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:2197(make) + 23 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:152(symbol) + 21 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:996() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:64(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_dtype.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/boolean.py:232(BooleanArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/frozen.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/array_manager.py:1147(SingleArrayManager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/plotting/_misc.py:553(_Options) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:1505(SQLDatabase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:345(PngStream) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_trirefine.py:1() + 3 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1118(_opener) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:489() + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:471(remove_custom_flags) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:1() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:428(_check_time_fields) + 26 0.000 0.000 0.000 0.000 {method 'index' of 'str' objects} + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:925(clear) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:595(render) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6345(mvoid) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/util.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:214(__init__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:400(_datetimelike_compat) + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:251(__contains__) + 18 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj} + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:201(register_class) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:70(__init__) + 15 0.000 0.000 0.000 0.000 :1() + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:260(__iter__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/generic.py:11879(_doc_params) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/container.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/function_base.py:2117(vectorize) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/console.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:358(BaseInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2263(DataCol) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5090(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1513(Ellipse) + 12 0.000 0.000 0.000 0.000 {built-in method builtins.round} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/arrow/dtype.py:39(ArrowDtype) + 30 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4278() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:925(copy_with) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:409(_NormalAccessor) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:80(__calc_weekday) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:6033(token_map) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:172() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:148(Calendar) + 1 0.000 0.000 0.014 0.014 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/arrow/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:669(BaseWindowGroupby) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_xlsxwriter.py:175(XlsxWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3173(QuotedString) + 5 0.000 0.000 0.000 0.000 {method 'rfind' of 'bytes' objects} + 33 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:452(_parse_letter_version) + 21 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3780(recurse) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:61(series_property_raising_typeerror) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:200(_Framer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:2123(identity) + 1 0.000 0.000 0.109 0.109 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/__init__.py:2() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:1() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:239(__init__) + 26 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4277() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/quiver.py:866(Barbs) + 27 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1197() + 1 0.000 0.000 0.000 0.000 {method 'squeeze' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_version.py:14(NumpyVersion) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:648(__copy__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_pylab_helpers.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:169(Column) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3099(re_match) + 1 0.000 0.000 0.000 0.000 {built-in method select.poll} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:116(_get_single_key) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3552(__init__) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2265() + 33 0.000 0.000 0.000 0.000 {built-in method _operator.index} + 3 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects} + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:157(_register_type) + 1 0.000 0.000 0.000 0.000 {built-in method time.localtime} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:2216(timezone) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:263(_Unframer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:445(LibraryLoader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/online.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1302(RegularPolyCollection) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:102(join_parsed_parts) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:2303(__init__) + 2 0.000 0.000 0.009 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:246(metadata) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:229(VolumePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/abc.py:13(ResourceReader) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:382(__exit__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:221(validate_fonttype) + 11 0.000 0.000 0.000 0.000 {method 'index' of 'tuple' objects} + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1227(stat) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/__init__.py:36(__deprecate_private_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/gbq.py:1() + 15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:915() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2007(_init_dynamic_classes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/testing.py:15(pyparsing_test) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:793(date) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2338(CompositeGenericTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:295(NestedPfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:1602(RadioButtons) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triangulation.py:8(Triangulation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:15(GeoAxes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/numbers.py:294(Integral) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:362(__subclasshook__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:4054(FancyArrowPatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/relativedelta.py:18(relativedelta) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/_util.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/dispatch.py:1() + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/__init__.py:1() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:33(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:270(FlatPfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/__init__.py:186(Path) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/interop.py:21(InOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:319(CDLL) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/arrow_parser_wrapper.py:15(ArrowParserWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/excelclipboard.py:1() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:511(update) + 20 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:847(inner) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:426(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/enums.py:4(Kind) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/figure.py:2149(SubFigure) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:928(_missing_) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:115(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:977(_MaskedBinaryOperation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:360(DataFrame) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_openpyxl.py:532(OpenpyxlReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1514(findCaller) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/encoders.py:5() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/genericpath.py:27(isfile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:950(_set_tstate_lock) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4949(__init__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:996(__new__) + 7 0.000 0.000 0.000 0.000 :948(_sanity_check) + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/function_base.py:19(_linspace_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:2289(XAxis) + 31 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/multiarray.py:669(result_type) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:17(_display_as_base) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:31(unicode_set) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3510(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:33() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:179() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:26(InfinityType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:396(PyTablesExprVisitor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_parseaddr.py:207(AddrlistClass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_parseaddr.py:4() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:512(to_rgb) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:2177(_SelectorWidget) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/extension.py:113(inherit_names) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/righttoleft.py:1() + 38 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects} + 3 0.000 0.000 0.000 0.000 :1251(__iter__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2892() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:228(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:41() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:441(_setdef) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1283(_replace_dtype_fields_recursive) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2372(_MaskedPrintOption) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1189(ZipFile) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1424(debug) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:159(__call__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:421(validate_whiskers) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:342(wrap) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:3417(dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:405(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:390(ScalarMappable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:716(add_condition) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1270(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1245(time) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_common.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:26(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3588(_apply_env_variables) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansitowin32.py:72(AnsiToWin32) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3807(FancyBboxPatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:2940(ToolLineHandles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:212(Add) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1259(Arrow) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1386(_get_defaults) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:953(__init__) + 3 0.000 0.000 0.000 0.000 :1237(_recalculate) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_weakrefset.py:37(__init__) + 2 0.000 0.000 0.000 0.000 {method 'unregister' of 'select.poll' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/__init__.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_managers.py:32(ToolManager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2589(MaskedIterator) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:26(_getlang) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:1737(_add_comparison_ops) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:1348(RollingAndExpandingMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/compat.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1565(EventCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:876(with_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/legendre.py:1619(Legendre) + 1 0.000 0.000 0.252 0.252 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:97() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4983(stopOn) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:473(timedelta) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/numbers.py:147(Real) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:160(_split) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:190() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/relativedelta.py:13() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:16(_get_method_wrappers) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:127(_compose) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:1346(PandasSQL) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/changeyear.py:44(additional_notes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/thai.py:12() + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:36(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:197(_new_message) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2698(_Base) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:1697(ExtensionOpsMixin) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimelike.py:162(_period_dispatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:2123(NDArrayBackedExtensionBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:573(_StreamProxy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/scope.py:123(Scope) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1041(__next__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1176(PolyCollection) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:704(add_parse_action) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:211() + 21 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:171(__set_name__) + 9 0.000 0.000 0.000 0.000 {built-in method _operator.truediv} + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/signal.py:49(decorator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/hebrew.py:12() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:495(find_distributions) + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:188(_dispatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:383(plus_or_dot) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:216(_fileobj_lookup) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:1() + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/__init__.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/datetimelike.py:1583(DatelikeOps) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/numeric.py:47(NumericDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_odfreader.py:28(ODFReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/quopri.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:131(_validate_date) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:982(FontManager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:249(AitoffTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:844(Poly3DCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_tzpath.py:31(_parse_python_tzpath) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:704(__mul__) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:337(get) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:29(Cursors) + 1 0.000 0.000 0.021 0.021 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:324(compile_pattern) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:1() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:173(invalidate_members) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_pylab_helpers.py:9(Gcf) + 2 0.000 0.000 0.000 0.000 :1452(find_distributions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/mask_ops.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:2026(SQLiteTable) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:357(copy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1260(Manager) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:945(MIMEPart) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:532(FontProperties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_afm.py:358(AFM) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:641(Path3DCollection) + 4 0.000 0.000 0.000 0.000 {built-in method _locale.setlocale} + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:348(_after_init) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:754() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:373(abspath) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:496(popitem) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:136() + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_pytesttester.py:76(__init__) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/_common.py:9(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:1828(ExtensionBlock) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:70(close) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:36(_Version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1090(TimerBase) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:184(close) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImagePalette.py:24(ImagePalette) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:906(AnchoredOffsetbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/version.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/hermite_e.py:1650(HermiteE) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/isoparser.py:42(isoparser) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:216(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:1467(_iLocIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/figure.py:73(_AxesStack) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:2527(YAxis) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:1418(_rrulestr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/container.py:5(Container) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/testing/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:188(InvertedPolarTransform) + 34 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1915(recurse) + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:376(__init__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:122(pushlines) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:341(get_makefile_filename) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/uu.py:27() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3415(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triangulation.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/colorsys.py:75(rgb_to_hls) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/timedeltas.py:33(TimedeltaIndex) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3450(_generateDefaultName) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5765(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:486(_make_selector) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:251() + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:26(_reflected_binary_method) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:841(TableBuilderVerboseMixin) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:282(__len__) + 17 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects} + 2 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/linecache.py:36(getlines) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:785(uname_result) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:117(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzinfo.py:18(memorized_timedelta) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/generic.py:46(_subclasscheck) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/arrays/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_version.py:20(get_versions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:92(Definition) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1675(getEffectiveLevel) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2043() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:221(Fonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:165(__setitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:4394(ConnectionPatch) + 26 0.000 0.000 0.000 0.000 {built-in method _stat.S_ISLNK} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_trifinder.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/tseries/api.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:682(__setitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numerictypes.py:229(obj2sctype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2274(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1216(Normalize) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:375(ScalarFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2486(Keyword) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:3051(ToolHandles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:384(gethomedir) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:70(alphas) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:374(validate_fontweight) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:77() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:44(_get_exports_list) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:8376(_convert2ma) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:1126(_LocIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/right.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:225(format_default) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:156(check_dask_array) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/mathtext.py:37(MathTextParser) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/__init__.py:1() + 3 0.000 0.000 0.000 0.000 {built-in method maketrans} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1145(tzinfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/arrayterator.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/persian.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:197(Context) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:106(Group) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:367(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:645(RcParams) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/colorsys.py:98(hls_to_rgb) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:840(_is_valid_dispatch_type) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:266(validate_color_or_inherit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1153(LockableBbox) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5770(postParse) + 9 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/linecache.py:147(lazycache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:177(git_versions_from_keywords) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1315(_replace_dtype_fields) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/roperator.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1601(ContextRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1976(SystemRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1378(LineCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:2579(FigureManagerBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_managers.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:1073(_nanminmax) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1677(_build_cache) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:816(fsdecode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_tritools.py:1() + 5 0.000 0.000 0.000 0.000 :765(exec_module) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_xlrd.py:19(XlrdReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4245(MatchFirst) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1073(Polygon) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:367(errstate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:39(EigResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:1305(PandasDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:535(_Compiler) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2052(get_group) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:248(DiskCache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:102(PrimitiveType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/GimpPaletteFile.py:17() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3922(And) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/stamp.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/decorators.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/hermite.py:1658(Hermite) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:41(EntryPoint) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:116(__diag__) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3514() + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:860(is_nonnegative_int) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1350(runtime_checkable) + 3 0.000 0.000 0.000 0.000 {built-in method _operator.mul} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:203(__exit__) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_dtype.py:24(_kind_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:18(numeric_type_aliases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/laguerre.py:1606(Laguerre) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:58(_timelex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:19(DirNamesMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/transforms.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/extension.py:138(ExtensionIndex) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:173(feed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PaletteFile.py:19(PaletteFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:261(LogScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:335(NestedVolumePfLine) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/period.py:103(_field_accessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:100(Apply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/indexing.py:31(GroupByIndexingMixin) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/numbers.py:1071(NumberPattern) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:838(_addHandlerRef) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:76(__lt__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:27(JoinStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/gridspec.py:531(SubplotSpec) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:588(get_content_maintype) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:313() + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:404(_exit_wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:217(_getintp_ctype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:778(SystemRandom) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/locale.py:469(_parse_localename) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/shared_docs.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:285(GroupbyIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:399(DiskCacheByHash) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/extendpandas.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:320(__init__) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_tzpath.py:5(reset_tzpath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:41(tzutc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:43(BaseIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/c_parser_wrapper.py:56(CParserWrapper) + 1 0.000 0.000 0.006 0.006 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2012(_after_init) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2379(Token) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:554() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:32() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:451(define) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:104() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:112(Policy) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:209() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_common.py:267(tzrangebase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/selectn.py:40(SelectN) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:264(__init__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:771(getenv) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/genericpath.py:16(exists) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numerictypes.py:589(_register_types) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:249(_ctypes) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:596(_get_root) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:1576(EABackedBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:200(CategoricalFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:29(GroupDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/iterators.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:67(_BaseVersion) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/tools/peakperiod.py:61() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:62(smallest_subnormal) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:359(LightSource) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1763(AffineBase) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:79() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/os.py:1073(__subclasshook__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:81(BaseSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:482(_set_tzdata) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:50(_localized_month) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/ewm.py:850(OnlineExponentialMovingWindow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:49(Properties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:596(MathCall) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2743(Word) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/core.py:238(reload_library) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axis3d.py:732(XAxis) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:2047() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:38(get_config) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:67(__len__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_pytesttester.py:1() + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/__future__.py:83(__init__) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:846(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/generic.py:11882() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/array_manager.py:1317(NullArrayProxy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:411(PercentStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1448(warning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1389(Logger) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:147(Parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:414(DiskCacheByMTime) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:815(Grouper) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:543(validate_bbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:815(LogFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:115() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:83(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:1949(Cursor) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/plot.py:79(decorator) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/__init__.py:1() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:9(__init__) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:55() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:240(PricePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:381(__init__) + 1 0.000 0.000 0.000 0.000 {method 'tobytes' of 'numpy.generic' objects} + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:806(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:779(Expr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:1075(Parser) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/custom.py:25() + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:799() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1413(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1276(Transform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:14(__config_flags) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/initialise.py:9(_wipe_internal_state_for_tests) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1922(Arc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:329(TruetypeFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:3733(LassoSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_layoutgrid.py:31(LayoutGrid) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:1307(rruleset) + 1 0.000 0.000 0.000 0.000 {built-in method _ctypes.dlopen} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:200(BaseBuffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/boolean.py:41(BooleanDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1565(_log) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:8() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/__init__.py:75(register) + 16 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:158() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1224(__init__) + 19 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:18(is_multiplicative) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:175(register_directive) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:510(CFunctionType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:515(get_paths) + 1 0.000 0.000 0.003 0.003 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/api/__init__.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:195() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:135(_makearray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:75(PandasExtensionDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:1403(BaseMaskedDtype) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:136(delegate_names) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:116(Buffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:2170(SQLiteDatabase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1760(LoggerAdapter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/appdirs.py:407(AppDirs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/_util.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/lock.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1305(EngFormatter) + 15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:448() + 4 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects} + 3 0.000 0.000 0.001 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1246(open) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:406(_validate_mathtext_fallback) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:2042(MultiCursor) + 22 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:297(_op_maker) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:434(_init_posix) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:56(__init__) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/__init__.py:1() + 12 0.000 0.000 0.000 0.000 {method 'remove' of 'set' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:117(splitext) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:534(_PreciseSelector) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:503(decorating_function) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/__init__.py:213(UTC) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:134(_get_option) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:80(DictReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/flags.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:207(Writer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4715(AppendableMultiFrameTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:83(PluralRule) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1230(append) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:253(formatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:138(Diagnostics) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:434(FlatCompletePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:3371(_Backend) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/core.py:198(update_user_library) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:208(__getattr__) + 7 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:443(__members__) + 12 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:138() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5260(SkipTo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1401(MouseButton) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:595(DrawingArea) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2177(BlendedGenericTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4967(_MultipleMatch) + 5 0.000 0.000 0.000 0.000 :1223(_find_parent_path_names) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:393(Semaphore) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:1112(python_implementation) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/generic.py:37(_check) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/timedeltas.py:81(_field_accessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:661(SocketIO) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:401(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1645(callHandlers) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:356(System) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:304(FuncFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/__init__.py:87(CompleteDirs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/py310compat.py:1() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:509(PYFUNCTYPE) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:153(_realType) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:260(__call__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:446(Registry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:592(DataFrameInfoPrinter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/readers.py:1355(TextFileReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/mathtext.py:48(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/categories.py:10(Category) + 18 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1879() + 5 0.000 0.000 0.000 0.000 {built-in method sys.exc_info} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:221() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:124(_is_python_source_dir) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/core.py:1244(get_locale_identifier) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:653(copy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:256(_validate_toolbar) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1587(__xor__) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha256} + 24 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:465(_parse_letter_version) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:88(__calc_month) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/invalid.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:14(IntegerDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:441(DataFrameInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:2854(AutoLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_tight_bbox.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:258(_AxisWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:76(Text3D) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:356(fill) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:136(Transpose) + 2 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/linecache.py:26(getline) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:493(Module_six_moves_urllib) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:925(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/__init__.py:21(__deprecated_private_func) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/floating.py:14(FloatingDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3624(Exif) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:477(NestedCompletePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/textpath.py:20(TextToPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:297(HammerTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:552(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:30() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:791(getrandbits) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:193(_getuserbase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1545(__init__) + 1 0.000 0.000 0.008 0.008 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/testing.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/xml.py:57(_XMLFrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:119(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:429(add_groups) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:82(__format__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:286(_validate_color_or_linecolor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1685(TransformWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:80(alphanums) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:420(AxisScaleBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:848(AxesImage) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/abc.py:150(TraversableResources) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:45(_compat_get_offset) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:120(__init__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3457(parseImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1751(ParserState) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:823(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:322(register_dataframe_accessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:285(SystemDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:251(RevenuePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_add_newdocs_scalars.py:54(_get_platform_and_machine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_nbit.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6544(__has_singleton) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/string.py:57(Template) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:96(IOHandles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/html.py:164(_HtmlFrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:297(ParsingError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:439(StrFormatStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:764(_get_backend_or_none) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shlex.py:19(shlex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1512(CenteredNorm) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2464(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/text.py:17() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:2780(_Mode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:749(StixFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/layout_engine.py:27(LayoutEngine) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:433(__init__) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha384} + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:836(inner) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:20(DlpackDeviceType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gettext.py:111() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1395(NonMultiplicativeRegistry) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1034(__new__) + 1 0.000 0.000 0.000 0.000 {built-in method math.exp} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6568(__array_finalize__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6744(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:132(tzoffset) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:394(_ymd) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1008(DataFrameRenderer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:49(BaseHeader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/_structures.py:35(NegativeInfinityType) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:576(_validate_greaterequal0_lessequal1) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3474(White) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/plot.py:50(PfLinePlot) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:416(LambertTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sas/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/uuid.py:78(SafeUUID) + 8 0.000 0.000 0.000 0.000 {built-in method builtins.delattr} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:154(py_object) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:772(DataFrameTableBuilder) + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:130(check_implemented) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:11(Color) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1312(_MainThread) + 2 0.000 0.000 0.000 0.000 {method 'register' of 'select.poll' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:155(_NetlocResultMixinBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ctypeslib.py:360(_get_scalar_type_map) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/exceptions.py:1() + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:491(_parse_local_version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:241(Japanese) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3676(StringEnd) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5076(ZeroOrMore) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:119(CapStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:344(MollweideTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_compression.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:49() + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:6028() + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_globals.py:58(__repr__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:966(joinpath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:405(PyDLL) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:195() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:1240(SectionProxy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/measurement.py:17(Measurement) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:164(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1884(Affine2D) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1748(CircleCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:3216(ToolContainerBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:610(Shadow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/enums.py:34(Structure) + 5 0.000 0.000 0.000 0.000 {method 'popitem' of 'dict' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:65(_raise_malformed_node) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:596(Barrier) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:367(_fix_result_transcoding) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_dtype_like.py:65(_DTypeDictBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:903(_MaskedUnaryOperation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1125(_DomainedBinaryOperation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:400(ContextChain) + 13 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:522(_binary_compiler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:478(split_format) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:568(_validate_greaterthan_minushalf) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:158(ToolToggleBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1314(FancyArrow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/enums.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:610(_get_deprecated_option) + 5 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_weakrefset.py:86(add) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:260(_inner) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5110(DelimitedList) + 1 0.000 0.000 0.000 0.000 {method 'union' of 'set' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_globals.py:65(_CopyMode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:137() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:84(MaskedArrayFutureWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6735(_extrema_operation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:568(parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/multi.py:197(names_compat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/concat.py:398(JoinUnit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:775(ZipExtFile) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_util.py:32(register_writer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/excel/_xlsxwriter.py:19(_XlsxStyler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:553(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:858(validate_hist_bins) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:698(PngImageFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/bezier.py:181(BezierSegment) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1627(__invert__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:936(PathPatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:964(StepPatch) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1362(getmask) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_dtype_like.py:71(_DTypeDict) + 1 0.000 0.000 0.005 0.005 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/api.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:361(_register_directives) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:17(_ParseResultsWithOffset) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:181() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:887(RegularPolygon) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1458(DraggableBase) + 1 0.000 0.000 0.000 0.000 {built-in method _hashlib.openssl_sha512} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:797(_DomainCheckInterval) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:201(tzlocal) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/base.py:157(SingleDataManager) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:226(_discover_resolvers) + 2 0.000 0.000 0.000 0.000 :2(__init__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:596(_register_directive) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/__init__.py:99(version_info) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:93(__compat__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:456(DebugActions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/helpers.py:654(OpAssoc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:709(ToolZoom) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:540(UnicodeFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/_common.py:21(package_to_anchor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1141(OffsetImage) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:232(LinearTriInterpolator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:286(CubicTriInterpolator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:183(Divide) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:686() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1172(Wedge) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:4177(Lasso) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:276(_key_from_fd) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/types.py:79(resolve_bases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__init__.py:192() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:996(parents) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:446(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/compressors.py:44(BZ2File) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:354(_get_sysconfigdata_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:394(StorageExtensionDtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:206(Op) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/utils.py:18(ArrowCTypes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/persian.py:17(_Persian) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:227(FrameSummary) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:326(condition_as_parse_action) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1508() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/spines.py:522(Spines) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axis3d.py:740(YAxis) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/colorsys.py:108(_v) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1504(_strip_annotations) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:775(_maintain_shutdown_locks) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_nested_sequence.py:18(_NestedSequence) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/npyio.py:106(NpzFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/matplotlib.py:25(PintConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PaletteFile.py:16() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5106(_generateDefaultName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1823(_MathStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:949(__iter__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:542(set) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:85(_import_module) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4646(IndentedBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:310(AxisConcatenator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_datasource.py:196(DataSource) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/arrayterator.py:16(Arrayterator) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:128() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/base.py:100(PandasObject) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sas/sasreader.py:33(ReaderBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:55(ContextDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1962(MaxNLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4085(Or) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4963(_generateDefaultName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:309(FlatVolumePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1768(EllipseCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1972(_MeshData) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:66(Widget) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:523(Ticker) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:633(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:413(LambertAxes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:534(Patch3DCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/suppresswarnings.py:8(apply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:539(_get_data_path) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageMode.py:16() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:140(isComplexType) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:285(_eval_type) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:1501() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/base.py:244(_maybe_return_indexers) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:2236(Path) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:1203(DataSplitter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tempfile.py:770(TemporaryDirectory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1417(TwoSlopeNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:201(LogTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/__init__.py:106(__version__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:710() + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:1717(suppress) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/lines.py:1467(AxLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_tritools.py:11(TriAnalyzer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:498(_ThetaShift) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:183(Line3D) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/axis3d.py:748(ZAxis) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/collections/__init__.py:932(__missing__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:45(_days_before_year) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:130(get_linalg_error_extobj) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:919(system) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_compression.py:33(DecompressReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1167(_tzicalvtz) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:143(IndexingMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/rolling.py:2686(RollingGroupby) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/engines.py:47(AbstractEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gettext.py:254(NullTranslations) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:618(_UnicodeCompiler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1550(makeRecord) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2237(UnitRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:499(AsinhScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:59(ColormapRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1880(Circle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:65(Text) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:210(_process_plot_var_args) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:186(_get_module) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:583(LogitTransform) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:830(implement_atleast_nd) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/error.py:2() + 3 0.000 0.000 0.000 0.000 {method 'copy' of 'mappingproxy' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:43(EighResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:194() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:1607(MAxisConcatenator) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:129() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:164(_resolve) + 10 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:210() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:72() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:911(FrameColumnApply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/align.py:67(_filter_special_cases) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/merge.py:1867(_AsOfMerge) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:246(_register_at_fork_reinit_lock) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:292(walk_stack) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:168(__init__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/appdirs.py:17() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:235() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3886(_setResultsName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:375(NestedPricePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/winterm.py:28(WinTerm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1909(TriMesh) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:2126(QuadMesh) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/textpath.py:293(TextPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:643(__getitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/html.py:587(_BeautifulSoupHtml5LibFrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:424(_E) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1068(Char) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:272(InvertedAitoffTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/children.py:13(ChildFunctionality) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1814(Affine2DBase) + 15 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:308(__missing__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:859(implement_single_dimensionless_argument_func) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2039(_register_directives) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:281(_sanitize_header) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_encoded_words.py:73(_QByteMap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:108(CalledProcessError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:216(Condition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:32(MachArLike) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:198(joinuser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:205(load_module) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:55(__init__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/__init__.py:43(private_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/string.py:159(Formatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/categorical.py:2321(CategoricalAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:23(Dialect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/accessor.py:226(SparseFrameAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:514(SeriesInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:53(Term) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:400(_Parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1359(_fixupChildren) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:420(major) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_version.py:3() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:548(ColorConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:243(InvertedLogTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/testing.py:124(TestParseResultsAsserts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:17(_AutoStringNameEnum) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:351(FlatPricePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:2239(PolyQuadMesh) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:830(ToolPan) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:707(TextArea) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/category.py:26(StrCategoryConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:94(rrulebase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:246(AitoffAxes) + 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_dtype_ctypes.py:1() + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:439(customize_config_vars) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:110(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:1310(ConverterMapping) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1265(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:147(Transform) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:144(__lt__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/copyreg.py:12(pickle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:95(_RLock) + 2 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:3433(shape) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/base_parser.py:100(BadLineHandleMethod) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:106(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/numpy_func.py:682(implement_prod_func) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2412(__setattr__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/header.py:541(_Accumulator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:85(ImageFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:391(FlatRevenuePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:418(NestedRevenuePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:386(InvertedMollweideTransform) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:1040() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:116(_ArrayMemoryError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:376(_FuncPtr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:135(_BaseVersion) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:212(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:264(SeriesFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4584(AppendableSeriesTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:440(TracebackException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:394(format_unit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:200(NameByPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:136(FeedParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/charset.py:167(Charset) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:167(check_getitem) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:570(Stack) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:958(LinearSegmentedColormap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:2278(LightSource) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:156(Resampling) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:12(qualify) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:1077(TransformedBbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/lines.py:1601(VertexSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:903(FontConstantsBase) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:319(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:259(DomainMap) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/prices/__init__.py:1() + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:256(__init__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/ops/methods.py:68() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:225() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:128() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:129() + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:50(_days_in_month) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/textwrap.py:336(_split_chunks) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:886(createLock) + 4 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects} + 14 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:379(__enter__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:2236(_create) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:295(_PosixFlavour) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/records.py:223(record) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/records.py:308(recarray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/memmap.py:22(memmap) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:883(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:246(ReadCsvBuffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:405(Substitution) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/_decorators.py:452(Appender) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_common.py:149(_tzinfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/easter.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:987(SeriesApply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/datetimes.py:105() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gzip.py:401(_GzipReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:603(_FileInFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:317(ZipInfo) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/series.py:215(_coerce_method) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:934(DataFrameTableBuilderVerbose) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:753(PandasExprVisitor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:33(DtypeKind) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/__init__.py:808(SubclassedSeries) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4649(GenericTable) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:404(path) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:30(DefinitionSyntaxError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:138(InvalidateByMultiPathsMtime) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3414(register_open) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:25(BaseTypeByIdentity) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:345(StructOrUnion) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:2706(LogitLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:457(ToolViewsPositions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:140(PolarAffine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:251(Multiply) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1853(_internal_poll) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:665(__neg__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:143() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:47(QRResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:55(SVDResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:410(HTMLCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/string_.py:218(BaseStringArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tempfile.py:411(_TemporaryFileCloser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1591(handle) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:156(wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:1630(_register_directives) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:123(InvalidateByPathMTime) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/matplotlib.py:28(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/__init__.py:5() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:464(AsinhTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:49(AnsiFore) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/contour.py:1478(QuadContourSet) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2204(_Style) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:316(InvertedHammerTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:294(HammerAxes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:48(filter_by) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2631(CaselessKeyword) + 8 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:291(SelectSelector) + 1 0.000 0.000 0.000 0.000 {method 'close' of 'select.kqueue' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_methods.py:47(_sum) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:822(_DomainTan) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzinfo.py:79(StaticTzInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzinfo.py:159(DstTzInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:58(NegativeInfinityType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:13(__call__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:578(_select_options) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:49(PandasDelegate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:2029(EngFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:129(VariableOffsetWindowIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/python_parser.py:1166(FixedWidthReader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_version.py:7() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gettext.py:358(GNUTranslations) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:333(AliasDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:171(NameByFileContent) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:765(_validate_legend_loc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1458(PercentFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2338(_PendingSkip) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2406(Literal) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2656(CloseMatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4361(Each) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5687(Combine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/text.py:1444(_AnnotationBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:1488(CirclePolygon) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:1325(FigureImage) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/glob.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:824(AuxTransformBox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:405(XTick) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:456(InvertedLambertTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:20(Prep) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:103(_safe_realpath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:494(MetadataPathFinder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5183(Opt) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:162(__ge__) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4106() + 12 0.000 0.000 0.000 0.000 {method 'islower' of 'str' objects} + 17 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/inspect.py:2556(annotation) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_type_aliases.py:92() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1001(is_absolute) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/config_init.py:295(is_terminal) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/decoder.py:254(JSONDecoder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:1830(TableIterator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:37(PyTablesScope) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:243(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2375(ApplicationRegistry) + 11 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:518() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:343(Interop) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:150(ChunkStream) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:483(InvertedAsinhTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1109(LogitFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1752(LinearLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5868(Suppress) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:961(_CollectionWithSizes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1033(Box) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:524(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:1215(_Sparse_Matrix_coo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:699(RadialAxis) + 1 0.000 0.000 0.000 0.000 {built-in method atexit.unregister} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:852() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:207(_BaseSelectorImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/numbers.py:267(Rational) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:51(SlogdetResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/__init__.py:398(_FixedOffset) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/_common.py:6(weekday) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:854(FrameRowApply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/encoder.py:104(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:954(_BytesTarFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tempfile.py:128(_RandomNameSequence) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2547(DataIndexableCol) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4485(AppendableFrameTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:45(BufferedSubFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/header.py:413(_ValueFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:134(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:381(InvertedSymmetricalLogTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:609(LogisticTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:198(Formatter) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3532(_generateDefaultName) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3681(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4800(PrecededBy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5346(_update_ignorer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:245(ToolSetCursor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/text.py:1370(OffsetFrom) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1010(Node) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1308(Vlist) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:1188(PcolorImage) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:748(_WedgeBbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:18() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/_structures.py:6() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2996(Char) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:254(__len__) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_inspect.py:142() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:376(BasicInterpolation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:564(_PythonCompiler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:348(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:342(_PollLikeSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__config__.py:14(DisplayModes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_globals.py:52(__new__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_version.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:840(_DomainSafeDivide) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:867(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/encoder.py:73(JSONEncoder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:2189(DatetimeLikeBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:2168(CompleteDirs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/datetimes.py:113(FulldatetimeDict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/indexing.py:287(GroupByNthSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:3541(StataWriterUTF8) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:1195(ConfigParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:201(UnitDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:424(validate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:677(_Stack) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2387(_generateDefaultName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/classes.py:262(CompletePfLine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:179(FontMetrics) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/layout_engine.py:132(TightLayoutEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_trirefine.py:47(UniformTriRefiner) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:223(_GeoTransform) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/functools.py:964(__set_name__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:986(parent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1470(__get_gettz) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:69(_localized_day) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:583(NDFrameApply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:3105(SeriesFixed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:522(LegacyInterpolation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:15(Converter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/localedata.py:216(LocaleDataDict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:271(Compat32) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:188(Quantize) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3479(register_extensions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:348(SymmetricalLogTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:1112(_iterinfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:322(Grid) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:341(MollweideAxes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:402(ThetaAxis) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:98(Disposal) + 9 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4107() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:175(Dither) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:102(CFunctionType) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:56(fget) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:432(validate_ps_distiller) + 1 0.000 0.000 0.000 0.000 {built-in method builtins.format} + 5 0.000 0.000 0.000 0.000 {built-in method posix.WIFSTOPPED} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:528(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1229(_make_invoke_excepthook) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__config__.py:95() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:507(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_ufunc_config.py:360(_unspecified) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:630(iinfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_dtype_like.py:81(_SupportsDType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_datasource.py:536(Repository) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:2378(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:1655(__init__) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:178(_supports_universal_builds) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1475(GettzFunc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:9(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:255(CallableDynamicDoc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:77(disallow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/accessor.py:37(SparseAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/ewm.py:817(ExponentialMovingWindowGroupby) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:186(Constant) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:306(JSONTableWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:2977(StataStrLWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2343(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:189(NameByObj) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/__init__.py:27(classproperty) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:61(_ColorMapping) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:358(Parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/units.py:108(ConversionInterface) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3207(_Curve) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/layout_engine.py:211(ConstrainedLayoutEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/image.py:1388(BboxImage) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:527(PaddedBox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:462(YTick) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1116(DateLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/prices.py:17(Flat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/suppresswarnings.py:1() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1024(block_iter) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3468(register_extension) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:75(nums) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:649(_warn_if_deprecated) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:110() + 3 0.000 0.000 0.000 0.000 {built-in method atexit.register} + 6 0.000 0.000 0.000 0.000 {built-in method _stat.S_ISDIR} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/genericpath.py:121(_splitext) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:46(_ignore_error) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:73(PickleError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_machar.py:17(MachAr) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:529() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:329(register_series_accessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:2097(NumpyBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:378(ExponentialMovingWindowIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/expanding.py:797(ExpandingGroupby) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:547(UnaryOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/html.py:708(_LxmlFrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4258(AppendableTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:506(PyTablesExpr) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:551(set_results_name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/textpath.py:26(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:831(PsfontsMap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1778(DateConverter) + 7 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/posixpath.py:52(normcase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:1214(IsoCalendarDate) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:61(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/records.py:87(format_parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:616(_Stream) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:877(_DomainGreaterEqual) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/compressors.py:59(LZMAFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_common.py:127(_TZifHeader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:874(tzrange) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/tseries/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:155(Int8Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:928(_BufferedWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:73(FixedWindowIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/plotting/_misc.py:566(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parquet.py:131(PyArrowImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:3138(BlockManagerFixed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:218(NameByMultiPaths) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:210(_pop_message) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:303(set_payload) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_cm.py:66(cubehelix) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2445(CompositeAffine2D) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3394(CharsNotIn) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1409(MouseEvent) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_common.py:13(tzname_in_python2) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:606(get_default_type) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:130() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:1000(SeriesTableBuilder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1840(SymLogNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:262(__subclasshook__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:353(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:428(CompletedProcess) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1358(current_thread) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:97(_Stop) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:255(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:209(_assert_stacked_square) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:16(LazyDict) + 1 0.000 0.000 0.002 0.002 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:614(get_config_var) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/floating.py:142(Float32Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:232(DatetimeProperties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:1046(SeriesTableBuilderVerbose) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:362(BinOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/merge.py:1782(_OrderedMerge) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parquet.py:118(BaseImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2234(GenericIndexCol) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:448(ExtendedInterpolation) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:185() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:288(DimensionDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/localedata.py:183(Alias) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:798(SharedRegistryObject) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/traceback.py:318(StackSummary) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:552(get_configdir) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:83() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ExifTags.py:351(IFD) + 1 0.000 0.000 0.001 0.001 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/helpers.py:599(make_html_tags) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colorbar.py:123(_ColorbarSpine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1008(PathCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1368(StarPolygonCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:664(Vf) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:75(VectorParse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:28(LockDraw) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/gridspec.py:318(GridSpec) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1192(RRuleLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:46(HandlerBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_tricontour.py:8(TriContourSet) + 2 0.000 0.000 0.000 0.000 {built-in method time.time} + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:63(decorate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:809(Quoter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:378(finfo) + 3 0.000 0.000 0.000 0.000 {method '__array_prepare__' of 'numpy.ndarray' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:1329(make_mask_descr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:332(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:64(ColumnNullType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/header.py:179(Header) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:409(SymmetricalLogScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4710(AtStringStart) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:672(DejaVuFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:163(Button) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/mlab.py:770(GaussianKDE) + 7 0.000 0.000 0.000 0.000 {built-in method sys.audit} + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:503(_parse_local_version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1367(StructuredVoidFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:205(dummy_ctype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:238(c_char_p) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:747(_Processor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ctypeslib.py:202(_concrete_ndptr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:893(_MaskedUFunc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:6844(_frommethod) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:293(TextCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:209(DictWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:569(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:1760(ExtensionScalarOpsMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/extension.py:180(NDArrayBackedExtensionIndex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:2241(DatetimeTZBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:424(TextAdjustment) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:1045(_IOWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1104(_ZipWriteFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:216(ExpandingIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/selectn.py:159(SelectNFrame) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:577(GroupByPlot) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/custom.py:13() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:21(PreprocessedDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:123(DefaultsDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2342(LazyRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:489() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:233(__getattr__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:160(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:119(Blend) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2159(_BlendedMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3558(GoToColumn) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/testing.py:20(reset_pyparsing_context) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:71(AnsiBack) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:88(_finalize_rasterization) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1206(Hlist) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1390(Rule) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:305(rrule) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend.py:54(DraggableLegend) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:449(RadialLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:412(Patch3D) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:779(_unknown_as_blank) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:557(validate_sketch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_utils/_convertions.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:830(__init__) + 8 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:80(_add_doc) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:880(add_metaclass) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:637(_translate_key) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:796(is_type_factory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:440(EastAsianTextAdjustment) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/datetimes.py:107(YearMonthDayDict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:46(Relation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1601(addHandler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:18(_PolicyBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:92(_StrongRef) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:261(PngInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/winterm.py:12(WinColor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1849(PatchCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:120(Output) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:3691(EllipseSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/__init__.py:69(InitializedState) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:995(rrulewrapper) + 1 0.000 0.000 0.000 0.000 {method 'rindex' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:905(FloatingFormat) + 1 0.000 0.000 0.000 0.000 {built-in method numpy.promote_types} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_datasource.py:99(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_datasource.py:74(_FileOpeners) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:133(LineSplitter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:331(_check_for_unavailable_sdk) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:328(_ttinfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:219(is_package) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:76(DeprecatedOption) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/_common.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:162(Int16Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:2389(_AtIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:2256(ObjectBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/ops.py:18(BlockPairInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1333(GenericArrayFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:1009(_BytesZipFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexers/objects.py:103(VariableWindowIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:147(ArrowTemporalProperties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:371(TimedeltaProperties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:261(SeriesWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:262(FilterBinOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/xml.py:435(_EtreeFrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/custom.py:13(_CustomCalendarType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:473(Prepared) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:167(PrefixDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:577(_GettextCompiler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:439(default_format) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:61(DefinitionFiles) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/utils.py:51(_has_surrogates) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:851() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:1295() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:298(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:670(PyDecoder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:97(RasterParse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:211(FontInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1162(List) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:361(HandlerStepPatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:724(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_trifinder.py:27(TrapezoidMapTriFinder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:985(_DOF_estimator) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:32(standardize_other) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:19(Prep) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:119(_resolve) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:103(standardize_other) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:1231() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:145(TimeoutExpired) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1164(_remaining_time) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:1706(make_nancomp) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1276(disable) + 5 0.000 0.000 0.000 0.000 :782(is_package) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_collections_abc.py:381(__subclasshook__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:71(_convert_signed_num) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:61(_SelectorMapping) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:507(KqueueSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:38(_UFuncNoLoopError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:148(MAError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_osx_support.py:314(_override_all_archs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:30(LocaleTime) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_strptime.py:170(TimeRE) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/describe.py:98(NDFrameDescriberAbstract) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/describe.py:133(DataFrameDescriber) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1445(FloatArrayFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:83(IOArgs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gzip.py:74(_PaddedFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pprint.py:77(_safe_key) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:73(__str__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_parseaddr.py:508(AddressList) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:51(ValidateInStrings) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/TiffTags.py:23(TagInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2568(BboxTransformTo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:940(_CacheType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2604(CaselessLiteral) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:36(AnsiCursor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/spines.py:487(SpinesProxy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/__init__.py:69(ProjectionRegistry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/gridspec.py:476(GridSpecFromSubplotSpec) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:626(DateFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:656(ConciseDateFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:372(Line3DCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:328(Unite) + 1 0.000 0.000 0.000 0.000 {method 'title' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:947(_set_native_id) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:184(c_int) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/_compression.py:9(BaseStream) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1253(tzical) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:1373(_result) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:1092(GroupByApply) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:120(_compose2) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tempfile.py:454(_TemporaryFileWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:667(StataValueLabel) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:517(PathDistribution) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:86(LogarithmicConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:2380(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/parser.py:134(ImportDefinition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3696(WordStart) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:896(ToolHelpBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:573(DviFont) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1496(Kern) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/_compat.py:32(TraversableResourcesLoader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/category.py:138(StrCategoryFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:430(HandlerRegularPolyCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:15(TriInterpolator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:462(PathPatch3D) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:381(notify_all) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:611(_validate_minor_tick_ndivs) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:486(__enter__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/datetime.py:445(_check_tzinfo_arg) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/getlimits.py:86(_str_smallest_subnormal) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:662(_check_compression) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:311(header_fetch_parse) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/plot.py:78(append_to_doc) + 1 0.000 0.000 0.000 0.000 {method 'seek' of '_io.BufferedReader' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/weakref.py:195(get) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/linecache.py:52(checkcache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:256(__enter__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:517(Event) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:630(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:259(c_wchar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:10(NBitBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/__future__.py:81(_Feature) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:108(MovedModule) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/base.py:1689(ExtensionArraySupportsAnyAll) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/numpy/function.py:47(CompatValidator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:2351(_ScalarAccessIndexer) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1818(close) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/window/online.py:89(EWMMeanState) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/scope.py:28(DeepChainMap) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:273(disallow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/xml.py:546(_LxmlFrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:168(Error) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/context.py:38(Expression) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:469(StringTemplateStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1200(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:2162(NullHandler) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:456(extract_custom_flags) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/measurement.py:174(build_measurement_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:16(Parser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:915(GrouperView) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:6(Substitution) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1878(AsinhNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:490(EnumType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:159(_DummyAxis) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2627(BboxTransformFrom) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2663(ScaledTranslation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4924(NotAny) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5072(_generateDefaultName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5823(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colorbar.py:146(_ColorbarAxesLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:360(ToolQuit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3136(_Base) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/layout_engine.py:106(PlaceHolderLayoutEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:1399(ArtistList) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1592(DraggableAnnotation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:66(weekday) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:380(StreamMask) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:310(ThetaTick) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:20(assert_objects_indexcompatibility) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:527(get_path) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:571(get_cachedir) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:702(get_scale_names) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/colors.py:30(Colors) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/types.py:132(_calculate_meta) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/enum.py:774(__hash__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1304(DatetimeFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:618(ndindex) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:213(_fromnxfunction) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:83(RegisteredOption) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:54(excel) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:165(Sniffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/json/decoder.py:20(JSONDecodeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:574(InfoPrinterAbstract) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:673(SeriesInfoPrinter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:89(ColumnBuffers) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:1286(SeriesParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:5175(Selection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:383(Context) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:52(RedefinitionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:766(Filterer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1194(_StderrHandler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:223(deprecate_privatize_attribute) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:183(Palette) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:239(iTXt) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1568(Locator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:2440(SymmetricalLogLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:129(LRUMemo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3589(LineStart) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5744(Group) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:429(__getattr__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1373(AsteriskPolygonCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1246(Event) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:600(ToolHome) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:713(DejaVuSerifFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1139(Accent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/rrule.py:1315(_genitem) + 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects} + 5 0.000 0.000 0.000 0.000 {built-in method _operator.sub} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:434(PollSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_globals.py:32(_NoValueType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:139(_ResultMixinStr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:194(_NetlocResultMixinStr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:77(PicklingError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:254(c_wchar_p) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/mixins.py:51(_unary_method) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:197(_assert_2d) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:203(_assert_stacked_2d) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ctypeslib.py:181(_ndptr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:220(ReadBuffer) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:199(__get_module) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:154(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:419(option_context) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:219(_resultbase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:185(AbstractMethodError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expressions.py:42(set_use_numexpr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:197(UInt32Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/floating.py:54(FloatingArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/apply.py:1118(ResamplerWindowApply) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/common.py:1074(_BytesIOWrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/indexing.py:247(GroupByPositionalSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/__init__.py:825(SubclassedDataFrame) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/_io.py:88(optional_args) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/python_parser.py:1284(FixedWidthFieldParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:276(FrameWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/json/_json.py:1310(FrameParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:425(FastPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:56(OffsetConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:687(BufferingFormatter) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:125(register_unit_format) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:414(set_fmt_locale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:2055(_OrderedSet) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1991(BoundaryNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:294(ArrayType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:719(PyEncoder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:123(FuncTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2525(BboxTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/actions.py:7(OnlyOnce) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4731(AtLineStart) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5677(TokenConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:642(ZoomPanBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:110(AxesWidget) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/zipp/__init__.py:162(FastLookup) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/figure.py:121(SubplotParams) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:34(_axis_method_wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/category.py:118(StrCategoryLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1707(MicrosecondLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1866(_SwitchableDateConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_trifinder.py:7(TriFinder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:548(RadialTick) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/decorators.py:39(map_to_year_warning) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:140(raiseerror_if_otherdimlessseries) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/signal.py:48(_wraps) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:17(__init__) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:21(assert_objects_indexcompatibility) + 6 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_enums.py:20(_generate_next_value_) + 1 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/typing.py:845(__repr__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:273(get_map) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:98(AxisError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/multiarray.py:741(dot) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:57(_Flavour) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:625(_PathParents) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:147(_ResultMixinBytes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:240(_missing_ctypes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:163(c_short) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:192(c_float) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:196(c_double) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:530(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzinfo.py:69(BaseTzInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:226(WriteBuffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:91(_LazyDescr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:178(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:1371(_tzparser) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:220(__get__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:204(UInt64Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:307(_LowLevelFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4228(WORMTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:612(TermValue) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:518(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/converters.py:33(ScaleConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:86(DimensionalityError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:853(PrettyIPython) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:983(SourceIterator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:791(filter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1040(StreamHandler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/formatting.py:21(_join) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/pint_eval.py:60(EvalTreeNode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:2134(build_quantity_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/matplotlib.py:17(PintAxisInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:64(_ArtistPropertiesSubstitution) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageSequence.py:19(Iterator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2719(TransformedPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2459(Empty) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3722(WordEnd) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5781(Dict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:332(RubberbandBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:1877(SubplotTool) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_managers.py:13(ToolTriggerEvent) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:572(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:719(HandlerTuple) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/dataframeexport.py:13(Flat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/pfstate.py:288(_LocIndexer) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:85(returnself_if_otherNone) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:188(c_uint) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_array_like.py:44(_SupportsArrayFunc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:141(is_python_build) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:24(IllegalMonthError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:379(UndefinedVariableError) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:233(_register_accessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:190(UInt16Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/generic.py:109(NamedAgg) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/multi.py:117(MultiIndexUIntEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/base.py:10(OutputKey) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:382(__getitem__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:598(PyCodec) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:310(FuncScaleLog) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:628(LogitScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2689(AffineDeltaTransform) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3473(BracketA) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:1033(_LuatexKpsewhich) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:939(ComputerModernFontConstants) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1448(Glue) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1523(AutoHeightChar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/widgets.py:266(SliderBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1567(DraggableOffsetBox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1268(AutoDateLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:166(HandlerNpoints) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/flat_methods.py:41(LocIndexer) + 2 0.000 0.000 0.000 0.000 {method 'join' of 'bytes' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ast.py:67(_convert_num) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:351(notify) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/style/core.py:217(update_nested_dict) + 1 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects} + 1 0.000 0.000 0.000 0.000 {built-in method _operator.iadd} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1093(name) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1282(Timer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1333(_DummyThread) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numerictypes.py:425(_typedict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:167(c_ushort) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:175(c_ulong) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:221(c_ubyte) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/_endian.py:23(_swapped_meta) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_pytesttester.py:46(PytestTester) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:144(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:562(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/utils.py:104(_Deprecate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/npyio.py:42(BagObj) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/core.py:156(MaskError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:129(_LazyModule) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:236(create_module) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:74(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:558(LocaleTextCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:1589(ParserError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:130(DictWriter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/base.py:147(NoNewAttributesMixin) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/describe.py:121(SeriesDescriber) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1849(Timedelta64Formatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:591(LZMACompressor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:715(_SharedFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:1941(PyZipFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:2218(FastLookup) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/dataframe_protocol.py:106(CategoricalDescription) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parsers/readers.py:466(_DeprecationConfig) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/parquet.py:240(FastParquetImpl) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:86(Constant) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:327(ConditionBinOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:360(Interpolation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/definitions.py:60(_NotNumeric) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/numbers.py:37(UnknownCurrencyError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/numbers.py:856(NumberFormatError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:68(UndefinedUnitError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:416(__contains__) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1010(__iter__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:270(LogRecord) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1749(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:116(InvalidateByExist) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:238(NameByHashIter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:532(BytesFeedParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:93(NonPrintableDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:930(PintSeriesAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:76(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/_util.py:14(DeferredError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:88(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:279(ConstPointerType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:328(StubImageFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/GimpPaletteFile.py:22(GimpPaletteFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageSequence.py:19() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:159(FuncScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:2594(AsinhLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4764(FollowedBy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/text.py:203(PfLineText) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:93(AnsiStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/plot.py:214(PfStatePlot) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:304(ToolCursorPosition) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:934(ToolCopyToClipboardBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2763(Arc3) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1563(AutoWidthChar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:420(PackerBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:1098(AnchoredText) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/category.py:168(UnitData) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/container.py:42(BarContainer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:628(HandlerStem) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:1156(_DOF_estimator_min_E) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_trirefine.py:12(TriRefiner) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/geo.py:18(ThetaFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:281(ThetaLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/dataframeexport.py:43(Nested) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/nested_methods.py:45(LocIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/prices.py:86(Nested) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:112(returnself_if_otherNone) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:120(returnself_if_otherzerofloatseries) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:286(Divide) + 4 0.000 0.000 0.000 0.000 {built-in method _sre.ascii_iscased} + 2 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/contextlib.py:63(_recreate_cm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:650(_use_posix_spawn) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:63(_zeros_like_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:228(c_byte) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:569(ndenumerate) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/stride_tricks.py:15(DummyArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:71(LazyList) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1036(tzstr) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:53() + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:130() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/base.py:462(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:62(IntegerArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:96(_IndexSlice) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:755(_Tellable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/selectn.py:72(SelectNSeries) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:771(PythonExprVisitor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2754() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:4632(AppendableMultiSeriesTable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:119(getLevelName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:305(udict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:165(RegistryCache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:374(Unit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:857(PintDataFrameAccessor) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:341(validate_aspect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageMode.py:22(ModeDescriptor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:29(ScaleBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1833(MultipleLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2271(BlendedAffine2D) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:288(RecursiveGrammarException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2391(NoMatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4652(_Indent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:731(DejaVuSansFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1054(Vbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/_base.py:95(_TransformedBoundsLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1501(YearLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:249(StreamplotSet) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:1071(_DOF_estimator_geom) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:60(register_vcs_handler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/numbers.py:12(Number) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:637(__len__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pickle.py:84(UnpicklingError) + 1 0.000 0.000 0.000 0.000 {built-in method numpy._set_promotion_state} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/_endian.py:46(BigEndianStructure) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:109(nd_grid) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_array_like.py:39(_SupportsArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:449(_polyfit_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:8(_TzSingleton) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:589(LocaleHTMLCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:109(bottleneck_switch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:169(Int32Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/floating.py:149(Float64Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/sparse/accessor.py:26(BaseAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/printing.py:500(PrettyDict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1628(Datetime64Formatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/utils.py:52(Endianness) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/compat/pickle_compat.py:144(Unpickler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:138(PackagePath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:598(_JavaScriptCompiler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/util.py:1029(BlockIterator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:418(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1123(FileHandler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:159(NameByFields) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:33(MessageDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:20(MatplotlibDeprecationWarning) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:387(validate_fontstretch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1121(ListedColormap) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1910(PowerNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/scale.py:89(LinearScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2790(TransformedPatchPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4658(_IndentGreater) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4787(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:19(DuplicateConstraint) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/ansi.py:25(AnsiCodes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/collections.py:1275(BrokenBarHCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:148(SmallFilledCircles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:618(ToolForward) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/font_manager.py:910(_JSONEncoder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1428(_GlueSpec) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_managers.py:4(ToolEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:208(HandlerNpointsYoffsets) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:314(HandlerPatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/flat_methods.py:52(SliceIndexer) + 5 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:767(_hash_set_none) + 4 0.000 0.000 0.000 0.000 {built-in method _sre.ascii_tolower} + 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding} + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:1172(_check_timeout) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/__config__.py:98() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:32(UFuncTypeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:56(_UFuncBinaryResolutionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:224(_NetlocResultMixinBytes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:171(c_long) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:233(c_char) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:303(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:761(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:2187(_lstsq_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/twodim_base.py:529(_vander_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:701(_polyval_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/platform.py:1125(python_version) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:1637(mr_class) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/sysconfig.py:184(_get_default_scheme) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/engines.py:124(PythonEngine) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:169(_is_type) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:1440(SQLAlchemyEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:160() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:154(RegistryMeta) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:506(Lister) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:71(HeaderParser) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/feedparser.py:125(__iter__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/message.py:1168(EmailMessage) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:163(validate_dpi) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:874(_ignorecase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:178(UnknownIntegerType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1658(IndexLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1915(_Edge_integer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:2874(AutoMinorLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:140(BasicMultilingualPlane) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:197(_should_enable_warnings) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3636(LineEnd) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3664(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3659(StringStart) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/units.py:135(DecimalConverter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/artist.py:111(_Unset) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:9(HatchPatternBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:14(HorizontalHatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:132(SmallCircles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1533(KeyEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:609(ToolBack) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2325(Square) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3595(Simple) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1061(Hbox) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/__init__.py:14(SubplotBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:467(VPacker) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axis.py:564(_LazyTickList) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:398(HandlerLineCollection) + 1 0.000 0.000 0.000 0.000 {built-in method _thread._set_sentinel} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:271(_is_owned) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/multiarray.py:85(empty_like) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/dtypes.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:200(c_longdouble) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:249(c_bool) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/__init__.py:313(_CountryTimezoneDict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_tzpath.py:170(InvalidTZPathWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:434(PyperclipWindowsException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:69(unix_dialect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/accessor.py:196(CachedAccessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:791(StataNonCatValueLabel) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:425(invalidate_members) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:529(build_system_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/unit.py:373(build_unit_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3445(register_save) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:328(StructOrUnionOrEnum) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:270(FixedFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/mixins/text.py:229(PfStateText) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/contour.py:29(ClabelText) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:437(ToolYScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:447(ToolXScale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2583(Sawtooth) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/__init__.py:72(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:876(AutoDateFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:521(HandlerErrorbar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/mpl_toolkits/mplot3d/art3d.py:347(Collection3D) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:73(ensure_pflines_flat) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:132(raiseerror_if_otherNone) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:157(Add) + 2 0.000 0.000 0.000 0.000 {method 'copy' of 'list' objects} + 1 0.000 0.000 0.000 0.000 {built-in method posix.getpid} + 2 0.000 0.000 0.000 0.000 {built-in method from_iterable} + 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:80(_UFuncInputCastingError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_exceptions.py:98(_UFuncOutputCastingError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:329(DefragResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1222(IntegerFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/ctypes/__init__.py:244(c_void_p) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:211(MGridClass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/_array_like.py:160(_UnknownType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:263(_fromnxfunction_single) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:121(LazySet) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/tzfile.py:12(_byte_string) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:236(ReadPickleBuffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_typing.py:241(WriteExcelBuffer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:144(MovedAttribute) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:245(_MovedItems) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:340(Module_six_moves_urllib_parse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:55(_TzStrFactory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:31(IllegalWeekdayError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:546(different_locale) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/isoparser.py:43(__init__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:18(IntCastingNaNError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:24(NullFrequencyError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:548(InvalidColumnName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/tseries/frequencies.py:430(_TimedeltaFrequencyInferer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:176(Int64Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/arrays/integer.py:183(UInt8Dtype) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:614(LZMADecompressor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:823(DataFrameTableBuilderNonVerbose) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:518(Div) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/ops.py:612(FuncNode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_testing/__init__.py:837(SubclassedCategorical) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/stata.py:956(StataParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/helpers.py:13() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:1227(SafeConfigParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/core.py:118(UnknownLocaleError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/units.py:13(UnknownUnitError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1218(PlaceHolder) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1280(disable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/measurement.py:178(Measurement) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/registry.py:190(ContextCacheOverlay) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:79(BytesParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:8(MessageError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/_policybase.py:41(__init__) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:276(release) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cbook.py:333(silent_list) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:2119(NoNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/__init__.py:75(UnidentifiedImageError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3456(register_save_all) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/error.py:2(FFIError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:72(BaseType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:85(VoidType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:224(RawFunctionType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/GimpGradientFile.py:66(GradientFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/GimpGradientFile.py:101(GimpGradientFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1687(FixedLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:146(Latin1) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:165(Greek) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:244(Kanji) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:251(Hiragana) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5044(OneOrMore) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5175(_NullToken) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:98(List) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:15(BadRequiredStrength) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/units.py:161(Registry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:87(Shapes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:124(Circles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:157(Stars) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1288(DrawEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1484(PickEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:3475(ShowBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:370(ToolQuitAll) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:380(ToolGrid) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:395(ToolMinorGrid) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:410(ToolFullScreen) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:588(ViewsPositionsBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:634(SaveFigureBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2439(DArrow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3434(Curve) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3492(BracketB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3674(Fancy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3762(Wedge) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:950(STIXFontConstants) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1410(Hrule) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/axes/__init__.py:8(_SubplotBaseMeta) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/container.py:77(ErrorbarContainer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/polar.py:241(ThetaFormatter) + 2 0.000 0.000 0.000 0.000 :1299(exec_module) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:259(__exit__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:522(build_group_class) + 1 0.000 0.000 0.000 0.000 {built-in method _stat.S_ISREG} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:47(ComplexWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:581(_RecursiveWildcardSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1043(PurePosixPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1053(PureWindowsPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1336(TimedeltaFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1341(SubArrayFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/polynomial.py:29(RankWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zoneinfo/_common.py:164(ZoneInfoNotFoundError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:25(_TzOffsetFactory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexing.py:2433(_iAtIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1836(Datetime64TZFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:707(ExFileObject) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:545(CombinedDatetimelikeProperties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:1257(FrameSplitter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:3232(FrameFixed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:377(UnaryOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/sql.py:1421(BaseEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:81(HeaderDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/uu.py:39(Error) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/packaging/version.py:57(InvalidVersion) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:97(BasePrimitiveType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:1077(_fdat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1732(NullLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:168(UnboundedMemo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:3551(PositionToken) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/units.py:72(AxisInfo) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:31(VerticalHatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:140(LargeCircles) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2369(Ellipse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2801(Angle3) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3511(BracketAB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:959(STIXSansFontConstants) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1486(VCentered) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_blocking_input.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1551(MonthLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1578(WeekdayLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:21(get_keywords) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:503(_Selector) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:493(_recursive_guard) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1245(ComplexFloatingFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1278(_TimelikeFormat) + 1 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath._reload_guard} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/_internal.py:244(c_void_p) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:262(OGridClass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:717(IndexExpression) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/exceptions.py:11(Error) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:373(_tzfile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/calendar.py:160(setfirstweekday) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/multi.py:156(MultiIndexPyIntEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/internals/blocks.py:2118(NumericBlock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1617(IntArrayFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:735(SpecialFileError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/groupby/ops.py:1249(SeriesSplitter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:154(FileHash) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:181(NoSectionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:190(DuplicateSectionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:243(NoOptionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/compat.py:36(BehaviorChangeWarning) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:527(_unary_compiler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/numbers.py:559(UnknownCurrencyFormatError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:114(OffsetUnitCalculusError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:127(LogarithmicUnitCalculusError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:729(Filter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:1743(RootLogger) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:98(_Exception) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:117(ireduce_dimensions) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:2135(Quantity) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:523(Group) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:948(Delegated) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:1285(is_interactive) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_docstring.py:50(_ArtistKwdocLoader) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:747(_DunderChecker) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/colors.py:1796(FuncNorm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:2860(ImageTransformHandler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:3430(register_mime) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/error.py:5(CDefError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:204(BaseFunctionType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:239(FunctionPtrType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/PngImagePlugin.py:1066(_idat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:262(NullFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/transforms.py:2607(BboxTransformToMaxOnly) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:80(_UnboundedCache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:8(_lazyclassproperty) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:153(LatinA) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:218(Chinese) + 3 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2469(_generateDefaultName) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/cm.py:95(__iter__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1315(ResizeEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2348(Circle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2711(SimpleEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2905(Arc) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3533(BarAB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3551(BracketCurve) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dviread.py:782(Tfm) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_managers.py:20(ToolManagerMessageEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/projections/__init__.py:85(get_projection_names) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/offsetbox.py:499(HPacker) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1633(HourLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1683(SecondLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/container.py:109(StemContainer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/nested_methods.py:56(SliceIndexer) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:33(assert_pflines_samekind) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/pfstate.py:301(_SliceIndexer) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfstate/arithmatic.py:175(Multiply) + 4 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:5916(postParse) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/copyreg.py:22(constructor) + 2 0.000 0.000 0.000 0.000 {method '__prepare__' of 'type' objects} + 1 0.000 0.000 0.000 0.000 {built-in method _thread.get_native_id} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:1147(daemon) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:51(_is_wildcard_pattern) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:337(SplitResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:356(SplitResultBytes) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/arrayprint.py:1235(BoolFormat) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:435(RClass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/index_tricks.py:537(CClass) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/polynomial/polyutils.py:47(RankWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/random.py:805(seed) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/__init__.py:372(_CountryNameDict) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/_version.py:4() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/_factories.py:19(_TzFactory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:661(_result) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:1378(_attr) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:47(UnsortedIndexError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:55(ParserError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/array_algos/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:69(Error) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:740(AbsoluteLinkError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:745(LinkOutsideDestinationError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/info.py:1032(SeriesTableBuilderNonVerbose) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/engines.py:107(NumExprEngine) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:319(JointFilterBinOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/islamic.py:3398(_CustomIslamicCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/__init__.py:102(get_application_registry) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:216(DuplicateOptionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:26(PintError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:2178(createLock) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/parser.py:126(BytesHeaderParser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:12(MessageParseError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:50(FirstHeaderLineIsContinuationDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:957(DelegatedProperty) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_api/deprecation.py:308(_deprecated_parameter_class) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:2851(ImagePointHandler) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/error.py:17(VerificationError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:261(PointerType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:486(UnionType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:187(TickHelper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:332(FormatStrFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:355(StrMethodFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1030(LogFormatterExponent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1093(LogFormatterSciNotation) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:205(Cyrillic) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:263(Katakana) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:287(Hangul) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:319(Arabic) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:327(Hebrew) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:2476(_SingleCharLiteral) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/results.py:14() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:47(UnsatisfiableConstraint) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/colorama/winterm.py:23(WinStyle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2397(LArrow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2429(RArrow) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2534(Round4) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2642(Roundtooth) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2841(Angle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3573(CurveBracket) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1420(Vrule) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1658(MinuteLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:503(HandlerPathCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:434(InvalidIndexError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/tri/_triinterpolate.py:1061(_DOF_estimator_user) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/plot.py:56(ContinuousValuesNotSupported) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:34(VersioneerConfig) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/dataclasses.py:959() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:105(SubprocessError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/subprocess.py:2044(_save_input) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:476(BoundedSemaphore) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:348(DefragResultBytes) + 1 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath._set_madvise_hugepage} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:421(ConverterError) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:91(LazyList) + 2 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/lazy.py:144(LazySet) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:129(InvalidVersion) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:33(PerformanceWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:39(UnsupportedFunctionCall) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/dtypes.py:117(CategoricalDtypeType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/gzip.py:116(BadGzipFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:270(TarError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:723(AbsolutePathError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/custom.py:32(_CustomCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/compat.py:66(FakeArray) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/babel/plural.py:325(RuleError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/quantity.py:148(wrapper) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/__init__.py:346(ExecutableNotFoundError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/rcsetup.py:350(validate_fontsize_None) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:285(NamedPointerType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/ImageFile.py:587(PyCodecState) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/ticker.py:1046(LogFormatterMathtext) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/bezier.py:25(NonIntersectingPathException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:252(ParseException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/core.py:4882(Located) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:26(DuplicateEditVariable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:33(UnknownConstraint) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/kiwisolver/exceptions.py:40(UnknownEditVariable) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:1335(CloseEvent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_bases.py:2574(NonGuiException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:2476(Round) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:864(StixSansFonts) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:1476(HCentered) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/dates.py:1605(DayLocator) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:772(HandlerPolyCollection) + 2 0.000 0.000 0.000 0.000 {method 'clear' of 'list' objects} + 1 0.000 0.000 0.000 0.000 {built-in method sys.getdefaultencoding} + 1 0.000 0.000 0.000 0.000 {method '__exit__' of 'posix.ScandirIterator' objects} + 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:750(BrokenBarrierError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:785() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/threading.py:943(_set_ident) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:85(TooHardError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:189(DTypePromotionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:404(_Accessor) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:528(_TerminatingSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:550(_WildcardSelector) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1578(PosixPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/pathlib.py:1585(WindowsPath) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:342(ParseResult) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/parse.py:361(ParseResultBytes) + 1 0.000 0.000 0.000 0.000 {built-in method numpy._using_numpy2_behavior} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:67(LinAlgError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:79(_64Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:429(ConverterLockError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:281(_fromnxfunction_seq) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:294(_fromnxfunction_args) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/ma/extras.py:319(_fromnxfunction_allargs) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/exceptions.py:15(UnknownTimeZoneError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/exceptions.py:38(InvalidTimeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/exceptions.py:42(AmbiguousTimeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/util/version/__init__.py:412(dev) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1156(_tzicalvtzcomp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:239(exec_module) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:454(Module_six_moves_urllib_response) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_config/config.py:104(OptionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/parser/_parser.py:1608(UnknownTimezoneWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/dtypes/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:124(EmptyDataError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:207(NumbaUtilError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:213(DuplicateLabelError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:301(SettingWithCopyWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:323(ChainedAssignmentError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:360(NumExprClobberingError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:405(IndexingError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:448(CSSWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:467(PossibleDataLossError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:479(ClosedFileError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:492(IncompatibilityWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:498(AttributeConflictWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:508(DatabaseError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:521(PossiblePrecisionLoss) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:536(ValueLabelTypeMismatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/csv.py:64(excel_tab) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:72(SameFileError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:82(ReadError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/formats/format.py:1656(ExtensionArrayFormatter) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:273(ExtractError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:288(EmptyHeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:294(EOFHeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:297(InvalidHeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:728(OutsideDestinationError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:42(BadZipFile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/zipfile.py:46(LargeZipFile) + 1 0.000 0.000 0.000 0.000 :1(__create_fn__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/_libs/window/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/accessors.py:478(PeriodProperties) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/socket.py:211(_GiveupOnSendfile) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/pytables.py:371(JointConditionBinOp) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/buddhist.py:440(_CustomBuddhistCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/chinese.py:1264(_CustomChineseCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/hindu.py:440(_CustomHinduCalendar) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/julian_revised.py:12() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/importlib/metadata.py:37(PackageNotFoundError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:254(InterpolationError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:264(InterpolationMissingOptionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:284(InterpolationDepthError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:340(MissingSectionHeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:140(UnitStrippedWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/logging/__init__.py:2172(handle) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:404(Header) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/_vendor/flexcache.py:420(Header) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:16(HeaderParseError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:20(BoundaryError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:24(MultipartConversionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:28(CharsetError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:41(NoBoundaryInMultipartDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:44(StartBoundaryNotFoundDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:47(CloseBoundaryNotFoundDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:67(UndecodableBytesDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:107(NonASCIILocalPartDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:974(DelegatedMethod) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:64(DecompressionBombWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/error.py:28(PkgConfigError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:192(UnknownFloatType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/model.py:482(StructType) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/util.py:101(_FifoCache) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:272(ParseFatalException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:159(LatinB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:309(CJK) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:312(Thai) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/unicode.py:341(Devanagari) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:48(NorthEastHatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/hatch.py:67(SouthEastHatch) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/backend_tools.py:627(ConfigureSubplotsBase) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3443(CurveA) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3448(CurveB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3453(CurveAB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3463(CurveFilledB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:966(DejaVuSerifFontConstants) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/_mathtext.py:970(DejaVuSansFontConstants) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/importlib_resources/abc.py:55(TraversalError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:238(HandlerLine2DCompound) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:275(HandlerLine2D) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/legend_handler.py:513(HandlerCircleCollection) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:438(TerminateTrajectory) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/streamplot.py:510(OutOfBounds) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:45(assert_pflines_distinctkind) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/pfline/arithmatic.py:57(ensure_pflines_samestructure) + 2 0.000 0.000 0.000 0.000 {method 'isalpha' of 'str' objects} + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/_version.py:52(NotThisMethod) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/selectors.py:200(__enter__) + 1 0.000 0.000 0.000 0.000 :1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:58(ModuleDeprecationWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/urllib/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/core/numeric.py:837(_outer_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/linalg/linalg.py:488(_unary_dispatcher) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:88(_8Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:382(Module_six_moves_urllib_error) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:130(ParserWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:179(AccessorRegistrationWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:75(SpecialFileError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/tools/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/reshape/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:285(HeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/_numba/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/interchange/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/configparser.py:276(InterpolationSyntaxError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/compat.py:67(__array_function__) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:53(MisplacedEnvelopeHeaderDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:64(InvalidMultipartContentTransferEncodingDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:73(InvalidBase64CharactersDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:76(InvalidBase64LengthDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/cffi/error.py:22(VerificationMissing) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/units.py:52(ConversionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3458(CurveFilledA) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/exceptions.py:74(VisibleDeprecationWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:70(_128Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:76(_80Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:82(_32Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:85(_16Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/lib/_iotools.py:437(ConversionWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytz/exceptions.py:53(NonExistentTimeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/__init__.py:11(DeprecatedTzFormatWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:627() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/dateutil/tz/tz.py:1818(_get_supported_offset) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:402(Module_six_moves_urllib_request) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/six.py:475(Module_six_moves_urllib_robotparser) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/util/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:69(DtypeWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:171(MergeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:234(InvalidIndexError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:242(DataError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:251(SpecificationError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:279(SettingWithCopyError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:426(PyperclipException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:563(CategoricalConversionWarning) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:577(LossySetitemError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:583(NoBufferPresent) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/config_init.py:637(register_plotting_backend_cb) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/strings/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/nanops.py:67(set_use_bottleneck) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:79(ExecError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:85(RegistryError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/shutil.py:89(_GiveupOnFastCopy) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/indexes/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/methods/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:276(ReadError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:279(CompressionError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:282(StreamError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:291(TruncatedHeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:300(SubsequentHeaderError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/tarfile.py:720(FilterError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/core/computation/expr.py:322(add_ops) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/io/pytables.py:2574(GenericDataIndexableCol) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/errors.py:82(PintTypeError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint/systems.py:530(System) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:61(MultipartInvariantViolationDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:70(InvalidBase64PaddingDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:87(InvalidHeaderDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:90(HeaderMissingRequiredValue) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:104(ObsoleteHeaderDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:970(DelegatedScalarProperty) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pint_pandas/pint_array.py:991(DelegatedScalarMethod) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/_version.py:2() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/PIL/Image.py:68(DecompressionBombError) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:17(ExceptionWordUnicode) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pyparsing/exceptions.py:279(ParseSyntaxException) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/core/__init__.py:1() + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/matplotlib/patches.py:3468(CurveFilledAB) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/Library/CloudStorage/OneDrive-LichtBlickSE/Desktop/portfolyo/portfolyo/portfolyo/visualize/plot.py:60(CategoricalValuesNotSupported) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:67(_256Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/email/errors.py:56(MissingHeaderBodySeparatorDefect) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/numpy/_typing/__init__.py:73(_96Bit) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pandas/errors/__init__.py:589(InvalidComparison) + 1 0.000 0.000 0.000 0.000 /Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/holidays/calendars/julian.py:12() + + diff --git a/pyproject.toml b/pyproject.toml index 974f208..d74774d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,17 @@ [tool.poetry] name = "portfolyo" -version = "0.5.10" +version = "0.6.0" description = "Analyse and manipulate timeseries related to power and gas offtake portfolios" authors = [ "Ruud Wijtvliet ", "Sakshi Singh ", + "Alina Voilova ", ] license = "BSD-3" readme = "README.rst" [tool.poetry.dependencies] -python = "^3.9" +python = "^3.10" pandas = "~2.0" # pandas 2.1.0 doesn't play nice with pint-pandas. Update when new pint-pandas version is released (>0.5) matplotlib = "^3.7.2" pint = "0.19.2" @@ -35,11 +36,13 @@ sphinx-autobuild = "^2021.3.14" matplotlib = "^3.8.2" numpydoc = "^1.6.0" sphinx-copybutton = "^0.5.2" -sphinx-exec-code = "^0.10" +sphinx-exec-code = "^0.12" sphinx-rtd-theme = "^1.3.0" insegel = "^1.3.1" nbsphinx = "^0.9.3" pandoc = "^2.3" +pip-tools = "^7.4.1" +IPython = "^8.23.0" [tool.poetry.group.dev.dependencies] diff --git a/setup.cfg b/setup.cfg index 4e57090..4edd93f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,7 +12,7 @@ max-line-length = 120 ignore = E501, W503, E202, E226 [tool:pytest] -addopts = --cov=. +#addopts = --cov=. markers = only_on_pr: marks tests as slow (select with -m only_on_pr and deselect with -m "not only_on_pr") pythonpath = ./tests diff --git a/tests/core/pfline/test_flat.py b/tests/core/pfline/test_flat.py index cad08f7..a2741a9 100644 --- a/tests/core/pfline/test_flat.py +++ b/tests/core/pfline/test_flat.py @@ -107,13 +107,13 @@ def test_flatpfline_asfreqcorrect1(freq_in: str, freq_out: str, columns: str): def test_flatpfline_asfreqcorrect2(freq, newfreq, columns, tz): """Test if changing frequency is done correctly (when it's possible).""" - # Includes at 2 full years + # Includes at least 2 full years a, m, d = np.array([2016, 1, 1]) + np.random.randint(0, 12, 3) # each + 0..11 start = f"{a}-{m}-{d}" a, (m, d) = a + 3, np.array([1, 1]) + np.random.randint(0, 12, 2) # each + 0..11 end = f"{a}-{m}-{d}" - i = pd.date_range(start, end, freq=freq, tz=tz) + i = pd.date_range(start, end, freq=freq, inclusive="left", tz=tz) df = dev.get_dataframe(i, columns) pfl1 = create.flatpfline(df) pfl2 = pfl1.asfreq(newfreq) @@ -143,8 +143,9 @@ def test_flatpfline_asfreqcorrect2(freq, newfreq, columns, tz): def test_flatpfline_asfreqimpossible(freq, newfreq, kind): """Test if changing frequency raises error if it's impossible.""" - periods = {"H": 200, "15T": 2000, "D": 20}[freq] - i = pd.date_range("2020-04-06", freq=freq, periods=periods, tz="Europe/Berlin") + i = pd.date_range( + "2020-04-06", "2020-04-16", freq=freq, inclusive="left", tz="Europe/Berlin" + ) pfl = dev.get_flatpfline(i, kind) with pytest.raises(ValueError): _ = pfl.asfreq(newfreq) diff --git a/tests/core/pfline/test_pfline_arithmatic_kind_and_error.py b/tests/core/pfline/test_pfline_arithmatic_kind_and_error.py index d716236..11f67a5 100644 --- a/tests/core/pfline/test_pfline_arithmatic_kind_and_error.py +++ b/tests/core/pfline/test_pfline_arithmatic_kind_and_error.py @@ -1,4 +1,5 @@ """Test if arithmatic returns correct type/kind of object and/or correctly raises error.""" + from dataclasses import dataclass from enum import Enum from functools import lru_cache @@ -17,7 +18,14 @@ # TODO: use/change STRICT setting -arithmatic.STRICT = True +@pytest.fixture +def strict_arithmetic(): + arithmatic.STRICT = True + yield + arithmatic.STRICT = False + + +# arithmatic.STRICT = True class Kind2(Enum): # Kind of value for other operand @@ -319,7 +327,9 @@ def from_config(cls, config: CaseConfig, er: ER) -> Iterable[Case]: ), ids=id_fn, ) -def test_pfl_arithmatic_kind_addraddsubrsub(testcase: Case, operation: str): +def test_pfl_arithmatic_kind_addraddsubrsub( + testcase: Case, operation: str, strict_arithmetic +): """Test if arithmatic expectedly raises Error or returns expected type/kind.""" do_kind_test(testcase, operation) @@ -383,7 +393,7 @@ def test_pfl_arithmatic_kind_addraddsubrsub(testcase: Case, operation: str): ), ids=id_fn, ) -def test_pfl_arithmatic_kind_mulrmul(testcase: Case, operation: str): +def test_pfl_arithmatic_kind_mulrmul(testcase: Case, operation: str, strict_arithmetic): """Test if arithmatic expectedly raises Error or returns expected type/kind.""" do_kind_test(testcase, operation) @@ -456,7 +466,7 @@ def test_pfl_arithmatic_kind_mulrmul(testcase: Case, operation: str): ), ids=id_fn, ) -def test_pfl_arithmatic_kind_div(testcase: Case, operation: str): +def test_pfl_arithmatic_kind_div(testcase: Case, operation: str, strict_arithmetic): """Test if arithmatic expectedly raises Error or returns expected type/kind.""" do_kind_test(testcase, operation) @@ -505,7 +515,7 @@ def test_pfl_arithmatic_kind_div(testcase: Case, operation: str): ), ids=id_fn, ) -def test_pfl_arithmatic_kind_rdiv(testcase: Case, operation: str): +def test_pfl_arithmatic_kind_rdiv(testcase: Case, operation: str, strict_arithmetic): """Test if arithmatic expectedly raises Error or returns expected type/kind.""" do_kind_test(testcase, operation) @@ -581,7 +591,9 @@ def test_pfl_arithmatic_kind_rdiv(testcase: Case, operation: str): ), ids=id_fn, ) -def test_pfl_arithmatic_kind_unionrunion(testcase: Case, operation: str): +def test_pfl_arithmatic_kind_unionrunion( + testcase: Case, operation: str, strict_arithmetic +): """Test if arithmatic expectedly raises Error or returns expected type/kind.""" do_kind_test(testcase, operation) diff --git a/tests/core/pfline/test_pfline_excelclipboard.py b/tests/core/pfline/test_pfline_excelclipboard.py index 08c0829..f6b092f 100644 --- a/tests/core/pfline/test_pfline_excelclipboard.py +++ b/tests/core/pfline/test_pfline_excelclipboard.py @@ -1,9 +1,9 @@ """Test if portfolio line can be exported.""" +import pandas as pd import pytest import portfolyo as pf -import pandas as pd @pytest.mark.parametrize("levels", [1, 2, 3]) diff --git a/tests/core/pfline/test_pfline_init.py b/tests/core/pfline/test_pfline_init.py index 76e1f63..62632d9 100644 --- a/tests/core/pfline/test_pfline_init.py +++ b/tests/core/pfline/test_pfline_init.py @@ -3,7 +3,7 @@ import random from dataclasses import dataclass from enum import Enum -from typing import Any, Callable, Iterable, Union +from typing import Any, Callable, Iterable import pandas as pd import pytest @@ -187,7 +187,7 @@ def test_init_A( columns: Iterable[str], inputtype: InputTypeA, has_unit: bool, - constructor: Union[Callable, type], + constructor: Callable | type, ): """Test if pfline can be initialized correctly from a flat testcase.""" @@ -253,3 +253,33 @@ def test_init_with_integers(col: str): pfl = pf.PfLine(s) for dtype in pfl.df.pint.dequantify().dtypes.values: assert not pd.api.types.is_integer_dtype(dtype) + + +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("freq", ["15T", "H"]) +def test_contain_whole_day(inclusive: str, freq: str): + """An index must contain full days. + For hourly-or-shorter values, this means that the start time of the first period () must equal the end time of the + last period (), which is not the case.""" + index = pd.date_range( + "2020-01-01", "2020-02-01", freq=freq, tz="Europe/Berlin", inclusive=inclusive + ) + if inclusive == "left": + # This should work without any error + pfl = dev.get_flatpfline(index) + assert isinstance(pfl, PfLine) + else: + # For "both" inclusive, it should raise an error + with pytest.raises(ValueError): + pfl = dev.get_flatpfline(index) + + +@pytest.mark.parametrize("freq", ["D", "MS", "QS", "AS"]) +def test_equal_sod(freq: str): + """In an index with daily-or-longer values, all timestamps (all periods) should start at the same time .""" + i = pd.date_range("2024-03-28", freq=freq, periods=10, tz="Europe/Berlin") + s = pd.Series(range(len(i)), i) + s = s.tz_convert(None) + s_pint = s.astype("pint[MW]") + with pytest.raises(ValueError): + pf.PfLine(s_pint) diff --git a/tests/core/pfline/test_pfline_text.py b/tests/core/pfline/test_pfline_text.py index 5f8c980..5e62e82 100644 --- a/tests/core/pfline/test_pfline_text.py +++ b/tests/core/pfline/test_pfline_text.py @@ -1,6 +1,7 @@ """Test if portfolio line can be printed.""" import pytest + import portfolyo as pf diff --git a/tests/core/pfline/test_slice.py b/tests/core/pfline/test_slice.py new file mode 100644 index 0000000..87b8f6e --- /dev/null +++ b/tests/core/pfline/test_slice.py @@ -0,0 +1,187 @@ +"""Test if slice attributes works properly with portfolio line.""" + +import pandas as pd +import pytest + +from portfolyo import dev + + +def get_idx( + startdate: str, + starttime: str, + enddate: str, + tz: str, + freq: str, + inclusive: str, +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive=inclusive) + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize( + "slice_start", ["2021", "2022", "2022-01-02", "2022-05-23 14:34"] +) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_flat_slice_start( + slice_start: str, freq: str, tz: str, sod: str, inclusive: str +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + pfl1 = dev.get_flatpfline(index) + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_flat_slice_end(slice_end: str, freq: str, tz: str, sod: str, inclusive: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + pfl1 = dev.get_flatpfline(index) + assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_flat_slice_whole(where: str, freq: str, tz: str, sod: str, inclusive: 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 = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + 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"]) +@pytest.mark.parametrize( + "slice_start", + [ + "2021", + "2022", + "2022-01-02", + "2022-01-02 14:00", + ], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_nested_slice_start( + slice_start: str, freq: str, tz: str, sod: str, inclusive: str +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + pfl1 = dev.get_nestedpfline(index) + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_nested_slice_end(slice_end: str, freq: str, tz: str, sod: str, inclusive: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + pfl1 = dev.get_nestedpfline(index) + assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_nested_slice_whole(where: str, freq: str, tz: str, sod: str, inclusive: 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 = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + 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 + + +@pytest.mark.parametrize("freq", ["H", "15T"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("startdate", ["2021", "2022", "2022-01-02"]) +def test__start_less_than_daily(startdate: str, freq: str, tz: str, sod: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive="left", tz=tz + ) + pfl1 = dev.get_flatpfline(index) + slice_start = f"{startdate} {sod}" + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "enddate", + [ + # (, ) + ("2021", "2020-12-31"), + ("2022", "2021-12-31"), + ("2021-07", "2021-06-30"), + ("2022-01-02", "2022-01-01"), + ], +) +def test__end_less_than_daily(enddate: str, tz: str): + index = get_idx( + "2020", starttime="00:00", enddate="2024", freq="15T", inclusive="left", tz=tz + ) + pfl1 = dev.get_flatpfline(index) + slice_end = f"{enddate[0]} 00:00" + loc_end = f"{enddate[1]} 23:45" + assert pfl1.slice[:slice_end] == pfl1.loc[:loc_end] diff --git a/tests/core/pfstate/test_pfstate_excelclipboard.py b/tests/core/pfstate/test_pfstate_excelclipboard.py index d2a2a47..61b3853 100644 --- a/tests/core/pfstate/test_pfstate_excelclipboard.py +++ b/tests/core/pfstate/test_pfstate_excelclipboard.py @@ -1,8 +1,9 @@ """Test if portfolio line can be exported.""" +import pandas as pd import pytest + import portfolyo as pf -import pandas as pd def test_pfstate_toexcel(): diff --git a/tests/core/pfstate/test_pfstate_init.py b/tests/core/pfstate/test_pfstate_init.py index 3f3b679..fa59ac5 100644 --- a/tests/core/pfstate/test_pfstate_init.py +++ b/tests/core/pfstate/test_pfstate_init.py @@ -18,7 +18,7 @@ s_less = dev.get_series(i_less, "") i_more = pd.date_range("2019-12-15", freq="D", periods=100) s_more = dev.get_series(i_more, "") -i_difffreq = pd.date_range("2020", freq="H", periods=80) +i_difffreq = pd.date_range("2020", freq="H", periods=24 * 5) s_difffreq = dev.get_series(i_difffreq, "") @@ -506,3 +506,22 @@ def test_pfstate_consistency_nosourcing(): pd.Series(1.0, i_ref, "pint[dimensionless]"), check_names=False, ) + + +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("freq", ["15T", "H"]) +def test_contain_whole_day(inclusive: str, freq: str): + """An index must contain full days. + For hourly-or-shorter values, this means that the start time of the first period () must equal the end time of the + last period (), which is not the case.""" + index = pd.date_range( + "2020-01-01", "2020-02-01", freq=freq, tz="Europe/Berlin", inclusive=inclusive + ) + if inclusive == "left": + # This should work without any error + pfs = dev.get_pfstate(index) + assert isinstance(pfs, PfState) + else: + # For "both" inclusive, it should raise an error + with pytest.raises(ValueError): + pfs = dev.get_pfstate(index) diff --git a/tests/core/pfstate/test_slice_state.py b/tests/core/pfstate/test_slice_state.py new file mode 100644 index 0000000..a3e0e0c --- /dev/null +++ b/tests/core/pfstate/test_slice_state.py @@ -0,0 +1,162 @@ +"""Test if slice attributes works properly with portfolio state.""" + +import pandas as pd +import pytest + +from portfolyo import dev + + +def get_idx( + startdate: str, + starttime: str, + enddate: str, + tz: str, + freq: str, + inclusive: str, +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive=inclusive) + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@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"), + ], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_slice_state( + slice_start: str, + slice_end: str, + freq: str, + sod: str, + inclusive: str, + tz: str, +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + 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"]) +@pytest.mark.parametrize( + "slice_start", + [ + "2021", + "2022", + "2022-01-02", + "2022-01-02 14:00", + ], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_state_slice_start( + slice_start: str, + freq: str, + sod: str, + inclusive: str, + tz: str, +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + pfs = dev.get_pfstate(index) + assert pfs.slice[slice_start:] == pfs.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_state_slice_end(slice_end: str, freq: str, sod: str, inclusive: str, tz: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + pfs = dev.get_pfstate(index) + assert pfs.slice[: slice_end[0]] == pfs.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_state_slice_whole(where: str, freq: str, sod: str, inclusive: str, tz: 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 = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) + 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 + + +@pytest.mark.parametrize("freq", ["H", "15T"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("startdate", ["2021", "2022", "2022-01-02"]) +def test__start_less_than_daily(startdate: str, freq: str, tz: str, sod: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive="left", tz=tz + ) + pfl1 = dev.get_pfstate(index) + slice_start = f"{startdate} {sod}" + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "enddate", + [ + # (, ) + ("2021", "2020-12-31"), + ("2022", "2021-12-31"), + ("2021-07", "2021-06-30"), + ("2022-01-02", "2022-01-01"), + ], +) +# @pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test__end_less_than_daily(enddate: str, tz: str): + index = get_idx( + "2020", starttime="00:00", enddate="2024", freq="15T", inclusive="left", tz=tz + ) + pfl1 = dev.get_pfstate(index) + slice_end = f"{enddate[0]} 00:00" + loc_end = f"{enddate[1]} 23:45" + assert pfl1.slice[:slice_end] == pfl1.loc[:loc_end] diff --git a/tests/dev/test_develop.py b/tests/dev/test_develop.py index 2221b4e..8e1cd51 100644 --- a/tests/dev/test_develop.py +++ b/tests/dev/test_develop.py @@ -1,34 +1,32 @@ """Simply test if functions don't raise an error""" -import pandas as pd +import datetime as dt + import pytest from portfolyo import Kind, dev from portfolyo.core.pfline import classes -@pytest.mark.parametrize("as_str", [True, False]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020"), - ("D", "2020"), - ("MS", "2020"), - ("QS", "2020"), - ("AS", "2020"), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), + (None, None, None), + ("H", "2020", None), + ("D", "2020", None), + ("MS", "2020", None), + ("QS", "2020", None), + ("AS", "2020", None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), ], ) -def test_index(freq, tz, start, as_str): +def test_index(freq, tz, startdate, start_of_day): """Test index creation.""" - if not as_str: - start = pd.Timestamp(start) - _ = dev.get_index() if freq is None else dev.get_index(freq, tz, start) + _ = dev.get_index() if freq is None else dev.get_index(freq, tz, startdate) @pytest.mark.parametrize("request_unit", [True, False]) @@ -38,19 +36,23 @@ def test_index(freq, tz, start, as_str): ) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_series(freq, tz, start, name, name_has_unit, request_unit): +def test_series(freq, tz, startdate, name, name_has_unit, request_unit, start_of_day): """Test series creation.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) s = dev.get_series(i, name, request_unit) if request_unit and name_has_unit: _ = s.pint.magnitude @@ -74,19 +76,25 @@ def test_series(freq, tz, start, name, name_has_unit, request_unit): ) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_dataframe(freq, tz, start, cols, first_col_has_unit, request_unit): +def test_dataframe( + freq, tz, startdate, cols, first_col_has_unit, request_unit, start_of_day +): """Test dataframe creation.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) df = dev.get_dataframe(i, cols, request_unit) unit = df.pint.dequantify().columns.get_level_values("unit")[0] if request_unit and first_col_has_unit: @@ -98,19 +106,23 @@ def test_dataframe(freq, tz, start, cols, first_col_has_unit, request_unit): @pytest.mark.parametrize("kind", [Kind.COMPLETE, Kind.VOLUME, Kind.PRICE]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_flatnestedpfline(freq, tz, start, kind): +def test_flatnestedpfline(freq, tz, startdate, kind, start_of_day): """Test flatpfline and nestedpfline creation.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) _ = dev.get_flatpfline(i, kind) _ = dev.get_nestedpfline(i, kind) @@ -119,19 +131,23 @@ def test_flatnestedpfline(freq, tz, start, kind): @pytest.mark.parametrize("kind", [Kind.COMPLETE, Kind.VOLUME, Kind.PRICE]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_pfline(freq, tz, start, kind, max_nlevels): +def test_pfline(freq, tz, startdate, kind, max_nlevels, start_of_day): """Test that pfline can be created.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) pfl = dev.get_randompfline(i, kind, max_nlevels) if max_nlevels == 1: assert isinstance(pfl, classes.FlatPfLine) diff --git a/tests/prices/test_hedge.py.bak b/tests/prices/test_hedge.py.bak deleted file mode 100644 index 1a080b7..0000000 --- a/tests/prices/test_hedge.py.bak +++ /dev/null @@ -1,86 +0,0 @@ -from portfolyo import dev -from portfolyo.prices import hedge -from portfolyo.prices import utils as putils -from portfolyo import testing -from portfolyo.tools import stamps -from pathlib import Path -import numpy as np -import pandas as pd -import pytest - - -@pytest.mark.parametrize("po", [True, False]) -@pytest.mark.parametrize( - ("values", "start", "result_base", "result_po"), - [ - ([1, 2, 3], "2020-01-01", 2, (np.nan, 2)), - (range(12), "2020-01-01", 5.5, (9.5, 3.5)), - ([*[10] * (23 + 8), *[15] * 5], "2020-03-29", 10.69444, (15, 10)), - ([*[10] * (25 + 8), *[15] * 5], "2020-10-25", 10.65789, (15, 10)), - ], -) -def test_basic_volhedge(values, start, result_base, result_po, po): - """Test if basic volume hedge with single values is calculated correctly.""" - index = pd.date_range(start, freq="H", periods=len(values), tz="Europe/Berlin") - df = pd.DataFrame({"w": values, "p": 100.0}, index) - result = hedge._hedge(df, how="vol", po=po) - if not po: - # Result for base hedge - expected_result = pd.Series({"w": result_base, "p": 100.0}) - else: - # Result for peak/offpeak hedge - values = {} - if not np.isnan(result_po[0]): - values[("peak", "w")] = result_po[0] - values[("peak", "p")] = 100.0 - if not np.isnan(result_po[1]): - values[("offpeak", "w")] = result_po[1] - values[("offpeak", "p")] = 100.0 - - expected_result = pd.Series(values) - testing.assert_series_equal(result.sort_index(), expected_result.sort_index()) - - -@pytest.mark.parametrize("withunit", [True, False]) -@pytest.mark.parametrize("how", ["vol", "val"]) -@pytest.mark.parametrize("po", [True, False]) -@pytest.mark.parametrize("aggfreq", ["MS", "QS", "AS"]) -@pytest.mark.parametrize("freq", ["H", "D"]) -@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -def test_hedge_fromexcel(tz, freq, aggfreq, po, how, withunit): - """Test if hedge results are correctly calculated, by comparing against previously calculated results.""" - if freq == "D" and po: - return # Only decompose in peak and offpeak if hourly values - - if tz is None: - return # TODO: allow hedging with dataframes without timezone information, and remove this block so that they are also checked - - path = Path(__file__).parent / "test_hedge_data.xlsx" - sheetname = f'{freq}_{"None" if tz is None else tz.replace("/", "")}' - - # Input data. - df_in = pd.read_excel(path, sheetname, header=6, index_col=0, usecols="A,B:C") - if tz: - df_in = df_in.tz_localize(tz, ambiguous="infer") - df_in.index.freq = pd.infer_freq(df_in.index) - w_in, p_in = df_in.w, df_in.p - if withunit: - w_in = w_in.astype("pint[MW]") - p_in = p_in.astype("pint[Eur/MWh]") - - # Expected output data. - df_out = pd.read_excel(path, f"{sheetname}_out", header=[3, 4, 5, 6], index_col=0) - if tz: - df_out = df_out.tz_localize(tz, ambiguous="infer") - df_out.index.freq = pd.infer_freq(df_out.index) - w_expected = df_out[aggfreq][po][how]["w"] - p_expected = df_out[aggfreq][po].iloc[:, 0] # price is first column - if withunit: - w_expected = w_expected.astype("pint[MW]") - p_expected = p_expected.astype("pint[Eur/MWh]") - - # Test output data. - w_test, p_test = hedge.hedge(w_in, p_in, how, aggfreq, po) - - testing.assert_series_equal(p_test, p_expected, check_names=False) - testing.assert_series_equal(w_test, w_expected, check_names=False) diff --git a/tests/prices/test_convert.py.bak b/tests/tools/prices/test_convert.py.bak similarity index 66% rename from tests/prices/test_convert.py.bak rename to tests/tools/prices/test_convert.py.bak index 4e5557e..77ad906 100644 --- a/tests/prices/test_convert.py.bak +++ b/tests/tools/prices/test_convert.py.bak @@ -1,88 +1,13 @@ import functools -from portfolyo.prices import convert -from portfolyo.tools import nits -from portfolyo import testing from pathlib import Path + import numpy as np import pandas as pd import pytest - -@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -@pytest.mark.parametrize("withunit", [True, False]) -@pytest.mark.parametrize( - ("b", "p", "o", "o_EuropeBerlin", "ts_left", "freq"), - [ - (100, 100, 100, None, "2020-01-01", "MS"), # 31 days, 23 working days - (100, 200, 41.02564103, None, "2020-01-01", "MS"), - (100, 300, -17.94871795, None, "2020-01-01", "MS"), - (100, 100, 100, None, "2020-01-01", "QS"), # 91 days, 65 working days - (100, 200, 44.44444444, 44.40484676, "2020-01-01", "QS"), - (100, 300, -11.11111111, -11.19030649, "2020-01-01", "QS"), - (100, 100, 100, None, "2020-01-01", "D"), # weekday - (100, 200, 0, None, "2020-01-01", "D"), # weekday - (100, 300, -100, None, "2020-01-01", "D"), # weekday - (100, np.nan, 100, None, "2020-01-04", "D"), # weekend only - ], -) -def test_pbaseppeakpoffpeak_explicit( - b: float, - p: float, - o: float, - ts_left: str, - freq: str, - withunit: bool, - tz: str, - o_EuropeBerlin: float, -): - """Test if base, peak and offpeak values can be calculated from single values.""" - # Handle timezone. - ts_left = pd.Timestamp(ts_left, tz=tz) - if tz is not None and o_EuropeBerlin is not None: - o = o_EuropeBerlin - - # Handle units. - if withunit: # add a (random) unit to see if conversion still works. - b, p, o = nits.Q_(b, "MW"), nits.Q_(p, "MW"), nits.Q_(o, "MW") - - # Do testing. - assert np.isclose(convert.peak(b, o, ts_left, freq), p, equal_nan=True) - if np.isnan(p): - p = 0 if not withunit else nits.Q_(0, "MW") - assert np.isclose(convert.offpeak(b, p, ts_left, freq), o) - assert np.isclose(convert.base(p, o, ts_left, freq), b) - - -@pytest.mark.parametrize("withunits", [True, False]) -@pytest.mark.parametrize("testcol", ["base", "peak", "offpeak"]) -@pytest.mark.parametrize( - "bpoframe", - [ - pd.DataFrame( - { - "peak": [100.0, 100, 100, 100], - "base": [80.0, 80, 80, 80], - "offpeak": [68.2051282, 69.4736842, 68.9770355, 68.421053], - }, - pd.date_range("2020", periods=4, freq="MS", tz="Europe/Berlin"), - ), - pd.DataFrame( - { - "peak": [100.0, 100, 100, 100], - "base": [80.0, 80, 80, 80], - "offpeak": [68.8510638, 68.8699360, 68.9361702, 68.9361702], - }, - pd.date_range("2020", periods=4, freq="AS", tz="Europe/Berlin"), - ), - ], -) -def test_completebpoframe_explicit(bpoframe, testcol: str, withunits: bool): - """Test if missing column can be reconstructed.""" - if withunits: - bpoframe = bpoframe.astype("pint[Eur/MWh]") - df = bpoframe.drop(columns=testcol) - result = convert.complete_bpoframe(df) - testing.assert_frame_equal(bpoframe, result) +from portfolyo import testing +from portfolyo.prices import convert +from portfolyo.tools import nits @functools.lru_cache() diff --git a/tests/prices/test_convert_data.xlsx b/tests/tools/prices/test_convert_data.xlsx similarity index 100% rename from tests/prices/test_convert_data.xlsx rename to tests/tools/prices/test_convert_data.xlsx diff --git a/tests/tools/test_changefreq_fromexcel.py.bak b/tests/tools/test_changefreq_fromexcel.py.bak index fa80891..1d7d70b 100644 --- a/tests/tools/test_changefreq_fromexcel.py.bak +++ b/tests/tools/test_changefreq_fromexcel.py.bak @@ -1,6 +1,6 @@ import functools from pathlib import Path -from typing import Tuple, Union +from typing import Tuple import pandas as pd import pytest @@ -578,7 +578,7 @@ def get_testframes( avg_or_sum: str, series_or_df: str, with_units: str, -) -> Tuple[Union[pd.DataFrame, pd.Series]]: +) -> Tuple[pd.DataFrame | pd.Series]: source_s = get_df_from_excel(source_freq, tz)[source_freq] if target_freq is None: target_s = source_s diff --git a/tests/tools/test_freq.py b/tests/tools/test_freq.py index a6224e2..545e8ba 100644 --- a/tests/tools/test_freq.py +++ b/tests/tools/test_freq.py @@ -1,5 +1,3 @@ -from typing import Union - import numpy as np import pandas as pd import pytest @@ -19,12 +17,11 @@ def test_longestshortestfreq(count): @pytest.mark.parametrize("freq1", freqs_small_to_large) @pytest.mark.parametrize("freq2", freqs_small_to_large) -def test_frequpordown_freqlongerorshorter(freq1, freq2): +def test_frequpordown(freq1, freq2): i1 = freqs_small_to_large.index(freq1) i2 = freqs_small_to_large.index(freq2) outcome = np.sign(i1 - i2) assert tools.freq.up_or_down(freq1, freq2) == outcome - assert tools.freq.longer_or_shorter(freq1, freq2) == outcome @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @@ -148,7 +145,7 @@ def test_setfreq( num: int, wanted: str, strict: bool, - expected: Union[str, Exception], + expected: str | Exception, indexorframe: str, ): i = pd.date_range("2020", periods=num, freq=freq) diff --git a/tests/tools/test_hedge.py b/tests/tools/test_hedge.py new file mode 100644 index 0000000..38b9dba --- /dev/null +++ b/tests/tools/test_hedge.py @@ -0,0 +1,148 @@ +from pathlib import Path + +import numpy as np +import pandas as pd +import pytest + +from portfolyo import testing, tools + + +@pytest.mark.parametrize("how", ["vol", "val"]) +@pytest.mark.parametrize( + "w_vals,start,w_expected", + [ + ([1, 2, 3], "2020-01-01", 2), + (range(12), "2020-01-01", 5.5), + ([*[10] * (23 + 8), *[15] * 5], "2020-03-29", 10.69444), + ([*[10] * (25 + 8), *[15] * 5], "2020-10-25", 10.65789), + ], +) +def test_onehedge_uniformpricesandduration(w_vals, start, w_expected, how): + """Test hedge with uniform prices and durations.""" + i = pd.date_range(start, freq="H", periods=len(w_vals), tz="Europe/Berlin") + df = pd.DataFrame({"w": w_vals, "p": 100.0}, i) + df["duration"] = tools.duration.index(i) + + result = tools.hedge.one_hedge(df, how=how) + expected = pd.Series({"w": w_expected, "p": 100.0}) + testing.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("how", ["vol", "val"]) +@pytest.mark.parametrize( + "w_vals,start,w_expected,tz", + [ + ([1, 2], "2020-01-01", 1.483333333, None), # 29 days in Feb + ([1, 2], "2021-01-01", 1.474576271, None), # 28 days in Feb + (range(12), "2020-01-01", 5.51366120, None), # no DST + (range(12), "2020-01-01", 5.514458106, "Europe/Berlin"), # DST + ], +) +def test_onehedge_uniformprices(w_vals, start, w_expected, how, tz): + """Test hedge with uniform prices but distinct durations.""" + i = pd.date_range(start, freq="MS", periods=len(w_vals), tz=tz) + df = pd.DataFrame({"w": w_vals, "p": 100.0}, i) + df["duration"] = tools.duration.index(i) + + result = tools.hedge.one_hedge(df, how=how) + expected = pd.Series({"w": w_expected, "p": 100.0}) + testing.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("how", ["vol", "val"]) +@pytest.mark.parametrize( + "w_vals,p_vals,start,p_expected,w_expected_vol,w_expected_val,tz", + [ + ( + [1, 2], + [100, 200], + "2020-01-01", + 148.333333333, + 1.4833333, + 1.651685393, + None, + ), # 29 days in Feb + ( + [1, 2], + [100, 200], + "2021-01-01", + 147.4576271, + 1.474576271, + 1.643678161, + None, + ), # 28 days in Feb + ( + np.arange(12), + np.arange(12) * 100, + "2020-01-01", + 551.366120, + 5.51366120, + 7.673934589, + None, + ), # no DST + ( + np.arange(12), + np.arange(12) * 100, + "2020-01-01", + 551.4458106, + 5.514458106, + 7.674415244, + "Europe/Berlin", + ), # DST + ], +) +def test_onehedge( + w_vals, p_vals, start, w_expected_val, w_expected_vol, p_expected, how, tz +): + """Test value hedge.""" + i = pd.date_range(start, freq="MS", periods=len(w_vals), tz=tz) + df = pd.DataFrame({"w": w_vals, "p": p_vals}, i) + df["duration"] = tools.duration.index(i) + + result = tools.hedge.one_hedge(df, how=how) + w_expected = w_expected_val if how == "val" else w_expected_vol + expected = pd.Series({"w": w_expected, "p": p_expected}) + testing.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("withunits", ["units", "nounits"]) +@pytest.mark.parametrize("how", ["vol", "val"]) +@pytest.mark.parametrize("bpo", ["b", "po"]) +@pytest.mark.parametrize("aggfreq", ["MS", "QS", "AS"]) +@pytest.mark.parametrize("freq", ["H", "D"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +def test_hedge_fromexcel(tz, freq, aggfreq, bpo, how, withunits): + """Test if hedge results are correctly calculated, by comparing against previously calculated results.""" + if freq == "D" and bpo == "po": + pytest.skip("Don't decompose in peak and offpeak if daily values") + + path = Path(__file__).parent / "test_hedge_data.xlsx" + sheetname = f'{freq}_{"None" if tz is None else tz.replace("/", "")}' + peak_fn = tools.product.germanpower_peakfn if bpo == "po" else None + + # Input data. + dfin = pd.read_excel(path, sheetname, header=6, index_col=0, usecols="A,B:C") + if tz: + dfin = dfin.tz_localize(tz, ambiguous="infer") + dfin.index.freq = pd.infer_freq(dfin.index) + win, pin = dfin.w, dfin.p + if withunits == "units": + win = win.astype("pint[MW]") + pin = pin.astype("pint[Eur/MWh]") + + # Expected output data. + dfout = pd.read_excel(path, f"{sheetname}_out", header=[3, 4, 5, 6], index_col=0) + if tz: + dfout = dfout.tz_localize(tz, ambiguous="infer") + dfout.index.freq = pd.infer_freq(dfout.index) + w_expected = dfout[aggfreq][bpo == "po"][how]["w"] + p_expected = dfout[aggfreq][bpo == "po"].iloc[:, 0] # price is first column + if withunits == "units": + w_expected = w_expected.astype("pint[MW]") + p_expected = p_expected.astype("pint[Eur/MWh]") + + # Test output data. + w_result, p_result = tools.hedge.hedge(win, pin, how, peak_fn, aggfreq) + + testing.assert_series_equal(p_result, p_expected, check_names=False) + testing.assert_series_equal(w_result, w_expected, check_names=False) diff --git a/tests/prices/test_hedge_data.xlsx b/tests/tools/test_hedge_data.xlsx similarity index 100% rename from tests/prices/test_hedge_data.xlsx rename to tests/tools/test_hedge_data.xlsx diff --git a/tests/tools/test_intersect.py b/tests/tools/test_intersect.py index fbb83f4..4a7c6a6 100644 --- a/tests/tools/test_intersect.py +++ b/tests/tools/test_intersect.py @@ -1,4 +1,4 @@ -from typing import Iterable, List, Union +from typing import Iterable, List import pandas as pd import pytest @@ -45,7 +45,7 @@ def get_idx( def get_frames( idxs: Iterable[pd.DatetimeIndex], ref_idx: pd.DatetimeIndex = None -) -> List[Union[pd.Series, pd.DataFrame]]: +) -> List[pd.Series | pd.DataFrame]: frames = [] for i, idx in enumerate(idxs): # Get data. @@ -154,27 +154,36 @@ def test_intersect_nooverlap(indexorframe: str, tz: str, freq: str, starttime: s get_idx("2020-01-01", starttime, tz, freq, "2022-01-01"), get_idx("2023-01-01", starttime, tz, freq, "2025-01-01"), ] - do_test_intersect(indexorframe, idxs, None, "", tz, freq) + do_test_intersect(indexorframe, idxs, None, "", tz, freq, check_freq=False) def do_test_intersect( indexorframe: str, idxs: Iterable[pd.DatetimeIndex], - expected_startdate: Union[str, Exception], + expected_startdate: str | Exception, expected_starttime: str = None, expected_tz: str = None, expected_freq: str = None, + **kwargs, ): if indexorframe == "idx": - do_test_fn = do_test_intersect_index + do_test_intersect_index( + idxs, expected_startdate, expected_starttime, expected_tz, expected_freq + ) else: - do_test_fn = do_test_intersect_frame - do_test_fn(idxs, expected_startdate, expected_starttime, expected_tz, expected_freq) + do_test_intersect_frame( + idxs, + expected_startdate, + expected_starttime, + expected_tz, + expected_freq, + **kwargs, + ) def do_test_intersect_index( idxs: Iterable[pd.DatetimeIndex], - expected_startdate: Union[str, Exception], + expected_startdate: str | Exception, expected_starttime: str = None, expected_tz: str = None, expected_freq: str = None, @@ -196,21 +205,35 @@ def do_test_intersect_index( def do_test_intersect_frame( idxs: Iterable[pd.DatetimeIndex], - expected_startdate: Union[str, Exception], + expected_startdate: str | Exception, expected_starttime: str = None, expected_tz: str = None, expected_freq: str = None, + ignore_freq: bool = False, + ignore_start_of_day: bool = False, + ignore_tz: bool = False, + **kwargs, ): frames = get_frames(idxs) # Error case. if type(expected_startdate) is type and issubclass(expected_startdate, Exception): with pytest.raises(expected_startdate): - tools.intersect.frames(*frames) + tools.intersect.frames( + *frames, + ignore_start_of_day=ignore_start_of_day, + ignore_tz=ignore_tz, + ignore_freq=ignore_freq, + ) return # Normal case. - result_frames = tools.intersect.frames(*frames) + result_frames = tools.intersect.frames( + *frames, + ignore_freq=ignore_freq, + ignore_start_of_day=ignore_start_of_day, + ignore_tz=ignore_tz, + ) expected_index = get_idx( expected_startdate, expected_starttime, expected_tz, expected_freq ) @@ -218,6 +241,6 @@ def do_test_intersect_frame( for result, expected in zip(result_frames, expected_frames): if isinstance(result, pd.Series): - testing.assert_series_equal(result, expected) + testing.assert_series_equal(result, expected, **kwargs) else: - testing.assert_frame_equal(result, expected) + testing.assert_frame_equal(result, expected, **kwargs) diff --git a/tests/tools/test_intersect_flex.py b/tests/tools/test_intersect_flex.py new file mode 100644 index 0000000..fab118a --- /dev/null +++ b/tests/tools/test_intersect_flex.py @@ -0,0 +1,303 @@ +from typing import Iterable + +import pandas as pd +import pytest + +from portfolyo import testing, tools + +COMMON_END = "2022-02-02" + +TESTCASES = [ # startdates, freq, expected_startdate + # One starts at first day of year. + (("2020-01-01", "2020-01-20"), "15T", "2020-01-20"), + (("2020-01-01", "2020-01-20"), "15T", "2020-01-20"), + (("2020-01-01", "2020-01-20"), "H", "2020-01-20"), + (("2020-01-01", "2020-01-20"), "H", "2020-01-20"), + (("2020-01-01", "2020-01-20"), "D", "2020-01-20"), + (("2020-01-01", "2020-01-20"), "D", "2020-01-20"), + (("2020-01-01", "2020-03-01"), "MS", "2020-03-01"), + (("2020-01-01", "2020-03-01"), "MS", "2020-03-01"), + (("2020-01-01", "2020-04-01"), "QS", "2020-04-01"), + (("2020-01-01", "2020-04-01"), "QS", "2020-04-01"), + (("2020-01-01", "2021-01-01"), "AS", "2021-01-01"), + (("2020-01-01", "2021-01-01"), "AS", "2021-01-01"), + # Both start in middle of year. + (("2020-04-21", "2020-06-20"), "15T", "2020-06-20"), + (("2020-04-21", "2020-06-20"), "15T", "2020-06-20"), + (("2020-04-21", "2020-06-20"), "H", "2020-06-20"), + (("2020-04-21", "2020-06-20"), "H", "2020-06-20"), + (("2020-04-21", "2020-06-20"), "D", "2020-06-20"), + (("2020-04-21", "2020-06-20"), "D", "2020-06-20"), +] + +COMMON_END_2 = "2023-01-01" +TESTCASES_2 = [ # startdates, freq, expected_dates + # One starts at first day of year. + (("2020-01-01", "2020-01-20"), ("15T", "H"), "2020-01-20"), + (("2020-01-01", "2020-01-20"), ("15T", "D"), "2020-01-20"), + (("2022-04-01", "2021-02-01"), ("H", "MS"), "2022-04-01"), + (("2020-01-01", "2020-04-01"), ("H", "QS"), "2020-04-01"), + (("2020-01-01", "2021-01-01"), ("D", "AS"), "2021-01-01"), + # Both start in middle of year. + (("2020-04-21", "2020-06-20"), ("15T", "H"), "2020-06-20"), + (("2020-04-21", "2020-06-20"), ("15T", "D"), "2020-06-20"), + (("2020-04-21", "2020-07-01"), ("H", "MS"), "2020-07-01"), + (("2020-04-21", "2020-07-01"), ("H", "QS"), "2020-07-01"), + (("2020-04-21", "2021-01-01"), ("D", "AS"), "2021-01-01"), +] + + +def get_idx( + startdate: str, + starttime: str, + tz: str, + freq: str, + enddate: str, +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize(("startdates", "freq", "expected_startdate"), TESTCASES) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +# @pytest.mark.parametrize("indexorframe", ["idx", "fr"]) +def test_intersect_flex_ignore_start_of_day( + # indexorframe: str, + startdates: Iterable[str], + starttime: str, + tz: str, + freq: str, + expected_startdate: str, +): + otherstarttime = "00:00" if starttime == "06:00" else "06:00" + idxs = [ + get_idx( + startdates[0], + starttime, + tz, + freq, + COMMON_END, + ), + get_idx( + startdates[1], + otherstarttime, + tz, + freq, + COMMON_END, + ), + ] + do_test_intersect( + "idx", + idxs, + ValueError if freq == "15T" or freq == "H" else expected_startdate, + expected_tz=tz, + expected_freq=freq, + expected_starttime=starttime, + expected_otherstarttime=otherstarttime, + expected_othertz=tz, + expected_otherfreq=freq, + enddate=COMMON_END, + ignore_start_of_day=True, + ) + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("startdates", "freq", "expected_startdate"), TESTCASES) +# @pytest.mark.parametrize("indexorframe", ["idx", "fr"]) +def test_intersect_flex_ignore_tz( + # indexorframe: str, + startdates: Iterable[str], + starttime: str, + tz: str, + freq: str, + expected_startdate: str, +): + othertz = None if tz == "Europe/Berlin" else "Europe/Berlin" + idxs = [ + get_idx(startdates[0], starttime, tz, freq, COMMON_END), + get_idx(startdates[1], starttime, othertz, freq, COMMON_END), + ] + do_test_intersect( + "idx", + idxs, + expected_startdate, + expected_tz=tz, + expected_freq=freq, + expected_starttime=starttime, + expected_otherstarttime=starttime, + expected_othertz=othertz, + expected_otherfreq=freq, + enddate=COMMON_END, + ignore_tz=True, + ) + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize(("startdates", "freq", "expected_startdate"), TESTCASES_2) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +def test_intersect_flex_ignore_freq( + # indexorframe: str, + startdates: Iterable[str], + starttime: str, + tz: str, + freq: Iterable[str], + expected_startdate: str, +): + """Test if intersection of indices with distinct frequencies gives correct result.""" + + idxs = [ + get_idx(startdates[0], starttime, tz, freq[0], COMMON_END_2), + get_idx(startdates[1], starttime, tz, freq[1], COMMON_END_2), + ] + do_test_intersect( + "idx", + idxs, + expected_startdate, + expected_tz=tz, + expected_freq=freq[0], + expected_starttime=starttime, + expected_otherstarttime=starttime, + expected_othertz=tz, + expected_otherfreq=freq[1], + enddate=COMMON_END_2, + ignore_freq=True, + ) + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize(("startdates", "freq", "expected_startdate"), TESTCASES_2) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +def test_ignore_all( # indexorframe: str, + startdates: Iterable[str], + starttime: str, + tz: str, + freq: Iterable[str], + expected_startdate: str, +): + otherstarttime = "00:00" if starttime == "06:00" else "06:00" + othertz = None if tz == "Europe/Berlin" else "Europe/Berlin" + idxs = [ + get_idx(startdates[0], starttime, tz, freq[0], COMMON_END_2), + get_idx(startdates[1], otherstarttime, othertz, freq[1], COMMON_END_2), + ] + do_test_intersect( + "idx", + idxs, + ( + ValueError + if freq[0] == "15T" or freq[0] == "H" or freq[1] == "15T" or freq[1] == "H" + else expected_startdate + ), + expected_tz=tz, + expected_freq=freq[0], + expected_starttime=starttime, + expected_otherstarttime=otherstarttime, + expected_othertz=othertz, + expected_otherfreq=freq[1], + enddate=COMMON_END_2, + ignore_freq=True, + ignore_start_of_day=True, + ignore_tz=True, + ) + + +def do_test_intersect( + indexorframe: str, + idxs: Iterable[pd.DatetimeIndex], + expected_startdate: str | Exception, + expected_starttime: str = None, + expected_tz: str = None, + expected_freq: str = None, + expected_otherstarttime: str = None, + expected_othertz: str = None, + expected_otherfreq: str = None, + enddate: str = None, + ignore_start_of_day: bool = False, + ignore_tz: bool = False, + ignore_freq: bool = False, +): + if indexorframe == "idx": + do_test_intersect_index( + idxs, + expected_startdate, + expected_starttime, + expected_tz, + expected_freq, + expected_otherstarttime, + expected_othertz, + expected_otherfreq, + enddate, + ignore_start_of_day, + ignore_tz, + ignore_freq, + ) + + +def do_test_intersect_index( + idxs: Iterable[pd.DatetimeIndex], + expected_startdate: str | Exception, + expected_starttime: str = None, + expected_tz: str = None, + expected_freq: str = None, + expected_otherstarttime: str = None, + expected_othertz: str = None, + expected_otherfreq: str = None, + enddate: str = None, + ignore_start_of_day: bool = False, + ignore_tz: bool = False, + ignore_freq: bool = False, +): + # Error case. + if isinstance(expected_startdate, type) and issubclass( + expected_startdate, Exception + ): + with pytest.raises(expected_startdate): + tools.intersect.indices_flex( + *idxs, + ignore_start_of_day=False, + ignore_tz=False, + ignore_freq=ignore_freq, + ) + return + # Normal case. + out_a, out_b = tools.intersect.indices_flex( + *idxs, + ignore_start_of_day=ignore_start_of_day, + ignore_tz=ignore_tz, + ignore_freq=ignore_freq, + ) + expected_a = get_idx( + expected_startdate, + expected_starttime, + expected_tz, + expected_freq, + enddate, + ) + expected_b = get_idx( + expected_startdate, + expected_otherstarttime, + expected_othertz, + expected_otherfreq, + enddate, + ) + testing.assert_index_equal(out_a, expected_a) + testing.assert_index_equal(out_b, expected_b) + + +def test_intersect_flex_dst(): + """Test if intersection keeps working if DST-boundary is right at end.""" + i1 = pd.date_range("2020", "2020-03-29", freq="D", tz="Europe/Berlin") + i2 = pd.date_range("2020", "2020-03-30", freq="D", tz="Europe/Berlin") + + expected = pd.date_range("2020", "2020-03-29", freq="D", tz="Europe/Berlin") + + result1, result2 = tools.intersect.indices_flex(i1, i2) + testing.assert_index_equal(result1, expected) + testing.assert_index_equal(result2, expected) diff --git a/tests/tools/test_intersect_flex_frame.py b/tests/tools/test_intersect_flex_frame.py new file mode 100644 index 0000000..5c42b05 --- /dev/null +++ b/tests/tools/test_intersect_flex_frame.py @@ -0,0 +1,175 @@ +import pandas as pd +import pytest + +from portfolyo import testing, tools + + +@pytest.mark.parametrize("types", ["series", "df"]) +@pytest.mark.parametrize("ignore_tz", [True, False]) +def test_frames_ignore_tz(types: str, ignore_tz: bool): + idx_a = pd.date_range( + "2020", "2022", freq="MS", inclusive="left", tz="Europe/Berlin" + ) + a = pd.Series(range(0, 24), idx_a) + + idx_b = pd.date_range("2020-02", "2021-09", freq="MS", inclusive="left") + b = pd.Series(range(0, 19), idx_b) + + exp_idx_a = pd.date_range( + "2020-02", "2021-09", freq="MS", inclusive="left", tz="Europe/Berlin" + ) + exp_idx_b = idx_b + exp_a = pd.Series(range(1, 20), exp_idx_a) + exp_b = pd.Series(range(0, 19), exp_idx_b) + + if types == "series": + if not ignore_tz: + with pytest.raises(ValueError): + _ = tools.intersect.frames(a, b, ignore_tz=ignore_tz) + return + result_a, result_b = tools.intersect.frames(a, b, ignore_tz=ignore_tz) + testing.assert_series_equal(result_a, exp_a) + testing.assert_series_equal(result_b, exp_b) + else: + a, b = pd.DataFrame({"col_a": a}), pd.DataFrame({"col_b": b}) + if not ignore_tz: + with pytest.raises(ValueError): + _ = tools.intersect.frames(a, b, ignore_tz=ignore_tz) + return + exp_a, exp_b = pd.DataFrame({"col_a": exp_a}), pd.DataFrame({"col_b": exp_b}) + result_a, result_b = tools.intersect.frames(a, b, ignore_tz=ignore_tz) + testing.assert_frame_equal(result_a, exp_a) + testing.assert_frame_equal(result_b, exp_b) + + +@pytest.mark.parametrize("types", ["series", "df"]) +@pytest.mark.parametrize("ignore_start_of_day", [True, False]) +def test_frames_ignore_start_of_day(types: str, ignore_start_of_day: bool): + idx_a = pd.date_range("2020 00:00", "2022 00:00", freq="MS", inclusive="left") + a = pd.Series(range(0, 24), idx_a) + + idx_b = pd.date_range("2020-02 06:00", "2021-09 06:00", freq="MS", inclusive="left") + b = pd.Series(range(0, 19), idx_b) + + exp_idx_a = pd.date_range( + "2020-02 00:00", "2021-09 00:00", freq="MS", inclusive="left" + ) + exp_idx_b = idx_b + exp_a = pd.Series(range(1, 20), exp_idx_a) + exp_b = pd.Series(range(0, 19), exp_idx_b) + if types == "series": + if not ignore_start_of_day: + with pytest.raises(ValueError): + _ = tools.intersect.frames( + a, b, ignore_start_of_day=ignore_start_of_day + ) + return + result_a, result_b = tools.intersect.frames( + a, b, ignore_start_of_day=ignore_start_of_day + ) + testing.assert_series_equal(result_a, exp_a) + testing.assert_series_equal(result_b, exp_b) + else: + a, b = pd.DataFrame({"col_a": a}), pd.DataFrame({"col_b": b}) + if not ignore_start_of_day: + with pytest.raises(ValueError): + _ = tools.intersect.frames( + a, b, ignore_start_of_day=ignore_start_of_day + ) + return + exp_a, exp_b = pd.DataFrame({"col_a": exp_a}), pd.DataFrame({"col_b": exp_b}) + result_a, result_b = tools.intersect.frames( + a, b, ignore_start_of_day=ignore_start_of_day + ) + testing.assert_frame_equal(result_a, exp_a) + testing.assert_frame_equal(result_b, exp_b) + + +@pytest.mark.parametrize("types", ["series", "df"]) +@pytest.mark.parametrize("ignore_freq", [True, False]) +def test_frames_ignore_freq(types: str, ignore_freq: bool): + idx_a = pd.date_range("2022-04-01", "2024-07-01", freq="QS", inclusive="left") + a = pd.Series(range(0, 9), idx_a) + + idx_b = pd.date_range("2021-01-01", "2024-01-01", freq="AS", inclusive="left") + b = pd.Series(range(0, 3), idx_b) + + exp_idx_a = pd.date_range("2023-01-01", "2024-01-01", freq="QS", inclusive="left") + exp_idx_b = pd.date_range("2023-01-01", "2024-01-01", freq="AS", inclusive="left") + exp_a = pd.Series(range(3, 7), exp_idx_a) + exp_b = pd.Series(range(2, 3), exp_idx_b) + if types == "series": + if not ignore_freq: + with pytest.raises(ValueError): + _ = tools.intersect.frames(a, b, ignore_freq=ignore_freq) + return + result_a, result_b = tools.intersect.frames(a, b, ignore_freq=ignore_freq) + testing.assert_series_equal(result_a, exp_a) + testing.assert_series_equal(result_b, exp_b) + else: + a, b = pd.DataFrame({"col_a": a}), pd.DataFrame({"col_b": b}) + if not ignore_freq: + with pytest.raises(ValueError): + _ = tools.intersect.frames(a, b, ignore_freq=ignore_freq) + return + exp_a, exp_b = pd.DataFrame({"col_a": exp_a}), pd.DataFrame({"col_b": exp_b}) + result_a, result_b = tools.intersect.frames(a, b, ignore_freq=ignore_freq) + testing.assert_frame_equal(result_a, exp_a) + testing.assert_frame_equal(result_b, exp_b) + + +@pytest.mark.parametrize("types", ["series", "df"]) +@pytest.mark.parametrize("ignore_all", [True, False]) +def test_frames_ignore_all(types: str, ignore_all: bool): + idx_a = pd.date_range( + "2022-04-01 00:00", + "2024-07-01 00:00", + freq="QS", + tz="Europe/Berlin", + inclusive="left", + ) + a = pd.Series(range(0, 9), idx_a) + + idx_b = pd.date_range( + "2021-01-01 06:00", "2024-01-01 06:00", freq="AS", inclusive="left" + ) + b = pd.Series(range(0, 3), idx_b) + + exp_idx_a = pd.date_range( + "2023-01-01 00:00", + "2024-01-01 00:00", + freq="QS", + tz="Europe/Berlin", + inclusive="left", + ) + exp_idx_b = pd.date_range( + "2023-01-01 06:00", "2024-01-01 06:00", freq="AS", inclusive="left" + ) + exp_a = pd.Series(range(3, 7), exp_idx_a) + exp_b = pd.Series(range(2, 3), exp_idx_b) + if types == "series": + if not ignore_all: + with pytest.raises(ValueError): + _ = tools.intersect.frames( + a, b, ignore_freq=False, ignore_start_of_day=False, ignore_tz=False + ) + return + result_a, result_b = tools.intersect.frames( + a, b, ignore_freq=True, ignore_start_of_day=True, ignore_tz=True + ) + testing.assert_series_equal(result_a, exp_a) + testing.assert_series_equal(result_b, exp_b) + else: + a, b = pd.DataFrame({"col_a": a}), pd.DataFrame({"col_b": b}) + if not ignore_all: + with pytest.raises(ValueError): + _ = tools.intersect.frames( + a, b, ignore_freq=False, ignore_start_of_day=False, ignore_tz=False + ) + return + exp_a, exp_b = pd.DataFrame({"col_a": exp_a}), pd.DataFrame({"col_b": exp_b}) + result_a, result_b = tools.intersect.frames( + a, b, ignore_freq=True, ignore_start_of_day=True, ignore_tz=True + ) + testing.assert_frame_equal(result_a, exp_a) + testing.assert_frame_equal(result_b, exp_b) diff --git a/tests/tools/test_isboundary.py b/tests/tools/test_isboundary.py index c75dd90..ce1f505 100644 --- a/tests/tools/test_isboundary.py +++ b/tests/tools/test_isboundary.py @@ -1,5 +1,5 @@ import datetime as dt -from typing import Iterable, Union +from typing import Iterable import pandas as pd import pytest @@ -257,7 +257,7 @@ def test_isboundary_index( periods: int, tz: str, freq: str, - expected_repeat: Union[int, Iterable[int]], + expected_repeat: int | Iterable[int], ): """Test if boundary timestamps are correctly identified in index.""" ts = f"{date} {start_time}" @@ -272,7 +272,7 @@ def test_isboundary_index_dst( i_freq: str, periods: int, freq: str, - expected_repeat: Union[int, Iterable[int]], + expected_repeat: int | Iterable[int], ): """Test if boundary timestamps are correctly identified in index during dst-transition.""" do_test_index(ts, i_freq, periods, "Europe/Berlin", freq, expected_repeat, 0) @@ -288,7 +288,7 @@ def test_isboundary_index_midyear( i_freq: str, periods: int, freq: str, - expected_repeat: Union[int, Iterable[int]], + expected_repeat: int | Iterable[int], ): """Test if boundary timestamps are correctly identified in index when we don't start at beginning of year.""" ts = f"{date} {start_time}" @@ -308,7 +308,7 @@ def test_isboundary_index_leadingzero( periods: int, tz: str, freq: str, - expected_repeat: Union[int, Iterable[int]], + expected_repeat: int | Iterable[int], leading_zeros: int, ): """Test if boundary timestamps are correctly identified in index when we first have some zeros.""" diff --git a/tests/tools/test_peakconvert.py b/tests/tools/test_peakconvert.py new file mode 100644 index 0000000..0b7eff9 --- /dev/null +++ b/tests/tools/test_peakconvert.py @@ -0,0 +1,119 @@ +import datetime as dt + +import pandas as pd +import pytest + +from portfolyo import tools + +f_germanpower = tools.peakfn.factory(dt.time(hour=8), dt.time(hour=20)) + + +@pytest.mark.parametrize("withunits", ["units", "nounits"]) +@pytest.mark.parametrize("testcol", ["base", "peak", "offpeak"]) +@pytest.mark.parametrize( + "bpoframe", + [ + pd.DataFrame( + { + "peak": [100.0, 100, 100, 100], + "base": [80.0, 80, 80, 80], + "offpeak": [68.2051282, 69.4736842, 68.9770355, 68.421053], + }, + pd.date_range("2020", periods=4, freq="MS", tz="Europe/Berlin"), + ), + pd.DataFrame( + { + "peak": [100.0, 100, 100, 100], + "base": [80.0, 80, 80, 80], + "offpeak": [68.8510638, 68.8699360, 68.9361702, 68.9361702], + }, + pd.date_range("2020", periods=4, freq="AS", tz="Europe/Berlin"), + ), + ], +) +def test_completebpoframe_averagable(bpoframe, testcol: str, withunits: str): + """Test if missing column can be reconstructed.""" + if withunits == "units": + bpoframe = bpoframe.astype("pint[Eur/MWh]") + df = bpoframe.drop(columns=testcol) + result = tools.peakconvert.complete_bpoframe(df, f_germanpower, is_summable=False) + tools.testing.assert_frame_equal(result, bpoframe) + + +@pytest.mark.parametrize("withunits", ["units", "nounits"]) +@pytest.mark.parametrize("testcol", ["base", "peak", "offpeak"]) +@pytest.mark.parametrize( + "bpoframe", + [ + pd.DataFrame( + { + "peak": [100.0, 100, 100, 100], + "base": [280.0, 180, 80, 380], + "offpeak": [180, 80, -20, 280], + }, + pd.date_range("2020", periods=4, freq="MS", tz="Europe/Berlin"), + ), + pd.DataFrame( + { + "peak": [100.0, 100, 100, 100], + "base": [280.0, 180, 80, 380], + "offpeak": [180, 80, -20, 280], + }, + pd.date_range("2020", periods=4, freq="AS", tz="Europe/Berlin"), + ), + ], +) +def test_completebpoframe_summable(bpoframe, testcol: str, withunits: str): + """Test if missing column can be reconstructed.""" + if withunits == "units": + bpoframe = bpoframe.astype("pint[Eur/MWh]") + df = bpoframe.drop(columns=testcol) + result = tools.peakconvert.complete_bpoframe(df, f_germanpower, is_summable=True) + tools.testing.assert_frame_equal(result, bpoframe) + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("withunits", ["units", "nounits"]) +@pytest.mark.parametrize("testcol", ["base", "peak", "offpeak"]) +@pytest.mark.parametrize( + ("b", "p", "o", "o_EuropeBerlin", "ts_left", "freq"), + [ + (100, 100, 100, None, "2020-01-01", "MS"), # 31 days, 23 working days + (100, 200, 41.02564103, None, "2020-01-01", "MS"), + (100, 300, -17.94871795, None, "2020-01-01", "MS"), + (100, 100, 100, None, "2020-01-01", "QS"), # 91 days, 65 working days + (100, 200, 44.44444444, 44.40484676, "2020-01-01", "QS"), + (100, 300, -11.11111111, -11.19030649, "2020-01-01", "QS"), + (100, 100, 100, None, "2020-01-01", "D"), # weekday + (100, 200, 0, None, "2020-01-01", "D"), # weekday + (100, 300, -100, None, "2020-01-01", "D"), # weekday + ], +) +def test_moreconversions_averagable( + b: float, + p: float, + o: float, + ts_left: str, + freq: str, + withunits: str, + tz: str, + o_EuropeBerlin: float, + testcol: str, +): + """Test if base, peak and offpeak values can be calculated from single values.""" + # Handle timezone. + i = pd.date_range(ts_left, freq=freq, tz=tz, periods=1) + if tz is not None and o_EuropeBerlin is not None: + o = o_EuropeBerlin + + expected = pd.DataFrame({"peak": [p], "base": [b], "offpeak": [o]}, i).astype(float) + + # Handle units. + if withunits == "units": + expected = expected.astype("pint[MW]") + + df = expected.drop(columns=testcol) + + # Do testing. + result = tools.peakconvert.complete_bpoframe(df, f_germanpower, is_summable=False) + tools.testing.assert_frame_equal(result, expected) diff --git a/tests/tools/test_peakperiod.py b/tests/tools/test_peakfn.py similarity index 54% rename from tests/tools/test_peakperiod.py rename to tests/tools/test_peakfn.py index 4aa4066..df8a9e4 100644 --- a/tests/tools/test_peakperiod.py +++ b/tests/tools/test_peakfn.py @@ -15,7 +15,7 @@ def index(start: str, end: str, freq: str, tz: str) -> pd.DatetimeIndex: return pd.date_range(start, end, freq=freq, inclusive="left", tz=tz) -f_germanpower = tools.peakperiod.factory(dt.time(hour=8), dt.time(hour=20)) +f_germanpower = tools.peakfn.factory(dt.time(hour=8), dt.time(hour=20)) TESTCASES_GERMANPOWER = [ # end, freq, count, stretch ("2020-01-08", "15T", 5 * 12 * 4, (32, 79)), ("2020-01-08", "H", 5 * 12, (8, 19)), @@ -29,7 +29,7 @@ def index(start: str, end: str, freq: str, tz: str) -> pd.DatetimeIndex: ("2021", "AS", ValueError, None), ] -f_everyday_13half = tools.peakperiod.factory( +f_everyday_13half = tools.peakfn.factory( dt.time(hour=8), dt.time(hour=21, minute=30), [1, 2, 3, 4, 5, 6, 7] ) TESTCASES_13HALF = [ # end, freq, count, stretch @@ -43,7 +43,7 @@ def index(start: str, end: str, freq: str, tz: str) -> pd.DatetimeIndex: ("2021", "AS", ValueError, None), ] -f_workingdays_full = tools.peakperiod.factory(None, None, [1, 2, 3, 4, 5]) +f_workingdays_full = tools.peakfn.factory(None, None, [1, 2, 3, 4, 5]) TESTCASES_WORKINGDAYS = [ # end, freq, count, stretch ("2020-01-08", "15T", 5 * 24 * 4, (0, 72 * 4 - 1)), ("2020-01-08", "H", 5 * 24, (0, 72 - 1)), @@ -59,9 +59,7 @@ def index(start: str, end: str, freq: str, tz: str) -> pd.DatetimeIndex: ("2021", "AS", ValueError, None), ] -f_everyday_until6 = tools.peakperiod.factory( - None, dt.time(hour=6), [1, 2, 3, 4, 5, 6, 7] -) +f_everyday_until6 = tools.peakfn.factory(None, dt.time(hour=6), [1, 2, 3, 4, 5, 6, 7]) TESTCASES_EVERYDAY6 = [ # month, freq, tz, count, stretch (1, "15T", None, 31 * 6 * 4, (24 * 4, 30 * 4 - 1)), (1, "15T", "Europe/Berlin", 31 * 6 * 4, (24 * 4, 30 * 4 - 1)), @@ -111,14 +109,14 @@ def test_functioncreation( """Test if an error is raised when creating impossible functions.""" if type(expected) is type and issubclass(expected, Exception): with pytest.raises(expected): - tools.peakperiod.factory(peak_left, peak_right, isoweekdays) + tools.peakfn.factory(peak_left, peak_right, isoweekdays) else: - tools.peakperiod.factory(peak_left, peak_right, isoweekdays) + tools.peakfn.factory(peak_left, peak_right, isoweekdays) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize(("end", "freq", "count", "stretch"), TESTCASES_GERMANPOWER) -def test_peakperiod_germanpower( +def test_peakfn_germanpower( end: str, freq: str, tz: str, count: int, stretch: Iterable[int] ): """Test if the peak periods are correctly calculated.""" @@ -129,7 +127,7 @@ def test_peakperiod_germanpower( @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize(("end", "freq", "count", "stretch"), TESTCASES_13HALF) -def test_peakperiod_everyday13half( +def test_peakfn_everyday13half( end: str, freq: str, tz: str, count: int, stretch: Iterable[int] ): """Test if the peak periods are correctly calculated.""" @@ -140,7 +138,7 @@ def test_peakperiod_everyday13half( @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize(("end", "freq", "count", "stretch"), TESTCASES_WORKINGDAYS) -def test_peakperiod_workingdaysfull( +def test_peakfn_workingdaysfull( end: str, freq: str, tz: str, count: int, stretch: Iterable[int] ): """Test if the peak periods are correctly calculated.""" @@ -152,7 +150,7 @@ def test_peakperiod_workingdaysfull( @pytest.mark.parametrize( ("month", "freq", "tz", "count", "stretch"), TESTCASES_EVERYDAY6 ) -def test_peakperiod_everydayuntil6( +def test_peakfn_everydayuntil6( month: int, tz: str, freq: str, count: int, stretch: Iterable[int] ): """Test if the peak periods are correctly calculated.""" @@ -162,7 +160,7 @@ def test_peakperiod_everydayuntil6( def do_test( i: pd.DatetimeIndex, - f: tools.peakperiod.PeakFunction, + f: tools.peakfn.PeakFunction, count: int, stretch: Iterable[int] = None, ): @@ -182,3 +180,148 @@ def do_test( assert not peak.iloc[first - 1] if last != -1: assert not peak.iloc[last + 1] + + +@pytest.mark.parametrize(("tz", "mar_b_corr"), [(None, 0), ("Europe/Berlin", -1)]) +@pytest.mark.parametrize("month", [1, 2, 3]) +@pytest.mark.parametrize("freq", ["D", "MS", "QS", "AS"]) +@pytest.mark.parametrize( + ("year", "bp", "jan_1_weekday", "jan_p", "feb_p", "mar_p"), + [ + (2020, (366, 262), True, 23, 20, 22), + (2021, (365, 261), True, 21, 20, 23), + (2022, (365, 260), False, 21, 20, 23), + ], +) +def test_peakduration_longfreqs( + year, bp, jan_1_weekday, jan_p, feb_p, mar_p, tz, mar_b_corr, freq, month +): + """Test if the correct number of base, peak and offpeak hours are calculated. + bp = tuple with number of base days and days with peak hours; jan_p, feb_p, mar_p = + number of days with peak hours in each month; mar_b_corr = correction to number of + base HOURS.""" + + if month > 1 and freq != "MS": + pytest.skip("Feb and Mar are only checked on month-level here.") + + start = pd.Timestamp(f"{year}-{month}", tz=tz) + i = pd.date_range(start, freq=freq, periods=1) + + # Expected values. + if freq == "AS": + b = 24 * bp[0] + p = 12 * bp[1] + elif freq == "QS": + b = 24 * (31 + 28 + 31 + (bp[0] - 365)) + mar_b_corr + p = 12 * (jan_p + feb_p + mar_p) + elif freq == "MS": + if month == 1: + b = 24 * 31 + p = 12 * jan_p + elif month == 2: + b = 24 * (28 + (bp[0] - 365)) + p = 12 * feb_p + else: # month == 3: + b = 24 * 31 + mar_b_corr + p = 12 * mar_p + else: # freq == 'D' + b = 24 + p = 12 * jan_1_weekday + expected_b = pd.Series([float(b)], i, dtype="pint[h]", name="duration") + expected_p = pd.Series([float(p)], i, dtype="pint[h]", name="duration") + expected_o = expected_b - expected_p + + result_b = tools.duration.index(i) + result_p = tools.peakfn.peak_duration(i, f_germanpower) + result_o = tools.peakfn.offpeak_duration(i, f_germanpower) + + # Test values. + tools.testing.assert_series_equal(expected_b, result_b) + tools.testing.assert_series_equal(expected_p, result_p) + tools.testing.assert_series_equal(expected_o, result_o) + + +@pytest.mark.parametrize( + "i,duration,peakduration", + [ + # Quarters + ( + pd.date_range("2020", freq="QS", periods=2, tz=None), + [(31 + 29 + 31) * 24, (30 + 31 + 30) * 24], + [(23 + 20 + 22) * 12, (22 + 21 + 22) * 12], + ), + ( + pd.date_range("2020", freq="QS", periods=2, tz="Europe/Berlin"), + [(31 + 29 + 31) * 24 - 1, (30 + 31 + 30) * 24], + [(23 + 20 + 22) * 12, (22 + 21 + 22) * 12], + ), + # Months + ( + pd.date_range("2020", freq="MS", periods=3, tz=None), + [31 * 24, 29 * 24, 31 * 24], + [23 * 12, 20 * 12, 22 * 12], + ), + ( + pd.date_range("2020", freq="MS", periods=3, tz="Europe/Berlin"), + [31 * 24, 29 * 24, 31 * 24 - 1], + [23 * 12, 20 * 12, 22 * 12], + ), + # Days + ( + pd.date_range("2020", freq="D", periods=7, tz=None), + [24] * 7, + [12, 12, 12, 0, 0, 12, 12], + ), + # . End-of-March: DST (if observed in tz) + ( + pd.date_range("2020-03-25", freq="D", periods=7, tz=None), + [24, 24, 24, 24, 24, 24, 24], + [12, 12, 12, 0, 0, 12, 12], + ), + ( + pd.date_range("2020-03-25", freq="D", periods=7, tz="Europe/Berlin"), + [24, 24, 24, 24, 23, 24, 24], + [12, 12, 12, 0, 0, 12, 12], + ), + # Hours + ( + pd.date_range("2020", freq="H", periods=48, tz=None), + [1] * 48, + [*[0] * 8, *[1] * 12, *[0] * 12, *[1] * 12, *[0] * 4], + ), + # . End-of-March: DST (if observed in tz) + ( + pd.date_range("2020-03-29", freq="H", periods=48, tz=None), + [1] * 48, + [*[0] * 32, *[1] * 12, *[0] * 4], + ), + ( + pd.date_range("2020-03-29", freq="H", periods=47, tz="Europe/Berlin"), + [1] * 47, + [*[0] * 31, *[1] * 12, *[0] * 4], + ), + # Quarterhours + ( + pd.date_range("2020", freq="15T", periods=192, tz=None), + [0.25] * 192, + [*[0] * 32, *[0.25] * 48, *[0] * 48, *[0.25] * 48, *[0] * 16], + ), + ], +) +@pytest.mark.parametrize("what", ["base", "peak", "offpeak"]) +def test_peakduration_allfreqs( + i: pd.DatetimeIndex, duration: Iterable, peakduration: Iterable, what: str +): + """Test if peak duration is correctly calculated for all frequencies.""" + if what == "duration": + values = duration + result = tools.duration.index(i) + elif what == "peak": + values = peakduration + result = tools.peakfn.peak_duration(i, f_germanpower) + else: # 'offpeak' + values = (b - p for b, p in zip(duration, peakduration)) + result = tools.peakfn.offpeak_duration(i, f_germanpower) + + expected = pd.Series(values, i, dtype=float).astype("pint[h]").rename("duration") + tools.testing.assert_series_equal(result, expected) diff --git a/tests/prices/test_utils.py b/tests/tools/test_product.py similarity index 54% rename from tests/prices/test_utils.py rename to tests/tools/test_product.py index 866b888..aabaa15 100644 --- a/tests/prices/test_utils.py +++ b/tests/tools/test_product.py @@ -4,99 +4,6 @@ import pytest from portfolyo import tools -from portfolyo.prices import utils - -# TODO: where are the hedge and conversion tests?? --> check git history - -TESTCASES_ISPEAK = [ # ts, ispeak - ("2020-01-01 01:00", False), - ("2020-01-01 07:00", False), - ("2020-01-01 08:00", True), - ("2020-01-01 19:00", True), - ("2020-01-01 20:00", False), - ("2020-01-03 07:45", False), - ("2020-01-03 08:00", True), - ("2020-01-03 19:45", True), - ("2020-01-03 20:00", False), - ("2020-01-04 07:45", False), - ("2020-01-04 08:00", False), - ("2020-01-04 19:45", False), - ("2020-01-04 20:00", False), - ("2020-01-05 07:45", False), - ("2020-01-05 08:00", False), - ("2020-01-05 19:45", False), - ("2020-01-05 20:00", False), - ("2020-03-29 01:00", False), - ("2020-03-29 03:00", False), - ("2020-10-25 01:00", False), - ("2020-10-25 03:00", False), -] - - -@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -@pytest.mark.parametrize(("ts", "ispeak"), TESTCASES_ISPEAK) -def test_is_peak_hour(ts, tz, ispeak): - """Test if individual timestamps are correctly identified as laying inside the peak - hour periods.""" - ts = pd.Timestamp(ts, tz=tz) - assert utils.is_peak_hour(ts) == ispeak - - -@pytest.mark.parametrize(("tz", "mar_b_corr"), [(None, 0), ("Europe/Berlin", -1)]) -@pytest.mark.parametrize("month", [1, 2, 3]) -@pytest.mark.parametrize("freq", ["D", "MS", "QS", "AS"]) -@pytest.mark.parametrize( - ("year", "bp", "jan_1_weekday", "jan_p", "feb_p", "mar_p"), - [ - (2020, (366, 262), True, 23, 20, 22), - (2021, (365, 261), True, 21, 20, 23), - (2022, (365, 260), False, 21, 20, 23), - ], -) -def test_duration( - year, bp, jan_1_weekday, jan_p, feb_p, mar_p, tz, mar_b_corr, freq, month -): - """Test if the correct number of base, peak and offpeak hours are calculated. - bp = tuple with number of base days and days with peak hours; jan_p, feb_p, mar_p = - number of days with peak hours in each month; mar_b_corr = correction to number of - base HOURS.""" - - if tz is None: - return # TODO: make sure the duration_base, duration_peak etc functions accept timezone-agnostic data - - if month > 1 and freq != "MS": - return - - start = pd.Timestamp(f"{year}-{month}", tz=tz) - - # Expected values. - if freq == "AS": - b = 24 * bp[0] - p = 12 * bp[1] - elif freq == "QS": - b = 24 * (31 + 28 + 31 + (bp[0] - 365)) + mar_b_corr - p = 12 * (jan_p + feb_p + mar_p) - elif freq == "MS": - if month == 1: - b = 24 * 31 - p = 12 * jan_p - elif month == 2: - b = 24 * (28 + (bp[0] - 365)) - p = 12 * feb_p - else: # month == 3: - b = 24 * 31 + mar_b_corr - p = 12 * mar_p - else: # freq == 'D' - b = 24 - p = 12 * jan_1_weekday - b = tools.unit.Q_(b, "hours") - p = tools.unit.Q_(p, "hours") - o = b - p - - # Test values. - assert b == utils.duration_base(start, freq) - assert p == utils.duration_peak(start, freq) - assert o == utils.duration_offpeak(start, freq) @pytest.mark.parametrize( @@ -183,7 +90,9 @@ def test_deliveryperiod( else: start_of_day = dt.time(hour=0) expected_left = pd.Timestamp(f"{expected_left} {starttime}", tz=tz) - ts_deliv = utils.delivery_period(ts_trade, period_type, period_start, start_of_day) + ts_deliv = tools.product.delivery_period( + ts_trade, period_type, period_start, start_of_day + ) assert ts_deliv[0] == expected_left try: add = {"m": 1, "q": 3, "s": 6, "a": 12}[period_type] diff --git a/tests/tools/test_right.py b/tests/tools/test_right.py index 15271c2..b4db911 100644 --- a/tests/tools/test_right.py +++ b/tests/tools/test_right.py @@ -41,35 +41,35 @@ ("2020-04-21 06:00", "D", "2020-04-22 06:00"), ] -TESTCASES_DST = [ # ts, freq, expected_ts_right +TESTCASES_DST = [ # ts, freq, expected_ts_right, periods # Start of DST. - ("2020-03-29 01:00", "15T", "2020-03-29 01:15"), - ("2020-03-29 01:00", "H", "2020-03-29 03:00"), - ("2020-03-29 00:00", "D", "2020-03-30 00:00"), - ("2020-03-29 01:00", "D", "2020-03-30 01:00"), - ("2020-03-29 03:00", "D", "2020-03-30 03:00"), - ("2020-03-29 06:00", "D", "2020-03-30 06:00"), - ("2020-03-01 00:00", "MS", "2020-04-01 00:00"), - ("2020-03-01 06:00", "MS", "2020-04-01 06:00"), - ("2020-01-01 00:00", "QS", "2020-04-01 00:00"), - ("2020-01-01 06:00", "QS", "2020-04-01 06:00"), + ("2020-03-29 01:00", "15T", "2020-03-29 01:15", 92 + 9 * 96), + ("2020-03-29 01:00", "H", "2020-03-29 03:00", 23 + 9 * 24), + ("2020-03-29 00:00", "D", "2020-03-30 00:00", None), + ("2020-03-29 01:00", "D", "2020-03-30 01:00", None), + ("2020-03-29 03:00", "D", "2020-03-30 03:00", None), + ("2020-03-29 06:00", "D", "2020-03-30 06:00", None), + ("2020-03-01 00:00", "MS", "2020-04-01 00:00", None), + ("2020-03-01 06:00", "MS", "2020-04-01 06:00", None), + ("2020-01-01 00:00", "QS", "2020-04-01 00:00", None), + ("2020-01-01 06:00", "QS", "2020-04-01 06:00", None), # End of DST. - ("2020-10-25 01:00", "15T", "2020-10-25 01:15+0200"), - ("2020-10-25 02:00+0200", "15T", "2020-10-25 02:15+0200"), - ("2020-10-25 02:00+0100", "15T", "2020-10-25 02:15+0100"), - ("2020-10-25 03:00", "15T", "2020-10-25 03:15"), - ("2020-10-25 01:00", "H", "2020-10-25 02:00+0200"), - ("2020-10-25 02:00+0200", "H", "2020-10-25 02:00+0100"), - ("2020-10-25 02:00+0100", "H", "2020-10-25 03:00"), - ("2020-10-25 03:00", "H", "2020-10-25 04:00"), - ("2020-10-25 00:00", "D", "2020-10-26 00:00"), - ("2020-10-25 01:00", "D", "2020-10-26 01:00"), - ("2020-10-25 03:00", "D", "2020-10-26 03:00"), - ("2020-10-25 06:00", "D", "2020-10-26 06:00"), - ("2020-10-01 00:00", "MS", "2020-11-01 00:00"), - ("2020-10-01 06:00", "MS", "2020-11-01 06:00"), - ("2020-10-01 00:00", "QS", "2021-01-01 00:00"), - ("2020-10-01 06:00", "QS", "2021-01-01 06:00"), + ("2020-10-25 01:00", "15T", "2020-10-25 01:15+0200", 100 + 9 * 96), + ("2020-10-25 02:00+0200", "15T", "2020-10-25 02:15+0200", 100 + 9 * 96), + ("2020-10-25 02:00+0100", "15T", "2020-10-25 02:15+0100", 10 * 96), + ("2020-10-25 03:00", "15T", "2020-10-25 03:15", 10 * 96), + ("2020-10-25 01:00", "H", "2020-10-25 02:00+0200", 25 + 9 * 24), + ("2020-10-25 02:00+0200", "H", "2020-10-25 02:00+0100", 25 + 9 * 24), + ("2020-10-25 02:00+0100", "H", "2020-10-25 03:00", 10 * 24), + ("2020-10-25 03:00", "H", "2020-10-25 04:00", 10 * 24), + ("2020-10-25 00:00", "D", "2020-10-26 00:00", None), + ("2020-10-25 01:00", "D", "2020-10-26 01:00", None), + ("2020-10-25 03:00", "D", "2020-10-26 03:00", None), + ("2020-10-25 06:00", "D", "2020-10-26 06:00", None), + ("2020-10-01 00:00", "MS", "2020-11-01 00:00", None), + ("2020-10-01 06:00", "MS", "2020-11-01 06:00", None), + ("2020-10-01 00:00", "QS", "2021-01-01 00:00", None), + ("2020-10-01 06:00", "QS", "2021-01-01 06:00", None), ] TESTCASES_15T_STAMPONLY = [ # ts, expected_ts_right @@ -89,13 +89,14 @@ @pytest.mark.parametrize(("ts", "freq", "expected_ts_right"), TESTCASES) def test_right_index(ts: str, freq: str, tz: str, expected_ts_right: str): """Test if right timestamp is correctly calculated for index without dst-transition.""" - do_test_index(ts, freq, tz, expected_ts_right) + do_test_index(ts, freq, tz, expected_ts_right, 96) # always integer # of days -@pytest.mark.parametrize(("ts", "freq", "expected_ts_right"), TESTCASES_DST) -def test_right_index_dst(ts: str, freq: str, expected_ts_right: str): +@pytest.mark.parametrize(("ts", "freq", "expected_ts_right", "periods"), TESTCASES_DST) +def test_right_index_dst(ts: str, freq: str, expected_ts_right: str, periods: int): """Test if right timestamp is correctly calculated for index with dst-transition.""" - do_test_index(ts, freq, "Europe/Berlin", expected_ts_right) + periods = periods or 10 + do_test_index(ts, freq, "Europe/Berlin", expected_ts_right, periods) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @@ -105,8 +106,8 @@ def test_right_stamp(ts: str, freq: str, tz: str, expected_ts_right: str): do_test_stamp(ts, freq, tz, expected_ts_right) -@pytest.mark.parametrize(("ts", "freq", "expected_ts_right"), TESTCASES_DST) -def test_right_stamp_dst(ts: str, freq: str, expected_ts_right: str): +@pytest.mark.parametrize(("ts", "freq", "expected_ts_right", "periods"), TESTCASES_DST) +def test_right_stamp_dst(ts: str, freq: str, expected_ts_right: str, periods: int): """Test if right timestamp is correctly calculated for timestamp with dst-transition.""" do_test_stamp(ts, freq, "Europe/Berlin", expected_ts_right) @@ -117,15 +118,15 @@ def test_right_stamp_15T(ts: str, expected_ts_right: str): do_test_stamp(ts, "15T", "Europe/Berlin", expected_ts_right) -def do_test_index(ts, freq, tz, expected_ts_right): +def do_test_index(ts, freq, tz, expected_ts_right, periods): # Must specify timezone in timestamp (instead of index) to avoid confusion at DST-changeover. - i = pd.date_range(pd.Timestamp(ts, tz=tz), freq=freq, periods=100) + i = pd.date_range(pd.Timestamp(ts, tz=tz), freq=freq, periods=periods) result = tools.right.index(i) expected = pd.date_range( - pd.Timestamp(expected_ts_right, tz=tz), freq=freq, periods=100, name="right" + pd.Timestamp(expected_ts_right, tz=tz), freq=freq, periods=periods, name="right" ) testing.assert_index_equal(result, expected) - tools.standardize.assert_index_standardized(result, True) + tools.standardize.assert_index_standardized(result, __right=True) def do_test_stamp(ts, freq, tz, expected_ts_right): diff --git a/tests/tools/test_standardize.py b/tests/tools/test_standardize.py index 8e606bb..66851fd 100644 --- a/tests/tools/test_standardize.py +++ b/tests/tools/test_standardize.py @@ -65,26 +65,25 @@ def test_standardize_DST( if bound == "right": td = pd.Timedelta(hours=24 if freq == "D" else 0.25) iin = pd.DatetimeIndex([*iin[1:], iin[-1] + td]) - kw = {"bound": bound, "floating": False, "tz": out_tz} + kw = {"floating": False, "tz": out_tz} # Do actual tests. if isinstance(expected, pd.Series): # 1: Using expected frame: should stay the same. - result = tools.standardize.frame(expected, force) + result = tools.standardize.frame(expected, force, **kw) pd.testing.assert_series_equal(result, expected) # 2: Series. - result = tools.standardize.frame(pd.Series(in_vals, iin), force, **kw) + result = tools.standardize.frame( + pd.Series(in_vals, iin), force, bound=bound, **kw + ) pd.testing.assert_series_equal(result, expected) else: # 1: Using expected frame: should stay the same. - result = tools.standardize.frame(expected, force) + result = tools.standardize.frame(expected, force, **kw) pd.testing.assert_frame_equal(result, expected) - # 2: Dataframe with index. - result = tools.standardize.frame(pd.DataFrame({"a": in_vals}, iin), force, **kw) - pd.testing.assert_frame_equal(result, expected) - # 3: Dataframe with column that must become index. + # 2: Dataframe. result = tools.standardize.frame( - pd.DataFrame({"a": in_vals, "t": iin}), force, index_col="t", **kw + pd.DataFrame({"a": in_vals}, iin), force, bound=bound, **kw ) pd.testing.assert_frame_equal(result, expected) @@ -139,7 +138,7 @@ def test_standardize_convert(freq, in_tz, floating, series_or_df, bound, out_tz) @pytest.mark.parametrize("in_tz", [None, "Europe/Berlin"]) @pytest.mark.parametrize("floating", [True, False]) @pytest.mark.parametrize("force", ["agnostic", "aware"]) -@pytest.mark.parametrize("freq", [*tools.freq.FREQUENCIES, "Q", "30T", "M", "AS-FEB"]) +@pytest.mark.parametrize("freq", [*tools.freq.FREQUENCIES, "Q", "M", "AS-FEB"]) def test_standardize_freq(freq, in_tz, floating, series_or_df, force): """Test raising errors when passing invalid frequencies.""" out_tz = "Europe/Berlin" @@ -147,14 +146,6 @@ def test_standardize_freq(freq, in_tz, floating, series_or_df, force): # Get index. i = dev.get_index(freq, in_tz, _seed=1) - # If no timezone specified and below-daily values, the created index will have too few/many datapoints. - # if ( - # in_tz is None - # and tools.freq.up_or_down(freq, "D") == -1 - # and tools.freq.up_or_down(force_freq, "D") == 1 - # ): - # pytest.skip("edge case: too few/too many datapoints.") # don't check edge case - # Add values. fr = dev.get_series(i) if series_or_df == "series" else dev.get_dataframe(i) @@ -169,13 +160,10 @@ def test_standardize_freq(freq, in_tz, floating, series_or_df, force): @pytest.mark.parametrize("series_or_df", ["series", "df"]) -@pytest.mark.parametrize("removefrom", ["nowhere", "end", "middle"]) +@pytest.mark.parametrize("remove", ["remove_some", "remove_none"]) @pytest.mark.parametrize("in_tz", [None, "Europe/Berlin"]) @pytest.mark.parametrize("freq", tools.freq.FREQUENCIES) -@pytest.mark.parametrize( - "force_freq", [*tools.freq.FREQUENCIES[::2], "30T", "M", "AS-FEB", None] -) -def test_standardize_gaps(freq, in_tz, removefrom, series_or_df, force_freq): +def test_standardize_gaps(freq, in_tz, remove, series_or_df): """Test raising errors on index with gaps. Don't test timezone-conversion.""" force = "agnostic" if in_tz is None else "aware" out_tz = in_tz @@ -183,14 +171,8 @@ def test_standardize_gaps(freq, in_tz, removefrom, series_or_df, force_freq): # Get index. i = dev.get_index(freq, in_tz, _seed=1) - # If no timezone specified and below-daily values, the created index will have too few/many datapoints. - if in_tz is None and tools.freq.up_or_down(freq, "D") == -1: - pytest.skip("edge case: too few/too many datapoints.") # don't check edge case - - # remove timestamp from index. - if removefrom == "start": # remove from end - i = i.delete(-1) - elif removefrom == "middle": # remove from middle + # remove timestamp from middle of index. + if remove == "remove_some": i = i.delete((len(i) - 2) // 2) # Add values. @@ -199,18 +181,13 @@ def test_standardize_gaps(freq, in_tz, removefrom, series_or_df, force_freq): # See if error is raised. if ( # fr has frequency, but it's a forbidden frequency - (removefrom != "middle" and freq not in tools.freq.FREQUENCIES) - # fr has frequency, but user wants to force a different frequency - or (removefrom != "middle" and freq != force_freq and force_freq is not None) - # fr does not have frequency, and user does not specify a forced frequency - or (removefrom == "middle" and not force_freq) - # user wants to force a frequency, but it's a forbidden frequency - or (force_freq is not None and force_freq not in tools.freq.FREQUENCIES) + (remove == "remove_none" and freq not in tools.freq.FREQUENCIES) + # fr does not have frequency + or (remove == "remove_some") ): with pytest.raises(ValueError): - _ = tools.standardize.frame(fr, force, tz=out_tz, force_freq=force_freq) + _ = tools.standardize.frame(fr, force, tz=out_tz) return - result = tools.standardize.frame(fr, force, tz=out_tz, force_freq=force_freq) - expected_freq = force_freq or freq - assert result.index.freq == expected_freq + result = tools.standardize.frame(fr, force, tz=out_tz) + assert result.index.freq == freq diff --git a/tests/tools/test_startofday.py b/tests/tools/test_startofday.py index b098883..f8460ad 100644 --- a/tests/tools/test_startofday.py +++ b/tests/tools/test_startofday.py @@ -1,9 +1,13 @@ -import pytest import datetime as dt -from portfolyo import tools, testing, dev +import pandas as pd +import pytest + +from portfolyo import testing, tools ERROR_SOD_DICT = {"hour": 6, "minute": 1} # error +SOD_STRS = ["00:00", "06:00", "15:30"] +SODS = [(0, 0), (6, 0), (15, 30)] SOD_DICTS = [ {"hour": 0, "minute": 0}, {"hour": 6, "minute": 0}, @@ -34,38 +38,390 @@ def create_start_of_day(hour, minute, returntype): return dt.timedelta(hours=hour, minutes=minute) -@pytest.mark.parametrize("startdate,freq", STARTDATE_AND_FREQ) -@pytest.mark.parametrize("sod_dict", SOD_DICTS) -@pytest.mark.parametrize("returntype", ["time", "str", "timedelta"]) -@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) -def test_get_startofday(startdate, freq, tz, sod_dict, returntype): +@pytest.mark.parametrize( + "i,hour,minute", + [ + # Midnight + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 0, + 0, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + ), + # 06:00 + # . No timezone + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz=None, + ), + 6, + 0, + ), + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="D", + inclusive="left", + tz=None, + ), + 6, + 0, + ), + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="H", + inclusive="left", + tz=None, + ), + 6, + 0, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + ), + ( + pd.date_range( + "2020-01-01 06:30", + "2021-01-01 06:30", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 30, + ), + ( + pd.date_range( + "2020-01-01 06:30", + "2021-01-01 06:30", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 30, + ), + ], +) +@pytest.mark.parametrize("returntype", ["time", "timedelta", "str"]) +def test_get_startofday(i: pd.DatetimeIndex, hour: int, minute: int, returntype: str): """Test if start-of-day can be correctly gotten from index.""" - i = dev.get_index(freq, tz, startdate, 10, dt.time(**sod_dict), _seed=SEED) + expected = create_start_of_day(hour, minute, returntype) result = tools.startofday.get(i, returntype) - expected = create_start_of_day(**sod_dict, returntype=returntype) assert result == expected -@pytest.mark.parametrize("startdate,freq", STARTDATE_AND_FREQ) -@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) -@pytest.mark.parametrize("sod_dict_in", SOD_DICTS) -@pytest.mark.parametrize("sod_dict_out", SOD_DICTS) -def test_set_startofday(startdate, freq, tz, sod_dict_in, sod_dict_out): - """Test if start of day can be correctly set to an index.""" - periods = {"H": 240, "D": 10, "MS": 3}[freq] - start_of_day_in = create_start_of_day(**sod_dict_in, returntype="time") - start_of_day_out = create_start_of_day(**sod_dict_out, returntype="time") - i = dev.get_index(freq, tz, startdate, periods, start_of_day_in, _seed=SEED) - if freq == "H" or sod_dict_out == ERROR_SOD_DICT: - with pytest.raises(ValueError): - _ = tools.startofday.set(i, start_of_day_out) - return - - result = tools.startofday.set(i, start_of_day_out) - if start_of_day_in == start_of_day_out: +@pytest.mark.parametrize( + "i,hour,minute,expected", + [ + # Midnight + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 0, + 0, + None, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + None, + ), + # 06:00 + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz=None, + ), + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="D", + inclusive="left", + tz=None, + ), + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2020-12-31 06:00", + freq="H", + inclusive="left", + tz=None, + ), + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2020-12-31 06:00", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + ), + # 06:03 + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 6, + 3, + Exception, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 3, + Exception, + ), + ], +) +def test_set_startofday( + i: pd.DatetimeIndex, + hour: int, + minute: int, + expected: pd.DatetimeIndex, +): + """Test if start-of-day can be correctly set to index.""" + if expected is None: expected = i - else: - expected = dev.get_index( - freq, tz, startdate, periods, start_of_day_out, _seed=SEED - ) + sod = dt.time(hour=hour, minute=minute) + # Error case. + if isinstance(expected, type) and issubclass(expected, Exception): + with pytest.raises(expected): + _ = tools.startofday.set(i, sod) + return + # Normal case. + result = tools.startofday.set(i, sod) testing.assert_index_equal(result, expected) diff --git a/tests/tools/test_wavg.py b/tests/tools/test_wavg.py index 2fe2e5d..120dd0f 100644 --- a/tests/tools/test_wavg.py +++ b/tests/tools/test_wavg.py @@ -1,4 +1,4 @@ -from typing import Any, Iterable, Union +from typing import Any, Iterable import numpy as np import pandas as pd @@ -57,7 +57,7 @@ def get_index(number: int, indextype: str) -> Iterable: def do_test_series( - values: Union[pd.Series, pd.DataFrame], weights: Any, expected: Any, **kwargs + values: pd.Series | pd.DataFrame, weights: Any, expected: Any, **kwargs ): if isinstance(expected, type) and issubclass(expected, Exception): with pytest.raises(expected): diff --git a/tests/tools/visualize/test_plot.py b/tests/tools/visualize/test_plot.py new file mode 100644 index 0000000..16913c7 --- /dev/null +++ b/tests/tools/visualize/test_plot.py @@ -0,0 +1,79 @@ +"""Test if portfolio line can be plotted.""" + +import matplotlib.pyplot as plt +import pandas as pd +import pytest + +import portfolyo as pf +from portfolyo import Kind, PfState + + +@pytest.mark.parametrize("levels", [1, 2, 3]) +@pytest.mark.parametrize("childcount", [1, 2, 3]) +@pytest.mark.parametrize("children", [True, False]) +@pytest.mark.parametrize("kind", [Kind.VOLUME, Kind.PRICE, Kind.REVENUE, Kind.COMPLETE]) +@pytest.mark.parametrize("freq", ["MS", "D"]) +def test_pfline_plot( + levels: int, childcount: int, children: bool, kind: Kind, freq: str +): + """Test if data can be plotted with plot() function.""" + index = pd.date_range("2020-01-01", "2021-01-01", freq=freq, tz=None) + pfl = pf.dev.get_pfline(index, nlevels=levels, childcount=childcount, kind=kind) + pfl.plot(children=children) + + +@pytest.mark.parametrize("childcount", [1, 2, 3]) +@pytest.mark.parametrize("children", [True, False]) +@pytest.mark.parametrize("freq", ["MS", "D"]) +def test_pfstate_plot( + childcount: int, + children: bool, + freq: str, +): + """Test if pfstate can be plotted with plot() function.""" + index = pd.date_range( + "2022-06-01", "2024-02-01", freq=freq, tz="Europe/Berlin", inclusive="left" + ) + offtakevolume = pf.dev.get_nestedpfline( + index, kind=Kind.VOLUME, childcount=childcount + ) + sourced = pf.dev.get_nestedpfline(index, kind=Kind.COMPLETE, childcount=childcount) + unsourcedprice = pf.dev.get_nestedpfline( + index, kind=Kind.PRICE, childcount=childcount + ) + pfs = PfState(-1 * offtakevolume, unsourcedprice, sourced) + pfs.plot(children=children) + + +@pytest.mark.parametrize("children", [True, False]) +def test_flatpfline_plot(children: bool): + """Test if plotting flatpfline with children attribute gives an error.""" + pfl = pf.dev.get_flatpfline() + pfl.plot(children=children) + + +@pytest.mark.parametrize("freq", ["MS", "D"]) +@pytest.mark.parametrize("children", [True, False]) +@pytest.mark.parametrize("levels", [1, 2, 3]) +@pytest.mark.parametrize("childcount", [1, 2, 3]) +def test_plot_to_ax(levels: int, childcount: int, children: bool, freq: str): + """Test if frunction plot_to_ax works with every kind of pfline.""" + index = pd.date_range("2020-01-01", "2021-01-01", freq=freq, tz=None) + pfl_compl = pf.dev.get_pfline( + index, nlevels=levels, childcount=childcount, kind=Kind.COMPLETE + ) + pfl_vol = pf.dev.get_pfline( + index, nlevels=levels, childcount=childcount, kind=Kind.VOLUME + ) + pfl_price = pf.dev.get_pfline( + index, nlevels=levels, childcount=childcount, kind=Kind.PRICE + ) + pfl_rev = pf.dev.get_pfline( + index, nlevels=levels, childcount=childcount, kind=Kind.REVENUE + ) + _, axs = plt.subplots(2, 2) + with pytest.raises(ValueError): + _ = pfl_compl.plot_to_ax(axs[0][0], children=children, kind=Kind.COMPLETE) + pfl_vol.plot_to_ax(axs[0][1], children=children, kind=Kind.VOLUME) + pfl_price.plot_to_ax(axs[1][0], children=children, kind=Kind.PRICE) + pfl_rev.plot_to_ax(axs[1][1], children=children, kind=Kind.REVENUE) diff --git a/tests/tools2/test_concat_error_cases.py b/tests/tools2/test_concat_error_cases.py new file mode 100644 index 0000000..e250fed --- /dev/null +++ b/tests/tools2/test_concat_error_cases.py @@ -0,0 +1,136 @@ +"""Test different error cases for concatenation of PfStates and PfLines.""" + +import pandas as pd +import pytest + +from portfolyo import dev +from portfolyo.core.pfline.enums import Kind +from portfolyo.core.pfstate.pfstate import PfState +from portfolyo.tools2 import concat + + +def test_general(): + """Test if concatenating PfLine with PfState raises error.""" + index = pd.date_range("2020", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfs = dev.get_pfstate(index2) + with pytest.raises(NotImplementedError): + _ = concat.general([pfl, pfs]) + + +def test_diff_freq(): + """Test if concatenating of two flat PfLines with different freq raises error.""" + index = pd.date_range("2020", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024", "2025", freq="AS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_diff_sod(): + """Test if concatenating of two flat PfLines with different sod raises error.""" + index = pd.date_range("2020-01-01 00:00", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01 06:00", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_slice_not_sod(): + """Test if concatenating of two flat PfLines with different sod raises error.""" + index = pd.date_range("2020-01-01 00:00", "2020-03-01", freq="H", inclusive="left") + index2 = pd.date_range( + "2020-02-01 06:00", "2020-04-01 06:00", freq="H", inclusive="left" + ) + pfl_a = dev.get_flatpfline(index) + pfl_b = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl_a, pfl_b]) + + +def test_diff_tz(): + """Test if concatenating of two flat PfLines with different tz raises error.""" + index = pd.date_range( + "2020-01-01", "2024", freq="QS", tz="Europe/Berlin", inclusive="left" + ) + index2 = pd.date_range("2024-01-01", "2025", freq="QS", tz=None, inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_diff_kind(): + """Test if concatenating of two flat PfLines with different kind raises error.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index, kind=Kind.COMPLETE) + pfl2 = dev.get_flatpfline(index2, kind=Kind.VOLUME) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_app_lenght(): + """Test if concatenatination raises error if we pass only one parameter.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + with pytest.raises(NotImplementedError): + _ = concat.concat_pflines([pfl]) + + +def test_concat_with_overlap(): + """Test if concatenatination raises error if there is overlap in indices of PfLines.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2020-01-01", "2023", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(ValueError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_with_gaps(): + """Test if concatenatination raises error if there is a gap in indices of PfLines.""" + index = pd.date_range("2020-01-01", "2023", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(ValueError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_children(): + """Test if concatenating of flat PfLine with nested PfLine raises error.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_nestedpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_diff_children(): + """Test if concatenating of two nested PfLines with different children raises error.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_nestedpfline(index) + pfl2 = dev.get_nestedpfline(index2).drop_child(name="a") + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_pfss(): + """Test if concatenating of Pfstate with "nested" PfState + (meaning that offtakevolume, sourced and unsourcedprice are nested Pflines) raises error. + """ + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfs1 = dev.get_pfstate(index) + offtakevolume = dev.get_nestedpfline(index2, kind=Kind.VOLUME) + sourced = dev.get_nestedpfline(index2, kind=Kind.COMPLETE) + unsourcedprice = dev.get_nestedpfline(index2, kind=Kind.PRICE) + pfs2 = PfState(offtakevolume, unsourcedprice, sourced) + with pytest.raises(TypeError): + _ = concat.concat_pfstates([pfs1, pfs2]) diff --git a/tests/tools2/test_concat_pfline.py b/tests/tools2/test_concat_pfline.py new file mode 100644 index 0000000..5e30722 --- /dev/null +++ b/tests/tools2/test_concat_pfline.py @@ -0,0 +1,151 @@ +"""Test if concatenation of PfLines works properly with different test cases.""" + +import pandas as pd +import pytest + +from portfolyo import dev +from portfolyo.tools2 import concat + +TESTCASES2 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + "2022-04-01", + ), + (("2020", "2022"), "AS", "2021-01-01"), + ( + ("2020-05-01", "2023-04-01"), + "MS", + "2022-11-01", + ), + (("2022-03-20", "2022-07-28"), "D", "2022-05-28"), +] + +TESTCASES3 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + ("2022-04-01", "2023-01-01"), + ), + (("2020", "2023"), "AS", ("2021-01-01", "2022-01-01")), + ( + ("2020-05-01", "2023-04-01"), + "MS", + ("2022-11-01", "2023-01-01"), + ), + (("2022-03-20", "2022-07-28"), "D", ("2022-04-28", "2022-05-15")), +] + + +def get_idx( + startdate: str, starttime: str, tz: str, freq: str, enddate: str +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES2) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_flat_pflines( + whole_idx: str, starttime: str, tz: str, freq: str, where: str, test_fn: str +): + """Test that two flat pflines with the same attributes (i.e., same frequency, + timezone, start-of-day, and kind) get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_flatpfline(idx) + pfl_a = whole_pfl.slice[:where] + pfl_b = whole_pfl.slice[where:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b]) + result2 = fn([pfl_b, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES2) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_nested_pflines( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that two nested pflines with the same attributes (i.e., same frequency, + timezone, start-of-day, and kind) and the same number of children and children names + get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_nestedpfline(idx) + pfl_a = whole_pfl.slice[:where] + pfl_b = whole_pfl.slice[where:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b]) + result2 = fn([pfl_b, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES3) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_three_flatpflines( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that three flat pflines with the same attributes (i.e., same frequency, + timezone, start-of-day, and kind) get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_flatpfline(idx) + split_one = where[0] + split_two = where[1] + pfl_a = whole_pfl.slice[:split_one] + pfl_b = whole_pfl.slice[split_one:split_two] + pfl_c = whole_pfl.slice[split_two:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b, pfl_c]) + result2 = fn([pfl_b, pfl_c, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES3) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_three_nestedpflines( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that three nested pflines with the same attributes ( aka kind, freq, sod, etc.) + and the same number of children and children names get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_nestedpfline(idx) + split_one = where[0] + split_two = where[1] + pfl_a = whole_pfl.slice[:split_one] + pfl_b = whole_pfl.slice[split_one:split_two] + pfl_c = whole_pfl.slice[split_two:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b, pfl_c]) + result2 = fn([pfl_b, pfl_c, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 diff --git a/tests/tools2/test_concat_pfstate.py b/tests/tools2/test_concat_pfstate.py new file mode 100644 index 0000000..6ca378b --- /dev/null +++ b/tests/tools2/test_concat_pfstate.py @@ -0,0 +1,100 @@ +"""Test if concatenation of PfStates works properly with different test cases.""" + +import pandas as pd +import pytest + +from portfolyo import dev +from portfolyo.tools2 import concat + +TESTCASES2 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + "2022-04-01", + ), + (("2020", "2022"), "AS", "2021-01-01"), + ( + ("2020-05-01", "2023-04-01"), + "MS", + "2022-11-01", + ), + (("2022-03-20", "2022-07-28"), "D", "2022-05-28"), +] + +TESTCASES3 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + ("2022-04-01", "2023-01-01"), + ), + (("2020", "2023"), "AS", ("2021-01-01", "2022-01-01")), + ( + ("2020-05-01", "2023-04-01"), + "MS", + ("2022-11-01", "2023-01-01"), + ), + (("2022-03-20", "2022-07-28"), "D", ("2022-04-28", "2022-05-15")), +] + + +def get_idx( + startdate: str, starttime: str, tz: str, freq: str, enddate: str +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES2) +@pytest.mark.parametrize("test_fn", ["general", "concat_pfstates"]) +def test_concat_pfstates( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that two PfStates get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfs = dev.get_pfstate(idx) + pfs_a = whole_pfs.slice[:where] + pfs_b = whole_pfs.slice[where:] + fn = concat.general if test_fn == "general" else concat.concat_pfstates + result = fn([pfs_a, pfs_b]) + result2 = fn([pfs_b, pfs_a]) + assert whole_pfs == result + assert whole_pfs == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES3) +@pytest.mark.parametrize("test_fn", ["general", "concat_pfstates"]) +def test_concat_three_pfstates( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that three PfStates get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfs = dev.get_pfstate(idx) + split_one = where[0] + split_two = where[1] + pfs_a = whole_pfs.slice[:split_one] + pfs_b = whole_pfs.slice[split_one:split_two] + pfs_c = whole_pfs.slice[split_two:] + fn = concat.general if test_fn == "general" else concat.concat_pfstates + result = fn([pfs_a, pfs_b, pfs_c]) + result2 = fn([pfs_b, pfs_c, pfs_a]) + assert whole_pfs == result + assert whole_pfs == result2 diff --git a/tests/tools2/test_indexable.py b/tests/tools2/test_indexable.py new file mode 100644 index 0000000..d757e31 --- /dev/null +++ b/tests/tools2/test_indexable.py @@ -0,0 +1,222 @@ +import pandas as pd +import pytest + +import portfolyo as pf + + +def get_idx( + startdate: str, + starttime: str, + tz: str, + freq: str, + enddate: str, +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +def create_obj( + series: pd.Series, name_obj: str +) -> pd.DataFrame | pf.PfLine | pf.PfState: + if name_obj == "pfline": + return pf.PfLine({"w": series}) + elif name_obj == "pfstate": + volume = pf.PfLine({"w": series}) + prices = pf.PfLine({"p": series}) + return pf.PfState(volume, prices) + else: + return pd.DataFrame({"col": series}) + + +def t_function(objtype: str): + if objtype == "series": + return pd.testing.assert_series_equal + elif objtype == "dataframe": + return pd.testing.assert_frame_equal + elif objtype == "pfline": + return pf.PfLine.__eq__ + else: + return pf.PfState.__eq__ + + +@pytest.mark.parametrize("first_obj", ["pfstate", "pfline", "series", "dataframe"]) +@pytest.mark.parametrize("second_obj", ["pfstate", "pfline", "series", "dataframe"]) +def test_intersect_freq_ignore( + first_obj: str, + second_obj: str, +): + """Test that intersection works properly on PfLines and/or PfStates with ignore_freq.""" + idx1 = get_idx("2022-04-01", "00:00", "Europe/Berlin", "QS", "2024-07-01") + s1 = pd.Series(range(len(idx1)), idx1) + + idx2 = get_idx("2021-01-01", "00:00", "Europe/Berlin", "MS", "2024-01-01") + s2 = pd.Series(range(len(idx2)), idx2) + + first = create_obj(s1, first_obj) if first_obj != "series" else s1 + second = create_obj(s2, second_obj) if second_obj != "series" else s2 + # Do intersection + intersect = pf.intersection(first, second, ignore_freq=True) + + # Expected results + expected_s1 = s1.iloc[:7] + expected_s2 = s2.iloc[15:48] + output_1 = ( + create_obj(expected_s1, first_obj) if first_obj != "series" else expected_s1 + ) + output_2 = ( + create_obj(expected_s2, second_obj) if second_obj != "series" else expected_s2 + ) + for a, b, objtype in zip([output_1, output_2], intersect, [first_obj, second_obj]): + fn = t_function(objtype) + fn(a, b) + + +@pytest.mark.parametrize("first_obj", ["pfstate", "pfline", "series", "dataframe"]) +@pytest.mark.parametrize("second_obj", ["pfstate", "pfline", "series", "dataframe"]) +def test_intersect_sod( + first_obj: str, + second_obj: str, +): + """Test that intersection works properly on PfLines and/or PfStates with ignore_sod.""" + idx1 = get_idx("2022-04-01", "00:00", "Europe/Berlin", "QS", "2024-07-01") + s1 = pd.Series(range(len(idx1)), idx1) + + idx2 = get_idx("2021-01-01", "06:00", "Europe/Berlin", "QS", "2024-01-01") + s2 = pd.Series(range(len(idx2)), idx2) + + first = create_obj(s1, first_obj) if first_obj != "series" else s1 + second = create_obj(s2, second_obj) if second_obj != "series" else s2 + # Do intersection + intersect = pf.intersection(first, second, ignore_start_of_day=True) + + # Expected results + expected_s1 = s1.iloc[:7] + expected_s2 = s2.iloc[5:12] + output_1 = ( + create_obj(expected_s1, first_obj) if first_obj != "series" else expected_s1 + ) + output_2 = ( + create_obj(expected_s2, second_obj) if second_obj != "series" else expected_s2 + ) + for a, b, objtype in zip([output_1, output_2], intersect, [first_obj, second_obj]): + fn = t_function(objtype) + fn(a, b) + + +@pytest.mark.parametrize("first_obj", ["pfstate", "pfline", "series", "dataframe"]) +@pytest.mark.parametrize("second_obj", ["pfstate", "pfline", "series", "dataframe"]) +def test_intersect_tz( + first_obj: str, + second_obj: str, +): + """Test that intersection works properly on PfLines and/or PfStates with ignore_tz.""" + idx1 = get_idx("2022-04-01", "00:00", "Europe/Berlin", "QS", "2024-07-01") + s1 = pd.Series(range(len(idx1)), idx1) + + idx2 = get_idx("2021-01-01", "00:00", None, "QS", "2024-01-01") + s2 = pd.Series(range(len(idx2)), idx2) + + first = create_obj(s1, first_obj) if first_obj != "series" else s1 + second = create_obj(s2, second_obj) if second_obj != "series" else s2 + # Do intersection + intersect = pf.intersection(first, second, ignore_tz=True) + + # Expected results + expected_s1 = s1.iloc[:7] + expected_s2 = s2.iloc[5:12] + output_1 = ( + create_obj(expected_s1, first_obj) if first_obj != "series" else expected_s1 + ) + output_2 = ( + create_obj(expected_s2, second_obj) if second_obj != "series" else expected_s2 + ) + for a, b, objtype in zip([output_1, output_2], intersect, [first_obj, second_obj]): + fn = t_function(objtype) + fn(a, b) + + +@pytest.mark.parametrize("first_obj", ["pfstate", "pfline", "series", "dataframe"]) +@pytest.mark.parametrize("second_obj", ["pfstate", "pfline", "series", "dataframe"]) +def test_intersect_ignore_all( + first_obj: str, + second_obj: str, +): + """Test that intersection works properly on PfLines and/or PfStates with ignore_all.""" + idx1 = get_idx("2022-04-01", "00:00", "Europe/Berlin", "QS", "2024-07-01") + s1 = pd.Series(range(len(idx1)), idx1) + + idx2 = get_idx("2021-01-01", "06:00", None, "MS", "2024-01-01") + s2 = pd.Series(range(len(idx2)), idx2) + + first = create_obj(s1, first_obj) if first_obj != "series" else s1 + second = create_obj(s2, second_obj) if second_obj != "series" else s2 + # Do intersection + intersect = pf.intersection( + first, second, ignore_freq=True, ignore_tz=True, ignore_start_of_day=True + ) + + # Expected results + expected_s1 = s1.iloc[:7] + expected_s2 = s2.iloc[15:48] + output_1 = ( + create_obj(expected_s1, first_obj) if first_obj != "series" else expected_s1 + ) + output_2 = ( + create_obj(expected_s2, second_obj) if second_obj != "series" else expected_s2 + ) + for a, b, objtype in zip([output_1, output_2], intersect, [first_obj, second_obj]): + fn = t_function(objtype) + fn(a, b) + + +@pytest.mark.parametrize("first_obj", ["pfstate", "pfline", "series", "dataframe"]) +@pytest.mark.parametrize("second_obj", ["pfstate", "pfline", "series", "dataframe"]) +@pytest.mark.parametrize("third_obj", ["pfstate", "pfline", "series", "dataframe"]) +def test_intersect_ignore_all_3obj( + first_obj: str, + second_obj: str, + third_obj: str, +): + """Test that intersection works properly on PfLines and/or PfStates with ignore_all.""" + idx1 = get_idx("2022-04-01", "00:00", "Europe/Berlin", "QS", "2024-07-01") + s1 = pd.Series(range(len(idx1)), idx1) + + idx2 = get_idx("2021-01-01", "06:00", None, "MS", "2024-01-01") + s2 = pd.Series(range(len(idx2)), idx2) + + idx3 = get_idx("2023-01-01", "00:00", "Asia/Kolkata", "AS", "2025-01-01") + s3 = pd.Series(range(len(idx3)), idx3) + + first = create_obj(s1, first_obj) if first_obj != "series" else s1 + second = create_obj(s2, second_obj) if second_obj != "series" else s2 + third = create_obj(s3, third_obj) if third_obj != "series" else s3 + + # Do intersection + intersect = pf.intersection( + first, second, third, ignore_freq=True, ignore_tz=True, ignore_start_of_day=True + ) + + # Expected results + expected_s1 = s1.iloc[3:7] + expected_s2 = s2.iloc[24:36] + expected_s3 = s3.iloc[:1] + output_1 = ( + create_obj(expected_s1, first_obj) if first_obj != "series" else expected_s1 + ) + output_2 = ( + create_obj(expected_s2, second_obj) if second_obj != "series" else expected_s2 + ) + output_3 = ( + create_obj(expected_s3, third_obj) if third_obj != "series" else expected_s3 + ) + + for a, b, objtype in zip( + [output_1, output_2, output_3], intersect, [first_obj, second_obj, third_obj] + ): + fn = t_function(objtype) + fn(a, b) diff --git a/tests/utils.py b/tests/utils.py index bd14c9e..730ca65 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,4 +1,5 @@ """Create uniform ids for testcases.""" + from typing import Any, Dict import pandas as pd From 586dca165463ef4ddc2d356c4459d2b401a865c7 Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Mon, 27 May 2024 19:36:18 +0200 Subject: [PATCH 2/3] tests using fixtures --- tests/tools/{test_hedge.py => test_hedge1.py} | 45 +------ tests/tools/test_hedge2.py | 127 ++++++++++++++++++ 2 files changed, 128 insertions(+), 44 deletions(-) rename tests/tools/{test_hedge.py => test_hedge1.py} (62%) create mode 100644 tests/tools/test_hedge2.py diff --git a/tests/tools/test_hedge.py b/tests/tools/test_hedge1.py similarity index 62% rename from tests/tools/test_hedge.py rename to tests/tools/test_hedge1.py index 38b9dba..e3d1008 100644 --- a/tests/tools/test_hedge.py +++ b/tests/tools/test_hedge1.py @@ -1,4 +1,4 @@ -from pathlib import Path +"""Testing hedge functions using hard-coded hedge values.""" import numpy as np import pandas as pd @@ -103,46 +103,3 @@ def test_onehedge( w_expected = w_expected_val if how == "val" else w_expected_vol expected = pd.Series({"w": w_expected, "p": p_expected}) testing.assert_series_equal(result, expected) - - -@pytest.mark.parametrize("withunits", ["units", "nounits"]) -@pytest.mark.parametrize("how", ["vol", "val"]) -@pytest.mark.parametrize("bpo", ["b", "po"]) -@pytest.mark.parametrize("aggfreq", ["MS", "QS", "AS"]) -@pytest.mark.parametrize("freq", ["H", "D"]) -@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -def test_hedge_fromexcel(tz, freq, aggfreq, bpo, how, withunits): - """Test if hedge results are correctly calculated, by comparing against previously calculated results.""" - if freq == "D" and bpo == "po": - pytest.skip("Don't decompose in peak and offpeak if daily values") - - path = Path(__file__).parent / "test_hedge_data.xlsx" - sheetname = f'{freq}_{"None" if tz is None else tz.replace("/", "")}' - peak_fn = tools.product.germanpower_peakfn if bpo == "po" else None - - # Input data. - dfin = pd.read_excel(path, sheetname, header=6, index_col=0, usecols="A,B:C") - if tz: - dfin = dfin.tz_localize(tz, ambiguous="infer") - dfin.index.freq = pd.infer_freq(dfin.index) - win, pin = dfin.w, dfin.p - if withunits == "units": - win = win.astype("pint[MW]") - pin = pin.astype("pint[Eur/MWh]") - - # Expected output data. - dfout = pd.read_excel(path, f"{sheetname}_out", header=[3, 4, 5, 6], index_col=0) - if tz: - dfout = dfout.tz_localize(tz, ambiguous="infer") - dfout.index.freq = pd.infer_freq(dfout.index) - w_expected = dfout[aggfreq][bpo == "po"][how]["w"] - p_expected = dfout[aggfreq][bpo == "po"].iloc[:, 0] # price is first column - if withunits == "units": - w_expected = w_expected.astype("pint[MW]") - p_expected = p_expected.astype("pint[Eur/MWh]") - - # Test output data. - w_result, p_result = tools.hedge.hedge(win, pin, how, peak_fn, aggfreq) - - testing.assert_series_equal(p_result, p_expected, check_names=False) - testing.assert_series_equal(w_result, w_expected, check_names=False) diff --git a/tests/tools/test_hedge2.py b/tests/tools/test_hedge2.py new file mode 100644 index 0000000..bc82b59 --- /dev/null +++ b/tests/tools/test_hedge2.py @@ -0,0 +1,127 @@ +"""Testing hedge functions using pre-calculated hedge values from excel.""" + +from pathlib import Path + +import pandas as pd +import pytest + +from portfolyo import testing, tools + +PATH = Path(__file__).parent / "test_hedge_data.xlsx" + + +def sheetname(freq, tz): + return f'{freq}_{"None" if tz is None else tz.replace("/", "")}' + + +@pytest.fixture( + scope="session", + params=[pytest.param(True, id="withunits"), pytest.param(False, id="withoutunits")], +) +def has_units(request): + return request.param + + +@pytest.fixture(scope="session", params=["H", "D"]) +def freq(request): + return request.param + + +@pytest.fixture(scope="session", params=[None, "Europe/Berlin"]) +def tz(request): + return request.param + + +@pytest.fixture(scope="session", params=["vol", "val"]) +def how(request): + return request.param + + +@pytest.fixture( + scope="session", + params=[ + pytest.param(None, id="base"), + pytest.param(tools.product.germanpower_peakfn, id="peakoffpeakgerman"), + ], +) +def peak_fn(request): + return request.param + + +@pytest.fixture(scope="session", params=["MS", "QS", "AS"]) +def aggfreq(request): + return request.param + + +@pytest.fixture +def dfin(freq: str, tz: str) -> pd.DataFrame: + df = pd.read_excel( + PATH, sheetname(freq, tz), header=6, index_col=0, usecols="A,B:C" + ) + if tz: + df = df.tz_localize(tz, ambiguous="infer") + df.index.freq = pd.infer_freq(df.index) + return df + + +@pytest.fixture +def dfexp(freq: str, tz: str) -> pd.DataFrame: + df = pd.read_excel( + PATH, f"{sheetname(freq, tz)}_out", header=[3, 4, 5, 6], index_col=0 + ) + if tz: + df = df.tz_localize(tz, ambiguous="infer") + df.index.freq = pd.infer_freq(df.index) + return df + + +@pytest.fixture +def win(dfin: pd.DataFrame, has_units: bool) -> pd.Series: + s = dfin["w"] + return s if not has_units else s.astype("pint[MW]") + + +@pytest.fixture +def pin(dfin: pd.DataFrame, has_units: bool) -> pd.Series: + s = dfin["p"] + return s if not has_units else s.astype("pint[Eur/MWh]") + + +@pytest.fixture +def wexp( + dfexp: pd.DataFrame, + has_units: bool, + aggfreq: str, + peak_fn: tools.peakfn.PeakFunction, + how: str, +) -> pd.Series: + if dfexp.index.freq == "D" and peak_fn is not None: + pytest.skip("Don't decompose in peak and offpeak if daily values") + s = dfexp[aggfreq][peak_fn is not None][how]["w"] + return s if not has_units else s.astype("pint[MW]") + + +@pytest.fixture +def pexp( + dfexp: pd.DataFrame, + has_units: bool, + aggfreq: str, + peak_fn: tools.peakfn.PeakFunction, +) -> pd.Series: + s = dfexp[aggfreq][peak_fn is not None].iloc[:, 0] # price is first column + return s if not has_units else s.astype("pint[Eur/MWh]") + + +def test_hedge_fromexcel( + win: pd.Series, + pin: pd.Series, + wexp: pd.Series, + pexp: pd.Series, + how: str, + aggfreq: str, + peak_fn: tools.peakfn.PeakFunction, +): + """Test if hedge results are correctly calculated, by comparing against previously calculated results.""" + wresult, presult = tools.hedge.hedge(win, pin, how, peak_fn, aggfreq) + testing.assert_series_equal(wresult, wexp, check_names=False) + testing.assert_series_equal(presult, pexp, check_names=False) From c32afeb5d5dc8fcf7809f2d6e4f278607e61dc3c Mon Sep 17 00:00:00 2001 From: Alina Voilova Date: Tue, 28 May 2024 10:33:54 +0200 Subject: [PATCH 3/3] cov report --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 4edd93f..4e57090 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,7 +12,7 @@ max-line-length = 120 ignore = E501, W503, E202, E226 [tool:pytest] -#addopts = --cov=. +addopts = --cov=. markers = only_on_pr: marks tests as slow (select with -m only_on_pr and deselect with -m "not only_on_pr") pythonpath = ./tests