├── .coveragerc ├── .github ├── ISSUE_TEMPLATE │ └── new-runup-model.md └── dependabot.yml ├── .gitignore ├── .isort.cfg ├── .pre-commit-config.yaml ├── .readthedocs.yml ├── .travis.yml ├── README.rst ├── docs ├── Makefile ├── _static │ └── VitousekDoubling2017Fig1.jpg ├── background.rst ├── conf.py ├── datasets.rst ├── ensembles.rst ├── index.rst ├── installation.rst ├── make.bat ├── models.rst ├── requirements.txt └── usage.rst ├── environment.yml ├── examples ├── README.rst └── plot_stockdon.py ├── poetry.lock ├── py_wave_runup ├── __init__.py ├── datasets.py ├── datasets │ ├── beuzen18 │ │ ├── generate_beuzen18_model.py │ │ ├── gp_runup_model.joblib │ │ └── lidar_runup_data_for_GP_training.csv │ └── power18.csv ├── ensembles.py ├── models.py └── utils.py ├── pyproject.toml ├── pytest.ini ├── requirements.txt ├── tests ├── __init__.py ├── test_datasets.py ├── test_ensembles.py └── test_models.py └── tox.ini /.coveragerc: -------------------------------------------------------------------------------- 1 | [report] 2 | exclude_lines = 3 | # Have to re-enable the standard pragma 4 | pragma: no cover 5 | 6 | # Don't complain about missing debug-only code: 7 | def __repr__ 8 | if self\.debug 9 | 10 | # Don't complain if tests don't hit defensive assertion code: 11 | raise AssertionError 12 | raise NotImplementedError 13 | 14 | # Don't complain if non-runnable code isn't run: 15 | if 0: 16 | if __name__ == .__main__.: 17 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new-runup-model.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New runup model 3 | about: Suggest an new runup model to be added to the package 4 | title: "[New model] Add AuthorYear" 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Who is the published the model and in what year?** 11 | e.g. Stockdon et al. (2006) 12 | 13 | **Please provide a link, doi or citation to the paper** 14 | e.g. Stockdon, H.F., Holman, R.A., Howd, P.A., Sallenger, A.H., 2006. Empirical parameterization of setup, swash, and runup. Coastal Engineering 53, 573–588. https://doi.org/10.1016/j.coastaleng.2005.12.005 15 | 16 | **If possible, please provide the relevant equation references** 17 | For example: 18 | - Eqn 18: R2 for dissipative beaches 19 | - Eqn 19: R2 for intermediate and reflective beaches 20 | - Eqn 10: Wave setup 21 | - Eqn 11: Incident swash 22 | - Eqn 12: Infragravity swash 23 | - Eqn 7: Total swash 24 | 25 | **Any other details that would be useful?** 26 | For example: 27 | - Did the authors use different wave height? (i.e. not reverse-shoaled deep water significant wave height?) 28 | - Are there variables other than Hs, Tp and beta which are used? 29 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: pip 4 | directory: "/" 5 | schedule: 6 | interval: monthly 7 | time: "16:00" 8 | timezone: Australia/Sydney 9 | open-pull-requests-limit: 10 10 | target-branch: develop 11 | ignore: 12 | - dependency-name: sphinx 13 | versions: 14 | - 3.4.1 15 | - 3.4.3 16 | - dependency-name: coverage 17 | versions: 18 | - 5.3.1 19 | - "5.4" 20 | - dependency-name: tox 21 | versions: 22 | - 3.20.1 23 | - 3.21.3 24 | - dependency-name: pytest 25 | versions: 26 | - 6.2.1 27 | - dependency-name: scikit-learn 28 | versions: 29 | - 0.24.0 30 | - dependency-name: numpy 31 | versions: 32 | - 1.19.4 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | pip-wheel-metadata/ 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *.cover 48 | .hypothesis/ 49 | .pytest_cache/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | docs/auto_examples/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery beat schedule file 80 | celerybeat-schedule 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # dotenv 86 | .env 87 | 88 | # virtualenv 89 | .venv 90 | venv/ 91 | ENV/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | 106 | # Editor configs 107 | /.idea/ 108 | .vscode/settings.json 109 | -------------------------------------------------------------------------------- /.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | line_length = 88 3 | multi_line_output = 3 4 | include_trailing_comma = True 5 | known_third_party = joblib,matplotlib,numpy,pandas,pkg_resources,pytest,sklearn,tomlkit 6 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/asottile/seed-isort-config 3 | rev: v2.2.0 4 | hooks: 5 | - id: seed-isort-config 6 | - repo: https://github.com/pre-commit/mirrors-isort 7 | rev: v5.9.1 8 | hooks: 9 | - id: isort 10 | - repo: https://github.com/ambv/black 11 | rev: 21.6b0 12 | hooks: 13 | - id: black 14 | language_version: python3.7 15 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | # Required 6 | version: 2 7 | 8 | # Build documentation in the docs/ directory with Sphinx 9 | sphinx: 10 | configuration: docs/conf.py 11 | 12 | # Build documentation with MkDocs 13 | #mkdocs: 14 | # configuration: mkdocs.yml 15 | 16 | # Optionally build your docs in additional formats such as PDF and ePub 17 | formats: all 18 | 19 | build: 20 | image: latest 21 | 22 | # Optionally set the version of Python and requirements required to build your docs 23 | python: 24 | version: 3.7 25 | install: 26 | - requirements: ./docs/requirements.txt 27 | - method: pip 28 | path: . 29 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Config file for automatic testing at travis-ci.org 2 | 3 | language: python 4 | dist: "xenial" 5 | python: 6 | - 3.9 7 | - 3.8 8 | - 3.7 9 | 10 | cache: 11 | pip: true 12 | directories: 13 | - "$HOME/.cache/pre-commit" 14 | 15 | stages: 16 | - lint 17 | - test 18 | - docs 19 | - name: deploy 20 | if: tag IS present 21 | 22 | before_install: 23 | - pip install --upgrade pip 24 | install: 25 | - pip install poetry 26 | - pip install tox-travis 27 | script: 28 | - tox 29 | 30 | jobs: 31 | include: 32 | - stage: lint 33 | python: 3.7 34 | install: 35 | - pip install pre-commit 36 | - pre-commit install-hooks 37 | script: 38 | - pre-commit run --all-files 39 | - stage: docs 40 | python: 3.9 41 | install: 42 | - pip install poetry 43 | - poetry install -v 44 | script: 45 | - echo $PWD 46 | - sphinx-build -nWT -b dummy ./docs ./docs/_build 47 | - stage: deploy 48 | script: 49 | - echo Deploying to PyPI... 50 | before_deploy: 51 | # User and password environment variables are set as hidden variables through 52 | # the web interface in the project settings. 53 | - pip install --upgrade pip 54 | - pip install poetry 55 | - poetry config http-basic.pypi $PYPI_USER $PYPI_PASS 56 | - poetry build 57 | deploy: 58 | provider: script 59 | script: poetry publish 60 | skip_cleanup: true 61 | on: 62 | branch: master 63 | tags: true 64 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ================= 2 | Python Wave Runup 3 | ================= 4 | :: 5 | 6 | Empirical wave runup models implemented in Python for coastal engineers and scientists. 7 | 8 | .. image:: https://zenodo.org/badge/180274721.svg 9 | :target: https://zenodo.org/badge/latestdoi/180274721 10 | 11 | .. image:: https://img.shields.io/pypi/v/py-wave-runup.svg 12 | :target: https://pypi.python.org/pypi/py-wave-runup 13 | 14 | .. image:: https://img.shields.io/travis/com/chrisleaman/py-wave-runup.svg 15 | :target: https://travis-ci.com/chrisleaman/py-wave-runup 16 | 17 | .. image:: https://readthedocs.org/projects/py-wave-runup/badge/?version=latest 18 | :target: https://py-wave-runup.readthedocs.io/en/latest/?badge=latest 19 | :alt: Documentation Status 20 | 21 | .. image:: https://codecov.io/gh/chrisleaman/py-wave-runup/branch/master/graph/badge.svg 22 | :target: https://codecov.io/gh/chrisleaman/py-wave-runup 23 | 24 | .. image:: https://img.shields.io/badge/code%20style-black-000000.svg 25 | :target: https://github.com/ambv/black 26 | 27 | 28 | Contents 29 | ---------- 30 | - `Installation`_ 31 | - `Usage`_ 32 | - `Documentation`_ 33 | - `Background`_ 34 | - `Contributing`_ 35 | - `Citation`_ 36 | - `License`_ 37 | - `References`_ 38 | 39 | 40 | 41 | Installation 42 | ------------ 43 | 44 | Installation of ``py-wave-runup`` can be done with pip: 45 | 46 | .. code:: bash 47 | 48 | pip install py-wave-runup 49 | 50 | 51 | Usage 52 | ----- 53 | 54 | The following `wave runup models`_ are available for use: 55 | 56 | - ``models.Stockdon2006``: The most commonly cited and widely used runup model. 57 | - ``models.Power2018``: Based on the Gene-Expression Programming technique. 58 | - ``models.Holman1986``: Incorporated wave setup using Duck, NC measurements. 59 | - ``models.Nielsen2009``: Based on runup measurements from NSW, Australia. 60 | - ``models.Ruggiero2001``: Based on runup measurements from dissipative Orgeon beaches. 61 | - ``models.Vousdoukas2012``: Based on runup from European Atlantic coast 62 | - ``models.Senechal2011``: Based on extreme storm condition at Truc Vert, France 63 | - ``models.Beuzen2019``: Gaussian Process (GP) runup model 64 | - ``models.Passarella2018``: Genetic Programming (infragravity and total) swash model 65 | 66 | To get calculate runup, setup and swash, define your offshore conditions in your 67 | selected runup model then you can access each parameter: 68 | 69 | .. code:: python 70 | 71 | from py_wave_runup import models 72 | 73 | model_sto06 = models.Stockdon2006(Hs=4, Tp=12, beta=0.1) 74 | 75 | model_sto06.R2 # 2.54 76 | model_sto06.setup # 0.96 77 | model_sto06.sinc # 2.06 78 | model_sto06.sig # 1.65 79 | 80 | .. _wave runup models: https://py-wave-runup.readthedocs.io/en/develop/models.html 81 | 82 | Documentation 83 | ------------- 84 | Documentation is located at https://py-wave-runup.readthedocs.io. 85 | 86 | 87 | Background 88 | ---------- 89 | 90 | Wave runup refers to the final part of a wave's journey as it travels from offshore 91 | onto the beach. It is observable by anyone who goes to the beach and watches the edge 92 | of the water "runup" and rundown the beach. It is comprised of two components: 93 | 94 | - **setup**: the height of the time averaged superelevation of the mean water level 95 | above the Still Water Level (SWL) 96 | - **swash**: the height of the time varying fluctuation of the instantaneous water 97 | level about the setup elevation 98 | 99 | Setup, swash and other components of Total Water Level (TWL) rise are shown in this 100 | handy figure below. 101 | 102 | .. image:: https://raw.githubusercontent.com/chrisleaman/py-wave-runup/master/docs/_static/VitousekDoubling2017Fig1.jpg 103 | :width: 500 px 104 | :align: center 105 | .. 106 | 107 | | Figure from Vitousek et al. (2017) [#vit17]_ 108 | 109 | Wave runup can contribute a significant portion of the increase in TWL in coastal 110 | storms causing erosion and inundation. For example, Stockdon et al. (2006) [#sto06]_ 111 | collated data from numerous experiments, some of which showed wave runup 2% excedence 112 | heights in excess of 3 m during some storms. 113 | 114 | Given the impact such a large increase in TWL can have on coastlines, there has been 115 | much research conducted to try improve our understanding of wave runup processes. 116 | Although there are many processes which can influence wave runup (such as nonlinear 117 | wave transformation, wave reflection, three-dimensional effects, porosity, roughness, 118 | permeability and groundwater) [#cem06]_, many attempts have been made to derive 119 | empirical relatinoships based on easily measurable parameters. Typically, empirical 120 | wave runup models include: 121 | 122 | - **Hs**: significant wave height 123 | - **Tp**: peak wave length 124 | - **beta**: beach slope 125 | 126 | This python package attempts to consolidate the work done by others in this field and 127 | collate the numerous empirical relationships for wave runup which have been published. 128 | 129 | Contributing 130 | ------------ 131 | 132 | As there are many different empirical wave models out there, contributions are most 133 | welcome. If you don't feel confident about changing the code yourself, feel free to open 134 | a `Github issue`_ and let us know what could be added. Otherwise, follow the steps below 135 | to create a Pull Request: 136 | 137 | .. _Github issue: https://github.com/chrisleaman/py-wave-runup/issues 138 | 139 | 1. Fork it (https://github.com/chrisleaman/py-wave-runup/fork) 140 | 2. Create the development environment: 141 | 142 | - For pip, run ``pip install --pre -r requirements.txt`` 143 | - For `poetry`_, run ``poetry install`` 144 | - For `anaconda`_, run ``conda env create --name -f environment.yml`` 145 | 146 | 3. Create your feature branch (``git checkout -b feature/fooBar``) 147 | 4. Install pre-commit hooks for automatic formatting (``pre-commit run -a``) 148 | 5. Add your code! 149 | 6. Add and run tests (``pytest``) 150 | 7. Update and check documentation compiles (``sphinx-build -M html ".\docs" ".\docs\_build"``) 151 | 8. Commit your changes (``git commit -am 'Add some fooBar``) 152 | 9. Push to the branch (``git push origin feature/fooBar``) 153 | 10. Create a new Pull Request 154 | 155 | .. _poetry: https://python-poetry.org/ 156 | .. _anaconda: https://www.anaconda.com/distribution/#download-section 157 | 158 | 159 | Citation 160 | -------- 161 | 162 | If this package has been useful to you, please cite the following DOI: https://doi.org/10.5281/zenodo.2667464 163 | 164 | 165 | License 166 | -------- 167 | 168 | Distributed under the GNU General Public License v3. 169 | 170 | 171 | References 172 | ---------- 173 | 174 | .. [#vit17] Vitousek, Sean, Patrick L. Barnard, Charles H. Fletcher, Neil Frazer, 175 | Li Erikson, and Curt D. Storlazzi. "Doubling of Coastal Flooding Frequency 176 | within Decades Due to Sea-Level Rise." Scientific Reports 7, no. 1 (May 18, 177 | 2017): 1399. https://doi.org/10.1038/s41598-017-01362-7. 178 | .. [#sto06] Stockdon, Hilary F., Robert A. Holman, Peter A. Howd, and Asbury H. Sallenger. 179 | "Empirical Parameterization of Setup, Swash, and Runup." Coastal Engineering 53, 180 | no. 7 (May 1, 2006): 573-88. https://doi.org/10.1016/j.coastaleng.2005.12.005 181 | .. [#cem06] United States, Army, and Corps of Engineers. Coastal Engineering Manual. 182 | Washington, D.C.: U.S. Army Corps of Engineers, 2006. 183 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | # Need to remove auto generated examples as well 15 | clean: 16 | rm -rf $(BUILDDIR)/* 17 | rm -rf auto_examples/ 18 | 19 | .PHONY: help Makefile 20 | 21 | # Catch-all target: route all unknown targets to Sphinx using the new 22 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 23 | %: Makefile 24 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/_static/VitousekDoubling2017Fig1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisleaman/py-wave-runup/f75a5551544d9e54d0e74dc94d8aaa119f80d62b/docs/_static/VitousekDoubling2017Fig1.jpg -------------------------------------------------------------------------------- /docs/background.rst: -------------------------------------------------------------------------------- 1 | 2 | Background 3 | ---------- 4 | 5 | Wave runup refers to the final part of a wave's journey as it travels from offshore 6 | onto the beach. It is observable by anyone who goes to the beach and watches the edge 7 | of the water "runup" and rundown the beach. It is comprised of two components: 8 | 9 | - **setup**: the height of the time averaged superelevation of the mean water level 10 | above the Still Water Level (SWL) 11 | - **swash**: the height of the time varying fluctuation of the instantaneous water 12 | level about the setup elevation 13 | 14 | Setup, swash and other components of Total Water Level (TWL) rise are shown in this 15 | handy figure below. 16 | 17 | .. image:: ./_static/VitousekDoubling2017Fig1.jpg 18 | .. 19 | 20 | | Figure from Vitousek et al. (2017) [#vit17]_ 21 | 22 | Wave runup can contribute a significant portion of the increase in TWL in coastal 23 | storms causing erosion and inundation. For example, Stockdon et al. (2006) [#sto06]_ 24 | collated data from numerous experiments, some of which showed wave runup 2% excedence 25 | heights in excess of 3 m during some storms. 26 | 27 | Given the impact such a large increase in TWL can have on coastlines, there has been 28 | much research conducted to try improve our understanding of wave runup processes. 29 | Although there are many processes which can influence wave runup (such as nonlinear 30 | wave transformation, wave reflection, three-dimensional effects, porosity, roughness, 31 | permeability and groundwater) [#cem06]_, many attempts have been made to derive 32 | empirical relatinoships based on easily measurable parameters. Typically, empirical 33 | wave runup models include: 34 | 35 | - **Hs**: significant wave height 36 | - **Tp**: peak wave length 37 | - **beta**: beach slope 38 | 39 | This python package attempts to consolidate the work done by others in this field and 40 | collate the numerous empirical relationships for wave runup which have been published. 41 | 42 | -------- 43 | 44 | .. [#vit17] Vitousek, Sean, Patrick L. Barnard, Charles H. Fletcher, Neil Frazer, 45 | Li Erikson, and Curt D. Storlazzi. "Doubling of Coastal Flooding Frequency 46 | within Decades Due to Sea-Level Rise." Scientific Reports 7, no. 1 (May 18, 47 | 2017): 1399. https://doi.org/10.1038/s41598-017-01362-7. 48 | .. [#sto06] Stockdon, Hilary F., Robert A. Holman, Peter A. Howd, and Asbury H. Sallenger. 49 | "Empirical Parameterization of Setup, Swash, and Runup." Coastal Engineering 53, 50 | no. 7 (May 1, 2006): 573-88. https://doi.org/10.1016/j.coastaleng.2005.12.005 51 | .. [#cem06] United States, Army, and Corps of Engineers. Coastal Engineering Manual. 52 | Washington, D.C.: U.S. Army Corps of Engineers, 2006. 53 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # http://www.sphinx-doc.org/en/master/config 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | import os 14 | import sys 15 | 16 | import tomlkit 17 | 18 | sys.path.insert(0, os.path.abspath("../py_wave_runup/")) 19 | 20 | 21 | # -- Project information ----------------------------------------------------- 22 | 23 | # Get project version from pyproject.toml file 24 | # https://github.com/python-poetry/poetry/issues/273#issuecomment-427647628 25 | def _get_project_meta(): 26 | with open("../pyproject.toml") as pyproject: 27 | file_contents = pyproject.read() 28 | return tomlkit.parse(file_contents)["tool"]["poetry"] 29 | 30 | 31 | project = "py-wave-runup" 32 | copyright = "2019, Chris Leaman" 33 | author = "Chris Leaman" 34 | 35 | # The full version, including alpha/beta/rc tags 36 | pkg_meta = _get_project_meta() 37 | release = str(pkg_meta["version"]) 38 | 39 | # -- General configuration --------------------------------------------------- 40 | # Add any Sphinx extension module names here, as strings. They can be 41 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 42 | # ones. 43 | extensions = [ 44 | "sphinx.ext.autodoc", 45 | "sphinx.ext.mathjax", 46 | "sphinx.ext.napoleon", 47 | "sphinx.ext.autosummary", 48 | "sphinx_gallery.gen_gallery", 49 | "sphinx.ext.doctest", 50 | "sphinx.ext.intersphinx", 51 | ] 52 | 53 | # Add any paths that contain templates here, relative to this directory. 54 | templates_path = ["_templates"] 55 | 56 | # List of patterns, relative to source directory, that match files and 57 | # directories to ignore when looking for source files. 58 | # This pattern also affects html_static_path and html_extra_path. 59 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] 60 | 61 | # The master toctree document. 62 | master_doc = "index" 63 | 64 | sphinx_gallery_conf = { 65 | "examples_dirs": "../examples", # path to your example scripts 66 | "gallery_dirs": "auto_examples", # path to where to save gallery generated output 67 | "download_all_examples": False, 68 | } 69 | 70 | source_suffix = ".rst" 71 | autoclass_content = "both" 72 | 73 | autodoc_default_options = { 74 | "members": True, 75 | } 76 | autosummary_generate = True 77 | 78 | intersphinx_mapping = { 79 | "python": ("https://docs.python.org/3", None), 80 | "pandas": ( 81 | "http://pandas.pydata.org/pandas-docs/stable/", 82 | "http://pandas.pydata.org/pandas-docs/stable/objects.inv", 83 | ), 84 | "numpy": ( 85 | "https://docs.scipy.org/doc/numpy/", 86 | "https://docs.scipy.org/doc/numpy/objects.inv", 87 | ), 88 | } 89 | 90 | # -- Options for HTML output ------------------------------------------------- 91 | 92 | # The theme to use for HTML and HTML Help pages. See the documentation for 93 | # a list of builtin themes. 94 | # 95 | html_theme = "alabaster" 96 | 97 | # Add any paths that contain custom static files (such as style sheets) here, 98 | # relative to this directory. They are copied after the builtin static files, 99 | # so a file named "default.css" will overwrite the builtin "default.css". 100 | html_static_path = ["_static"] 101 | 102 | pygments_style = "sphinx" 103 | 104 | html_sidebars = { 105 | "**": ["about.html", "navigation.html", "relations.html", "searchbox.html"] 106 | } 107 | 108 | html_theme_options = { 109 | "description": "Empirical wave runup models implemented in Python for coastal engineers and scientists.", 110 | "github_user": "chrisleaman", 111 | "github_repo": "py-wave-runup", 112 | "fixed_sidebar": True, 113 | "github_button": True, 114 | } 115 | 116 | # Autodoc options 117 | 118 | # Define what classes to skip 119 | def autodoc_skip_member(app, what, name, obj, skip, options): 120 | exclusions = ("RunupModel",) 121 | exclude = name in exclusions 122 | return skip or exclude 123 | 124 | 125 | def setup(app): 126 | app.connect("autodoc-skip-member", autodoc_skip_member) 127 | 128 | 129 | # Define order 130 | autodoc_member_order = "bysource" 131 | -------------------------------------------------------------------------------- /docs/datasets.rst: -------------------------------------------------------------------------------- 1 | Datasets 2 | ========= 3 | 4 | .. automodule:: datasets 5 | :members: 6 | :undoc-members: 7 | 8 | .. autosummary:: 9 | :nosignatures: 10 | 11 | load_power18 12 | load_random_sto06 13 | -------------------------------------------------------------------------------- /docs/ensembles.rst: -------------------------------------------------------------------------------- 1 | Ensemble models 2 | ========================== 3 | 4 | .. automodule:: ensembles 5 | :members: 6 | :undoc-members: 7 | 8 | .. autosummary:: 9 | :nosignatures: 10 | 11 | EnsembleRaw 12 | EnsembleMean -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | Python Wave Runup 2 | ================= 3 | 4 | 5 | .. image:: https://img.shields.io/pypi/v/py-wave-runup.svg 6 | :target: https://pypi.python.org/pypi/py-wave-runup 7 | 8 | .. image:: https://img.shields.io/travis/com/chrisleaman/py-wave-runup.svg 9 | :target: https://travis-ci.com/chrisleaman/py-wave-runup 10 | 11 | .. image:: https://readthedocs.org/projects/py-wave-runup/badge/?version=latest 12 | :target: https://py-wave-runup.readthedocs.io/en/latest/?badge=latest 13 | :alt: Documentation Status 14 | 15 | .. image:: https://codecov.io/gh/chrisleaman/py-wave-runup/branch/master/graph/badge.svg 16 | :target: https://codecov.io/gh/chrisleaman/py-wave-runup 17 | 18 | .. image:: https://img.shields.io/badge/code%20style-black-000000.svg 19 | :target: https://github.com/ambv/black 20 | 21 | .. image:: https://api.dependabot.com/badges/status?host=github&identifier=180274721 22 | :target: https://dependabot.com 23 | :alt: Updates 24 | 25 | **py-wave-runup** is a Python module which makes it easy for coastal engineers and 26 | scientists to test and use various empirical wave runup models which have been 27 | published in literature. 28 | 29 | To get started, check out the sections below: 30 | 31 | Contents 32 | ~~~~~~~~ 33 | 34 | .. toctree:: 35 | :maxdepth: 2 36 | 37 | background 38 | installation 39 | usage 40 | models 41 | ensembles 42 | datasets 43 | auto_examples/index 44 | 45 | -------------------------------------------------------------------------------- /docs/installation.rst: -------------------------------------------------------------------------------- 1 | 2 | Installation 3 | ------------ 4 | 5 | If you don't have Python installed, Anaconda_ is an easy way to get up and running with Python. 6 | 7 | .. _Anaconda: https://docs.anaconda.com/anaconda/install/ 8 | 9 | 10 | Installation of ``py-wave-runup`` can be done with ``pip``. Run this command in your 11 | terminal of choice to grab the latest release of this package: 12 | 13 | .. code:: bash 14 | 15 | pip install py-wave-runup 16 | 17 | If you've installed an older version and want to upgrade to the latest version, run 18 | this command: 19 | 20 | .. code:: bash 21 | 22 | pip install --upgrade py-wave-runup 23 | 24 | After you're up and running, head on over to :doc:`usage` for some examples of what 25 | you can do. 26 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/models.rst: -------------------------------------------------------------------------------- 1 | Wave runup models 2 | ========================= 3 | 4 | .. automodule:: models 5 | :members: 6 | :undoc-members: 7 | 8 | .. autosummary:: 9 | :nosignatures: 10 | 11 | Stockdon2006 12 | Power2018 13 | Holman1986 14 | Nielsen2009 15 | Ruggiero2001 16 | Vousdoukas2012 17 | Senechal2011 18 | Beuzen2019 19 | Passarella2018 20 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | codecov==2.*,>=2.0.0 2 | coverage==5.*,>=5.0.0 3 | joblib==0.*,>=0.14.1 4 | numpy==1.*,>=1.16.0 5 | pandas==0.*,>=0.25.3 6 | pytest==5.*,>=5.3.0 7 | pytest-cov==2.*,>=2.8.0 8 | pytest-runner==5.*,>=5.1.0 9 | scikit-learn==0.*,>=0.22.0 10 | sphinx==2.*,>=2.3.0 11 | sphinx-gallery==0.*,>=0.5.0 12 | tomlkit==0.*,>=0.5.8 13 | tox==3.*,>=3.13.0 14 | -------------------------------------------------------------------------------- /docs/usage.rst: -------------------------------------------------------------------------------- 1 | Usage 2 | ----- 3 | 4 | First, make sure that the package is :doc:`installed `. 5 | 6 | Now, we import the ``models`` module from ``py_wave_runup``. This is where all our 7 | empirical wave runup models are stored. 8 | 9 | .. code:: python 10 | 11 | from py_wave_runup import models 12 | 13 | Then, we can pick a model from the :doc:`list of available wave runup models 14 | ` to use. Here we defined the wave height, wave period and slope used to 15 | calculate runup using the Stockdon et al. (2006) model. 16 | 17 | .. code:: python 18 | 19 | model_sto06 = models.Stockdon2006(Hs=4, Tp=12, beta=0.1) 20 | 21 | Our model now gives us access to our wave runup parameter which have been calculated 22 | using the model. 23 | 24 | .. code:: python 25 | 26 | model_sto06.R2 # 2.54 27 | model_sto06.setup # 0.96 28 | model_sto06.sinc # 2.06 29 | model_sto06.sig # 1.65 30 | 31 | .. tip:: 32 | You can find more usage examples :doc:`here`. -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: py-wave-runup 2 | channels: 3 | - conda-forge 4 | - defaults 5 | dependencies: 6 | - black <20.0,>=18.3 7 | - codecov ==2.*,>=2.0.0 8 | - coverage ==5.*,>=5.0.0 9 | - joblib ==0.*,>=0.14.1 10 | - numpy ==1.*,>=1.16.0 11 | - pandas ==0.*,>=0.25.3 12 | - pre-commit ==1.*,>=1.18.0 13 | - pytest ==5.*,>=5.3.0 14 | - pytest-cov ==2.*,>=2.8.0 15 | - pytest-runner ==5.*,>=5.1.0 16 | - scikit-learn ==0.*,>=0.22.0 17 | - sphinx ==2.*,>=2.3.0 18 | - sphinx-gallery ==0.*,>=0.5.0 19 | - tox ==3.*,>=3.13.0 20 | - tomlkit ==0.*,>=0.5.8 21 | -------------------------------------------------------------------------------- /examples/README.rst: -------------------------------------------------------------------------------- 1 | Examples 2 | ~~~~~~~~ 3 | 4 | Here we show examples of how to apply py-wave-runup in practice: -------------------------------------------------------------------------------- /examples/plot_stockdon.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Assessing Stockdon et al (2006) runup model 4 | =========================================== 5 | 6 | 7 | In this example, we will evaluate the accuracy of the Stockdon et al (2006) runup 8 | model. To do this, we will use the compiled wave runup observations provided by Power 9 | et al (2018). 10 | 11 | The Stockdon et al (2006) wave runup model comprises of two relationships, one for 12 | dissipative beaches (i.e. :math:`\\zeta < 0.3`) Eqn (18): 13 | 14 | .. math:: R_{2} = 0.043(H_{s}L_{p})^{0.5} 15 | 16 | and a seperate relationship for intermediate and reflective beaches (i.e. 17 | :math:`\\zeta > 0.3`): 18 | 19 | .. math:: 20 | 21 | R_{2} = 1.1 \\left( 0.35 \\beta (H_{s}L_{p})^{0.5} + \\frac{H_{s}L_{p}( 22 | 0.563 \\beta^{2} +0.004)^{0.5}}{2} \\right) 23 | 24 | First, let's import our required packages: 25 | """ 26 | ############################################# 27 | import matplotlib.pyplot as plt 28 | import numpy as np 29 | from sklearn.metrics import mean_squared_error, r2_score 30 | 31 | import py_wave_runup 32 | 33 | ############################################# 34 | # Let's import the Power et al (2018) runup data, which is included in this 35 | # package. 36 | 37 | df = py_wave_runup.datasets.load_power18() 38 | print(df.head()) 39 | 40 | ############################################# 41 | # We can see that this dataset gives us :math:`H_{s}` (significant wave height), 42 | # :math:`T_{p}` (peak wave period), :math:`\tan \beta` (beach slope). Let's import 43 | # the Stockdon runup model and calculate the estimated :math:`R_{2}` runup value for 44 | # each row in this dataset. 45 | 46 | # Initalize the Stockdon 2006 model with values from the dataset 47 | sto06 = py_wave_runup.models.Stockdon2006(Hs=df.hs, Tp=df.tp, beta=df.beta) 48 | 49 | # Append a new column at the end of our dataset with Stockdon 2006 R2 estimations 50 | df["sto06_r2"] = sto06.R2 51 | 52 | # Check the first few rows of observed vs. modelled R2 53 | print(df[["r2", "sto06_r2"]].head()) 54 | 55 | ############################################# 56 | # Now let's create a plot of observed R2 values vs. predicted R2 values: 57 | 58 | # Plot data 59 | fig, ax1 = plt.subplots(1, 1, figsize=(4, 4), dpi=300) 60 | ax1.plot(df.r2, df.sto06_r2, "b.", markersize=2, linewidth=0.5) 61 | 62 | # Add 1:1 line to indicate perfect fit 63 | ax1.plot([0, 12], [0, 12], "k-") 64 | 65 | # Add axis labels 66 | ax1.set_xlabel("Observed R2 (m)") 67 | ax1.set_ylabel("Modelled R2 (m)") 68 | ax1.set_title("Stockdon et al. (2006) Runup Model") 69 | 70 | plt.tight_layout() 71 | 72 | ############################################# 73 | # We can see there is a fair amount of scatter, especially as we get larger wave 74 | # runup heights. This indicates that the model might not be working as well as we 75 | # might have hoped. 76 | # 77 | # Let's also check RMSE and coefficient of determination values: 78 | 79 | print(f"R2 Score: {r2_score(df.r2, df.sto06_r2):.2f}") 80 | print(f"RMSE: {np.sqrt(mean_squared_error(df.r2, df.sto06_r2)):.2f} m") 81 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | category = "dev" 3 | description = "A configurable sidebar-enabled Sphinx theme" 4 | name = "alabaster" 5 | optional = false 6 | python-versions = "*" 7 | version = "0.7.12" 8 | 9 | [[package]] 10 | category = "dev" 11 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 12 | name = "appdirs" 13 | optional = false 14 | python-versions = "*" 15 | version = "1.4.4" 16 | 17 | [[package]] 18 | category = "dev" 19 | description = "Atomic file writes." 20 | marker = "sys_platform == \"win32\"" 21 | name = "atomicwrites" 22 | optional = false 23 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 24 | version = "1.4.0" 25 | 26 | [[package]] 27 | category = "dev" 28 | description = "Classes Without Boilerplate" 29 | name = "attrs" 30 | optional = false 31 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 32 | version = "21.2.0" 33 | 34 | [package.extras] 35 | dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] 36 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 37 | tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 38 | tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 39 | 40 | [[package]] 41 | category = "dev" 42 | description = "Internationalization utilities" 43 | name = "babel" 44 | optional = false 45 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 46 | version = "2.9.1" 47 | 48 | [package.dependencies] 49 | pytz = ">=2015.7" 50 | 51 | [[package]] 52 | category = "dev" 53 | description = "The uncompromising code formatter." 54 | name = "black" 55 | optional = false 56 | python-versions = ">=3.6.2" 57 | version = "21.6b0" 58 | 59 | [package.dependencies] 60 | appdirs = "*" 61 | click = ">=7.1.2" 62 | mypy-extensions = ">=0.4.3" 63 | pathspec = ">=0.8.1,<1" 64 | regex = ">=2020.1.8" 65 | toml = ">=0.10.1" 66 | 67 | [package.dependencies.typed-ast] 68 | python = "<3.8" 69 | version = ">=1.4.2" 70 | 71 | [package.dependencies.typing-extensions] 72 | python = "<3.8" 73 | version = ">=3.7.4" 74 | 75 | [package.extras] 76 | colorama = ["colorama (>=0.4.3)"] 77 | d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] 78 | python2 = ["typed-ast (>=1.4.2)"] 79 | uvloop = ["uvloop (>=0.15.2)"] 80 | 81 | [[package]] 82 | category = "dev" 83 | description = "Python package for providing Mozilla's CA Bundle." 84 | name = "certifi" 85 | optional = false 86 | python-versions = "*" 87 | version = "2021.5.30" 88 | 89 | [[package]] 90 | category = "dev" 91 | description = "Validate configuration and produce human readable error messages." 92 | name = "cfgv" 93 | optional = false 94 | python-versions = ">=3.6.1" 95 | version = "3.3.0" 96 | 97 | [[package]] 98 | category = "dev" 99 | description = "Universal encoding detector for Python 2 and 3" 100 | name = "chardet" 101 | optional = false 102 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 103 | version = "4.0.0" 104 | 105 | [[package]] 106 | category = "dev" 107 | description = "Composable command line interface toolkit" 108 | name = "click" 109 | optional = false 110 | python-versions = ">=3.6" 111 | version = "8.0.1" 112 | 113 | [package.dependencies] 114 | colorama = "*" 115 | 116 | [package.dependencies.importlib-metadata] 117 | python = "<3.8" 118 | version = "*" 119 | 120 | [[package]] 121 | category = "dev" 122 | description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" 123 | name = "codecov" 124 | optional = false 125 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 126 | version = "2.1.11" 127 | 128 | [package.dependencies] 129 | coverage = "*" 130 | requests = ">=2.7.9" 131 | 132 | [[package]] 133 | category = "dev" 134 | description = "Cross-platform colored terminal text." 135 | marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" 136 | name = "colorama" 137 | optional = false 138 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 139 | version = "0.4.4" 140 | 141 | [[package]] 142 | category = "dev" 143 | description = "Code coverage measurement for Python" 144 | name = "coverage" 145 | optional = false 146 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 147 | version = "5.5" 148 | 149 | [package.extras] 150 | toml = ["toml"] 151 | 152 | [[package]] 153 | category = "dev" 154 | description = "Composable style cycles" 155 | name = "cycler" 156 | optional = false 157 | python-versions = "*" 158 | version = "0.10.0" 159 | 160 | [package.dependencies] 161 | six = "*" 162 | 163 | [[package]] 164 | category = "dev" 165 | description = "Distribution utilities" 166 | name = "distlib" 167 | optional = false 168 | python-versions = "*" 169 | version = "0.3.2" 170 | 171 | [[package]] 172 | category = "dev" 173 | description = "Docutils -- Python Documentation Utilities" 174 | name = "docutils" 175 | optional = false 176 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 177 | version = "0.17.1" 178 | 179 | [[package]] 180 | category = "dev" 181 | description = "A platform independent file lock." 182 | name = "filelock" 183 | optional = false 184 | python-versions = "*" 185 | version = "3.0.12" 186 | 187 | [[package]] 188 | category = "dev" 189 | description = "File identification library for Python" 190 | name = "identify" 191 | optional = false 192 | python-versions = ">=3.6.1" 193 | version = "2.2.10" 194 | 195 | [package.extras] 196 | license = ["editdistance-s"] 197 | 198 | [[package]] 199 | category = "dev" 200 | description = "Internationalized Domain Names in Applications (IDNA)" 201 | name = "idna" 202 | optional = false 203 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 204 | version = "2.10" 205 | 206 | [[package]] 207 | category = "dev" 208 | description = "Getting image size from png/jpeg/jpeg2000/gif file" 209 | name = "imagesize" 210 | optional = false 211 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 212 | version = "1.2.0" 213 | 214 | [[package]] 215 | category = "dev" 216 | description = "Read metadata from Python packages" 217 | marker = "python_version < \"3.8\"" 218 | name = "importlib-metadata" 219 | optional = false 220 | python-versions = ">=3.6" 221 | version = "4.6.1" 222 | 223 | [package.dependencies] 224 | zipp = ">=0.5" 225 | 226 | [package.dependencies.typing-extensions] 227 | python = "<3.8" 228 | version = ">=3.6.4" 229 | 230 | [package.extras] 231 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 232 | perf = ["ipython"] 233 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 234 | 235 | [[package]] 236 | category = "dev" 237 | description = "iniconfig: brain-dead simple config-ini parsing" 238 | name = "iniconfig" 239 | optional = false 240 | python-versions = "*" 241 | version = "1.1.1" 242 | 243 | [[package]] 244 | category = "dev" 245 | description = "A very fast and expressive template engine." 246 | name = "jinja2" 247 | optional = false 248 | python-versions = ">=3.6" 249 | version = "3.0.1" 250 | 251 | [package.dependencies] 252 | MarkupSafe = ">=2.0" 253 | 254 | [package.extras] 255 | i18n = ["Babel (>=2.7)"] 256 | 257 | [[package]] 258 | category = "main" 259 | description = "Lightweight pipelining: using Python functions as pipeline jobs." 260 | name = "joblib" 261 | optional = false 262 | python-versions = "*" 263 | version = "0.14.1" 264 | 265 | [[package]] 266 | category = "dev" 267 | description = "A fast implementation of the Cassowary constraint solver" 268 | name = "kiwisolver" 269 | optional = false 270 | python-versions = ">=3.6" 271 | version = "1.3.1" 272 | 273 | [[package]] 274 | category = "dev" 275 | description = "Safely add untrusted strings to HTML/XML markup." 276 | name = "markupsafe" 277 | optional = false 278 | python-versions = ">=3.6" 279 | version = "2.0.1" 280 | 281 | [[package]] 282 | category = "dev" 283 | description = "Python plotting package" 284 | name = "matplotlib" 285 | optional = false 286 | python-versions = ">=3.7" 287 | version = "3.4.2" 288 | 289 | [package.dependencies] 290 | cycler = ">=0.10" 291 | kiwisolver = ">=1.0.1" 292 | numpy = ">=1.16" 293 | pillow = ">=6.2.0" 294 | pyparsing = ">=2.2.1" 295 | python-dateutil = ">=2.7" 296 | 297 | [[package]] 298 | category = "dev" 299 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 300 | name = "mypy-extensions" 301 | optional = false 302 | python-versions = "*" 303 | version = "0.4.3" 304 | 305 | [[package]] 306 | category = "dev" 307 | description = "Node.js virtual environment builder" 308 | name = "nodeenv" 309 | optional = false 310 | python-versions = "*" 311 | version = "1.6.0" 312 | 313 | [[package]] 314 | category = "main" 315 | description = "NumPy is the fundamental package for array computing with Python." 316 | name = "numpy" 317 | optional = false 318 | python-versions = ">=3.7" 319 | version = "1.21.0" 320 | 321 | [[package]] 322 | category = "dev" 323 | description = "Core utilities for Python packages" 324 | name = "packaging" 325 | optional = false 326 | python-versions = ">=3.6" 327 | version = "21.0" 328 | 329 | [package.dependencies] 330 | pyparsing = ">=2.0.2" 331 | 332 | [[package]] 333 | category = "main" 334 | description = "Powerful data structures for data analysis, time series, and statistics" 335 | name = "pandas" 336 | optional = false 337 | python-versions = ">=3.6.1" 338 | version = "1.1.5" 339 | 340 | [package.dependencies] 341 | numpy = ">=1.15.4" 342 | python-dateutil = ">=2.7.3" 343 | pytz = ">=2017.2" 344 | 345 | [package.extras] 346 | test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] 347 | 348 | [[package]] 349 | category = "dev" 350 | description = "Utility library for gitignore style pattern matching of file paths." 351 | name = "pathspec" 352 | optional = false 353 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 354 | version = "0.8.1" 355 | 356 | [[package]] 357 | category = "dev" 358 | description = "Python Imaging Library (Fork)" 359 | name = "pillow" 360 | optional = false 361 | python-versions = ">=3.6" 362 | version = "8.3.1" 363 | 364 | [[package]] 365 | category = "dev" 366 | description = "plugin and hook calling mechanisms for python" 367 | name = "pluggy" 368 | optional = false 369 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 370 | version = "0.13.1" 371 | 372 | [package.dependencies] 373 | [package.dependencies.importlib-metadata] 374 | python = "<3.8" 375 | version = ">=0.12" 376 | 377 | [package.extras] 378 | dev = ["pre-commit", "tox"] 379 | 380 | [[package]] 381 | category = "dev" 382 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 383 | name = "pre-commit" 384 | optional = false 385 | python-versions = ">=3.6.1" 386 | version = "2.13.0" 387 | 388 | [package.dependencies] 389 | cfgv = ">=2.0.0" 390 | identify = ">=1.0.0" 391 | nodeenv = ">=0.11.1" 392 | pyyaml = ">=5.1" 393 | toml = "*" 394 | virtualenv = ">=20.0.8" 395 | 396 | [package.dependencies.importlib-metadata] 397 | python = "<3.8" 398 | version = "*" 399 | 400 | [[package]] 401 | category = "dev" 402 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 403 | name = "py" 404 | optional = false 405 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 406 | version = "1.10.0" 407 | 408 | [[package]] 409 | category = "dev" 410 | description = "Pygments is a syntax highlighting package written in Python." 411 | name = "pygments" 412 | optional = false 413 | python-versions = ">=3.5" 414 | version = "2.9.0" 415 | 416 | [[package]] 417 | category = "dev" 418 | description = "Python parsing module" 419 | name = "pyparsing" 420 | optional = false 421 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 422 | version = "2.4.7" 423 | 424 | [[package]] 425 | category = "dev" 426 | description = "pytest: simple powerful testing with Python" 427 | name = "pytest" 428 | optional = false 429 | python-versions = ">=3.6" 430 | version = "6.2.4" 431 | 432 | [package.dependencies] 433 | atomicwrites = ">=1.0" 434 | attrs = ">=19.2.0" 435 | colorama = "*" 436 | iniconfig = "*" 437 | packaging = "*" 438 | pluggy = ">=0.12,<1.0.0a1" 439 | py = ">=1.8.2" 440 | toml = "*" 441 | 442 | [package.dependencies.importlib-metadata] 443 | python = "<3.8" 444 | version = ">=0.12" 445 | 446 | [package.extras] 447 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 448 | 449 | [[package]] 450 | category = "dev" 451 | description = "Pytest plugin for measuring coverage." 452 | name = "pytest-cov" 453 | optional = false 454 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 455 | version = "2.12.1" 456 | 457 | [package.dependencies] 458 | coverage = ">=5.2.1" 459 | pytest = ">=4.6" 460 | toml = "*" 461 | 462 | [package.extras] 463 | testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] 464 | 465 | [[package]] 466 | category = "dev" 467 | description = "Invoke py.test as distutils command with dependency resolution" 468 | name = "pytest-runner" 469 | optional = false 470 | python-versions = ">=3.6" 471 | version = "5.3.1" 472 | 473 | [package.extras] 474 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 475 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-virtualenv", "pytest-black (>=0.3.7)", "pytest-mypy"] 476 | 477 | [[package]] 478 | category = "main" 479 | description = "Extensions to the standard Python datetime module" 480 | name = "python-dateutil" 481 | optional = false 482 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 483 | version = "2.8.1" 484 | 485 | [package.dependencies] 486 | six = ">=1.5" 487 | 488 | [[package]] 489 | category = "main" 490 | description = "World timezone definitions, modern and historical" 491 | name = "pytz" 492 | optional = false 493 | python-versions = "*" 494 | version = "2021.1" 495 | 496 | [[package]] 497 | category = "dev" 498 | description = "YAML parser and emitter for Python" 499 | name = "pyyaml" 500 | optional = false 501 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 502 | version = "5.4.1" 503 | 504 | [[package]] 505 | category = "dev" 506 | description = "Alternative regular expression module, to replace re." 507 | name = "regex" 508 | optional = false 509 | python-versions = "*" 510 | version = "2021.7.6" 511 | 512 | [[package]] 513 | category = "dev" 514 | description = "Python HTTP for Humans." 515 | name = "requests" 516 | optional = false 517 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 518 | version = "2.25.1" 519 | 520 | [package.dependencies] 521 | certifi = ">=2017.4.17" 522 | chardet = ">=3.0.2,<5" 523 | idna = ">=2.5,<3" 524 | urllib3 = ">=1.21.1,<1.27" 525 | 526 | [package.extras] 527 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] 528 | socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] 529 | 530 | [[package]] 531 | category = "dev" 532 | description = "A set of python modules for machine learning and data mining" 533 | name = "scikit-learn" 534 | optional = false 535 | python-versions = ">=3.6" 536 | version = "0.24.2" 537 | 538 | [package.dependencies] 539 | joblib = ">=0.11" 540 | numpy = ">=1.13.3" 541 | scipy = ">=0.19.1" 542 | threadpoolctl = ">=2.0.0" 543 | 544 | [package.extras] 545 | benchmark = ["matplotlib (>=2.1.1)", "pandas (>=0.25.0)", "memory-profiler (>=0.57.0)"] 546 | docs = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)", "memory-profiler (>=0.57.0)", "sphinx (>=3.2.0)", "sphinx-gallery (>=0.7.0)", "numpydoc (>=1.0.0)", "Pillow (>=7.1.2)", "sphinx-prompt (>=1.3.0)"] 547 | examples = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)"] 548 | tests = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "flake8 (>=3.8.2)", "mypy (>=0.770)", "pyamg (>=4.0.0)"] 549 | 550 | [[package]] 551 | category = "dev" 552 | description = "SciPy: Scientific Library for Python" 553 | name = "scipy" 554 | optional = false 555 | python-versions = ">=3.7" 556 | version = "1.6.1" 557 | 558 | [package.dependencies] 559 | numpy = ">=1.16.5" 560 | 561 | [[package]] 562 | category = "main" 563 | description = "Python 2 and 3 compatibility utilities" 564 | name = "six" 565 | optional = false 566 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 567 | version = "1.16.0" 568 | 569 | [[package]] 570 | category = "dev" 571 | description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." 572 | name = "snowballstemmer" 573 | optional = false 574 | python-versions = "*" 575 | version = "2.1.0" 576 | 577 | [[package]] 578 | category = "dev" 579 | description = "Python documentation generator" 580 | name = "sphinx" 581 | optional = false 582 | python-versions = ">=3.6" 583 | version = "4.0.3" 584 | 585 | [package.dependencies] 586 | Jinja2 = ">=2.3" 587 | Pygments = ">=2.0" 588 | alabaster = ">=0.7,<0.8" 589 | babel = ">=1.3" 590 | colorama = ">=0.3.5" 591 | docutils = ">=0.14,<0.18" 592 | imagesize = "*" 593 | packaging = "*" 594 | requests = ">=2.5.0" 595 | setuptools = "*" 596 | snowballstemmer = ">=1.1" 597 | sphinxcontrib-applehelp = "*" 598 | sphinxcontrib-devhelp = "*" 599 | sphinxcontrib-htmlhelp = "*" 600 | sphinxcontrib-jsmath = "*" 601 | sphinxcontrib-qthelp = "*" 602 | sphinxcontrib-serializinghtml = "*" 603 | 604 | [package.extras] 605 | docs = ["sphinxcontrib-websupport"] 606 | lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] 607 | test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] 608 | 609 | [[package]] 610 | category = "dev" 611 | description = "A Sphinx extension that builds an HTML version of any Python script and puts it into an examples gallery." 612 | name = "sphinx-gallery" 613 | optional = false 614 | python-versions = ">=3.6" 615 | version = "0.9.0" 616 | 617 | [package.dependencies] 618 | sphinx = ">=1.8.3" 619 | 620 | [[package]] 621 | category = "dev" 622 | description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" 623 | name = "sphinxcontrib-applehelp" 624 | optional = false 625 | python-versions = ">=3.5" 626 | version = "1.0.2" 627 | 628 | [package.extras] 629 | lint = ["flake8", "mypy", "docutils-stubs"] 630 | test = ["pytest"] 631 | 632 | [[package]] 633 | category = "dev" 634 | description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." 635 | name = "sphinxcontrib-devhelp" 636 | optional = false 637 | python-versions = ">=3.5" 638 | version = "1.0.2" 639 | 640 | [package.extras] 641 | lint = ["flake8", "mypy", "docutils-stubs"] 642 | test = ["pytest"] 643 | 644 | [[package]] 645 | category = "dev" 646 | description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" 647 | name = "sphinxcontrib-htmlhelp" 648 | optional = false 649 | python-versions = ">=3.6" 650 | version = "2.0.0" 651 | 652 | [package.extras] 653 | lint = ["flake8", "mypy", "docutils-stubs"] 654 | test = ["pytest", "html5lib"] 655 | 656 | [[package]] 657 | category = "dev" 658 | description = "A sphinx extension which renders display math in HTML via JavaScript" 659 | name = "sphinxcontrib-jsmath" 660 | optional = false 661 | python-versions = ">=3.5" 662 | version = "1.0.1" 663 | 664 | [package.extras] 665 | test = ["pytest", "flake8", "mypy"] 666 | 667 | [[package]] 668 | category = "dev" 669 | description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." 670 | name = "sphinxcontrib-qthelp" 671 | optional = false 672 | python-versions = ">=3.5" 673 | version = "1.0.3" 674 | 675 | [package.extras] 676 | lint = ["flake8", "mypy", "docutils-stubs"] 677 | test = ["pytest"] 678 | 679 | [[package]] 680 | category = "dev" 681 | description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." 682 | name = "sphinxcontrib-serializinghtml" 683 | optional = false 684 | python-versions = ">=3.5" 685 | version = "1.1.5" 686 | 687 | [package.extras] 688 | lint = ["flake8", "mypy", "docutils-stubs"] 689 | test = ["pytest"] 690 | 691 | [[package]] 692 | category = "dev" 693 | description = "threadpoolctl" 694 | name = "threadpoolctl" 695 | optional = false 696 | python-versions = ">=3.5" 697 | version = "2.1.0" 698 | 699 | [[package]] 700 | category = "dev" 701 | description = "Python Library for Tom's Obvious, Minimal Language" 702 | name = "toml" 703 | optional = false 704 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 705 | version = "0.10.2" 706 | 707 | [[package]] 708 | category = "dev" 709 | description = "Style preserving TOML library" 710 | name = "tomlkit" 711 | optional = false 712 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 713 | version = "0.7.2" 714 | 715 | [[package]] 716 | category = "dev" 717 | description = "tox is a generic virtualenv management and test command line tool" 718 | name = "tox" 719 | optional = false 720 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 721 | version = "3.23.1" 722 | 723 | [package.dependencies] 724 | colorama = ">=0.4.1" 725 | filelock = ">=3.0.0" 726 | packaging = ">=14" 727 | pluggy = ">=0.12.0" 728 | py = ">=1.4.17" 729 | six = ">=1.14.0" 730 | toml = ">=0.9.4" 731 | virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" 732 | 733 | [package.dependencies.importlib-metadata] 734 | python = "<3.8" 735 | version = ">=0.12" 736 | 737 | [package.extras] 738 | docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] 739 | testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "pytest-xdist (>=1.22.2)", "pathlib2 (>=2.3.3)"] 740 | 741 | [[package]] 742 | category = "dev" 743 | description = "a fork of Python 2 and 3 ast modules with type comment support" 744 | marker = "python_version < \"3.8\"" 745 | name = "typed-ast" 746 | optional = false 747 | python-versions = "*" 748 | version = "1.4.3" 749 | 750 | [[package]] 751 | category = "dev" 752 | description = "Backported and Experimental Type Hints for Python 3.5+" 753 | marker = "python_version < \"3.8\"" 754 | name = "typing-extensions" 755 | optional = false 756 | python-versions = "*" 757 | version = "3.10.0.0" 758 | 759 | [[package]] 760 | category = "dev" 761 | description = "HTTP library with thread-safe connection pooling, file post, and more." 762 | name = "urllib3" 763 | optional = false 764 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 765 | version = "1.26.6" 766 | 767 | [package.extras] 768 | brotli = ["brotlipy (>=0.6.0)"] 769 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 770 | socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] 771 | 772 | [[package]] 773 | category = "dev" 774 | description = "Virtual Python Environment builder" 775 | name = "virtualenv" 776 | optional = false 777 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 778 | version = "20.4.7" 779 | 780 | [package.dependencies] 781 | appdirs = ">=1.4.3,<2" 782 | distlib = ">=0.3.1,<1" 783 | filelock = ">=3.0.0,<4" 784 | six = ">=1.9.0,<2" 785 | 786 | [package.dependencies.importlib-metadata] 787 | python = "<3.8" 788 | version = ">=0.12" 789 | 790 | [package.extras] 791 | docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] 792 | testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] 793 | 794 | [[package]] 795 | category = "dev" 796 | description = "Backport of pathlib-compatible object wrapper for zip files" 797 | marker = "python_version < \"3.8\"" 798 | name = "zipp" 799 | optional = false 800 | python-versions = ">=3.6" 801 | version = "3.5.0" 802 | 803 | [package.extras] 804 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 805 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] 806 | 807 | [metadata] 808 | content-hash = "7cbf458bfc0a5128170d0cb7ac050e827ae09a5fdf29739df319600ed0c8044f" 809 | python-versions = "^3.7 || ^3.8 || ^3.9" 810 | 811 | [metadata.files] 812 | alabaster = [ 813 | {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, 814 | {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, 815 | ] 816 | appdirs = [ 817 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 818 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 819 | ] 820 | atomicwrites = [ 821 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 822 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 823 | ] 824 | attrs = [ 825 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 826 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 827 | ] 828 | babel = [ 829 | {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, 830 | {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, 831 | ] 832 | black = [ 833 | {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, 834 | {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, 835 | ] 836 | certifi = [ 837 | {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, 838 | {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, 839 | ] 840 | cfgv = [ 841 | {file = "cfgv-3.3.0-py2.py3-none-any.whl", hash = "sha256:b449c9c6118fe8cca7fa5e00b9ec60ba08145d281d52164230a69211c5d597a1"}, 842 | {file = "cfgv-3.3.0.tar.gz", hash = "sha256:9e600479b3b99e8af981ecdfc80a0296104ee610cab48a5ae4ffd0b668650eb1"}, 843 | ] 844 | chardet = [ 845 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, 846 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, 847 | ] 848 | click = [ 849 | {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, 850 | {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, 851 | ] 852 | codecov = [ 853 | {file = "codecov-2.1.11-py2.py3-none-any.whl", hash = "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8"}, 854 | {file = "codecov-2.1.11-py3.8.egg", hash = "sha256:e95901d4350e99fc39c8353efa450050d2446c55bac91d90fcfd2354e19a6aef"}, 855 | {file = "codecov-2.1.11.tar.gz", hash = "sha256:6cde272454009d27355f9434f4e49f238c0273b216beda8472a65dc4957f473b"}, 856 | ] 857 | colorama = [ 858 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 859 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 860 | ] 861 | coverage = [ 862 | {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, 863 | {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, 864 | {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, 865 | {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, 866 | {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, 867 | {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, 868 | {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, 869 | {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, 870 | {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, 871 | {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, 872 | {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, 873 | {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, 874 | {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, 875 | {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, 876 | {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, 877 | {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, 878 | {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, 879 | {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, 880 | {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, 881 | {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, 882 | {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, 883 | {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, 884 | {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, 885 | {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, 886 | {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, 887 | {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, 888 | {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, 889 | {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, 890 | {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, 891 | {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, 892 | {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, 893 | {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, 894 | {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, 895 | {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, 896 | {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, 897 | {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, 898 | {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, 899 | {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, 900 | {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, 901 | {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, 902 | {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, 903 | {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, 904 | {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, 905 | {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, 906 | {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, 907 | {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, 908 | {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, 909 | {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, 910 | {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, 911 | {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, 912 | {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, 913 | {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, 914 | ] 915 | cycler = [ 916 | {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, 917 | {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, 918 | ] 919 | distlib = [ 920 | {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"}, 921 | {file = "distlib-0.3.2.zip", hash = "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"}, 922 | ] 923 | docutils = [ 924 | {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, 925 | {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, 926 | ] 927 | filelock = [ 928 | {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, 929 | {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, 930 | ] 931 | identify = [ 932 | {file = "identify-2.2.10-py2.py3-none-any.whl", hash = "sha256:18d0c531ee3dbc112fa6181f34faa179de3f57ea57ae2899754f16a7e0ff6421"}, 933 | {file = "identify-2.2.10.tar.gz", hash = "sha256:5b41f71471bc738e7b586308c3fca172f78940195cb3bf6734c1e66fdac49306"}, 934 | ] 935 | idna = [ 936 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, 937 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, 938 | ] 939 | imagesize = [ 940 | {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, 941 | {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, 942 | ] 943 | importlib-metadata = [ 944 | {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, 945 | {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, 946 | ] 947 | iniconfig = [ 948 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 949 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 950 | ] 951 | jinja2 = [ 952 | {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, 953 | {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, 954 | ] 955 | joblib = [ 956 | {file = "joblib-0.14.1-py2.py3-none-any.whl", hash = "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"}, 957 | {file = "joblib-0.14.1.tar.gz", hash = "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8"}, 958 | ] 959 | kiwisolver = [ 960 | {file = "kiwisolver-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd34fbbfbc40628200730bc1febe30631347103fc8d3d4fa012c21ab9c11eca9"}, 961 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d3155d828dec1d43283bd24d3d3e0d9c7c350cdfcc0bd06c0ad1209c1bbc36d0"}, 962 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5a7a7dbff17e66fac9142ae2ecafb719393aaee6a3768c9de2fd425c63b53e21"}, 963 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f8d6f8db88049a699817fd9178782867bf22283e3813064302ac59f61d95be05"}, 964 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:5f6ccd3dd0b9739edcf407514016108e2280769c73a85b9e59aa390046dbf08b"}, 965 | {file = "kiwisolver-1.3.1-cp36-cp36m-win32.whl", hash = "sha256:225e2e18f271e0ed8157d7f4518ffbf99b9450fca398d561eb5c4a87d0986dd9"}, 966 | {file = "kiwisolver-1.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cf8b574c7b9aa060c62116d4181f3a1a4e821b2ec5cbfe3775809474113748d4"}, 967 | {file = "kiwisolver-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:232c9e11fd7ac3a470d65cd67e4359eee155ec57e822e5220322d7b2ac84fbf0"}, 968 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b38694dcdac990a743aa654037ff1188c7a9801ac3ccc548d3341014bc5ca278"}, 969 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ca3820eb7f7faf7f0aa88de0e54681bddcb46e485beb844fcecbcd1c8bd01689"}, 970 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fd0f1ae9d92b42854b2979024d7597685ce4ada367172ed7c09edf2cef9cb8"}, 971 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:1e1bc12fb773a7b2ffdeb8380609f4f8064777877b2225dec3da711b421fda31"}, 972 | {file = "kiwisolver-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:72c99e39d005b793fb7d3d4e660aed6b6281b502e8c1eaf8ee8346023c8e03bc"}, 973 | {file = "kiwisolver-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8be8d84b7d4f2ba4ffff3665bcd0211318aa632395a1a41553250484a871d454"}, 974 | {file = "kiwisolver-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31dfd2ac56edc0ff9ac295193eeaea1c0c923c0355bf948fbd99ed6018010b72"}, 975 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:563c649cfdef27d081c84e72a03b48ea9408c16657500c312575ae9d9f7bc1c3"}, 976 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:78751b33595f7f9511952e7e60ce858c6d64db2e062afb325985ddbd34b5c131"}, 977 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a357fd4f15ee49b4a98b44ec23a34a95f1e00292a139d6015c11f55774ef10de"}, 978 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:5989db3b3b34b76c09253deeaf7fbc2707616f130e166996606c284395da3f18"}, 979 | {file = "kiwisolver-1.3.1-cp38-cp38-win32.whl", hash = "sha256:c08e95114951dc2090c4a630c2385bef681cacf12636fb0241accdc6b303fd81"}, 980 | {file = "kiwisolver-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:44a62e24d9b01ba94ae7a4a6c3fb215dc4af1dde817e7498d901e229aaf50e4e"}, 981 | {file = "kiwisolver-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50af681a36b2a1dee1d3c169ade9fdc59207d3c31e522519181e12f1b3ba7000"}, 982 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a53d27d0c2a0ebd07e395e56a1fbdf75ffedc4a05943daf472af163413ce9598"}, 983 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:834ee27348c4aefc20b479335fd422a2c69db55f7d9ab61721ac8cd83eb78882"}, 984 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c3e6455341008a054cccee8c5d24481bcfe1acdbc9add30aa95798e95c65621"}, 985 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:acef3d59d47dd85ecf909c359d0fd2c81ed33bdff70216d3956b463e12c38a54"}, 986 | {file = "kiwisolver-1.3.1-cp39-cp39-win32.whl", hash = "sha256:c5518d51a0735b1e6cee1fdce66359f8d2b59c3ca85dc2b0813a8aa86818a030"}, 987 | {file = "kiwisolver-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b9edd0110a77fc321ab090aaa1cfcaba1d8499850a12848b81be2222eab648f6"}, 988 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0cd53f403202159b44528498de18f9285b04482bab2a6fc3f5dd8dbb9352e30d"}, 989 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:33449715e0101e4d34f64990352bce4095c8bf13bed1b390773fc0a7295967b3"}, 990 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:401a2e9afa8588589775fe34fc22d918ae839aaaf0c0e96441c0fdbce6d8ebe6"}, 991 | {file = "kiwisolver-1.3.1.tar.gz", hash = "sha256:950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248"}, 992 | ] 993 | markupsafe = [ 994 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 995 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 996 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 997 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 998 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 999 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 1000 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 1001 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 1002 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 1003 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 1004 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 1005 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 1006 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 1007 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 1008 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 1009 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 1010 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 1011 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 1012 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 1013 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 1014 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 1015 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 1016 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 1017 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 1018 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 1019 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 1020 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 1021 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 1022 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 1023 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 1024 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 1025 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 1026 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 1027 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 1028 | ] 1029 | matplotlib = [ 1030 | {file = "matplotlib-3.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c541ee5a3287efe066bbe358320853cf4916bc14c00c38f8f3d8d75275a405a9"}, 1031 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3a5c18dbd2c7c366da26a4ad1462fe3e03a577b39e3b503bbcf482b9cdac093c"}, 1032 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a9d8cb5329df13e0cdaa14b3b43f47b5e593ec637f13f14db75bb16e46178b05"}, 1033 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:7ad19f3fb6145b9eb41c08e7cbb9f8e10b91291396bee21e9ce761bb78df63ec"}, 1034 | {file = "matplotlib-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:7a58f3d8fe8fac3be522c79d921c9b86e090a59637cb88e3bc51298d7a2c862a"}, 1035 | {file = "matplotlib-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6382bc6e2d7e481bcd977eb131c31dee96e0fb4f9177d15ec6fb976d3b9ace1a"}, 1036 | {file = "matplotlib-3.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a6a44f27aabe720ec4fd485061e8a35784c2b9ffa6363ad546316dfc9cea04e"}, 1037 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1c1779f7ab7d8bdb7d4c605e6ffaa0614b3e80f1e3c8ccf7b9269a22dbc5986b"}, 1038 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5826f56055b9b1c80fef82e326097e34dc4af8c7249226b7dd63095a686177d1"}, 1039 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0bea5ec5c28d49020e5d7923c2725b837e60bc8be99d3164af410eb4b4c827da"}, 1040 | {file = "matplotlib-3.4.2-cp38-cp38-win32.whl", hash = "sha256:6475d0209024a77f869163ec3657c47fed35d9b6ed8bccba8aa0f0099fbbdaa8"}, 1041 | {file = "matplotlib-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:21b31057bbc5e75b08e70a43cefc4c0b2c2f1b1a850f4a0f7af044eb4163086c"}, 1042 | {file = "matplotlib-3.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b26535b9de85326e6958cdef720ecd10bcf74a3f4371bf9a7e5b2e659c17e153"}, 1043 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:32fa638cc10886885d1ca3d409d4473d6a22f7ceecd11322150961a70fab66dd"}, 1044 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:956c8849b134b4a343598305a3ca1bdd3094f01f5efc8afccdebeffe6b315247"}, 1045 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:85f191bb03cb1a7b04b5c2cca4792bef94df06ef473bc49e2818105671766fee"}, 1046 | {file = "matplotlib-3.4.2-cp39-cp39-win32.whl", hash = "sha256:b1d5a2cedf5de05567c441b3a8c2651fbde56df08b82640e7f06c8cd91e201f6"}, 1047 | {file = "matplotlib-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:df815378a754a7edd4559f8c51fc7064f779a74013644a7f5ac7a0c31f875866"}, 1048 | {file = "matplotlib-3.4.2.tar.gz", hash = "sha256:d8d994cefdff9aaba45166eb3de4f5211adb4accac85cbf97137e98f26ea0219"}, 1049 | ] 1050 | mypy-extensions = [ 1051 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 1052 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 1053 | ] 1054 | nodeenv = [ 1055 | {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, 1056 | {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, 1057 | ] 1058 | numpy = [ 1059 | {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"}, 1060 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"}, 1061 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"}, 1062 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"}, 1063 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"}, 1064 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"}, 1065 | {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"}, 1066 | {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"}, 1067 | {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"}, 1068 | {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"}, 1069 | {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"}, 1070 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"}, 1071 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"}, 1072 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"}, 1073 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"}, 1074 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"}, 1075 | {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"}, 1076 | {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"}, 1077 | {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"}, 1078 | {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"}, 1079 | {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"}, 1080 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"}, 1081 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"}, 1082 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"}, 1083 | {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"}, 1084 | {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"}, 1085 | {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"}, 1086 | {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"}, 1087 | ] 1088 | packaging = [ 1089 | {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, 1090 | {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, 1091 | ] 1092 | pandas = [ 1093 | {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"}, 1094 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"}, 1095 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"}, 1096 | {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"}, 1097 | {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"}, 1098 | {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"}, 1099 | {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"}, 1100 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"}, 1101 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"}, 1102 | {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"}, 1103 | {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"}, 1104 | {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"}, 1105 | {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"}, 1106 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"}, 1107 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"}, 1108 | {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"}, 1109 | {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"}, 1110 | {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"}, 1111 | {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"}, 1112 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"}, 1113 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"}, 1114 | {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"}, 1115 | {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"}, 1116 | {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"}, 1117 | ] 1118 | pathspec = [ 1119 | {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, 1120 | {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, 1121 | ] 1122 | pillow = [ 1123 | {file = "Pillow-8.3.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd"}, 1124 | {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723"}, 1125 | {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04"}, 1126 | {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37"}, 1127 | {file = "Pillow-8.3.1-cp36-cp36m-win32.whl", hash = "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229"}, 1128 | {file = "Pillow-8.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de"}, 1129 | {file = "Pillow-8.3.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14"}, 1130 | {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab"}, 1131 | {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf"}, 1132 | {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0"}, 1133 | {file = "Pillow-8.3.1-cp37-cp37m-win32.whl", hash = "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba"}, 1134 | {file = "Pillow-8.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500"}, 1135 | {file = "Pillow-8.3.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4"}, 1136 | {file = "Pillow-8.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e"}, 1137 | {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79"}, 1138 | {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae"}, 1139 | {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844"}, 1140 | {file = "Pillow-8.3.1-cp38-cp38-win32.whl", hash = "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367"}, 1141 | {file = "Pillow-8.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8"}, 1142 | {file = "Pillow-8.3.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e"}, 1143 | {file = "Pillow-8.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856"}, 1144 | {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82"}, 1145 | {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc"}, 1146 | {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83"}, 1147 | {file = "Pillow-8.3.1-cp39-cp39-win32.whl", hash = "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d"}, 1148 | {file = "Pillow-8.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8"}, 1149 | {file = "Pillow-8.3.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf"}, 1150 | {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63"}, 1151 | {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636"}, 1152 | {file = "Pillow-8.3.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d"}, 1153 | {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77"}, 1154 | {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8"}, 1155 | {file = "Pillow-8.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4"}, 1156 | {file = "Pillow-8.3.1.tar.gz", hash = "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792"}, 1157 | ] 1158 | pluggy = [ 1159 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 1160 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 1161 | ] 1162 | pre-commit = [ 1163 | {file = "pre_commit-2.13.0-py2.py3-none-any.whl", hash = "sha256:b679d0fddd5b9d6d98783ae5f10fd0c4c59954f375b70a58cbe1ce9bcf9809a4"}, 1164 | {file = "pre_commit-2.13.0.tar.gz", hash = "sha256:764972c60693dc668ba8e86eb29654ec3144501310f7198742a767bec385a378"}, 1165 | ] 1166 | py = [ 1167 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, 1168 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, 1169 | ] 1170 | pygments = [ 1171 | {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, 1172 | {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, 1173 | ] 1174 | pyparsing = [ 1175 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 1176 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 1177 | ] 1178 | pytest = [ 1179 | {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, 1180 | {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, 1181 | ] 1182 | pytest-cov = [ 1183 | {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, 1184 | {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, 1185 | ] 1186 | pytest-runner = [ 1187 | {file = "pytest-runner-5.3.1.tar.gz", hash = "sha256:0fce5b8dc68760f353979d99fdd6b3ad46330b6b1837e2077a89ebcf204aac91"}, 1188 | {file = "pytest_runner-5.3.1-py3-none-any.whl", hash = "sha256:85f93af814438ee322b4ea08fe3f5c2ad53b253577f3bd84b2ad451fee450ac5"}, 1189 | ] 1190 | python-dateutil = [ 1191 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, 1192 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, 1193 | ] 1194 | pytz = [ 1195 | {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, 1196 | {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, 1197 | ] 1198 | pyyaml = [ 1199 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, 1200 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, 1201 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, 1202 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, 1203 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, 1204 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, 1205 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, 1206 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, 1207 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, 1208 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, 1209 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, 1210 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, 1211 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, 1212 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, 1213 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, 1214 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, 1215 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, 1216 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, 1217 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, 1218 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, 1219 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, 1220 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, 1221 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, 1222 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, 1223 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, 1224 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, 1225 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, 1226 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, 1227 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, 1228 | ] 1229 | regex = [ 1230 | {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, 1231 | {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, 1232 | {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, 1233 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, 1234 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, 1235 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, 1236 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, 1237 | {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, 1238 | {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, 1239 | {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, 1240 | {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, 1241 | {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, 1242 | {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, 1243 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, 1244 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, 1245 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, 1246 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, 1247 | {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, 1248 | {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, 1249 | {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, 1250 | {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, 1251 | {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, 1252 | {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, 1253 | {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, 1254 | {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, 1255 | {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, 1256 | {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, 1257 | {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, 1258 | {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, 1259 | {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, 1260 | {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, 1261 | {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, 1262 | {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, 1263 | {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, 1264 | {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, 1265 | {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, 1266 | {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, 1267 | {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, 1268 | {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, 1269 | {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, 1270 | {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, 1271 | ] 1272 | requests = [ 1273 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, 1274 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, 1275 | ] 1276 | scikit-learn = [ 1277 | {file = "scikit-learn-0.24.2.tar.gz", hash = "sha256:d14701a12417930392cd3898e9646cf5670c190b933625ebe7511b1f7d7b8736"}, 1278 | {file = "scikit_learn-0.24.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:d5bf9c863ba4717b3917b5227463ee06860fc43931dc9026747de416c0a10fee"}, 1279 | {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5beaeb091071625e83f5905192d8aecde65ba2f26f8b6719845bbf586f7a04a1"}, 1280 | {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:06ffdcaaf81e2a3b1b50c3ac6842cfb13df2d8b737d61f64643ed61da7389cde"}, 1281 | {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:fec42690a2eb646b384eafb021c425fab48991587edb412d4db77acc358b27ce"}, 1282 | {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:5ff3e4e4cf7592d36541edec434e09fb8ab9ba6b47608c4ffe30c9038d301897"}, 1283 | {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:3cbd734e1aefc7c5080e6b6973fe062f97c26a1cdf1a991037ca196ce1c8f427"}, 1284 | {file = "scikit_learn-0.24.2-cp36-cp36m-win32.whl", hash = "sha256:f74429a07fedb36a03c159332b914e6de757176064f9fed94b5f79ebac07d913"}, 1285 | {file = "scikit_learn-0.24.2-cp36-cp36m-win_amd64.whl", hash = "sha256:dd968a174aa82f3341a615a033fa6a8169e9320cbb46130686562db132d7f1f0"}, 1286 | {file = "scikit_learn-0.24.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:49ec0b1361da328da9bb7f1a162836028e72556356adeb53342f8fae6b450d47"}, 1287 | {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f18c3ed484eeeaa43a0d45dc2efb4d00fc6542ccdcfa2c45d7b635096a2ae534"}, 1288 | {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cdf24c1b9bbeb4936456b42ac5bd32c60bb194a344951acb6bfb0cddee5439a4"}, 1289 | {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d177fe1ff47cc235942d628d41ee5b1c6930d8f009f1a451c39b5411e8d0d4cf"}, 1290 | {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f3ec00f023d84526381ad0c0f2cff982852d035c921bbf8ceb994f4886c00c64"}, 1291 | {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ae19ac105cf7ce8c205a46166992fdec88081d6e783ab6e38ecfbe45729f3c39"}, 1292 | {file = "scikit_learn-0.24.2-cp37-cp37m-win32.whl", hash = "sha256:f0ed4483c258fb23150e31b91ea7d25ff8495dba108aea0b0d4206a777705350"}, 1293 | {file = "scikit_learn-0.24.2-cp37-cp37m-win_amd64.whl", hash = "sha256:39b7e3b71bcb1fe46397185d6c1a5db1c441e71c23c91a31e7ad8cc3f7305f9a"}, 1294 | {file = "scikit_learn-0.24.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:90a297330f608adeb4d2e9786c6fda395d3150739deb3d42a86d9a4c2d15bc1d"}, 1295 | {file = "scikit_learn-0.24.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f1d2108e770907540b5248977e4cff9ffaf0f73d0d13445ee938df06ca7579c6"}, 1296 | {file = "scikit_learn-0.24.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1eec963fe9ffc827442c2e9333227c4d49749a44e592f305398c1db5c1563393"}, 1297 | {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:2db429090b98045d71218a9ba913cc9b3fe78e0ba0b6b647d8748bc6d5a44080"}, 1298 | {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:62214d2954377fcf3f31ec867dd4e436df80121e7a32947a0b3244f58f45e455"}, 1299 | {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8fac72b9688176922f9f54fda1ba5f7ffd28cbeb9aad282760186e8ceba9139a"}, 1300 | {file = "scikit_learn-0.24.2-cp38-cp38-win32.whl", hash = "sha256:ae426e3a52842c6b6d77d00f906b6031c8c2cfdfabd6af7511bb4bc9a68d720e"}, 1301 | {file = "scikit_learn-0.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:038f4e9d6ef10e1f3fe82addc3a14735c299866eb10f2c77c090410904828312"}, 1302 | {file = "scikit_learn-0.24.2-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:48f273836e19901ba2beecd919f7b352f09310ce67c762f6e53bc6b81cacf1f0"}, 1303 | {file = "scikit_learn-0.24.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a2a47449093dcf70babc930beba2ca0423cb7df2fa5fd76be5260703d67fa574"}, 1304 | {file = "scikit_learn-0.24.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0e71ce9c7cbc20f6f8b860107ce15114da26e8675238b4b82b7e7cd37ca0c087"}, 1305 | {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2754c85b2287333f9719db7f23fb7e357f436deed512db3417a02bf6f2830aa5"}, 1306 | {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7be1b88c23cfac46e06404582215a917017cd2edaa2e4d40abe6aaff5458f24b"}, 1307 | {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4e6198675a6f9d333774671bd536668680eea78e2e81c0b19e57224f58d17f37"}, 1308 | {file = "scikit_learn-0.24.2-cp39-cp39-win32.whl", hash = "sha256:cbdb0b3db99dd1d5f69d31b4234367d55475add31df4d84a3bd690ef017b55e2"}, 1309 | {file = "scikit_learn-0.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:40556bea1ef26ef54bc678d00cf138a63069144a0b5f3a436eecd8f3468b903e"}, 1310 | ] 1311 | scipy = [ 1312 | {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, 1313 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, 1314 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, 1315 | {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, 1316 | {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, 1317 | {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, 1318 | {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, 1319 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, 1320 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, 1321 | {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, 1322 | {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, 1323 | {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, 1324 | {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, 1325 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, 1326 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, 1327 | {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, 1328 | {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, 1329 | {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, 1330 | {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, 1331 | ] 1332 | six = [ 1333 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1334 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1335 | ] 1336 | snowballstemmer = [ 1337 | {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, 1338 | {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, 1339 | ] 1340 | sphinx = [ 1341 | {file = "Sphinx-4.0.3-py3-none-any.whl", hash = "sha256:5747f3c855028076fcff1e4df5e75e07c836f0ac11f7df886747231092cfe4ad"}, 1342 | {file = "Sphinx-4.0.3.tar.gz", hash = "sha256:dff357e6a208eb7edb2002714733ac21a9fe597e73609ff417ab8cf0c6b4fbb8"}, 1343 | ] 1344 | sphinx-gallery = [ 1345 | {file = "sphinx-gallery-0.9.0.tar.gz", hash = "sha256:14a2ecbfc172a5623f11d1cb9a5a9e21d5e2e65b76bb6f2174ca8a544f86fe93"}, 1346 | ] 1347 | sphinxcontrib-applehelp = [ 1348 | {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, 1349 | {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, 1350 | ] 1351 | sphinxcontrib-devhelp = [ 1352 | {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, 1353 | {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, 1354 | ] 1355 | sphinxcontrib-htmlhelp = [ 1356 | {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, 1357 | {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, 1358 | ] 1359 | sphinxcontrib-jsmath = [ 1360 | {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, 1361 | {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, 1362 | ] 1363 | sphinxcontrib-qthelp = [ 1364 | {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, 1365 | {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, 1366 | ] 1367 | sphinxcontrib-serializinghtml = [ 1368 | {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, 1369 | {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, 1370 | ] 1371 | threadpoolctl = [ 1372 | {file = "threadpoolctl-2.1.0-py3-none-any.whl", hash = "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725"}, 1373 | {file = "threadpoolctl-2.1.0.tar.gz", hash = "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b"}, 1374 | ] 1375 | toml = [ 1376 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1377 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1378 | ] 1379 | tomlkit = [ 1380 | {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, 1381 | {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, 1382 | ] 1383 | tox = [ 1384 | {file = "tox-3.23.1-py2.py3-none-any.whl", hash = "sha256:b0b5818049a1c1997599d42012a637a33f24c62ab8187223fdd318fa8522637b"}, 1385 | {file = "tox-3.23.1.tar.gz", hash = "sha256:307a81ddb82bd463971a273f33e9533a24ed22185f27db8ce3386bff27d324e3"}, 1386 | ] 1387 | typed-ast = [ 1388 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, 1389 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, 1390 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, 1391 | {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, 1392 | {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, 1393 | {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, 1394 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, 1395 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, 1396 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, 1397 | {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, 1398 | {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, 1399 | {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, 1400 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, 1401 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, 1402 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, 1403 | {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, 1404 | {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, 1405 | {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, 1406 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, 1407 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, 1408 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, 1409 | {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, 1410 | {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, 1411 | {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, 1412 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, 1413 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, 1414 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, 1415 | {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, 1416 | {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, 1417 | {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, 1418 | ] 1419 | typing-extensions = [ 1420 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, 1421 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, 1422 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, 1423 | ] 1424 | urllib3 = [ 1425 | {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, 1426 | {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, 1427 | ] 1428 | virtualenv = [ 1429 | {file = "virtualenv-20.4.7-py2.py3-none-any.whl", hash = "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76"}, 1430 | {file = "virtualenv-20.4.7.tar.gz", hash = "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467"}, 1431 | ] 1432 | zipp = [ 1433 | {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, 1434 | {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, 1435 | ] 1436 | -------------------------------------------------------------------------------- /py_wave_runup/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.1.8" 2 | 3 | from . import datasets, ensembles, models 4 | -------------------------------------------------------------------------------- /py_wave_runup/datasets.py: -------------------------------------------------------------------------------- 1 | """ 2 | This module is an interface for loading existing wave runup datasets. These datasets 3 | can be used to evaluate existing models or train new models. Datasets are returned as 4 | :obj:`pandas.DataFrame`. 5 | """ 6 | 7 | import io 8 | import pkgutil 9 | import random 10 | from datetime import datetime, timedelta 11 | 12 | import numpy as np 13 | import pandas as pd 14 | from sklearn.preprocessing import minmax_scale 15 | 16 | from py_wave_runup import models 17 | from py_wave_runup.utils import PerlinNoise 18 | 19 | 20 | def load_power18(): 21 | """ 22 | Loads wave runup data included with Power et al (2018) 23 | 24 | This function loads the supplementary data from: 25 | 26 | Power, H.E., Gharabaghi, B., Bonakdari, H., Robertson, B., Atkinson, A.L., 27 | Baldock, T.E., 2018. Prediction of wave runup on beaches using 28 | Gene-Expression Programming and empirical relationships. Coastal Engineering. 29 | https://doi.org/10.1016/j.coastaleng.2018.10.006 30 | 31 | Examples: 32 | >>> from py_wave_runup import datasets 33 | >>> df = datasets.load_power18() 34 | >>> df.describe() 35 | hs tp beta roughness r2 36 | count 1390.000000 1390.000000 1390.000000 1390.000000 1390.000000 37 | mean 1.893131 9.227035 0.120612 0.024779 2.318814 38 | std 1.309243 3.589004 0.062236 0.043617 1.776918 39 | min 0.018576 0.805805 0.009000 0.000003 0.027336 40 | 25% 0.895942 7.517556 0.088228 0.001000 1.103500 41 | 50% 1.848050 9.963089 0.108422 0.003750 1.923500 42 | 75% 2.391756 10.995500 0.129220 0.007500 3.406660 43 | max 7.174100 23.680333 0.286551 0.125000 12.669592 44 | 45 | """ 46 | 47 | # To load a resource in a package, need to use pkgutil. 48 | # Refer https://stackoverflow.com/a/6028106 49 | data = pkgutil.get_data(__name__, "datasets/power18.csv") 50 | 51 | # Manually define names for each column 52 | names = [ 53 | "dataset", 54 | "beach", 55 | "case", 56 | "lab_field", 57 | "hs", 58 | "tp", 59 | "beta", 60 | "d50", 61 | "roughness", 62 | "r2", 63 | ] 64 | 65 | # Need to use the io package to read in the .csv 66 | # Refer to https://stackoverflow.com/a/20697069 67 | df = pd.read_csv(io.BytesIO(data), encoding="utf8", names=names, skiprows=1) 68 | 69 | return df 70 | 71 | 72 | def load_random_sto06( 73 | seed=12345, 74 | t_start=datetime(2000, 1, 1), 75 | t_end=datetime(2000, 1, 2), 76 | dt=timedelta(hours=1), 77 | hs_range=(1, 3), 78 | tp_range=(6, 10), 79 | beta_range=(0.08, 0.1), 80 | noise_std=0.3, 81 | ): 82 | 83 | """ 84 | Loads a randomly generated wave runup dataframe. 85 | 86 | This function returns a randomly generated :obj:`pandas.DataFrame` containing wave 87 | parameters and noisey runup values calculated using the Stockdon et al (2006) runup 88 | model. This random data is intended to be used to demonstrate runup analysis 89 | without having to use actual data 90 | 91 | Args: 92 | seed (:obj:`int`): Seed the random number generator 93 | t_start (:obj:`datetime.datetime`): Start time of the dataframe 94 | t_end (:obj:`datetime.datetime`): End time of the dataframe 95 | dt (:obj:`datetime.timedelta`): Time interval of the dataframe 96 | hs_range (:obj:`tuple`): Range (`min`, `max`) of the significant wave height 97 | tp_range (:obj:`tuple`): Range (`min`, `max`) of the peak wave period 98 | beta_range (:obj:`tuple`): Range (`min`, `max`) of the nearshore slope 99 | noise_std (:obj:`float`): Standard deviation (in meters) of the wave runup 100 | statistics. 101 | 102 | Returns: 103 | A :obj:`pandas.DataFrame` 104 | 105 | Examples: 106 | Get 107 | 108 | >>> from py_wave_runup import datasets 109 | >>> df = datasets.load_random_sto06() 110 | >>> df.head() 111 | hs tp beta ... swash sig sinc 112 | 2000-01-01 00:00:00 3.000000 6.000000 0.098110 ... 1.171474 0.717714 0.894084 113 | 2000-01-01 01:00:00 2.850109 6.128432 0.099052 ... 1.378190 0.919351 1.104072 114 | 2000-01-01 02:00:00 2.865462 6.461471 0.099766 ... 1.154970 0.664189 0.866796 115 | 2000-01-01 03:00:00 2.942888 6.750824 0.100000 ... 1.223142 0.701520 0.918580 116 | 2000-01-01 04:00:00 2.906808 6.937742 0.099069 ... 2.001251 1.476527 1.687905 117 | 118 | [5 rows x 8 columns] 119 | """ 120 | 121 | # Create the time index for our dataframe 122 | index = pd.date_range(start=t_start, end=t_end, freq=dt) 123 | df = pd.DataFrame(index=index) 124 | 125 | # Create some random noise 126 | random.seed(seed) 127 | np.random.seed(seed) 128 | pn = PerlinNoise(num_octaves=7, persistence=0.5) 129 | 130 | # Generate input parameters. Note that we offset the noise value by the length of 131 | # the index to avoid having the same timeseries shape for each parameter. 132 | l = len(index) 133 | hs = minmax_scale([pn.noise(i) for i, _ in enumerate(index)], hs_range) 134 | tp = minmax_scale([pn.noise(i + l) for i, _ in enumerate(index)], tp_range) 135 | beta = minmax_scale([pn.noise(i + 2 * l) for i, _ in enumerate(index)], beta_range) 136 | 137 | # Generate wave parameters based on Stockdon 138 | model = models.Stockdon2006(Hs=hs, Tp=tp, beta=beta) 139 | 140 | # Generate additional noise 141 | noise = np.random.normal(0, noise_std, l) 142 | 143 | # Combine into a dataframe 144 | df["hs"] = hs 145 | df["tp"] = tp 146 | df["beta"] = beta 147 | df["r2"] = model.R2 + noise 148 | df["setup"] = model.setup + noise 149 | df["swash"] = model.swash + noise 150 | df["sig"] = model.sig + noise 151 | df["sinc"] = model.sinc + noise 152 | 153 | return df 154 | -------------------------------------------------------------------------------- /py_wave_runup/datasets/beuzen18/generate_beuzen18_model.py: -------------------------------------------------------------------------------- 1 | """ 2 | File to manually generate new Beuzen18 model. A new model file needs to be generated 3 | each time sklearn gets updated to a new version. 4 | 5 | Code and data copied from: 6 | https://github.com/TomasBeuzen/BeuzenEtAl_2019_NHESS_GP_runup_model/blob/master/paper_code/Beuzen_et_al_2019_code.ipynb 7 | """ 8 | 9 | import pandas as pd 10 | from joblib import dump, load 11 | from sklearn.gaussian_process import GaussianProcessRegressor 12 | from sklearn.gaussian_process.kernels import RBF, WhiteKernel 13 | 14 | 15 | def main(): 16 | df = pd.read_csv("lidar_runup_data_for_GP_training.csv", index_col=0) 17 | 18 | # Define features and response data 19 | X = df.drop( 20 | columns=df.columns[-1] 21 | ) # Drop the last column to retain input features (Hs, Tp, slope) 22 | y = df[[df.columns[-1]]] # The last column is the predictand (R2) 23 | 24 | # Specify the kernel to use in the GP 25 | kernel = RBF(0.1, (1e-2, 1e2)) + WhiteKernel(1, (1e-2, 1e2)) 26 | 27 | # Train GP model on training dataset 28 | gp = GaussianProcessRegressor( 29 | kernel=kernel, n_restarts_optimizer=9, normalize_y=True, random_state=123 30 | ) 31 | gp.fit(X, y) 32 | 33 | dump(gp, "gp_runup_model.joblib") 34 | 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /py_wave_runup/datasets/beuzen18/gp_runup_model.joblib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisleaman/py-wave-runup/f75a5551544d9e54d0e74dc94d8aaa119f80d62b/py_wave_runup/datasets/beuzen18/gp_runup_model.joblib -------------------------------------------------------------------------------- /py_wave_runup/datasets/beuzen18/lidar_runup_data_for_GP_training.csv: -------------------------------------------------------------------------------- 1 | idx,Hs,Tp,beach_slope,runup 2 | 0,4.5503657230000005,11.56048539,0.06397070099999999,2.397470589 3 | 1,0.08420311300000001,7.7069290310000005,0.11563533599999999,0.07409659099999999 4 | 2,1.7033237380000001,10.74572024,0.224945106,1.922730795 5 | 3,2.100108195,6.817402545,0.014640546,0.994934305 6 | 4,0.596324749,15.4053954,0.132848295,1.0129679870000001 7 | 5,0.679992387,6.208592904,0.127863275,1.357981343 8 | 6,3.077303103,10.25306099,0.139847947,1.1897661929999999 9 | 7,0.8298278920000001,12.61839034,0.008780478000000001,0.33530636 10 | 8,1.454580585,12.49859355,0.11581285,2.643169066 11 | 9,2.992502777,10.11855898,0.05535376,2.104307689 12 | 10,0.874323427,4.228012334,0.017150178000000002,0.391039973 13 | 11,1.652985058,7.275451036000001,0.12775567300000001,0.49399626 14 | 12,1.5729528819999998,12.31885748,0.072218129,1.4015755140000001 15 | 13,1.9469012540000001,6.045662365,0.179151118,1.284222137 16 | 14,0.5000503270000001,9.650839362000001,0.182025635,0.72674616 17 | 15,0.41675331600000004,3.33184203,0.16967244199999998,0.5454716860000001 18 | 16,0.954435667,14.65427325,0.154035551,0.241282845 19 | 17,0.625190372,8.753507267,0.074448994,0.749374256 20 | 18,0.723331265,11.45980413,0.158231885,1.628063257 21 | 19,2.016655811,11.43216443,0.18679527699999998,1.148192321 22 | 20,2.347289306,11.14525657,0.09568212,0.76927254 23 | 21,2.306556985,9.723835876,0.1226292,1.663169265 24 | 22,1.469508896,9.002760327,0.024027423,0.532768578 25 | 23,0.26916425,2.940731717,0.08824926400000001,0.23161445100000003 26 | 24,1.361943325,5.463288943999999,0.072162242,1.0745590859999998 27 | 25,1.301244713,11.44899074,0.137977409,0.824264164 28 | 26,0.266643875,12.73385729,0.10345021199999999,0.40244901899999996 29 | 27,1.1231037179999999,8.642887015,0.075424363,1.7263525259999999 30 | 28,0.45262133200000004,8.206658586,0.01512405,0.158492551 31 | 29,2.628832353,10.522393,0.056141074000000006,1.30876788 32 | 30,0.95595689,7.905392414,0.154125423,0.10324052800000001 33 | 31,4.07742321,10.60172617,0.059199445,1.881225491 34 | 32,1.028817994,11.34857515,0.09276229400000001,0.12404068300000001 35 | 33,1.090956107,7.229800261,0.191657121,1.0574998290000002 36 | 34,1.7922193380000002,12.75099714,0.135187465,2.1029613030000003 37 | 35,0.622400233,3.86998321,0.081083458,0.7683331059999999 38 | 36,1.4204715780000001,9.572510771000001,0.13551789,1.3616020619999998 39 | 37,2.305112039,7.81118572,0.10541145800000001,1.127647507 40 | 38,1.046159709,4.695197815,0.09767059300000001,0.200146596 41 | 39,0.9195052509999999,14.43262352,0.06624714799999999,0.635480803 42 | 40,0.27427885399999996,6.0871153,0.19522595399999998,0.975857725 43 | 41,0.883392568,6.565491403999999,0.13874023900000002,0.675214505 44 | 42,1.6125509230000001,9.35919501,0.080005723,0.990195356 45 | 43,0.625357716,11.32370918,0.127841572,1.120625074 46 | 44,1.254109848,9.050297663,0.221693292,1.529382766 47 | 45,1.503715001,5.330221468,0.055745935999999996,0.5071624770000001 48 | 46,3.256827603,10.95654316,0.08591915300000001,2.5442705919999997 49 | 47,1.528215523,5.142433493,0.142690548,0.936580642 50 | 48,0.31661600300000003,14.754486300000002,0.048999034000000004,0.198971533 51 | 49,0.065099463,6.370081634,0.14059095,0.625271837 52 | 50,1.003721802,12.12599296,0.06700028400000001,1.056795926 53 | 51,0.42465078799999995,13.42402907,0.17779518800000002,0.7047566340000001 54 | 52,1.255687193,13.31942744,0.13176605,1.364302717 55 | 53,0.434054722,6.212854468,0.071716907,0.41001699700000005 56 | 54,2.508448629,10.371879400000001,0.18602027399999999,1.721535073 57 | 55,0.6755407109999999,9.556812226,0.125865806,0.447194629 58 | 56,0.8095737059999999,10.15764776,0.01288095,0.6987350790000001 59 | 57,2.136037969,11.20881897,0.119283347,1.20976951 60 | 58,1.327767595,9.795422823,0.092293739,0.548920636 61 | 59,0.13071992,3.572269753,0.026547354,0.302446022 62 | 60,1.470044114,12.38805046,0.051539407999999995,0.721527391 63 | 61,0.506270946,5.471669137,0.136868865,0.241151383 64 | 62,1.187452524,7.6996590220000005,0.057571724000000005,0.223409073 65 | 63,3.8803800589999997,11.3121095,0.073109707,2.308146217 66 | 64,1.0106385690000002,7.991793423,0.108466756,1.02645538 67 | 65,0.442494761,10.62457151,0.05819301599999999,0.260180119 68 | 66,0.85705469,4.214005087,0.191088593,0.921694663 69 | 67,0.99338946,10.90121614,0.18439440699999998,1.031295424 70 | 68,1.380844529,12.30686058,0.141883488,0.36357254899999997 71 | 69,0.665847051,15.32407008,0.120194858,0.566464321 72 | 70,1.954126931,11.391044599999999,0.037190046000000004,1.1656079 73 | 71,0.9818407929999999,9.170476277,0.1958527,0.443315096 74 | 72,1.312195129,12.03070808,0.12881284,1.7735721999999998 75 | 73,1.839649136,9.04158301,0.134585319,0.8465543170000001 76 | 74,1.8372860709999999,10.34958557,0.190236044,1.5492961790000002 77 | 75,0.449603381,7.948690745,0.142094954,0.964010192 78 | 76,0.7531356840000001,12.13515832,0.104273294,0.691679277 79 | 77,0.865232267,7.2262164360000005,0.030089163,0.5363687970000001 80 | 78,3.0752409160000003,11.03236893,0.075598773,1.718339415 81 | 79,3.538850229,9.800475303999999,0.034923777999999996,1.8235136930000002 82 | 80,1.123846527,9.698549555,0.080739819,1.330978714 83 | 81,1.778250325,6.505173171,0.08209955299999999,0.804026342 84 | 82,2.617820499,11.95046128,0.16751390300000002,1.396982656 85 | 83,0.515617516,4.2950607430000005,0.13287395400000002,0.9102584309999999 86 | 84,0.486816216,8.986574027,0.145909633,1.7961720380000001 87 | 85,0.856465085,8.853800507999999,0.16602984699999998,1.311744651 88 | 86,1.9770508390000001,8.531154736,0.05558115,1.249146685 89 | 87,1.953261115,10.53247425,0.047661447999999995,0.7021937640000001 90 | 88,1.158192457,6.599302587,0.085176042,0.719368805 91 | 89,1.8177104309999998,12.25070897,0.121531684,1.5535771440000001 92 | 90,0.395578221,11.5488491,0.159597401,0.421625333 93 | 91,1.7059474819999998,9.12298593,0.025380043999999997,0.96852928 94 | 92,0.297347719,5.791163945,0.09161762400000001,0.9751038740000001 95 | 93,0.655047195,8.275416732,0.075722079,0.124780041 96 | 94,1.673297475,7.453114059,0.113970519,1.150244236 97 | 95,0.925496669,9.890973465,0.01746431,0.12685014 98 | 96,1.04046068,7.590640707,0.108116998,0.370046014 99 | 97,1.016983617,11.11287884,0.054739395,0.51482531 100 | 98,0.58836099,6.5629366860000005,0.175453258,0.476360114 101 | 99,0.8358473790000001,9.753255567,0.13710523800000002,0.8121151390000001 102 | 100,0.46323825799999996,5.185352711,0.037367341,0.08738671 103 | 101,0.667618551,3.724004139,0.119337809,0.503906926 104 | 102,1.42462928,10.28845532,0.185215551,1.2704446040000001 105 | 103,1.818187446,8.639758359,0.078419732,0.500775822 106 | 104,1.953375853,8.980967278,0.149569953,1.355484685 107 | 105,1.227606598,4.697316843,0.120467973,0.5747882329999999 108 | 106,1.64152397,6.083319675,0.007601304000000001,0.499833563 109 | 107,0.925888748,13.44014257,0.149254855,0.9181162959999999 110 | 108,0.554875661,12.97711312,0.051366511,0.45757237700000003 111 | 109,0.054680669,5.603848042,0.10959941,0.335968349 112 | 110,0.903798166,6.608548354,0.012932158999999999,0.15289043800000002 113 | 111,1.199701547,7.2168673,0.126861061,1.46850899 114 | 112,1.592855439,6.690482464,0.21151630600000002,1.15530924 115 | 113,0.23514806100000002,9.955788315,0.108336277,0.25185249 116 | 114,1.483501301,7.336779317,0.16827508300000002,1.334855284 117 | 115,1.244204212,8.64713892,0.054907073,0.804078944 118 | 116,0.7279897190000001,7.810331175,0.080685879,1.266026108 119 | 117,1.341913746,8.711297492,0.154251508,0.844564891 120 | 118,1.085074675,14.41416026,0.161460302,1.593721234 121 | 119,1.4362176690000001,12.92919677,0.10972225099999999,1.033952634 122 | 120,1.70498956,11.4863278,0.093244115,0.7376655 123 | 121,0.7532785879999999,15.18179828,0.022128976,0.294738215 124 | 122,0.41119070399999996,7.573294027,0.108933885,0.565887049 125 | 123,0.32464415399999996,5.1124489,0.156939153,1.1805022920000001 126 | 124,1.129781051,6.097191303,0.150252196,0.36315497399999996 127 | 125,1.064961676,4.59307229,0.10798298199999999,0.908125875 128 | 126,0.9341283990000001,14.3866889,0.096328518,0.9200274820000001 129 | 127,1.162275208,9.752645832999999,0.143700766,0.510068062 130 | 128,0.6248902620000001,13.31045993,0.152505268,1.272635565 131 | 129,0.411565261,5.8773393270000005,0.01744089,0.39611217 132 | 130,0.454936255,11.55947947,0.14095654300000002,0.778262276 133 | 131,0.765247133,6.575110574,0.07451633099999999,0.943519992 134 | 132,2.051270548,12.16495154,0.077123575,1.011869317 135 | 133,2.526512824,9.791542377,0.10375766199999999,1.374977642 136 | 134,0.810974918,12.47856836,0.129114094,0.39683267899999997 137 | 135,1.721007345,6.717183126,0.176621077,0.9303107740000001 138 | 136,1.1670959379999999,12.16069009,0.177360168,1.713096515 139 | 137,0.689846033,3.980294378,0.068061835,0.364594615 140 | 138,0.7053980879999999,6.630500941,0.174591172,0.872457068 141 | 139,2.525458884,11.24408744,0.07821793,1.595343446 142 | 140,0.019543233,3.957376408,0.140501334,0.505649954 143 | 141,0.496569386,11.45414098,0.179012859,0.9905783659999999 144 | 142,0.582163475,8.78311827,0.211425698,0.9634971259999999 145 | 143,0.329445163,14.70796744,0.079557317,0.527428065 146 | 144,0.8452252440000001,11.49379986,0.186519562,0.682642527 147 | 145,2.580952337,10.89473258,0.125534574,1.0510132209999998 148 | 146,0.409535404,10.52081162,0.012831186000000001,0.333736137 149 | 147,1.653325224,10.56310926,0.139918488,1.084319279 150 | 148,1.057629292,11.41421697,0.14713363599999998,1.22139903 151 | 149,0.7750359309999999,9.808347317,0.076926603,1.066779945 152 | 150,0.202142285,9.577893032,0.131995639,0.547680125 153 | 151,0.29559057699999997,3.0716462730000003,0.17305254,0.8701666990000001 154 | 152,1.067302878,5.358353038,0.15756082400000002,1.017404947 155 | 153,0.36926564,13.61688533,0.11766251300000001,0.7266126270000001 156 | 154,0.691431782,7.458323968999999,0.20004971,1.267998772 157 | 155,1.801616207,9.14691422,0.108720977,1.4576573430000002 158 | 156,0.7272084940000001,9.366278219,0.080267799,0.436661659 159 | 157,0.5418388820000001,7.705029463,0.11848554900000001,0.232948805 160 | 158,0.291375355,4.258000803,0.090513284,0.51854961 161 | 159,2.187733824,10.63478939,0.076722887,1.277000883 162 | 160,1.0408368209999999,10.81545054,0.10633163,0.959237162 163 | 161,1.399462406,7.597601354,0.11541977699999999,0.827681131 164 | 162,0.873169003,5.6416458579999995,0.095223124,0.503625625 165 | 163,1.336193899,6.626839826,0.036780774,0.7093644170000001 166 | 164,2.102333575,9.749312606,0.089055236,0.963044169 167 | 165,1.827457448,6.058322738999999,0.082367811,1.194769105 168 | 166,1.029166682,12.42089784,0.106490315,1.196225362 169 | 167,1.08923933,5.360855515,0.048240693,0.330827403 170 | 168,1.0273663640000001,5.747995701000001,0.11086517800000001,1.198473996 171 | 169,3.4733491930000002,10.30554016,0.060600550999999996,2.061910517 172 | 170,0.612902432,10.66819113,0.14520339999999998,0.193428619 173 | 171,0.565783417,3.3161919269999998,0.014902148,0.142705369 174 | 172,1.032075888,8.566063217,0.18226510699999998,0.726982928 175 | 173,0.666450577,9.091174866,0.127750047,1.197856821 176 | 174,0.4909,5.55204639,0.139366154,0.574261019 177 | 175,1.320669103,13.90742282,0.034114867,0.553467145 178 | 176,0.36583266600000003,7.55292779,0.162775579,0.703892759 179 | 177,1.493342653,5.672981517999999,0.099948355,0.41818772600000004 180 | 178,1.240501247,11.60302522,0.10519333800000001,1.448742011 181 | 179,0.605274944,6.664945755,0.11437525300000001,0.844857858 182 | 180,1.447628675,5.8194004779999995,0.135379294,1.222033613 183 | 181,1.246543665,6.38219482,0.16394987800000002,0.691368361 184 | 182,1.48922465,9.233778519,0.160164309,1.60195976 185 | 183,0.47413005700000005,10.41333204,0.104375656,0.763017231 186 | 184,0.833221834,7.242226662999999,0.147545204,1.093294816 187 | 185,0.8865926470000001,8.174509051,0.109385409,0.692118971 188 | 186,0.7450572040000001,12.65188691,0.08599923,0.354705466 189 | 187,1.154729521,8.561977022,0.016945843000000002,0.326797135 190 | 188,0.71968527,9.118315624,0.033164651,0.401161726 191 | 189,1.7715295930000001,10.73647447,0.21334295600000003,1.30506134 192 | 190,1.364181576,7.785150817000001,0.076027001,1.126974715 193 | 191,0.07742353099999999,4.3650113489999995,0.145790365,0.885570964 194 | 192,1.43242322,11.55266391,0.073925517,1.07353057 195 | 193,1.318229461,7.985682152000001,0.067643527,0.502055783 196 | 194,2.2465898909999997,8.189690005,0.1544343,1.5568954640000001 197 | 195,1.5192923999999999,12.25068196,0.156768041,1.289944203 198 | 196,0.841920241,8.313897715,0.16003484699999998,0.45321946399999996 199 | 197,2.132176129,9.035280905,0.035784946,0.9154241759999999 200 | 198,0.165155283,5.456450864,0.165038035,0.416972712 201 | 199,0.9217590720000001,4.94770738,0.05970676,0.705096123 202 | 200,1.261801027,11.59121984,0.086423746,0.714458698 203 | 201,0.82578241,7.2799543710000005,0.072126322,0.38667429700000006 204 | 202,0.615245019,9.534571411,0.163364091,1.04119624 205 | 203,0.398132261,10.97672318,0.081388182,0.49774443399999996 206 | 204,1.366352431,9.085992969,0.125453708,1.082409262 207 | 205,2.3049005890000003,10.22642651,0.153250425,1.403199464 208 | 206,0.7992881540000001,12.09799142,0.127726393,1.4649329269999998 209 | 207,1.0711662990000002,11.15982339,0.05259783,0.8061746790000001 210 | 208,2.22848039,9.46863344,0.12687026099999998,0.9811323120000001 211 | 209,0.611619931,15.38853562,0.16966563199999998,1.126427748 212 | 210,0.361316675,8.543092907,0.158955863,0.423580774 213 | 211,1.551655706,10.69422838,0.10376754,1.206401685 214 | 212,0.23000548199999998,5.579973597,0.068318878,0.16681589 215 | 213,1.408273168,12.97107077,0.126325983,2.216988869 216 | 214,0.7705298709999999,4.231486234,0.158239339,0.766582309 217 | 215,1.0027200059999999,13.938874499999999,0.12946949900000002,0.5645463270000001 218 | 216,0.596055783,12.301915800000002,0.068453369,0.743704052 219 | 217,1.16728175,9.086434325,0.160528007,1.099435058 220 | 218,0.304300295,3.0823833689999995,0.13249577199999998,0.336216725 221 | 219,1.574059681,5.584408804,0.10430037,0.99477762 222 | 220,1.263674586,9.318561366,0.091872525,0.826187115 223 | 221,0.6091532829999999,7.077893163,0.044147005999999996,0.201932503 224 | 222,0.35320211799999995,15.47342177,0.172410636,0.6702502770000001 225 | 223,0.5435725370000001,6.398070801,0.073513803,0.7018773890000001 226 | 224,0.92162519,11.72095333,0.142564284,0.63177567 227 | 225,1.214137854,5.39830913,0.009437786,0.37449374700000004 228 | 226,2.164392374,7.378871033999999,0.061152105,1.0517113040000001 229 | 227,0.7343281,13.75112067,0.121213876,1.133964833 230 | 228,0.642970899,8.634118195,0.105366885,0.922789856 231 | 229,0.579490232,5.217800377,0.10009738800000001,0.313160328 232 | 230,2.258726259,9.646422299,0.15778444,1.771273315 233 | 231,1.283776755,7.221539665,0.142784875,1.056739605 234 | 232,1.318091846,11.5070764,0.159056709,0.58459922 235 | 233,1.5169189930000002,5.691420471,0.10361598,0.70478897 236 | 234,3.0864119469999998,10.30988785,0.041609678,1.853145791 237 | 235,0.34096412299999995,13.33798778,0.137620397,0.493072781 238 | 236,1.6345997209999998,7.269691988,0.038643949,0.50703029 239 | 237,2.29145784,8.726020057000001,0.077984432,1.356432206 240 | 238,1.64840832,8.850009545,0.060726137,0.717327365 241 | 239,1.21917044,10.65532795,0.15545132,1.5225076469999999 242 | 240,0.603997633,11.29150718,0.168879072,1.2468733509999999 243 | 241,1.2454703809999998,10.62737435,0.016607259,0.269054929 244 | 242,1.880002215,6.167000122999999,0.139306746,0.9492720579999999 245 | 243,1.043853938,9.157184696,0.033818902000000005,0.60317068 246 | 244,0.8930417759999999,10.16774389,0.104342161,0.597394921 247 | 245,1.168205138,6.148271863,0.13059309800000002,0.854332104 248 | 246,0.439407244,11.40719579,0.123638739,0.490704521 249 | 247,1.803767216,8.309303146,0.14582748,1.087917148 250 | 248,0.244992388,4.879022227,0.180267376,0.655963279 251 | 249,1.8629857090000002,9.492341943,0.11786200599999999,1.1741536240000001 252 | 250,0.48900256700000005,13.65052547,0.165085486,1.016041175 253 | 251,0.657349892,9.891464327000001,0.13172879999999998,1.60607096 254 | 252,0.346355821,7.679765521,0.047973542,0.454451129 255 | 253,1.139876517,13.35197742,0.07052056,0.86313957 256 | 254,1.7511728780000002,8.649080001,0.09714204900000001,0.7904775629999999 257 | 255,1.5860410390000002,10.68809863,0.044383201,0.83109856 258 | 256,1.744264778,10.73852971,0.144467775,1.526836153 259 | 257,1.7203500930000002,7.030157024,0.146942134,0.718059569 260 | 258,1.2909241059999998,8.208387483,0.12091024199999999,0.540100913 261 | 259,1.448080795,12.89570073,0.125151578,0.696658124 262 | 260,1.137427303,9.613763985,0.06474071099999999,0.372935251 263 | 261,0.7023401090000001,6.572487981,0.12252686300000001,0.438554709 264 | 262,1.168219651,8.458764345,0.111416719,1.290867287 265 | 263,0.55395098,8.402434657999999,0.134345101,0.7027968659999999 266 | 264,2.069718965,7.068410167000001,0.12328783900000001,1.268316113 267 | 265,1.0729959359999999,13.27540792,0.160917474,1.259338487 268 | 266,0.52062303,12.43164134,0.040140537999999996,0.21451312600000003 269 | 267,0.5613759229999999,6.7163500560000005,0.102475999,1.109480907 270 | 268,0.508463869,6.691202558,0.032052626,0.626439645 271 | 269,0.881732211,7.987089393,0.15222578,0.844825928 272 | 270,0.7506383179999999,5.572710122,0.046152752000000005,0.46425513399999996 273 | 271,0.304069158,4.478797327,0.10227404300000001,0.7685302490000001 274 | 272,0.8685373820000001,10.49747877,0.081122455,0.79767002 275 | 273,1.882130811,11.42901092,0.189637981,1.7686605640000002 276 | 274,1.17822712,14.04560832,0.127743105,0.8081256379999999 277 | 275,0.9536190390000001,8.265699146000001,0.066194861,0.593616065 278 | 276,0.8377020279999999,12.18090445,0.07180151,1.29182852 279 | 277,1.229996782,6.895168945,0.034725234,0.41420968 280 | 278,1.05424776,12.2681477,0.08320398,0.502686193 281 | 279,0.648710486,15.00574909,0.063116664,0.45117176200000003 282 | 280,0.827783403,6.471964647,0.098307305,0.20745953600000003 283 | 281,0.9610757320000001,10.37104159,0.098451891,0.34625302399999996 284 | 282,0.702196377,10.37174445,0.108406089,1.328668994 285 | 283,0.742020485,10.30462001,0.157849665,0.44947580200000004 286 | 284,2.096626186,10.29929652,0.128074451,0.7650280220000001 287 | 285,1.609753966,8.839136400000001,0.130656618,0.639156794 288 | 286,2.3462185819999997,11.16069832,0.098342204,1.0285235959999999 289 | 287,1.533375311,9.971561631,0.053926049000000004,1.132298751 290 | 288,0.313276005,3.093445832,0.12700325,0.591024436 291 | 289,2.017078745,11.26787211,0.097635196,1.552299584 292 | 290,2.207642161,9.078983125,0.123496033,1.364346071 293 | 291,0.787904226,11.33707334,0.051811763,0.283891242 294 | 292,0.82459438,4.505137346000001,0.13671166199999998,1.069111961 295 | 293,2.1292203119999997,10.30769448,0.149283713,1.16099634 296 | 294,1.0041269,9.586049113,0.137912226,1.257486015 297 | 295,0.695855584,7.236013112,0.008463375,0.346036031 298 | 296,1.284613066,11.51661335,0.123312327,0.539337153 299 | 297,0.7853685140000001,11.6941904,0.149634565,0.897973804 300 | 298,0.775147884,4.886352568,0.047919471,0.204483628 301 | 299,1.814754625,5.83137002,0.14336372,1.224122489 302 | 300,1.191271823,11.08083611,0.047768280999999996,1.1504881040000001 303 | 301,1.021098385,10.75207262,0.137522829,0.322155163 304 | 302,1.184831722,6.351051109,0.081996629,0.464194977 305 | 303,0.378887233,6.281609016,0.19751892899999998,0.734597395 306 | 304,0.854960006,5.0725296239999995,0.129880157,0.1845629 307 | 305,0.724016999,11.88688456,0.10631431599999999,0.940919417 308 | 306,1.314931875,11.47780122,0.031982536,0.45735542700000004 309 | 307,0.9210120279999999,4.100203282,0.098477741,0.6400604999999999 310 | 308,1.090446805,10.04469494,0.165135046,0.80574945 311 | 309,3.1511182360000003,10.35755902,0.085187376,2.157043418 312 | 310,2.825483223,10.51100854,0.065213103,1.536588745 313 | 311,0.643314452,13.64288757,0.105740824,0.494754125 314 | 312,0.35180607,6.887267277,0.09323498,0.240212323 315 | 313,2.047758499,11.41872823,0.141871575,1.408616331 316 | 314,0.641726796,9.591234683,0.11030392900000001,0.225112449 317 | 315,0.91281171,8.496378837,0.209974811,1.085723333 318 | 316,0.3592863,5.865147593,0.167933623,0.8415813329999999 319 | 317,0.237698779,5.051937667,0.055188167999999996,0.480170541 320 | 318,0.468981975,7.121370574,0.154228761,0.288353988 321 | 319,0.930196885,8.183849627,0.071122615,0.9814031679999999 322 | 320,0.519421074,5.892462553,0.136749098,1.029717669 323 | 321,1.6078702569999999,10.52019319,0.131250061,0.799785428 324 | 322,1.76301177,7.367178247000001,0.057900568,0.9313316309999999 325 | 323,2.7533719710000004,10.50184073,0.06516873200000001,1.7794440059999999 326 | 324,3.862093125,10.16484914,0.060279349,2.072505027 327 | 325,1.4245984530000002,6.673553725,0.080431385,0.905235404 328 | 326,1.84559688,10.61950262,0.054806082,0.9866476000000001 329 | 327,0.526865201,5.6448305979999995,0.10687967699999999,0.629198252 330 | 328,1.828101943,10.69660111,0.102718596,0.961989997 331 | 329,0.638343792,11.48378961,0.033770437,0.46538483399999997 332 | 330,1.271959287,6.366028224,0.132791893,0.601847684 333 | 331,1.3754988330000002,9.042134616,0.20886349899999998,1.30079812 334 | 332,0.800955263,8.680529418999999,0.136167804,0.263934923 335 | 333,0.487864921,12.55680785,0.10439309699999999,0.208664166 336 | 334,4.234477321,11.103135,0.06792721,2.280547183 337 | 335,0.709057163,13.75681619,0.12244630699999999,0.80356135 338 | 336,2.515501403,11.97866689,0.110056041,1.204402207 339 | 337,1.042334653,12.32281898,0.118054732,0.7959810690000001 340 | 338,0.443059886,11.74182212,0.1825404,0.622086354 341 | 339,0.465537629,8.994518786,0.078037434,1.00434771 342 | 340,0.52934364,10.63059683,0.060037897,0.69090152 343 | 341,1.425152026,6.183154071000001,0.166571879,1.042058154 344 | 342,1.526522133,8.077106661,0.097630883,0.472315955 345 | 343,0.430673386,8.561197463,0.071010102,0.339396517 346 | 344,2.290627195,10.59376847,0.048730233,1.167515722 347 | 345,0.208613026,7.221179064,0.06203357599999999,0.253679101 348 | 346,1.357690716,8.481547784,0.15464144400000002,0.5842319220000001 349 | 347,1.153633829,8.611628663,0.153488188,1.4062751119999999 350 | 348,3.9130769169999997,11.28497459,0.07951166700000001,2.544130858 351 | 349,1.384784597,5.171606443,0.074737292,0.7236858690000001 352 | 350,0.789907338,8.512064629,0.180252398,0.9257270059999999 353 | 351,0.298075634,8.326510121,0.10351902699999999,0.35392869299999996 354 | 352,0.573519207,9.029465267,0.048078046,0.178136343 355 | 353,1.425216952,5.906193702,0.051514622,0.288924695 356 | 354,0.575162443,6.360152633999999,0.14517032300000002,0.783667123 357 | 355,0.571220924,4.845794506,0.16002713699999999,0.426901594 358 | 356,1.6192965940000001,11.46728894,0.130542463,1.35168402 359 | 357,0.44033646299999996,14.89974821,0.10841315900000001,0.866791135 360 | 358,0.43579570799999995,9.963098426,0.146708379,0.6789460820000001 361 | 359,0.590800318,9.987540096,0.12490553800000001,0.956520873 362 | 360,1.032284661,10.09932,0.141458511,1.001504854 363 | 361,0.748323263,11.09820122,0.07897696400000001,0.470301814 364 | 362,1.526566852,8.487307042000001,0.097925494,1.263652066 365 | 363,0.264885589,4.784965509,0.12072243099999999,0.482302678 366 | 364,0.771517892,9.12463523,0.164691208,0.675574421 367 | 365,1.282204874,10.25909452,0.043011920999999995,0.680222208 368 | 366,0.320168057,8.827486042,0.028974200000000002,0.332946542 369 | 367,0.995720389,6.636514008,0.053875276,0.641883699 370 | 368,0.8077242109999999,6.099813384,0.09362056099999999,0.755241122 371 | 369,1.030722167,4.706608276,0.069123858,0.481399364 372 | 370,1.193458701,9.225198323999999,0.12364357599999999,0.34174917200000005 373 | 371,1.464972271,10.68021664,0.091724445,0.883692087 374 | 372,1.6997646180000001,6.469132277999999,0.056176325,0.67610837 375 | 373,0.632094446,5.880488481,0.074320499,0.18374339 376 | 374,0.848301662,10.72403966,0.009331456,0.317835466 377 | 375,0.91970435,7.6880907810000005,0.038872484,0.2859428 378 | 376,0.572034347,10.50795603,0.172043048,1.454338538 379 | 377,1.548039795,8.649368465,0.16128615599999999,1.19670479 380 | 378,0.71783659,8.559737646,0.041035736,0.6154834339999999 381 | 379,1.131738981,8.592930121,0.127837317,0.769642741 382 | 380,1.818085266,9.958936327,0.077496518,0.812605919 383 | 381,2.751033955,9.164939271,0.070904433,1.259774414 384 | 382,2.307770952,10.48150377,0.179051777,1.535102884 385 | 383,1.575560954,11.27138886,0.13940408599999998,0.513273666 386 | 384,0.681828988,7.778027947000001,0.099161425,0.443404956 387 | 385,1.088151828,9.672804445,0.065256232,0.9577909459999999 388 | 386,1.298837283,7.238229914,0.129664746,0.359218425 389 | 387,2.1991987930000003,8.139523894,0.158138864,1.257157286 390 | 388,0.8682127140000001,6.299723257,0.123136903,0.970921722 391 | 389,0.885337492,8.198878179,0.128824611,0.48357619700000004 392 | 390,0.8638677,5.036055605,0.12452924300000001,0.676293528 393 | 391,0.49802263,3.366569563,0.104886392,0.339018868 394 | 392,1.220579308,8.007693669,0.025821128,0.799489454 395 | 393,0.514580853,9.190611766,0.105853235,0.579253742 396 | 394,2.3271740480000003,7.521740087,0.083514626,0.934233306 397 | 395,0.39581208100000004,14.58083636,0.096107905,0.337390709 398 | 396,0.476050873,13.65292343,0.149010775,0.783285152 399 | 397,1.588787245,7.61922205,0.135025579,0.953671006 400 | 398,0.7374447009999999,8.811651982,0.010241462,0.247607537 401 | 399,1.016322051,8.027205277,0.08390833199999999,0.21681346899999998 402 | 400,0.522541596,10.36915116,0.204451209,0.9153793640000001 403 | 401,1.3609005019999998,8.084848891,0.13652851400000002,1.25997521 404 | 402,1.089665425,11.13602554,0.065149943,0.275105692 405 | 403,0.818492663,6.044806326000001,0.167706038,0.616359466 406 | 404,1.713807944,12.28842058,0.071062045,1.146512376 407 | 405,2.3283032009999998,8.537277037,0.059695218,1.1732291540000002 408 | 406,1.317916499,8.033848007000001,0.08926796699999999,0.680554786 409 | 407,1.3552334540000002,6.9530891939999995,0.10980572300000001,1.03051903 410 | 408,0.478122847,7.932055319,0.17724348399999998,0.903825914 411 | 409,2.1907675269999998,12.02944229,0.120334291,1.009203453 412 | 410,2.59752103,9.27537822,0.114048749,1.733949755 413 | 411,1.9388245240000002,9.612351522,0.084956735,1.288046853 414 | 412,1.319278888,10.61808685,0.122443993,1.0016353340000002 415 | 413,0.555469042,8.046467746,0.071004661,0.536503514 416 | 414,1.280437679,6.8933995370000005,0.05130398,1.1208233440000002 417 | 415,0.668439755,14.99448191,0.095326795,0.690148425 418 | -------------------------------------------------------------------------------- /py_wave_runup/ensembles.py: -------------------------------------------------------------------------------- 1 | """ 2 | This module implements various ensemble techniques to combine the predictions of 3 | multiple :doc:`models`. 4 | 5 | """ 6 | import pandas as pd 7 | 8 | from py_wave_runup import models 9 | 10 | 11 | class EnsembleRaw: 12 | """ 13 | Returns predicitons from each wave runup model 14 | 15 | This class runs predictions on all available runup models and returns the results 16 | from each model, i.e. no combining or ensembling is performed. It is provided as 17 | a base class for other ensemble models to inherit, they will need access to all 18 | predicitions anyway. 19 | """ 20 | 21 | def __init__(self, Hs=None, Tp=None, beta=None, Lp=None, r=None): 22 | """ 23 | Args: 24 | Hs (:obj:`float` or :obj:`list`): Significant wave height. In order to 25 | account for energy dissipation in the nearshore, transform the wave to 26 | the nearshore, then reverse-shoal to deep water. 27 | beta (:obj:`float` or :obj:`list`): Beach slope. Typically defined as the 28 | slope between the region of :math:`\\pm2\\sigma` where :math:`\\sigma` 29 | is the standard deviation of the continuous water level record. 30 | Tp (:obj:`float` or :obj:`list`): Peak wave period. 31 | Must be defined if ``Lp`` is not defined. 32 | Lp (:obj:`float` or :obj:`list`): Peak wave length 33 | Must be definied if ``Tp`` is not defined. 34 | r (:obj:`float` or :obj:`list`): Hydraulic roughness length. Can be 35 | approximated by :math:`r=2.5D_{50}`. 36 | """ 37 | 38 | self.Hs = Hs 39 | self.Tp = Tp 40 | self.beta = beta 41 | self.Lp = Lp 42 | self.r = r 43 | 44 | # Get list of all runup models 45 | self.runup_models = models.RunupModel.__subclasses__() 46 | 47 | def estimate(self, param): 48 | """ 49 | Returns: 50 | Returns a pandas dataframe where each column contains the estimates 51 | returned by each runup model 52 | 53 | Args: 54 | param (:obj:`str`): `R2`, `setup`, `sig`, `sinc` or `swash` 55 | 56 | Examples: 57 | Get a dataframe containing all wave runup model predictions for Hs=4, 58 | Tp=11 and beta=0.1. 59 | 60 | >>> from py_wave_runup.ensembles import EnsembleRaw 61 | >>> ensemble = EnsembleRaw(Hs=4, Tp=11, beta=0.1) 62 | >>> ensemble_r2 = ensemble.estimate('R2') 63 | >>> ensemble_r2 64 | Stockdon2006_R2 Power2018_R2 ... Senechal2011_R2 Beuzen2019_R2 65 | 0 2.542036 NaN ... 1.972371 2.081213 66 | 67 | [1 rows x 9 columns] 68 | """ 69 | return self._model_estimates(param) 70 | 71 | def _model_estimates(self, param): 72 | """ 73 | Returns: 74 | Returns a pandas dataframe where each column contains the estimates 75 | returned by each runup model for the specified parameter. 76 | 77 | Args: 78 | param (:obj:`str`): `R2`, `setup`, `sig`, `sinc` or `swash` 79 | """ 80 | 81 | valid_params = ["R2", "setup", "sig", "sinc", "swash"] 82 | if param not in valid_params: 83 | raise ValueError(f'param must be one of {" or ".format(valid_params)}') 84 | 85 | # Store results in dictionary 86 | results = {} 87 | 88 | for model in self.runup_models: 89 | 90 | # Check that model has the attribute we need (some models don't estimate 91 | # infragravity/incident swash) 92 | if hasattr(model, param): 93 | model_name = model.__name__ 94 | results[f"{model_name}_{param}"] = getattr( 95 | model(Hs=self.Hs, Tp=self.Tp, beta=self.beta, r=self.r), param 96 | ) 97 | 98 | # Due to the way pandas constructs dataframes, we must specify the results in 99 | # a list if we only have one set of conditions to return. 100 | if hasattr(type(self.Hs), "__iter__"): 101 | df = pd.DataFrame.from_dict(results) 102 | else: 103 | df = pd.DataFrame.from_dict([results]) 104 | return df 105 | 106 | 107 | class EnsembleMean(EnsembleRaw): 108 | """ 109 | Returns the mean parameter given by all the runup models. 110 | """ 111 | 112 | def estimate(self, param): 113 | """ 114 | Returns: 115 | Returns the mean parameter given by all the runup models. 116 | 117 | Args: 118 | param (:obj:`str`): `R2`, `setup`, `sig`, `sinc` or `swash` 119 | 120 | Examples: 121 | Get a pandas series containing the mean wave runup model predictions for Hs=4, 122 | Tp=11 and beta=0.1. 123 | 124 | >>> from py_wave_runup.ensembles import EnsembleMean 125 | >>> ensemble = EnsembleMean(Hs=[3,4], Tp=[10,11], beta=[0.09,0.1]) 126 | >>> ensemble_r2 = ensemble.estimate('R2') 127 | >>> ensemble_r2 128 | 0 1.968515 129 | 1 2.578236 130 | Name: mean_R2, dtype: float64 131 | """ 132 | df = self._model_estimates(param) 133 | return df.mean(axis=1).rename(f"mean_{param}") 134 | -------------------------------------------------------------------------------- /py_wave_runup/models.py: -------------------------------------------------------------------------------- 1 | """ 2 | This module implements different published wave runup empirical models. Each class 3 | implements a different published model which can be used to estimate wave runup, 4 | typically based on Hs, Tp, and beta. 5 | """ 6 | 7 | import warnings 8 | from abc import ABCMeta, abstractmethod 9 | 10 | import joblib 11 | import numpy as np 12 | from pkg_resources import resource_filename 13 | 14 | 15 | class RunupModel(metaclass=ABCMeta): 16 | """ 17 | Abstract base class which our empirical runup models will inherit from 18 | """ 19 | 20 | doi = None 21 | 22 | def __init__(self, Hs=None, Tp=None, beta=None, Lp=None, h=None, r=None): 23 | """ 24 | Args: 25 | Hs (:obj:`float` or :obj:`list`): Significant wave height. In order to 26 | account for energy dissipation in the nearshore, transform the wave to 27 | the nearshore, then reverse-shoal to deep water. 28 | beta (:obj:`float` or :obj:`list`): Beach slope. Typically defined as the 29 | slope between the region of :math:`\\pm2\\sigma` where :math:`\\sigma` 30 | is the standard deviation of the continuous water level record. 31 | Tp (:obj:`float` or :obj:`list`): Peak wave period. 32 | Must be defined if ``Lp`` is not defined. 33 | Lp (:obj:`float` or :obj:`list`): Peak wave length 34 | Must be definied if ``Tp`` is not defined. 35 | h (:obj:`float` or :obj:`list`): Depth of wave measurement(s). If not 36 | given deep-water conditions are assumed. 37 | r (:obj:`float` or :obj:`list`): Hydraulic roughness length. Can be 38 | approximated by :math:`r=2.5D_{50}`. 39 | """ 40 | 41 | self.Hs = Hs 42 | self.Tp = Tp 43 | self.beta = beta 44 | self.Lp = Lp 45 | self.h = h 46 | self.r = r 47 | 48 | # Ensure wave length or peak period is specified 49 | if all(v is None for v in [Lp, Tp]): 50 | raise ValueError("Expected either Lp or Tp args") 51 | 52 | # Ensure input is atleast 1d numpy array, this is so we can handle lists, 53 | # arrays and floats. 54 | self.Hs = np.atleast_1d(Hs).astype(float) 55 | self.beta = np.atleast_1d(beta).astype(float) 56 | self.r = np.atleast_1d(r).astype(float) 57 | 58 | # Calculate wave length if it hasn't been specified. 59 | if not Lp: 60 | self.Tp = np.atleast_1d(Tp) 61 | if self.h: 62 | k = [] 63 | for T in self.Tp: 64 | k.append(self._newtRaph(T, self.h)) 65 | self.Lp = (2 * np.pi) / np.array(k) 66 | else: 67 | self.Lp = 9.81 * (self.Tp ** 2) / 2 / np.pi 68 | else: 69 | self.Lp = np.atleast_1d(Lp) 70 | if self.h: 71 | self.Tp = np.sqrt( 72 | (2 * np.pi * self.Lp) 73 | / (9.81 * np.tanh((2 * np.pi * self.h) / self.Lp)) 74 | ) 75 | else: 76 | self.Tp = np.sqrt(2 * np.pi * self.Lp / 9.81) 77 | 78 | # Ensure arrays are of the same size 79 | if len(set(x.size for x in [self.Hs, self.Tp, self.beta, self.Lp])) != 1: 80 | raise ValueError("Input arrays are not the same length") 81 | 82 | # Calculate Iribarren number. Need since there are different 83 | # parameterizations for dissipative and intermediate/reflective beaches. 84 | self.zeta = self.beta / (self.Hs / self.Lp) ** (0.5) 85 | 86 | def _return_one_or_array(self, val): 87 | # If only calculating a single value, return a single value and not an array 88 | # with length one. 89 | if val.size == 1: 90 | return val.item() 91 | else: 92 | return val 93 | 94 | def _newtRaph(self, T, h): 95 | 96 | # Function to determine k from dispersion relation given period (T) and depth (h) using 97 | # the Newton-Raphson method. 98 | 99 | if not np.isnan(T): 100 | L_not = (9.81 * (T ** 2)) / (2 * np.pi) 101 | k1 = (2 * np.pi) / L_not 102 | 103 | def fk(k): 104 | return (((2 * np.pi) / T) ** 2) - (9.81 * k * np.tanh(k * h)) 105 | 106 | def f_prime_k(k): 107 | return (-9.81 * np.tanh(k * h)) - ( 108 | 9.81 * k * (1 - (np.tanh(k * h) ** 2)) 109 | ) 110 | 111 | k2 = 100 112 | i = 0 113 | while abs((k2 - k1)) / k1 > 0.01: 114 | i += 1 115 | if i != 1: 116 | k1 = k2 117 | k2 = k1 - (fk(k1) / f_prime_k(k1)) 118 | else: 119 | k2 = np.nan # pragma: no cover 120 | 121 | return k2 122 | 123 | 124 | class Stockdon2006(RunupModel): 125 | """ 126 | Implements the runup model from Stockdon et al (2006) 127 | 128 | Stockdon, H. F., Holman, R. A., Howd, P. A., & Sallenger, A. H. (2006). 129 | Empirical parameterization of setup, swash, and runup. Coastal Engineering, 130 | 53(7), 573–588. https://doi.org/10.1016/j.coastaleng.2005.12.005 131 | 132 | Examples: 133 | Calculate 2% exceedence runup level, including setup component and swash 134 | component given Hs=4m, Tp=11s, beta=0.1. 135 | 136 | >>> from py_wave_runup.models import Stockdon2006 137 | >>> sto06 = Stockdon2006(Hs=4, Tp=11, beta=0.1) 138 | >>> sto06.R2 139 | 2.5420364539745717 140 | >>> sto06.setup 141 | 0.9621334076403345 142 | >>> sto06.swash 143 | 2.6402827466167222 144 | """ 145 | 146 | doi = "10.1016/j.coastaleng.2005.12.005" 147 | 148 | @property 149 | def R2(self): 150 | """ 151 | Returns: 152 | The 2% exceedence runup level. For dissipative beaches (i.e. 153 | :math:`\\zeta < 0.3`) Eqn (18) from the paper is used: 154 | 155 | .. math:: R_{2} = 0.043(H_{s}L_{p})^{0.5} 156 | 157 | For intermediate and reflective beaches (i.e. :math:`\\zeta > 0.3`), 158 | the function returns the result from Eqn (19): 159 | 160 | .. math:: 161 | 162 | R_{2} = 1.1 \\left( 0.35 \\beta (H_{s}L_{p})^{0.5} + \\frac{H_{s}L_{p}( 163 | 0.563 \\beta^{2} +0.004)^{0.5}}{2} \\right) 164 | """ 165 | 166 | # Generalized runup (Eqn 19) 167 | result = 1.1 * ( 168 | 0.35 * self.beta * (self.Hs * self.Lp) ** 0.5 169 | + ((self.Hs * self.Lp * (0.563 * self.beta ** 2 + 0.004)) ** 0.5) / 2 170 | ) 171 | 172 | # For dissipative beaches (Eqn 18) 173 | dissipative_mask = self.zeta < 0.3 174 | result[dissipative_mask] = ( 175 | 0.043 * (self.Hs[dissipative_mask] * self.Lp[dissipative_mask]) ** 0.5 176 | ) 177 | 178 | result = self._return_one_or_array(result) 179 | return result 180 | 181 | @property 182 | def setup(self): 183 | """ 184 | Returns: 185 | The setup level using Eqn (10): 186 | 187 | .. math:: \\bar{\\eta} = 0.35 \\beta (H_{s}L_{p})^{0.5} 188 | """ 189 | result = 0.35 * self.beta * (self.Hs * self.Lp) ** 0.5 190 | result = self._return_one_or_array(result) 191 | return result 192 | 193 | @property 194 | def sinc(self): 195 | """ 196 | Returns: 197 | Incident component of swash using Eqn (11): 198 | 199 | .. math:: S_{inc} = 0.75 \\beta (H_{s}L_{p})^{0.5} 200 | """ 201 | result = 0.75 * self.beta * (self.Hs * self.Lp) ** 0.5 202 | result = self._return_one_or_array(result) 203 | return result 204 | 205 | @property 206 | def sig(self): 207 | """ 208 | Returns: 209 | Infragravity component of swash using Eqn (12): 210 | 211 | .. math:: S_{ig} = 0.06 (H_{s}L_{p})^{0.5} 212 | """ 213 | result = 0.06 * (self.Hs * self.Lp) ** 0.5 214 | result = self._return_one_or_array(result) 215 | return result 216 | 217 | @property 218 | def swash(self): 219 | """ 220 | Returns: 221 | Total amount of swash using Eqn (7): 222 | 223 | .. math:: S = \\sqrt{S_{inc}^{2}+S_{ig}^{2}} 224 | """ 225 | result = np.sqrt(self.sinc ** 2 + self.sig ** 2) 226 | result = self._return_one_or_array(result) 227 | return result 228 | 229 | 230 | class Power2018(RunupModel): 231 | """ 232 | Implements the runup model from Power et al (2018) 233 | 234 | Power, H.E., Gharabaghi, B., Bonakdari, H., Robertson, B., Atkinson, A.L., 235 | Baldock, T.E., 2018. Prediction of wave runup on beaches using 236 | Gene-Expression Programming and empirical relationships. Coastal Engineering. 237 | https://doi.org/10.1016/j.coastaleng.2018.10.006 238 | 239 | Examples: 240 | Calculate 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1. 241 | 242 | >>> from py_wave_runup.models import Power2018 243 | >>> pow18 = Power2018(Hs=1, Tp=8, beta=0.07, r=0.00075) 244 | >>> pow18.R2 245 | 1.121845349302836 246 | """ 247 | 248 | doi = "10.1016/j.coastaleng.2018.10.006" 249 | 250 | @property 251 | def R2(self): 252 | """ 253 | Returns: 254 | The 2% exceedence runup level, based on following dimensionless parameters: 255 | 256 | .. math:: 257 | 258 | x_{1} &= \\frac{H_{s}}{L_{p}} \\\\ 259 | x_{2} &= \\beta \\\\ 260 | x_{3} &= \\frac{r}{H_{s}} 261 | 262 | The final equation is given by the form: 263 | 264 | .. math:: 265 | 266 | R_{2} &= H_{s} \\times ( \\\\ 267 | &(x_{2} + (((x_{3} \\times 3) / e^{-5}) \\times ((3 \\times x_{3}) \\times x_{3}))) \\\\ 268 | &+ ((((x_{1} + x_{3}) - 2) - (x_{3} - x_{2})) + ((x_{2} - x_{1}) - x_{3})) \\\\ 269 | &+ (((x_{3}^{x_{1}}) - (x_{3}^{\\frac{1}{3}})) - ((e^{x_{2}})^{(x_{1} \\times 3)})) \\\\ 270 | &+ \\sqrt{(((x_{3} + x_{1}) - x_{2}) - (x_{2} + \\log_{10}x_{3}))} \\\\ 271 | &+ ((((x_{2}^{2}) / (x_{1}^{\\frac{1}{3}}))^{(x_{1}^{\\frac{1}{3}})}) - \\sqrt{x_{3}}) \\\\ 272 | &+ ( (x_{2} + ((x_{3} / x_{1})^{\\frac{1}{3}})) + (\\log(2) - (1 / (1 + e^{-(x_{2} + x_{3})}))) ) \\\\ 273 | &+ ((\\sqrt{x_{3}} - (((3^{2}) + 3) \\times (x_{2}^{2})))^{2}) \\\\ 274 | &+ ((((x_{3} \\times -5)^{2})^{2}) + (((x_{3} + x_{3}) \\times x_{1}) / (x_{2}^{2}))) \\\\ 275 | &+ \\log{(\\sqrt{((x_{2}^{2}) + (x_{3}^{\\frac{1}{3}}))} + ((x_{2} + 3)^{\\frac{1}{3}}))} \\\\ 276 | &+ ( (((x_{1} / x_{3}) \\times (-5^{2})) \\times (x_{3}^{2})) - \\log_{10}{(1 / (1 + \\exp^{-(x_{2} + x_{3})}))} ) \\\\ 277 | &+ (x_{1}^{x_{3}}) \\\\ 278 | &+ \\exp^{-((((x_{3} / x_{1})^{\\exp^{4}}) + ((\\exp^{x_{3}})^{3}))^{2})} \\\\ 279 | &+ \\exp^{(\\log{(x_{2} - x_{3})} - \\log{\\exp^{-((-1 + x_{1})^{2})}})} \\\\ 280 | &+ ((\\sqrt{4} \\times (((x_{3} / x_{2}) - x_{2}) - (0 - x_{1})))^{2}) \\\\ 281 | &+ (2 \\times ((((-5 \\times x_{3}) + x_{1}) \\times (2 - x_{3})) - 2)) \\\\ 282 | &+ ((\\sqrt{4} \\times (((x_{3} / x_{2}) - x_{2}) - (0 - x_{1})))^{2}) \\\\ 283 | &+ ((((-5 + x_{1}) - x_{2}) \\times (x_{2} - x_{3})) \\times ((x_{1} - x_{2}) - (-4^{-5}))) \\\\ 284 | &+ (\\exp^{-((x_{2} + (-5 - x_{1}))^{2})} + ((x_{2} + 5) \\times (x_{3}^{2}))) \\\\ 285 | &+ \\sqrt{ 1 / ( 1 + \\exp^{ -( (\\exp^{x_{1}} - \\exp^{-((x_{3} + x_{3})^{2})}) + ((x_{1}^{x_{3}}) - (x_{3} \\times 4)) ) } ) } \\\\ 286 | &+ ( ( \\exp^{ -( ( ( ( \\exp^{ -( ( (\\sqrt{x_{3}} \\times 4) + (1 / (1 + \\exp^{-(x_{2} + 2)})) )^{2} ) } )^{2} ) + x_{1} )^{2} ) } )^{3} ) \\\\ 287 | ) 288 | """ 289 | 290 | # Power et al. defines these three dimensionless parameters in Eqn (9) 291 | x1 = self.Hs / self.Lp 292 | x2 = self.beta 293 | x3 = self.r / self.Hs 294 | 295 | result = self.Hs * ( 296 | (x2 + (((x3 * 3) / np.exp(-5)) * ((3 * x3) * x3))) 297 | + ((((x1 + x3) - 2) - (x3 - x2)) + ((x2 - x1) - x3)) 298 | + (((x3 ** x1) - (x3 ** (1 / 3))) - (np.exp(x2) ** (x1 * 3))) 299 | + np.sqrt((((x3 + x1) - x2) - (x2 + np.log10(x3)))) 300 | + ((((x2 ** 2) / (x1 ** (1 / 3))) ** (x1 ** (1 / 3))) - np.sqrt(x3)) 301 | + ( 302 | (x2 + ((x3 / x1) ** (1 / 3))) 303 | + (np.log(2) - (1 / (1 + np.exp(-(x2 + x3))))) 304 | ) 305 | + ((np.sqrt(x3) - (((3 ** 2) + 3) * (x2 ** 2))) ** 2) 306 | + ((((x3 * -5) ** 2) ** 2) + (((x3 + x3) * x1) / (x2 ** 2))) 307 | + np.log((np.sqrt(((x2 ** 2) + (x3 ** (1 / 3)))) + ((x2 + 3) ** (1 / 3)))) 308 | + ( 309 | (((x1 / x3) * (-(5 ** 2))) * (x3 ** 2)) 310 | - np.log10((1 / (1 + np.exp(-(x2 + x3))))) 311 | ) 312 | + (x1 ** x3) 313 | + np.exp(-((((x3 / x1) ** np.exp(4)) + (np.exp(x3) ** 3)) ** 2)) 314 | + np.exp((np.log((x2 - x3)) - np.log(np.exp(-((-1 + x1) ** 2))))) 315 | + ((np.sqrt(4) * (((x3 / x2) - x2) - (0 - x1))) ** 2) 316 | + (2 * ((((-5 * x3) + x1) * (2 - x3)) - 2)) 317 | + ((np.sqrt(4) * (((x3 / x2) - x2) - (0 - x1))) ** 2) 318 | + ((((-5 + x1) - x2) * (x2 - x3)) * ((x1 - x2) - (-(4 ** -5)))) 319 | + (np.exp(-((x2 + (-5 - x1)) ** 2)) + ((x2 + 5) * (x3 ** 2))) 320 | + np.sqrt( 321 | 1 322 | / ( 323 | 1 324 | + np.exp( 325 | -( 326 | (np.exp(x1) - np.exp(-((x3 + x3) ** 2))) 327 | + ((x1 ** x3) - (x3 * 4)) 328 | ) 329 | ) 330 | ) 331 | ) 332 | + ( 333 | ( 334 | np.exp( 335 | -( 336 | ( 337 | ( 338 | ( 339 | np.exp( 340 | -( 341 | ( 342 | (np.sqrt(x3) * 4) 343 | + (1 / (1 + np.exp(-(x2 + 2)))) 344 | ) 345 | ** 2 346 | ) 347 | ) 348 | ) 349 | ** 2 350 | ) 351 | + x1 352 | ) 353 | ** 2 354 | ) 355 | ) 356 | ) 357 | ** 3 358 | ) 359 | ) 360 | 361 | result = self._return_one_or_array(result) 362 | return result 363 | 364 | 365 | class Holman1986(RunupModel): 366 | """ 367 | Implements the runup model from Holman (1986) 368 | 369 | Holman, R.A., 1986. Extreme value statistics for wave run-up on a natural 370 | beach. Coastal Engineering 9, 527–544. https://doi.org/10.1016/0378-3839( 371 | 86)90002-5 372 | 373 | Examples: 374 | Calculate 2% exceedence runup level, including setup component given Hs=4m, 375 | Tp=11s, beta=0.1. 376 | 377 | >>> from py_wave_runup.models import Holman1986 378 | >>> hol86 = Holman1986(Hs=4, Tp=11, beta=0.1) 379 | >>> hol86.R2 380 | 3.089266633290902 381 | >>> hol86.setup 382 | 0.8 383 | """ 384 | 385 | doi = "10.1016/0378-3839(86)90002-5" 386 | 387 | @property 388 | def R2(self): 389 | """ 390 | Returns: 391 | The 2% exceedence runup level, given by 392 | 393 | .. math:: R_{2} = 0.83 \\tan{\\beta} \\sqrt{H_{s}+L_{p}} + 0.2 H_{s} 394 | """ 395 | result = 0.83 * np.tan(self.beta) * np.sqrt(self.Hs * self.Lp) + 0.2 * self.Hs 396 | result = self._return_one_or_array(result) 397 | return result 398 | 399 | @property 400 | def setup(self): 401 | """ 402 | Returns: 403 | The setup level using: 404 | 405 | .. math:: \\bar{\\eta} = 0.2 H_{s} 406 | """ 407 | result = 0.2 * self.Hs 408 | result = self._return_one_or_array(result) 409 | return result 410 | 411 | 412 | class Nielsen2009(RunupModel): 413 | """ 414 | Implements the runup model from Nielsen (2009) 415 | 416 | P. Nielsen, Coastal and Estuarine Processes, Singapore, World Scientific, 2009. 417 | 418 | Examples: 419 | Calculate 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1. 420 | 421 | >>> from py_wave_runup.models import Nielsen2009 422 | >>> niel09 = Nielsen2009(Hs=4, Tp=11, beta=0.1) 423 | >>> niel09.R2 424 | 3.276685253433243 425 | """ 426 | 427 | @property 428 | def R2(self): 429 | """ 430 | Returns: 431 | The 2% exceedence runup level, given by 432 | 433 | .. math:: R_{2} = 1.98L_{R} + Z_{100} 434 | 435 | This relationship was first suggested by Nielsen and Hanslow (1991). The 436 | definitions for :math:`L_{R}` were then updated by Nielsen (2009), 437 | where :math:`L_{R} = 0.6 \\tan{\\beta} \\sqrt{H_{rms}L_{s}}` for 438 | :math:`\\tan{\\beta} \\geq 0.1` and :math:`L_{R} = 0.06\\sqrt{H_{rms}L_{s}}` 439 | for :math:`\\tan{\\beta}<0.1`. Note that :math:`Z_{100}` is the highest 440 | vertical level passed by all swash events in a time period and is usually 441 | taken as the tide varying water level. 442 | """ 443 | 444 | # Two different definitions of LR dependant on slope: 445 | beta_mask = np.tan(self.beta) < 0.1 446 | LR = 0.6 * np.tan(self.beta) * np.sqrt(self.Hs * self.Lp) 447 | LR[beta_mask] = 0.06 * np.sqrt(self.Hs[beta_mask] * self.Lp[beta_mask]) 448 | 449 | result = 1.98 * LR 450 | result = self._return_one_or_array(result) 451 | return result 452 | 453 | 454 | class Ruggiero2001(RunupModel): 455 | """ 456 | Implements the runup model from Ruggiero et al (2001) 457 | 458 | Ruggiero, P., Komar, P.D., McDougal, W.G., Marra, J.J., Beach, R.A., 2001. Wave 459 | Runup, Extreme Water Levels and the Erosion of Properties Backing Beaches. Journal 460 | of Coastal Research 17, 407–419. 461 | 462 | Examples: 463 | Calculates 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1. 464 | 465 | >>> from py_wave_runup.models import Ruggiero2001 466 | >>> rug01 = Ruggiero2001(Hs=4, Tp=11, beta=0.1) 467 | >>> rug01.R2 468 | 2.3470968711209452 469 | """ 470 | 471 | @property 472 | def R2(self): 473 | """ 474 | Returns: 475 | The 2% exceedence runup level, given by: 476 | 477 | .. math:: R_{2} = 0.27 \\sqrt{\\beta H_{s} L_{p}} 478 | """ 479 | 480 | result = 0.27 * np.sqrt(self.beta * self.Hs * self.Lp) 481 | result = self._return_one_or_array(result) 482 | return result 483 | 484 | 485 | class Vousdoukas2012(RunupModel): 486 | """ 487 | Implements the runup model from Vousdoukas et al (2012) 488 | 489 | Vousdoukas, M.I., Wziatek, D., Almeida, L.P., 2012. Coastal vulnerability assessment 490 | based on video wave run-up observations at a mesotidal, steep-sloped beach. Ocean 491 | Dynamics 62, 123–137. https://doi.org/10.1007/s10236-011-0480-x 492 | 493 | Examples: 494 | Calculates 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1. 495 | 496 | >>> from py_wave_runup.models import Vousdoukas2012 497 | >>> vou12 = Vousdoukas2012(Hs=4, Tp=11, beta=0.1) 498 | >>> vou12.R2 499 | 2.1397213136650377 500 | """ 501 | 502 | @property 503 | def R2(self): 504 | """ 505 | Returns: 506 | The 2% exceedence runup level, given by: 507 | 508 | .. math: R_{2} = 0.53 \\beta \\sqrt{H_{s}L_{p}} + 0.58 \\tan{\\beta}\\beta H_{s} + 0.45 509 | """ 510 | 511 | result = ( 512 | 0.53 * self.beta * np.sqrt(self.Hs * self.Lp) 513 | + 0.58 * np.tan(self.beta) * self.Hs 514 | + 0.45 515 | ) 516 | result = self._return_one_or_array(result) 517 | return result 518 | 519 | 520 | class Atkinson2017(RunupModel): 521 | """ 522 | Implements the runup model from Atkinson et al (2017) 523 | 524 | Atkinson, A.L., Power, H.E., Moura, T., Hammond, T., Callaghan, D.P., Baldock, T.E., 525 | 2017. Assessment of runup predictions by empirical models on non-truncated beaches 526 | on the south-east Australian coast. Coastal Engineering 119, 15–31. 527 | https://doi.org/10.1016/j.coastaleng.2016.10.001 528 | 529 | Examples: 530 | Calculate 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1 531 | 532 | >>> from py_wave_runup.models import Atkinson2017 533 | >>> atk17 = Atkinson2017(Hs=4, Tp=11, beta=0.1) 534 | >>> atk17.R2 535 | 3.177500364611603 536 | """ 537 | 538 | @property 539 | def R2(self): 540 | """ 541 | Returns: 542 | The 2% exceedence runup level, given by: 543 | 544 | .. math: R_{2} = 0.92 \\tan{\\beta} \\sqrt{H_{s} L_{p}} + 0.16 H_{s} 545 | """ 546 | 547 | result = 0.92 * np.tan(self.beta) * np.sqrt(self.Hs * self.Lp) + 0.16 * self.Hs 548 | result = self._return_one_or_array(result) 549 | return result 550 | 551 | 552 | class Senechal2011(RunupModel): 553 | """ 554 | Implements the runup model from Senechal et al (2011) 555 | 556 | Senechal, N., Coco, G., Bryan, K.R., Holman, R.A., 2011. Wave runup during extreme 557 | storm conditions. Journal of Geophysical Research 116. 558 | https://doi.org/10.1029/2010JC006819 559 | 560 | Examples: 561 | Calculate 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1 562 | 563 | >>> from py_wave_runup.models import Senechal2011 564 | >>> sen11 = Senechal2011(Hs=4, Tp=11, beta=0.1) 565 | >>> sen11.R2 566 | 1.9723707064298488 567 | """ 568 | 569 | @property 570 | def R2(self): 571 | """ 572 | Returns: 573 | The 2% exceedence runup level, given by: 574 | 575 | .. math:: R_{2} = 2.14 \\times \\tanh{0.4 H_{s}} 576 | """ 577 | 578 | result = 2.14 * np.tanh(0.4 * self.Hs) 579 | result = self._return_one_or_array(result) 580 | return result 581 | 582 | @property 583 | def sig(self): 584 | """ 585 | Returns: 586 | Infragravity component of swash: 587 | 588 | .. math: S_{ig} = 0.05 * (H_{s} L_{p})^{0.5} 589 | """ 590 | result = 0.05 * np.sqrt(self.Hs * self.Lp) 591 | result = self._return_one_or_array(result) 592 | return result 593 | 594 | 595 | class Beuzen2019(RunupModel): 596 | """ 597 | Implements the GP runup model from Beuzen et al (2019). 598 | 599 | Beuzen, T., Goldstein, E. B., & Splinter, K. D., 2019. Ensemble models from 600 | machine learning: an example of wave runup and coastal dune erosion. 601 | https://doi.org/10.5194/nhess-19-2295-2019 602 | 603 | Examples: 604 | Calculate 2% exceedence runup level given Hs=4m, Tp=11s, beta=0.1 605 | 606 | >>> from py_wave_runup.models import Beuzen2019 607 | >>> beu19 = Beuzen2019(Hs=4, Tp=11, beta=0.1) 608 | >>> f"{beu19.R2:.2f}" 609 | '2.08' 610 | """ 611 | 612 | @property 613 | def R2(self): 614 | """ 615 | Returns: 616 | The 2% exceedence runup level from a pre-trained Gaussian process model 617 | """ 618 | model_path = resource_filename( 619 | "py_wave_runup", "datasets/beuzen18/gp_runup_model.joblib" 620 | ) 621 | 622 | # Ignore the warning when unpickling GaussianProcessRegressor from version 623 | # 0.22.1. 624 | with warnings.catch_warnings(): 625 | warnings.simplefilter("ignore") 626 | with open(model_path, "rb") as f: 627 | model = joblib.load(f) 628 | 629 | result = np.squeeze( 630 | model.predict(np.column_stack((self.Hs, self.Tp, self.beta))) 631 | ) 632 | result = self._return_one_or_array(result) 633 | return result 634 | 635 | 636 | class Passarella2018(RunupModel): 637 | """ 638 | Implements the Infragravity Swash model from Passarella et al (2018) 639 | 640 | Passarella, M., E. B. Goldstein, S. De Muro, G. Coco, 2018. 641 | The use of genetic programming to develop a predictor of swash excursion on sandy beaches. 642 | Nat. Hazards Earth Syst. Sci., 18, 599-611, 643 | https://doi.org/10.5194/nhess-18-599-2018 644 | 645 | Examples: 646 | Calculate IG swash given Hs=4m, Tp=11s, beta=0.1 647 | 648 | >>> from py_wave_runup.models import Passarella2018 649 | >>> pas18 = Passarella2018(Hs=4, Tp=11, beta=0.1) 650 | >>> pas18.sig 651 | 1.5687930560916425 652 | """ 653 | 654 | @property 655 | def sig(self): 656 | """ 657 | Returns: 658 | Infragravity component of swash using Eqn (14): 659 | 660 | .. math:: 661 | 662 | S_{ig} = \\frac{\\beta}{0.028+\\beta} + 663 | \\frac{-1}{2412.255 \\beta - 5.521 \\beta L_{p}} + 664 | \\frac{H_{s} -0.711}{0.465 + 173.470 (\\frac{H_{s}}{L_{p}})} 665 | 666 | """ 667 | result = ( 668 | (self.beta / (0.028 + self.beta)) 669 | + (-1 / ((2412.255 * self.beta) - (5.521 * self.beta * self.Lp))) 670 | + ((self.Hs - 0.711) / (0.465 + (173.470 * (self.Hs / self.Lp)))) 671 | ) 672 | result = self._return_one_or_array(result) 673 | return result 674 | 675 | @property 676 | def swash(self): 677 | """ 678 | Returns: 679 | Total amount of swash using Eqn (12): 680 | 681 | .. math:: 682 | 683 | S = 146.737\\beta^{2} + \\frac{T_{p}H_{s}^{3}}{5.800+10.595H_{ 684 | s}^{3}} - 4397.838\\beta^4 685 | 686 | """ 687 | result = ( 688 | (146.737 * (self.beta ** 2)) 689 | + ((self.Tp * (self.Hs ** 3)) / (5.800 + (10.595 * (self.Hs ** 3)))) 690 | - 4397.838 * (self.beta ** 4) 691 | ) 692 | result = self._return_one_or_array(result) 693 | return result 694 | -------------------------------------------------------------------------------- /py_wave_runup/utils.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | 4 | 5 | class PerlinNoise(object): 6 | """ 7 | Perlin noise is used to generate random timeseries in the datasets module. 8 | 9 | Implementation of 1D Perlin Noise ported from C code: 10 | https://github.com/stegu/perlin-noise/blob/master/src/noise1234.c 11 | """ 12 | 13 | def __init__(self, num_octaves, persistence, noise_scale=0.188): 14 | self.num_octaves = num_octaves 15 | 16 | self.noise_scale = 0.188 17 | 18 | self.octaves = [PerlinNoiseOctave() for i in range(self.num_octaves)] 19 | self.frequencies = [1.0 / pow(2, i) for i in range(self.num_octaves)] 20 | self.amplitudes = [ 21 | pow(persistence, len(self.octaves) - i) for i in range(self.num_octaves) 22 | ] 23 | 24 | def noise(self, x): 25 | noise = [ 26 | self.octaves[i].noise( 27 | xin=x * self.frequencies[i], noise_scale=self.noise_scale 28 | ) 29 | * self.amplitudes[i] 30 | for i in range(self.num_octaves) 31 | ] 32 | 33 | return sum(noise) 34 | 35 | 36 | class PerlinNoiseOctave(object): 37 | """ 38 | Perlin noise is used to generate random timeseries in the datasets module. 39 | """ 40 | 41 | def __init__(self, num_shuffles=100): 42 | self.p_supply = [i for i in range(0, 256)] 43 | 44 | for i in range(num_shuffles): 45 | random.shuffle(self.p_supply) 46 | 47 | self.perm = self.p_supply * 2 48 | 49 | def noise(self, xin, noise_scale): 50 | ix0 = int(math.floor(xin)) 51 | fx0 = xin - ix0 52 | fx1 = fx0 - 1.0 53 | ix1 = (ix0 + 1) & 255 54 | ix0 = ix0 & 255 55 | 56 | s = self.fade(fx0) 57 | 58 | n0 = self.grad(self.perm[ix0], fx0) 59 | n1 = self.grad(self.perm[ix1], fx1) 60 | 61 | return noise_scale * self.lerp(s, n0, n1) 62 | 63 | def lerp(self, t, a, b): 64 | return a + t * (b - a) 65 | 66 | def fade(self, t): 67 | return t * t * t * (t * (t * 6.0 - 15.0) + 10.0) 68 | 69 | def grad(self, hash, x): 70 | h = hash & 15 71 | grad = 1.0 + (h & 7) # Gradient value from 1.0 - 8.0 72 | if h & 8: 73 | grad = -grad # Add a random sign 74 | return grad * x 75 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "py-wave-runup" 3 | version = "0.1.10" 4 | description = "Empirical wave runup models implemented in Python" 5 | authors = ["Chris Leaman"] 6 | license = "GPL-3.0+" 7 | readme = 'README.rst' 8 | repository = 'https://github.com/chrisleaman/py-wave-runup' 9 | homepage = 'https://github.com/chrisleaman/py-wave-runup' 10 | documentation = 'https://py-wave-runup.readthedocs.io' 11 | 12 | [tool.poetry.dependencies] 13 | python = "^3.7 || ^3.8 || ^3.9" 14 | numpy = "^1.16" 15 | pandas = "^1.0" 16 | joblib = "^0.14.1" 17 | 18 | [tool.poetry.dev-dependencies] 19 | coverage = "^5.0" 20 | codecov = "^2.0" 21 | pre-commit = "^2.9" 22 | pytest-runner = "^5.1" 23 | pytest = "^6.0" 24 | pytest-cov = "^2.8" 25 | sphinx = "^4.0" 26 | sphinx-gallery = "^0.9.0" 27 | tox = "^3.13" 28 | tomlkit = "^0.7.0" 29 | black = "^21.6b0" 30 | matplotlib = "^3.4.2" 31 | scikit-learn = {version = "^0.24.2", allow-prereleases = true} 32 | 33 | [build-system] 34 | requires = ["poetry>=0.12"] 35 | build-backend = "poetry.masonry.api" 36 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | addopts = --cov=py_wave_runup --cov-report term-missing --doctest-modules --ignore=docs 3 | doctest_optionflags= NORMALIZE_WHITESPACE ELLIPSIS -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | black<20.0,>=18.3 2 | codecov==2.*,>=2.0.0 3 | coverage==5.*,>=5.0.0 4 | joblib==0.*,>=0.14.1 5 | numpy==1.*,>=1.16.0 6 | pandas==0.*,>=0.25.3 7 | pre-commit==1.*,>=1.18.0 8 | pytest==5.*,>=5.3.0 9 | pytest-cov==2.*,>=2.8.0 10 | pytest-runner==5.*,>=5.1.0 11 | scikit-learn==0.*,>=0.22.0 12 | sphinx==2.*,>=2.3.0 13 | sphinx-gallery==0.*,>=0.5.0 14 | tomlkit==0.*,>=0.5.8 15 | tox==3.*,>=3.13.0 16 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisleaman/py-wave-runup/f75a5551544d9e54d0e74dc94d8aaa119f80d62b/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_datasets.py: -------------------------------------------------------------------------------- 1 | from pytest import approx, raises 2 | 3 | from py_wave_runup import datasets 4 | 5 | 6 | class TestPower18(object): 7 | def test_load_data(self): 8 | df = datasets.load_power18() 9 | first_row = { 10 | "dataset": "ATKINSON2017", 11 | "beach": "AUSTINMER", 12 | "case": "AU24-1", 13 | "lab_field": "F", 14 | "hs": 0.739476577, 15 | "tp": 6.4, 16 | "beta": 0.102, 17 | "d50": "0.000445", 18 | "roughness": 0.0011125, 19 | "r2": 1.979, 20 | } 21 | assert first_row == df.iloc[0].to_dict() 22 | -------------------------------------------------------------------------------- /tests/test_ensembles.py: -------------------------------------------------------------------------------- 1 | from pytest import approx, raises 2 | 3 | from py_wave_runup import ensembles 4 | 5 | 6 | class TestEnsembleRaw(object): 7 | def test_invalid_param(self): 8 | ensemble = ensembles.EnsembleRaw(Hs=1, Tp=8, beta=0.1) 9 | with raises(ValueError): 10 | ensemble.estimate("not_r2") 11 | -------------------------------------------------------------------------------- /tests/test_models.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from pytest import approx, raises 3 | 4 | from py_wave_runup import models 5 | 6 | 7 | class TestStockdon2006(object): 8 | def test_reflective(self): 9 | model = models.Stockdon2006(Hs=4, Tp=11, beta=0.1) 10 | assert model.R2 == approx(2.54, abs=0.01) 11 | assert model.setup == approx(0.96, abs=0.01) 12 | assert model.sig == approx(1.65, abs=0.01) 13 | assert model.sinc == approx(2.06, abs=0.01) 14 | assert model.swash == approx(2.64, abs=0.01) 15 | 16 | def test_dissipative(self): 17 | model = models.Stockdon2006(Hs=4, Tp=11, beta=0.001) 18 | assert model.R2 == approx(1.18, abs=0.01) 19 | assert model.setup == approx(0.0096, abs=0.01) 20 | assert model.sig == approx(1.65, abs=0.01) 21 | assert model.sinc == approx(0.02, abs=0.01) 22 | assert model.swash == approx(1.65, abs=0.01) 23 | 24 | def test_wave_length(self): 25 | model = models.Stockdon2006(Hs=4, Lp=200, beta=0.05) 26 | assert model.R2 == approx(1.69, 0.1) 27 | 28 | def test_depth_and_period(self): 29 | model = models.Stockdon2006(Hs=4, Tp=12, h=15, beta=0.05) 30 | assert model.R2 == approx(1.00, 0.1) 31 | 32 | def test_depth_and_wavelength(self): 33 | model = models.Stockdon2006(Hs=4, Lp=200, h=15, beta=0.05) 34 | assert model.R2 == approx(1.69, 0.1) 35 | 36 | def test_list_input(self): 37 | model = models.Stockdon2006(Hs=[1, 2], Lp=[100, 200], beta=[0.05, 0.1]) 38 | assert model.R2 == approx((0.59, 1.84), abs=0.1) 39 | assert model.setup == approx((0.17, 0.70), abs=0.1) 40 | assert model.sig == approx((0.6, 1.2), abs=0.1) 41 | assert model.sinc == approx((0.37, 1.5), abs=0.1) 42 | assert model.swash == approx((0.71, 1.92), abs=0.01) 43 | 44 | def test_no_wave_length(self): 45 | with raises(ValueError): 46 | models.Stockdon2006(Hs=1, beta=0.1) 47 | 48 | def test_different_list_input(self): 49 | with raises(ValueError): 50 | models.Stockdon2006(Hs=[1, 2], Lp=[100, 200], beta=[0.1]) 51 | 52 | 53 | class TestPower2018(object): 54 | def test_reflective(self): 55 | model = models.Power2018(Hs=4, Tp=11, beta=0.1, r=0.00075) 56 | assert model.R2 == approx(4.79, abs=0.01) 57 | 58 | def test_dissipative(self): 59 | model = models.Power2018(Hs=4, Tp=11, beta=0.001, r=0.00075) 60 | assert model.R2 == approx(33.75, abs=0.01) 61 | 62 | def test_low_wave_conditions(self): 63 | model = models.Power2018(Hs=1, Tp=8, beta=0.07, r=0.00075) 64 | assert model.R2 == approx(1.12, abs=0.01) 65 | 66 | def test_list_input(self): 67 | model = models.Power2018( 68 | Hs=[1, 2], Lp=[100, 200], beta=[0.05, 0.1], r=[0.00075, 0.00075] 69 | ) 70 | assert model.R2 == approx((0.922, 2.88), abs=0.1) 71 | 72 | def test_no_roughness(self): 73 | model = models.Power2018(Hs=4, Tp=11, beta=0.1) 74 | assert np.isnan(model.R2) 75 | 76 | 77 | class TestHolman1986(object): 78 | def test_reflective(self): 79 | model = models.Holman1986(Hs=4, Tp=11, beta=0.1) 80 | assert model.R2 == approx(3.09, abs=0.01) 81 | assert model.setup == approx(0.8, abs=0.01) 82 | 83 | def test_dissipative(self): 84 | model = models.Holman1986(Hs=4, Tp=11, beta=0.001) 85 | assert model.R2 == approx(0.82, abs=0.01) 86 | assert model.setup == approx(0.8, abs=0.01) 87 | 88 | def test_list_input(self): 89 | model = models.Holman1986(Hs=[1, 2], Lp=[100, 200], beta=[0.05, 0.1]) 90 | assert model.R2 == approx((0.62, 2.06), abs=0.1) 91 | assert model.setup == approx((0.2, 0.4), abs=0.01) 92 | 93 | 94 | class TestNielsen2009(object): 95 | def test_reflective(self): 96 | model = models.Nielsen2009(Hs=4, Tp=11, beta=0.1) 97 | assert model.R2 == approx(3.27, abs=0.01) 98 | 99 | 100 | class TestRuggiero2001(object): 101 | def test_reflective(self): 102 | model = models.Ruggiero2001(Hs=4, Tp=11, beta=0.1) 103 | assert model.R2 == approx(2.35, abs=0.01) 104 | 105 | def test_dissipative(self): 106 | model = models.Ruggiero2001(Hs=4, Tp=11, beta=0.001) 107 | assert model.R2 == approx(0.23, abs=0.01) 108 | 109 | 110 | class TestVousdoukas2012(object): 111 | def test_reflective(self): 112 | model = models.Vousdoukas2012(Hs=4, Tp=11, beta=0.1) 113 | assert model.R2 == approx(2.14, abs=0.01) 114 | 115 | def test_dissipative(self): 116 | model = models.Vousdoukas2012(Hs=4, Tp=11, beta=0.001) 117 | assert model.R2 == approx(0.47, abs=0.01) 118 | 119 | 120 | class TestAtkinson2018(object): 121 | def test_reflective(self): 122 | model = models.Atkinson2017(Hs=4, Tp=11, beta=0.1) 123 | assert model.R2 == approx(3.17, abs=0.01) 124 | 125 | def test_dissipative(self): 126 | model = models.Atkinson2017(Hs=4, Tp=11, beta=0.001) 127 | assert model.R2 == approx(0.67, abs=0.01) 128 | 129 | 130 | class TestSenechal2011(object): 131 | def test_reflective(self): 132 | model = models.Senechal2011(Hs=4, Tp=11, beta=0.1) 133 | assert model.R2 == approx(1.97, abs=0.01) 134 | assert model.sig == approx(1.37, abs=0.01) 135 | 136 | def test_dissipative(self): 137 | model = models.Senechal2011(Hs=4, Tp=11, beta=0.001) 138 | assert model.R2 == approx(1.97, abs=0.01) 139 | assert model.sig == approx(1.37, abs=0.01) 140 | 141 | 142 | class TestBeuzenl2019(object): 143 | def test_reflective(self): 144 | model = models.Beuzen2019(Hs=4, Tp=11, beta=0.1) 145 | assert model.R2 == approx(2.08, abs=0.01) 146 | 147 | def test_dissipative(self): 148 | model = models.Beuzen2019(Hs=4, Tp=11, beta=0.001) 149 | assert model.R2 == approx(2.06, abs=0.01) 150 | 151 | 152 | class TestPassarella2018(object): 153 | def test_reflective(self): 154 | model = models.Passarella2018(Hs=4, Tp=11, beta=0.1) 155 | assert model.sig == approx(1.57, abs=0.01) 156 | assert model.swash == approx(2.05, abs=0.01) 157 | 158 | def test_dissipative(self): 159 | model = models.Passarella2018(Hs=4, Tp=11, beta=0.001) 160 | assert model.sig == approx(0.10, abs=0.01) 161 | assert model.swash == approx(1.02, abs=0.01) 162 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | skipsdist = True 3 | envlist = py37, py38, py39 4 | 5 | [travis] 6 | python = 7 | 3.9: py39 8 | 3.8: py38 9 | 3.7: py37 10 | 11 | [testenv] 12 | whitelist_externals = poetry 13 | passenv = TOXENV CI TRAVIS TRAVIS_* CODECOV_* 14 | skip_install = true 15 | commands = 16 | poetry install -v 17 | poetry run pytest . 18 | codecov -e TOXENV 19 | 20 | --------------------------------------------------------------------------------