Repository: scikit-mobility/scikit-mobility

Issue:
H3 tesselation - IndexError: index -1 is out of bounds for axis 0 with size 0
Good evening, 
When I run the command `tilers.tiler.get("h3_tessellation", base_shape = gdf)` I receive this error: 
```
epsg:3857
C:\Python38\lib\site-packages\skmob\tessellation\tilers.py:205: UserWarning: Geometry is in a geographic CRS. Results from 'area' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  np.array(list(constants.H3_UTILS['avg_hex_area_km2'].values())) > base_shape.area.values[0])[0][-1]
Traceback (most recent call last):

  File "C:\WS\flickr-geo-search\flickr_geo_elab.py", line 20, in <module>
    h3tess = tilers.tiler.get("h3_tessellation", base_shape = gdf)

  File "C:\Python38\lib\site-packages\skmob\tessellation\tilers.py", line 29, in get
    return self.create(service_id, **kwargs)

  File "C:\Python38\lib\site-packages\skmob\tessellation\tilers.py", line 26, in create
    return tiler(**kwargs)

  File "C:\Python38\lib\site-packages\skmob\tessellation\tilers.py", line 264, in __call__
    return self._build(base_shape, meters, crs)

  File "C:\Python38\lib\site-packages\skmob\tessellation\tilers.py", line 269, in _build
    res = self._get_appropriate_res(base_shape, meters)

  File "C:\Python38\lib\site-packages\skmob\tessellation\tilers.py", line 204, in _get_appropriate_res
    min_res_cover = np.where(

IndexError: index -1 is out of bounds for axis 0 with size 0
```
Strange, because I've reprojected the dataframe from 4326 to 3857, what I'm doing wrong?  However, the command works without reprojection.
This is my code:

```
import pandas as pd
import geopandas as gpd
import skmob
from skmob.tessellation import tilers

df = pd.read_pickle(r"data\Roma_2004_2020_geo.pkl")
gdf = gpd.GeoDataFrame(df, geometry = gpd.points_from_xy(df.longitude, 
                                    df.latitude,
                                    crs = "EPSG:4326").to_crs(epsg=3857))
print(gdf.crs)
h3tess = tilers.tiler.get("h3_tessellation", base_shape = gdf)
h3tess.to_file("h3tess_test.shp")
```

Thanks!!! 
Ivan

Discussion:

Patch:
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..a1a54a3
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,3 @@
+[flake8]
+max-line-length = 120
+max-complexity = 18
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000..0e18b00
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,51 @@
+name: Lint
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    # We want to run on external PRs, but not on our own internal PRs as they'll be run
+    # by the push to the branch. Without this if check, checks are duplicated since
+    # internal PRs match both the push and pull_request events.
+    if:
+      github.event_name == 'push' || github.event.pull_request.head.repo.full_name !=
+      github.repository
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Set up Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.6
+
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          python -m pip install --upgrade pre-commit tox poetry
+          python -m pip install sphinx sphinx_rtd_theme sphinx-copybutton
+
+      - name: Lint
+        run: pre-commit run --show-diff-on-failure --files  skmob/tessellation/*
+
+      - name: Test and coverage
+        run:  |
+          python3 -m tox -e py36
+
+      - name: Build documentation
+        working-directory: docs
+        run:  make html
+
+      - name: Copy static files
+        run: |
+          mv .nojekyll static/html
+          mv logo_skmob.png static/html
+          mv coverage static/html
+
+      - name: Deploy 🚀
+        uses: JamesIves/github-pages-deploy-action@4.1.1
+        with:
+          branch: gh-pages # The branch the action should deploy to.
+          folder: static/html # The folder the action should deploy.
diff --git a/.gitignore b/.gitignore
index 3f688ed..07c7500 100644
--- a/.gitignore
+++ b/.gitignore
@@ -65,4 +65,16 @@ __pycache__/
 .DS_Store
 
 # VSCode
-.vscode
\ No newline at end of file
+.vscode
+
+# HTML Docs
+static/*
+
+# Coverage
+.coverage/*
+coverage/*
+htmlcov
+
+
+# Tox
+.tox
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..9623e45
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,21 @@
+repos:
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v2.3.0
+    hooks:
+    -   id: check-yaml
+    -   id: end-of-file-fixer
+    -   id: trailing-whitespace
+-   repo: https://github.com/pre-commit/mirrors-isort
+    rev: v5.5.4
+    hooks:
+    - id: isort
+      args: ["--profile", "black"]
+-   repo: https://github.com/python/black
+    rev: 20.8b1
+    hooks:
+    - id: black
+      language_version: python3.6
+-   repo: https://gitlab.com/pycqa/flake8
+    rev: 3.8.4
+    hooks:
+    - id: flake8
diff --git a/docs/Makefile b/docs/Makefile
index d682645..32f8f3e 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -3,10 +3,10 @@
 
 # You can set these variables from the command line, and also
 # from the environment for the first two.
-SPHINXOPTS    ?=
+SPHINXOPTS    ?=-a -b html --keep-going
 SPHINXBUILD   ?= sphinx-build
 SOURCEDIR     = .
-BUILDDIR      = ../../scikit-mobility-docs
+BUILDDIR      = ../static
 
 # Put it first so that "make" without argument is like "make help".
 help:
diff --git a/docs/conf.py b/docs/conf.py
index 18ce9d8..2b9ce03 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -12,14 +12,15 @@
 
 import os
 import sys
-sys.path.insert(0, os.path.abspath('..'))
+
+sys.path.insert(0, os.path.abspath(".."))
 
 
 # -- Project information -----------------------------------------------------
 
-project = 'scikit-mobility'
-copyright = '2019, skmob devs'
-author = 'skmob devs'
+project = "scikit-mobility"
+copyright = "2019, skmob devs"
+author = "skmob devs"
 
 
 # -- General configuration ---------------------------------------------------
@@ -27,18 +28,18 @@ author = 'skmob devs'
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.napoleon']
+extensions = ["sphinx.ext.autodoc", "sphinx.ext.autosummary", "sphinx.ext.napoleon", "sphinx_copybutton"]
 napoleon_google_docstring = False
 napoleon_use_param = False
 napoleon_use_ivar = True
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 # This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
 
 
 # -- Options for HTML output -------------------------------------------------
@@ -47,32 +48,35 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
 # a list of builtin themes.
 #
 html_theme = "sphinx_rtd_theme"
-html_logo = '../logo_skmob.png'
+html_logo = "../logo_skmob.png"
 html_theme_options = {
-    'canonical_url': '',
-    'analytics_id': 'UA-XXXXXXX-1',  #  Provided by Google in your dashboard
-    'logo_only': False,
-    'display_version': True,
-    'prev_next_buttons_location': 'bottom',
-    'style_external_links': False,
-    'vcs_pageview_mode': '',
-    'style_nav_header_background': 'white',
+    "canonical_url": "",
+    "analytics_id": "UA-XXXXXXX-1",
+    "logo_only": False,
+    "display_version": True,
+    "prev_next_buttons_location": "bottom",
+    "style_external_links": False,
+    "vcs_pageview_mode": "",
+    "style_nav_header_background": "white",
     # Toc options
-    'collapse_navigation': True,
-    'sticky_navigation': True,
-    'navigation_depth': 4,
-    'includehidden': True,
-    'titles_only': False
+    "collapse_navigation": True,
+    "sticky_navigation": True,
+    "navigation_depth": 4,
+    "includehidden": True,
+    "titles_only": False,
 }
 
-html_theme_path = ["_themes", ]
+html_theme_path = [
+    "_themes",
+]
 
 numpydoc_show_class_members = False
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ["_static"]
+
 
 def setup(app):
-    app.add_javascript('copybutton.js')
+    app.add_js_file("copybutton.js")
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..81e71cb
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,1954 @@
+[[package]]
+name = "appdirs"
+version = "1.4.4"
+description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "atomicwrites"
+version = "1.4.0"
+description = "Atomic file writes."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "attrs"
+version = "21.2.0"
+description = "Classes Without Boilerplate"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
+
+[[package]]
+name = "branca"
+version = "0.4.2"
+description = "Generate complex HTML+JS pages with Python"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+jinja2 = "*"
+
+[[package]]
+name = "cachecontrol"
+version = "0.12.6"
+description = "httplib2 caching for requests"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""}
+msgpack = ">=0.5.2"
+requests = "*"
+
+[package.extras]
+filecache = ["lockfile (>=0.9)"]
+redis = ["redis (>=2.10.5)"]
+
+[[package]]
+name = "cachy"
+version = "0.3.0"
+description = "Cachy provides a simple yet effective caching library."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.extras]
+redis = ["redis (>=3.3.6,<4.0.0)"]
+memcached = ["python-memcached (>=1.59,<2.0)"]
+msgpack = ["msgpack-python (>=0.5,<0.6)"]
+
+[[package]]
+name = "certifi"
+version = "2020.12.5"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "cffi"
+version = "1.14.5"
+description = "Foreign Function Interface for Python calling C code."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+name = "cfgv"
+version = "3.2.0"
+description = "Validate configuration and produce human readable error messages."
+category = "dev"
+optional = false
+python-versions = ">=3.6.1"
+
+[[package]]
+name = "chardet"
+version = "4.0.0"
+description = "Universal encoding detector for Python 2 and 3"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "cleo"
+version = "0.8.1"
+description = "Cleo allows you to create beautiful and testable command-line interfaces."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+clikit = ">=0.6.0,<0.7.0"
+
+[[package]]
+name = "click"
+version = "7.1.2"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "click-plugins"
+version = "1.1.1"
+description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+click = ">=4.0"
+
+[package.extras]
+dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"]
+
+[[package]]
+name = "cligj"
+version = "0.7.1"
+description = "Click params for commmand line interfaces to GeoJSON"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4"
+
+[package.dependencies]
+click = ">=4.0,<8"
+
+[package.extras]
+test = ["pytest-cov"]
+
+[[package]]
+name = "clikit"
+version = "0.6.2"
+description = "CliKit is a group of utilities to build beautiful and testable command line interfaces."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""}
+pastel = ">=0.2.0,<0.3.0"
+pylev = ">=1.3,<2.0"
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "coverage"
+version = "5.5"
+description = "Code coverage measurement for Python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+toml = ["toml"]
+
+[[package]]
+name = "crashtest"
+version = "0.3.1"
+description = "Manage Python errors with ease"
+category = "dev"
+optional = false
+python-versions = ">=3.6,<4.0"
+
+[[package]]
+name = "cryptography"
+version = "3.4.7"
+description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cffi = ">=1.12"
+
+[package.extras]
+docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
+docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
+pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
+sdist = ["setuptools-rust (>=0.11.4)"]
+ssh = ["bcrypt (>=3.1.5)"]
+test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
+
+[[package]]
+name = "cycler"
+version = "0.10.0"
+description = "Composable style cycles"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+name = "distlib"
+version = "0.3.1"
+description = "Distribution utilities"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "filelock"
+version = "3.0.12"
+description = "A platform independent file lock."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "fiona"
+version = "1.8.19"
+description = "Fiona reads and writes spatial data files"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+attrs = ">=17"
+certifi = "*"
+click = ">=4.0,<8"
+click-plugins = ">=1.0"
+cligj = ">=0.5"
+munch = "*"
+six = ">=1.7"
+
+[package.extras]
+all = ["pytest (>=3)", "pytest-cov", "shapely", "boto3 (>=1.2.4)", "mock"]
+calc = ["shapely"]
+s3 = ["boto3 (>=1.2.4)"]
+test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"]
+
+[[package]]
+name = "folium"
+version = "0.12.1"
+description = "Make beautiful maps with Leaflet.js & Python"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+branca = ">=0.3.0"
+jinja2 = ">=2.9"
+numpy = "*"
+requests = "*"
+
+[package.extras]
+testing = ["pytest"]
+
+[[package]]
+name = "geojson"
+version = "2.5.0"
+description = "Python bindings and utilities for GeoJSON"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "geopandas"
+version = "0.9.0"
+description = "Geographic pandas extensions"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+fiona = ">=1.8"
+pandas = ">=0.24.0"
+pyproj = ">=2.2.0"
+shapely = ">=1.6"
+
+[[package]]
+name = "h3"
+version = "3.7.2"
+description = "Hierarchical hexagonal geospatial indexing system"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+all = ["numpy", "pytest", "pytest-cov", "flake8"]
+numpy = ["numpy"]
+test = ["pytest", "pytest-cov", "flake8"]
+
+[[package]]
+name = "html5lib"
+version = "1.1"
+description = "HTML parser based on the WHATWG HTML specification"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+six = ">=1.9"
+webencodings = "*"
+
+[package.extras]
+all = ["genshi", "chardet (>=2.2)", "lxml"]
+chardet = ["chardet (>=2.2)"]
+genshi = ["genshi"]
+lxml = ["lxml"]
+
+[[package]]
+name = "identify"
+version = "2.2.4"
+description = "File identification library for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.6.1"
+
+[package.extras]
+license = ["editdistance-s"]
+
+[[package]]
+name = "idna"
+version = "2.10"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "importlib-metadata"
+version = "1.7.0"
+description = "Read metadata from Python packages"
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "rst.linker"]
+testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "importlib-resources"
+version = "5.1.2"
+description = "Read resources from Python packages"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+zipp = {version = ">=0.4", markers = "python_version < \"3.8\""}
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[[package]]
+name = "iniconfig"
+version = "1.1.1"
+description = "iniconfig: brain-dead simple config-ini parsing"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "jeepney"
+version = "0.6.0"
+description = "Low-level, pure Python DBus protocol wrapper."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"]
+
+[[package]]
+name = "jinja2"
+version = "2.11.3"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+MarkupSafe = ">=0.23"
+
+[package.extras]
+i18n = ["Babel (>=0.8)"]
+
+[[package]]
+name = "joblib"
+version = "1.0.1"
+description = "Lightweight pipelining with Python functions"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "keyring"
+version = "21.8.0"
+description = "Store and access your passwords safely."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""}
+jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""}
+pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""}
+SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""}
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[[package]]
+name = "kiwisolver"
+version = "1.3.1"
+description = "A fast implementation of the Cassowary constraint solver"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "lockfile"
+version = "0.12.2"
+description = "Platform-independent file locking module"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "markupsafe"
+version = "1.1.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+
+[[package]]
+name = "matplotlib"
+version = "3.3.4"
+description = "Python plotting package"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cycler = ">=0.10"
+kiwisolver = ">=1.0.1"
+numpy = ">=1.15"
+pillow = ">=6.2.0"
+pyparsing = ">=2.0.3,<2.0.4 || >2.0.4,<2.1.2 || >2.1.2,<2.1.6 || >2.1.6"
+python-dateutil = ">=2.1"
+
+[[package]]
+name = "mpmath"
+version = "1.2.1"
+description = "Python library for arbitrary-precision floating-point arithmetic"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+develop = ["pytest (>=4.6)", "pycodestyle", "pytest-cov", "codecov", "wheel"]
+tests = ["pytest (>=4.6)"]
+
+[[package]]
+name = "msgpack"
+version = "1.0.2"
+description = "MessagePack (de)serializer."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "munch"
+version = "2.5.0"
+description = "A dot-accessible dictionary (a la JavaScript objects)"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[package.extras]
+testing = ["pytest", "coverage", "astroid (>=1.5.3,<1.6.0)", "pylint (>=1.7.2,<1.8.0)", "astroid (>=2.0)", "pylint (>=2.3.1,<2.4.0)"]
+yaml = ["PyYAML (>=5.1.0)"]
+
+[[package]]
+name = "nodeenv"
+version = "1.6.0"
+description = "Node.js virtual environment builder"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "numpy"
+version = "1.19.5"
+description = "NumPy is the fundamental package for array computing with Python."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "packaging"
+version = "20.9"
+description = "Core utilities for Python packages"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+pyparsing = ">=2.0.2"
+
+[[package]]
+name = "pandas"
+version = "1.1.5"
+description = "Powerful data structures for data analysis, time series, and statistics"
+category = "main"
+optional = false
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+numpy = ">=1.15.4"
+python-dateutil = ">=2.7.3"
+pytz = ">=2017.2"
+
+[package.extras]
+test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"]
+
+[[package]]
+name = "pastel"
+version = "0.2.1"
+description = "Bring colors to your terminal."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "patsy"
+version = "0.5.1"
+description = "A Python package for describing statistical models and for building design matrices."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+numpy = ">=1.4"
+six = "*"
+
+[[package]]
+name = "pexpect"
+version = "4.8.0"
+description = "Pexpect allows easy control of interactive console applications."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+ptyprocess = ">=0.5"
+
+[[package]]
+name = "pillow"
+version = "8.2.0"
+description = "Python Imaging Library (Fork)"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "pkginfo"
+version = "1.7.0"
+description = "Query metadatdata from sdists / bdists / installed packages."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.extras]
+testing = ["nose", "coverage"]
+
+[[package]]
+name = "pluggy"
+version = "0.13.1"
+description = "plugin and hook calling mechanisms for python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+
+[[package]]
+name = "poetry"
+version = "1.1.6"
+description = "Python dependency management and packaging made easy."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+cachecontrol = {version = ">=0.12.4,<0.13.0", extras = ["filecache"]}
+cachy = ">=0.3.0,<0.4.0"
+cleo = ">=0.8.1,<0.9.0"
+clikit = ">=0.6.2,<0.7.0"
+crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""}
+html5lib = ">=1.0,<2.0"
+importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""}
+keyring = {version = ">=21.2.0,<22.0.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""}
+packaging = ">=20.4,<21.0"
+pexpect = ">=4.7.0,<5.0.0"
+pkginfo = ">=1.4,<2.0"
+poetry-core = ">=1.0.3,<1.1.0"
+requests = ">=2.18,<3.0"
+requests-toolbelt = ">=0.9.1,<0.10.0"
+shellingham = ">=1.1,<2.0"
+tomlkit = ">=0.7.0,<1.0.0"
+virtualenv = ">=20.0.26,<21.0.0"
+
+[[package]]
+name = "poetry-core"
+version = "1.0.3"
+description = "Poetry PEP 517 Build Backend"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""}
+
+[[package]]
+name = "powerlaw"
+version = "1.4.6"
+description = "Toolbox for testing if a probability distribution fits a power law"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+matplotlib = "*"
+mpmath = "*"
+numpy = "*"
+scipy = "*"
+
+[[package]]
+name = "pre-commit"
+version = "2.12.1"
+description = "A framework for managing and maintaining multi-language pre-commit hooks."
+category = "dev"
+optional = false
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+cfgv = ">=2.0.0"
+identify = ">=1.0.0"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+importlib-resources = {version = "*", markers = "python_version < \"3.7\""}
+nodeenv = ">=0.11.1"
+pyyaml = ">=5.1"
+toml = "*"
+virtualenv = ">=20.0.8"
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+description = "Run a subprocess in a pseudo terminal"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "py"
+version = "1.10.0"
+description = "library with cross-python path, ini-parsing, io, code, log facilities"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pycparser"
+version = "2.20"
+description = "C parser in Python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pylev"
+version = "1.3.0"
+description = "A pure Python Levenshtein implementation that's not freaking GPL'd."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pyparsing"
+version = "2.4.7"
+description = "Python parsing module"
+category = "main"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "pyproj"
+version = "3.0.1"
+description = "Python interface to PROJ (cartographic projections and coordinate transformations library)"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+certifi = "*"
+
+[[package]]
+name = "pytest"
+version = "6.2.4"
+description = "pytest: simple powerful testing with Python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
+attrs = ">=19.2.0"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=0.12,<1.0.0a1"
+py = ">=1.8.2"
+toml = "*"
+
+[package.extras]
+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.1"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "python-igraph"
+version = "0.9.1"
+description = "High performance graph data structures and algorithms"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+texttable = ">=1.6.2"
+
+[package.extras]
+plotting = ["pycairo (>=1.18.0)"]
+
+[[package]]
+name = "pytz"
+version = "2021.1"
+description = "World timezone definitions, modern and historical"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pywin32-ctypes"
+version = "0.2.0"
+description = ""
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pyyaml"
+version = "5.4.1"
+description = "YAML parser and emitter for Python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[[package]]
+name = "requests"
+version = "2.25.1"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+chardet = ">=3.0.2,<5"
+idna = ">=2.5,<3"
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
+socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+
+[[package]]
+name = "requests-toolbelt"
+version = "0.9.1"
+description = "A utility belt for advanced users of python-requests"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+requests = ">=2.0.1,<3.0.0"
+
+[[package]]
+name = "rtree"
+version = "0.9.7"
+description = "R-Tree spatial index for Python GIS"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "scikit-learn"
+version = "0.24.2"
+description = "A set of python modules for machine learning and data mining"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+joblib = ">=0.11"
+numpy = ">=1.13.3"
+scipy = ">=0.19.1"
+threadpoolctl = ">=2.0.0"
+
+[package.extras]
+benchmark = ["matplotlib (>=2.1.1)", "pandas (>=0.25.0)", "memory-profiler (>=0.57.0)"]
+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)"]
+examples = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)"]
+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)"]
+
+[[package]]
+name = "scipy"
+version = "1.5.4"
+description = "SciPy: Scientific Library for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+numpy = ">=1.14.5"
+
+[[package]]
+name = "secretstorage"
+version = "3.3.1"
+description = "Python bindings to FreeDesktop.org Secret Service API"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cryptography = ">=2.0"
+jeepney = ">=0.6"
+
+[[package]]
+name = "shapely"
+version = "1.7.1"
+description = "Geometric objects, predicates, and operations"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+all = ["numpy", "pytest", "pytest-cov"]
+test = ["pytest", "pytest-cov"]
+vectorized = ["numpy"]
+
+[[package]]
+name = "shellingham"
+version = "1.4.0"
+description = "Tool to Detect Surrounding Shell"
+category = "dev"
+optional = false
+python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "statsmodels"
+version = "0.12.2"
+description = "Statistical computations and models for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+numpy = ">=1.15"
+pandas = ">=0.21"
+patsy = ">=0.5"
+scipy = ">=1.1"
+
+[package.extras]
+build = ["cython (>=0.29)"]
+develop = ["cython (>=0.29)"]
+docs = ["sphinx", "nbconvert", "jupyter-client", "ipykernel", "matplotlib", "nbformat", "numpydoc", "pandas-datareader"]
+
+[[package]]
+name = "texttable"
+version = "1.6.3"
+description = "module for creating simple ASCII tables"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "threadpoolctl"
+version = "2.1.0"
+description = "threadpoolctl"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "toml"
+version = "0.10.2"
+description = "Python Library for Tom's Obvious, Minimal Language"
+category = "dev"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "tomlkit"
+version = "0.7.0"
+description = "Style preserving TOML library"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "tox"
+version = "3.23.1"
+description = "tox is a generic virtualenv management and test command line tool"
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[package.dependencies]
+colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""}
+filelock = ">=3.0.0"
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+packaging = ">=14"
+pluggy = ">=0.12.0"
+py = ">=1.4.17"
+six = ">=1.14.0"
+toml = ">=0.9.4"
+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"
+
+[package.extras]
+docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"]
+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)"]
+
+[[package]]
+name = "tqdm"
+version = "4.60.0"
+description = "Fast, Extensible Progress Meter"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[package.extras]
+dev = ["py-make (>=0.1.0)", "twine", "wheel"]
+notebook = ["ipywidgets (>=6)"]
+telegram = ["requests"]
+
+[[package]]
+name = "urllib3"
+version = "1.26.4"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+brotli = ["brotlipy (>=0.6.0)"]
+
+[[package]]
+name = "virtualenv"
+version = "20.4.6"
+description = "Virtual Python Environment builder"
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[package.dependencies]
+appdirs = ">=1.4.3,<2"
+distlib = ">=0.3.1,<1"
+filelock = ">=3.0.0,<4"
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""}
+six = ">=1.9.0,<2"
+
+[package.extras]
+docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"]
+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)"]
+
+[[package]]
+name = "webencodings"
+version = "0.5.1"
+description = "Character encoding aliases for legacy web content"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "zipp"
+version = "3.4.1"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = ">=3.6.1,<4"
+content-hash = "92502d69b8afe15084b32f8147a5563a2ffc7ffdd8780efc1667991e9b1f08fc"
+
+[metadata.files]
+appdirs = [
+    {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
+    {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
+]
+atomicwrites = [
+    {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
+    {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
+]
+attrs = [
+    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
+    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
+]
+branca = [
+    {file = "branca-0.4.2-py3-none-any.whl", hash = "sha256:62c2e777f074fc1830cd40ba9e650beb941861075980babafead8d97856b1a4b"},
+    {file = "branca-0.4.2.tar.gz", hash = "sha256:c111453617b17ab2bda60a4cd71787d6f2b59c85cdf71ab160a737606ac66c31"},
+]
+cachecontrol = [
+    {file = "CacheControl-0.12.6-py2.py3-none-any.whl", hash = "sha256:10d056fa27f8563a271b345207402a6dcce8efab7e5b377e270329c62471b10d"},
+    {file = "CacheControl-0.12.6.tar.gz", hash = "sha256:be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8"},
+]
+cachy = [
+    {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"},
+    {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"},
+]
+certifi = [
+    {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"},
+    {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"},
+]
+cffi = [
+    {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"},
+    {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"},
+    {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"},
+    {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"},
+    {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"},
+    {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"},
+    {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"},
+    {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"},
+    {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"},
+    {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"},
+    {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"},
+    {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"},
+    {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"},
+    {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"},
+    {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"},
+    {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"},
+    {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"},
+    {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"},
+    {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"},
+    {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"},
+    {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"},
+    {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"},
+    {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"},
+    {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"},
+    {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"},
+    {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"},
+    {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"},
+    {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"},
+    {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"},
+    {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"},
+    {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"},
+    {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"},
+    {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"},
+    {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"},
+    {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"},
+    {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"},
+    {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"},
+]
+cfgv = [
+    {file = "cfgv-3.2.0-py2.py3-none-any.whl", hash = "sha256:32e43d604bbe7896fe7c248a9c2276447dbef840feb28fe20494f62af110211d"},
+    {file = "cfgv-3.2.0.tar.gz", hash = "sha256:cf22deb93d4bcf92f345a5c3cd39d3d41d6340adc60c78bbbd6588c384fda6a1"},
+]
+chardet = [
+    {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
+    {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
+]
+cleo = [
+    {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"},
+    {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"},
+]
+click = [
+    {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
+    {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
+]
+click-plugins = [
+    {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
+    {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
+]
+cligj = [
+    {file = "cligj-0.7.1-py3-none-any.whl", hash = "sha256:07171c1e287f45511f97df4ea071abc5d19924153413d5683a8e4866369bc676"},
+    {file = "cligj-0.7.1.tar.gz", hash = "sha256:b2f1f7247d59a5387bd3013a08b9ed6829e96fafa4a6e6292341efdb46fe6220"},
+]
+clikit = [
+    {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"},
+    {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"},
+]
+colorama = [
+    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+coverage = [
+    {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"},
+    {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"},
+    {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"},
+    {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"},
+    {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"},
+    {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"},
+    {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"},
+    {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"},
+    {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"},
+    {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"},
+    {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"},
+    {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"},
+    {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"},
+    {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"},
+    {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"},
+    {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"},
+    {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"},
+    {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"},
+    {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"},
+    {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"},
+    {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"},
+    {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"},
+    {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"},
+    {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"},
+    {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"},
+    {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"},
+    {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"},
+    {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"},
+    {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"},
+    {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"},
+    {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"},
+    {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"},
+    {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"},
+    {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"},
+    {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"},
+    {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"},
+    {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"},
+    {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"},
+    {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"},
+    {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"},
+    {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"},
+    {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"},
+    {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"},
+    {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"},
+    {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"},
+    {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"},
+    {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"},
+    {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"},
+    {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"},
+    {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"},
+    {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"},
+    {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
+]
+crashtest = [
+    {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"},
+    {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"},
+]
+cryptography = [
+    {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"},
+    {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"},
+    {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"},
+    {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"},
+    {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"},
+    {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"},
+    {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"},
+    {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"},
+    {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"},
+    {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"},
+    {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"},
+    {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"},
+]
+cycler = [
+    {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"},
+    {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"},
+]
+distlib = [
+    {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"},
+    {file = "distlib-0.3.1.zip", hash = "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"},
+]
+filelock = [
+    {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"},
+    {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"},
+]
+fiona = [
+    {file = "Fiona-1.8.19-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e54e9b176f42aa1243dbc9f89509866dc0242cffdde40948d0055041bc80735"},
+    {file = "Fiona-1.8.19-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:dd6ce1f64b535ad923d72a6e08eff3becb75d8f416e51c221c06c4fe49b86e3b"},
+    {file = "Fiona-1.8.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:553036b0891d5a8747759b7e16708e816e0dbb55322f392df7ebcb777133ef78"},
+    {file = "Fiona-1.8.19-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4a59f0d9044a4aeb2d8f098888a5c117997e45106b3382badc395d28b32d533"},
+    {file = "Fiona-1.8.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:658ce97ccd4022d4de75d2f68a087e9e74d5a894a2f8635fbb74d1a6bd9ddd49"},
+    {file = "Fiona-1.8.19-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c0e509661ed89f831218a17ba46a3d978be6f07491889d9b434888cfe646768f"},
+    {file = "Fiona-1.8.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7728aa64f2955cf4b4cc15edbe4a49b423557b586fb3d2b25543ff297289be7f"},
+    {file = "Fiona-1.8.19-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6155f3be8ba00591898b1cdde06bef20901b25a4d3c2b4cf842c278a5169e65a"},
+    {file = "Fiona-1.8.19.tar.gz", hash = "sha256:b9059e0b29c2e9e6b817e53f941e77e1aca7075f986005d38db307067b60458f"},
+]
+folium = [
+    {file = "folium-0.12.1-py2.py3-none-any.whl", hash = "sha256:3d2c48dd6ffe5327975bbfd718468c4e81db9f2844c26e574f878adf4c08b644"},
+]
+geojson = [
+    {file = "geojson-2.5.0-py2.py3-none-any.whl", hash = "sha256:ccbd13368dd728f4e4f13ffe6aaf725b6e802c692ba0dde628be475040c534ba"},
+    {file = "geojson-2.5.0.tar.gz", hash = "sha256:6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a"},
+]
+geopandas = [
+    {file = "geopandas-0.9.0-py2.py3-none-any.whl", hash = "sha256:79f6e557ba0dba76eec44f8351b1c6b42a17c38f5f08fef347e98fe4dae563c7"},
+    {file = "geopandas-0.9.0.tar.gz", hash = "sha256:63972ab4dc44c4029f340600dcb83264eb8132dd22b104da0b654bef7f42630a"},
+]
+h3 = [
+    {file = "h3-3.7.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b1e455525a222d487010835630e7951f84b9034c6d7b9cf5501fbd6a9559453"},
+    {file = "h3-3.7.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:93748d1ae0d2d73352165b92ea2f52c0bb1aecf1d2a7808f6092fe709ddd1449"},
+    {file = "h3-3.7.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c1d8c1d8b2f56c5d0ce73f62c6deba407c41ce87958f0909da35b7c29f40bc77"},
+    {file = "h3-3.7.2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:10496db335b748e32b219d388e0bf6503d47eb481281667789a4c84f9f368ea5"},
+    {file = "h3-3.7.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:31e539bff3b94b80b6eb77f5aa514f90a9d1e15972db4778e8af861e6f47edd1"},
+    {file = "h3-3.7.2-cp35-cp35m-win_amd64.whl", hash = "sha256:e9adde9f35187dcd3c031384d2968968f019c8eceea58e223a03723604abf7e0"},
+    {file = "h3-3.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3556ef201c8758839f84457abe76559cb5657f9ddf485a895f52032931657475"},
+    {file = "h3-3.7.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:6e455a033bd536405989f8263595e0c18912167140b0a444ba797978e65b8f6b"},
+    {file = "h3-3.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:cbf3ba462cf3f541cd8c1b4ed4dfff834307beb8a8bbb220a30931b2106e5c60"},
+    {file = "h3-3.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1d88cccf881fee97daf94623dc65269e8500f597daf542ff1bc2583e9edf04d1"},
+    {file = "h3-3.7.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0f04a747dd3cccad055b5d44d9733454abfbc85e351a1cc186beced4697a650f"},
+    {file = "h3-3.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:808478e912dc81fa15cf8cd5e08ebe623386e81e3767c983ea83ebd4e859d743"},
+    {file = "h3-3.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d7c5db66b69ce5cce3b4b8c49264a85c06b8c0bf6970bd779437aec705dcfdf4"},
+    {file = "h3-3.7.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:bb205325abeed4deb64e1a82bc10e21f2d0e86c1c1ebf6aa12e1859a096f2063"},
+    {file = "h3-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:6e38c92ec8572ac071fb8d92ce811665d80e6ee019ee6c33b6ea708fd978d19e"},
+    {file = "h3-3.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8167e1389598a185d33c66cf5149d3a457780dbc7fb22f11ead1153cf1ac2fcb"},
+    {file = "h3-3.7.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:a1e86a00e5ff5da3c9e278679364a8640fd36d0e0b88a22a29c8c49c05fe4145"},
+    {file = "h3-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2d3b6540a8b36032d57ab56d3db48d5c0ff936b60da28d8dfbf4c74be5f295f0"},
+    {file = "h3-3.7.2.tar.gz", hash = "sha256:3271168dcc7ed3f28301939ae8726003043adf10af8db67e38fcbb0960116154"},
+]
+html5lib = [
+    {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"},
+    {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"},
+]
+identify = [
+    {file = "identify-2.2.4-py2.py3-none-any.whl", hash = "sha256:ad9f3fa0c2316618dc4d840f627d474ab6de106392a4f00221820200f490f5a8"},
+    {file = "identify-2.2.4.tar.gz", hash = "sha256:9bcc312d4e2fa96c7abebcdfb1119563b511b5e3985ac52f60d9116277865b2e"},
+]
+idna = [
+    {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
+    {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"},
+    {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"},
+]
+importlib-resources = [
+    {file = "importlib_resources-5.1.2-py3-none-any.whl", hash = "sha256:ebab3efe74d83b04d6bf5cd9a17f0c5c93e60fb60f30c90f56265fce4682a469"},
+    {file = "importlib_resources-5.1.2.tar.gz", hash = "sha256:642586fc4740bd1cad7690f836b3321309402b20b332529f25617ff18e8e1370"},
+]
+iniconfig = [
+    {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
+    {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
+]
+jeepney = [
+    {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"},
+    {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"},
+]
+jinja2 = [
+    {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"},
+    {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"},
+]
+joblib = [
+    {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"},
+    {file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"},
+]
+keyring = [
+    {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"},
+    {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"},
+]
+kiwisolver = [
+    {file = "kiwisolver-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd34fbbfbc40628200730bc1febe30631347103fc8d3d4fa012c21ab9c11eca9"},
+    {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d3155d828dec1d43283bd24d3d3e0d9c7c350cdfcc0bd06c0ad1209c1bbc36d0"},
+    {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5a7a7dbff17e66fac9142ae2ecafb719393aaee6a3768c9de2fd425c63b53e21"},
+    {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f8d6f8db88049a699817fd9178782867bf22283e3813064302ac59f61d95be05"},
+    {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:5f6ccd3dd0b9739edcf407514016108e2280769c73a85b9e59aa390046dbf08b"},
+    {file = "kiwisolver-1.3.1-cp36-cp36m-win32.whl", hash = "sha256:225e2e18f271e0ed8157d7f4518ffbf99b9450fca398d561eb5c4a87d0986dd9"},
+    {file = "kiwisolver-1.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cf8b574c7b9aa060c62116d4181f3a1a4e821b2ec5cbfe3775809474113748d4"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:232c9e11fd7ac3a470d65cd67e4359eee155ec57e822e5220322d7b2ac84fbf0"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b38694dcdac990a743aa654037ff1188c7a9801ac3ccc548d3341014bc5ca278"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ca3820eb7f7faf7f0aa88de0e54681bddcb46e485beb844fcecbcd1c8bd01689"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fd0f1ae9d92b42854b2979024d7597685ce4ada367172ed7c09edf2cef9cb8"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:1e1bc12fb773a7b2ffdeb8380609f4f8064777877b2225dec3da711b421fda31"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:72c99e39d005b793fb7d3d4e660aed6b6281b502e8c1eaf8ee8346023c8e03bc"},
+    {file = "kiwisolver-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8be8d84b7d4f2ba4ffff3665bcd0211318aa632395a1a41553250484a871d454"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31dfd2ac56edc0ff9ac295193eeaea1c0c923c0355bf948fbd99ed6018010b72"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:563c649cfdef27d081c84e72a03b48ea9408c16657500c312575ae9d9f7bc1c3"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:78751b33595f7f9511952e7e60ce858c6d64db2e062afb325985ddbd34b5c131"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a357fd4f15ee49b4a98b44ec23a34a95f1e00292a139d6015c11f55774ef10de"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:5989db3b3b34b76c09253deeaf7fbc2707616f130e166996606c284395da3f18"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-win32.whl", hash = "sha256:c08e95114951dc2090c4a630c2385bef681cacf12636fb0241accdc6b303fd81"},
+    {file = "kiwisolver-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:44a62e24d9b01ba94ae7a4a6c3fb215dc4af1dde817e7498d901e229aaf50e4e"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50af681a36b2a1dee1d3c169ade9fdc59207d3c31e522519181e12f1b3ba7000"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a53d27d0c2a0ebd07e395e56a1fbdf75ffedc4a05943daf472af163413ce9598"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:834ee27348c4aefc20b479335fd422a2c69db55f7d9ab61721ac8cd83eb78882"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c3e6455341008a054cccee8c5d24481bcfe1acdbc9add30aa95798e95c65621"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:acef3d59d47dd85ecf909c359d0fd2c81ed33bdff70216d3956b463e12c38a54"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-win32.whl", hash = "sha256:c5518d51a0735b1e6cee1fdce66359f8d2b59c3ca85dc2b0813a8aa86818a030"},
+    {file = "kiwisolver-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b9edd0110a77fc321ab090aaa1cfcaba1d8499850a12848b81be2222eab648f6"},
+    {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0cd53f403202159b44528498de18f9285b04482bab2a6fc3f5dd8dbb9352e30d"},
+    {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:33449715e0101e4d34f64990352bce4095c8bf13bed1b390773fc0a7295967b3"},
+    {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:401a2e9afa8588589775fe34fc22d918ae839aaaf0c0e96441c0fdbce6d8ebe6"},
+    {file = "kiwisolver-1.3.1.tar.gz", hash = "sha256:950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248"},
+]
+lockfile = [
+    {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"},
+    {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"},
+]
+markupsafe = [
+    {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
+    {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
+    {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"},
+    {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"},
+    {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"},
+    {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"},
+    {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"},
+    {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"},
+    {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"},
+    {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"},
+    {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"},
+    {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"},
+    {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"},
+    {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"},
+    {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"},
+    {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
+    {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
+    {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
+    {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
+    {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"},
+    {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"},
+    {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
+]
+matplotlib = [
+    {file = "matplotlib-3.3.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:672960dd114e342b7c610bf32fb99d14227f29919894388b41553217457ba7ef"},
+    {file = "matplotlib-3.3.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:7c155437ae4fd366e2700e2716564d1787700687443de46bcb895fe0f84b761d"},
+    {file = "matplotlib-3.3.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:a17f0a10604fac7627ec82820439e7db611722e80c408a726cd00d8c974c2fb3"},
+    {file = "matplotlib-3.3.4-cp36-cp36m-win32.whl", hash = "sha256:215e2a30a2090221a9481db58b770ce56b8ef46f13224ae33afe221b14b24dc1"},
+    {file = "matplotlib-3.3.4-cp36-cp36m-win_amd64.whl", hash = "sha256:348e6032f666ffd151b323342f9278b16b95d4a75dfacae84a11d2829a7816ae"},
+    {file = "matplotlib-3.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:94bdd1d55c20e764d8aea9d471d2ae7a7b2c84445e0fa463f02e20f9730783e1"},
+    {file = "matplotlib-3.3.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a1acb72f095f1d58ecc2538ed1b8bca0b57df313b13db36ed34b8cdf1868e674"},
+    {file = "matplotlib-3.3.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:46b1a60a04e6d884f0250d5cc8dc7bd21a9a96c584a7acdaab44698a44710bab"},
+    {file = "matplotlib-3.3.4-cp37-cp37m-win32.whl", hash = "sha256:ed4a9e6dcacba56b17a0a9ac22ae2c72a35b7f0ef0693aa68574f0b2df607a89"},
+    {file = "matplotlib-3.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:c24c05f645aef776e8b8931cb81e0f1632d229b42b6d216e30836e2e145a2b40"},
+    {file = "matplotlib-3.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7310e353a4a35477c7f032409966920197d7df3e757c7624fd842f3eeb307d3d"},
+    {file = "matplotlib-3.3.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:451cc89cb33d6652c509fc6b588dc51c41d7246afdcc29b8624e256b7663ed1f"},
+    {file = "matplotlib-3.3.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3d2eb9c1cc254d0ffa90bc96fde4b6005d09c2228f99dfd493a4219c1af99644"},
+    {file = "matplotlib-3.3.4-cp38-cp38-win32.whl", hash = "sha256:e15fa23d844d54e7b3b7243afd53b7567ee71c721f592deb0727ee85e668f96a"},
+    {file = "matplotlib-3.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:1de0bb6cbfe460725f0e97b88daa8643bcf9571c18ba90bb8e41432aaeca91d6"},
+    {file = "matplotlib-3.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f44149a0ef5b4991aaef12a93b8e8d66d6412e762745fea1faa61d98524e0ba9"},
+    {file = "matplotlib-3.3.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:746a1df55749629e26af7f977ea426817ca9370ad1569436608dc48d1069b87c"},
+    {file = "matplotlib-3.3.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:5f571b92a536206f7958f7cb2d367ff6c9a1fa8229dc35020006e4cdd1ca0acd"},
+    {file = "matplotlib-3.3.4-cp39-cp39-win32.whl", hash = "sha256:9265ae0fb35e29f9b8cc86c2ab0a2e3dcddc4dd9de4b85bf26c0f63fe5c1c2ca"},
+    {file = "matplotlib-3.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:9a79e5dd7bb797aa611048f5b70588b23c5be05b63eefd8a0d152ac77c4243db"},
+    {file = "matplotlib-3.3.4-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1e850163579a8936eede29fad41e202b25923a0a8d5ffd08ce50fc0a97dcdc93"},
+    {file = "matplotlib-3.3.4-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d738acfdfb65da34c91acbdb56abed46803db39af259b7f194dc96920360dbe4"},
+    {file = "matplotlib-3.3.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aa49571d8030ad0b9ac39708ee77bd2a22f87815e12bdee52ecaffece9313ed8"},
+    {file = "matplotlib-3.3.4-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:cf3a7e54eff792f0815dbbe9b85df2f13d739289c93d346925554f71d484be78"},
+    {file = "matplotlib-3.3.4.tar.gz", hash = "sha256:3e477db76c22929e4c6876c44f88d790aacdf3c3f8f3a90cb1975c0bf37825b0"},
+]
+mpmath = [
+    {file = "mpmath-1.2.1-py3-none-any.whl", hash = "sha256:604bc21bd22d2322a177c73bdb573994ef76e62edd595d17e00aff24b0667e5c"},
+    {file = "mpmath-1.2.1.tar.gz", hash = "sha256:79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a"},
+]
+msgpack = [
+    {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"},
+    {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192"},
+    {file = "msgpack-1.0.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841"},
+    {file = "msgpack-1.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"},
+    {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326"},
+    {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439"},
+    {file = "msgpack-1.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f"},
+    {file = "msgpack-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2"},
+    {file = "msgpack-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc"},
+    {file = "msgpack-1.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54"},
+    {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87"},
+    {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c"},
+    {file = "msgpack-1.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1"},
+    {file = "msgpack-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a"},
+    {file = "msgpack-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b"},
+    {file = "msgpack-1.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06"},
+    {file = "msgpack-1.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c"},
+    {file = "msgpack-1.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e"},
+    {file = "msgpack-1.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83"},
+    {file = "msgpack-1.0.2-cp38-cp38-win32.whl", hash = "sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9"},
+    {file = "msgpack-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009"},
+    {file = "msgpack-1.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694"},
+    {file = "msgpack-1.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759"},
+    {file = "msgpack-1.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887"},
+    {file = "msgpack-1.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e"},
+    {file = "msgpack-1.0.2-cp39-cp39-win32.whl", hash = "sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33"},
+    {file = "msgpack-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f"},
+    {file = "msgpack-1.0.2.tar.gz", hash = "sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984"},
+]
+munch = [
+    {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"},
+    {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"},
+]
+nodeenv = [
+    {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"},
+    {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"},
+]
+numpy = [
+    {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76"},
+    {file = "numpy-1.19.5-cp36-cp36m-win32.whl", hash = "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a"},
+    {file = "numpy-1.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827"},
+    {file = "numpy-1.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28"},
+    {file = "numpy-1.19.5-cp37-cp37m-win32.whl", hash = "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7"},
+    {file = "numpy-1.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d"},
+    {file = "numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc"},
+    {file = "numpy-1.19.5-cp38-cp38-win32.whl", hash = "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2"},
+    {file = "numpy-1.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa"},
+    {file = "numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60"},
+    {file = "numpy-1.19.5-cp39-cp39-win32.whl", hash = "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e"},
+    {file = "numpy-1.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e"},
+    {file = "numpy-1.19.5-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73"},
+    {file = "numpy-1.19.5.zip", hash = "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4"},
+]
+packaging = [
+    {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
+    {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
+]
+pandas = [
+    {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"},
+    {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"},
+    {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"},
+    {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"},
+    {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"},
+    {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"},
+    {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"},
+    {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"},
+    {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"},
+    {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"},
+    {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"},
+    {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"},
+    {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"},
+    {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"},
+    {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"},
+    {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"},
+    {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"},
+    {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"},
+    {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"},
+    {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"},
+    {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"},
+    {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"},
+    {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"},
+    {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"},
+]
+pastel = [
+    {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"},
+    {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"},
+]
+patsy = [
+    {file = "patsy-0.5.1-py2.py3-none-any.whl", hash = "sha256:5465be1c0e670c3a965355ec09e9a502bf2c4cbe4875e8528b0221190a8a5d40"},
+    {file = "patsy-0.5.1.tar.gz", hash = "sha256:f115cec4201e1465cd58b9866b0b0e7b941caafec129869057405bfe5b5e3991"},
+]
+pexpect = [
+    {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"},
+    {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"},
+]
+pillow = [
+    {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"},
+    {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"},
+    {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"},
+    {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"},
+    {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"},
+    {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"},
+    {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"},
+    {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"},
+    {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"},
+    {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"},
+    {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"},
+    {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"},
+    {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"},
+    {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"},
+    {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"},
+    {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"},
+    {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"},
+    {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"},
+    {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"},
+    {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"},
+    {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"},
+    {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"},
+    {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"},
+    {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"},
+    {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"},
+    {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"},
+    {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"},
+    {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"},
+    {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"},
+    {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"},
+    {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"},
+    {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"},
+    {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"},
+]
+pkginfo = [
+    {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"},
+    {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"},
+]
+pluggy = [
+    {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
+    {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
+]
+poetry = [
+    {file = "poetry-1.1.6-py2.py3-none-any.whl", hash = "sha256:768d87fdad55c8b2512996aea74bc389b4772680dcafea90643bdf8eaedf6ca0"},
+    {file = "poetry-1.1.6.tar.gz", hash = "sha256:e7c58a50c14aebc18e7de9df64f1dad74b194f21b8e5257251449f0feb4784fa"},
+]
+poetry-core = [
+    {file = "poetry-core-1.0.3.tar.gz", hash = "sha256:2315c928249fc3207801a81868b64c66273077b26c8d8da465dccf8f488c90c5"},
+    {file = "poetry_core-1.0.3-py2.py3-none-any.whl", hash = "sha256:c6bde46251112de8384013e1ab8d66e7323d2c75172f80220aba2bc07e208e9a"},
+]
+powerlaw = [
+    {file = "powerlaw-1.4.6.tar.gz", hash = "sha256:7f9d9cb39ad23af8f6cae165d47020ee8b7fa58f380c356de91ae2625577699e"},
+]
+pre-commit = [
+    {file = "pre_commit-2.12.1-py2.py3-none-any.whl", hash = "sha256:70c5ec1f30406250b706eda35e868b87e3e4ba099af8787e3e8b4b01e84f4712"},
+    {file = "pre_commit-2.12.1.tar.gz", hash = "sha256:900d3c7e1bf4cf0374bb2893c24c23304952181405b4d88c9c40b72bda1bb8a9"},
+]
+ptyprocess = [
+    {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
+    {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
+]
+py = [
+    {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
+    {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
+]
+pycparser = [
+    {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
+    {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
+]
+pylev = [
+    {file = "pylev-1.3.0-py2.py3-none-any.whl", hash = "sha256:1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e"},
+    {file = "pylev-1.3.0.tar.gz", hash = "sha256:063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3"},
+]
+pyparsing = [
+    {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
+    {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
+]
+pyproj = [
+    {file = "pyproj-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f942a976ea3de6a519cf48be30a12f465e44d0ac0c38a0d820ab3acfcc0a48a6"},
+    {file = "pyproj-3.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:09db64a8088b23f001e574d92bcc3080bf7de44ddca152d0282a2b50c918a64a"},
+    {file = "pyproj-3.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:cba99e171d744969e13a865ad28fa9c949c4400b0e9c431a802cdd804f52f632"},
+    {file = "pyproj-3.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:81c06df20d09d621e52791c19ce3c880695fb430061e59c2472fa5467e890391"},
+    {file = "pyproj-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:3e7e851e6d58c16ac2cd920a1bacb7fbb24758a6fcd7f234d594a88ebae04ec9"},
+    {file = "pyproj-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:aa0a2981b25145523ca17a643c5be077fe13e514fdca9b6d1c412a95d723a5a5"},
+    {file = "pyproj-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:708d6e01b9ff3d6dc62a5ad2d2ba1264a863eaa657c1a9bf713a10cc35d34553"},
+    {file = "pyproj-3.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36ba436675f9dea4ab3db7d9a32d3ff11c2fbb4d6690a83454d2f3c5c0b54041"},
+    {file = "pyproj-3.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:489a96da87d8846c34c90da90e637544e4f4f50a13589b5aac54297f5ee1b01d"},
+    {file = "pyproj-3.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4a333f3e46fe8b2eb4647a3daa3a2cec52ddc6c107c653b45880526114942ee8"},
+    {file = "pyproj-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:9e2ef75401f17062166d3fe53c555cd62c9577697a2f5ded916b23c54e5db497"},
+    {file = "pyproj-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7bfaa34e8bb0510d4380310374deecd9e4328b9cf556925cfb45b5a94d5bbdbe"},
+    {file = "pyproj-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9666d01faf4e758ac68f2c16695c90de49c3170e3760988bf76a34aae11f4e15"},
+    {file = "pyproj-3.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c658afc8a6115b58b02aa53d27bf2a67c1b00b55067edb1b7711c6c7391cfaa9"},
+    {file = "pyproj-3.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:fee7517bd389a1db7b8bebb18838d04dedca9eaacda01d353d98f5ee421f263e"},
+    {file = "pyproj-3.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:86ef2fcd584a3222bf73e2befc24b2badd139b3371f4a1e88649978ef7649540"},
+    {file = "pyproj-3.0.1-cp38-cp38-win32.whl", hash = "sha256:d27d40ec541ef69a5107bfcd85f40170e9e122ceb6315ce508cd44d199983d41"},
+    {file = "pyproj-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:bc70b6adcfa713d89bc561673cb57af5fb3a1718cd7d57ec537430cd1007a864"},
+    {file = "pyproj-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b845510255f9580d7e226dd3321a51c468cefb7be24e46415caf67caa4287c4"},
+    {file = "pyproj-3.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7ae8e7052f18fde1884574da449010e94fa205ad27aeeaa34a097f49a1ed6a2b"},
+    {file = "pyproj-3.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:a3805e026a5547be205a5e322c08e3069f0a48c63bbd53dbc7a8e3499bc66d58"},
+    {file = "pyproj-3.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1be7d54900eb7e2d1e637319080b3a047c70d1fb2f3c12d3400c0fa8a90cf440"},
+    {file = "pyproj-3.0.1-cp39-cp39-win32.whl", hash = "sha256:09bead60769e69b592e8cb3ac51b5215f75e9bb9c213ce575031961deb48d6da"},
+    {file = "pyproj-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:a3a8ab19232bf4f4bb2590536538881b7bd0c07df23e0c2a792402ca2476c197"},
+    {file = "pyproj-3.0.1.tar.gz", hash = "sha256:bfbac35490dd17f706700673506eeb8170f8a2a63fb5878171d4e6eef242d141"},
+]
+pytest = [
+    {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"},
+    {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
+    {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
+]
+python-igraph = [
+    {file = "python-igraph-0.9.1.tar.gz", hash = "sha256:f1895a83c57180f03c50fb77334a4d5029327aefee14f03381e10d34a1794410"},
+    {file = "python_igraph-0.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:135dd8231036751393baa6dd4b729a32268988ea7470c96d1fd9b5bb31d285d1"},
+    {file = "python_igraph-0.9.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ca858739512c65346e97b28ba13c8b22831282fe7ca7d0e61452a5b558f4065a"},
+    {file = "python_igraph-0.9.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:c263a078dcd4619d7e98d0c6b3c0f06e3ea7ad4bb57154fb1e9b30a8ad2b5081"},
+    {file = "python_igraph-0.9.1-cp36-cp36m-win32.whl", hash = "sha256:ce3596e87e7e930f16a91a14935c325d4f7d4f2b41ceab7681c5dedcf582888d"},
+    {file = "python_igraph-0.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:44c280ec6fd8e66627bb23f8c1b3a66ed6039381d6a3c24e03e019e985aa8c17"},
+    {file = "python_igraph-0.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8895ca5ee5107ba34280ede192c08da698b9a61ddea70b38af0bb02e29cb3150"},
+    {file = "python_igraph-0.9.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:f835c05357a5eaa35ea20ee665203b481463c6d69d836c5d64aa54d71a4064ea"},
+    {file = "python_igraph-0.9.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f7c79d946c2db5d040422f61dfa80497ed292ffeb40075fcd4a1117fe2108f4d"},
+    {file = "python_igraph-0.9.1-cp37-cp37m-win32.whl", hash = "sha256:725688a32efa0230a99e3339eb7c71a8953959782cb7a67d4f056ebd61e17b39"},
+    {file = "python_igraph-0.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2d3fd7c280428d73790fb23f0ceb41486623f0a153aedd2287fffff389c26ac1"},
+    {file = "python_igraph-0.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:102c2a430453d9e90d3032f239fa5688e320bedd62767806f5425c0099d25b51"},
+    {file = "python_igraph-0.9.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1ebe1d3e0b2b2052a83d9146656e6da152536043aabc517e4063215b5f7624e3"},
+    {file = "python_igraph-0.9.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:3ce7aedc8c7e9be9441051b28f5c1c53bd719109d621f047729870d7ff851e49"},
+    {file = "python_igraph-0.9.1-cp38-cp38-win32.whl", hash = "sha256:55b066f3995dc75500339f4897dcb2d6f2c7367ea0562ee5376e993102877a74"},
+    {file = "python_igraph-0.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:e33fd8948f3a7ecce00e3f6fb786216d357042ccfbc541a9ccd3c67a1ea1a053"},
+    {file = "python_igraph-0.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e31b0f9cf30d60ef8b9db428b99f62a90677d9c17bd0fa17159a833658c3ed0"},
+    {file = "python_igraph-0.9.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7dd757c6ac9e67e5b42f9e94b570d542a1fa5b7c35c3aec0bc3ac72562c91e0c"},
+    {file = "python_igraph-0.9.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:508d2a4c0a81cc208e18b771552c131542d734025832a42153c212b00eec7d82"},
+    {file = "python_igraph-0.9.1-cp39-cp39-win32.whl", hash = "sha256:baffdfe2b2acd9713991bb7570b2a174846b00d4fcdb4459e2738af47bae5736"},
+    {file = "python_igraph-0.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:864d92e8c71ecc28d168bc46417ffc7b61bfc78c83c8b00b180efbdfaf53fde3"},
+    {file = "python_igraph-0.9.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:47daca0f986f9268809dc82132468763e52ebaab636300f958c9d74291d77ba7"},
+    {file = "python_igraph-0.9.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:4195d8ada8e625ed692a47610fca2a4b89109f2e257883950d980fa082220745"},
+    {file = "python_igraph-0.9.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:c2cb544ae4655b28e99a2d293f0cd3de901e971e0fe748c062aeb651d6eb44f3"},
+    {file = "python_igraph-0.9.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f4351522b9716795dc3affbb5aef2ffbcadf20b63da5a310161e55675754752"},
+    {file = "python_igraph-0.9.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:64f9745278c412ef131cd5ea174ff67f9473fe7666bcb1e0b4fc7f1b21c3e224"},
+    {file = "python_igraph-0.9.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:391c94f3630b07f7de3a9381a31a96b244944c8a804a39e7946fa45876bc5a15"},
+]
+pytz = [
+    {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
+    {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
+]
+pywin32-ctypes = [
+    {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
+    {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
+]
+pyyaml = [
+    {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"},
+    {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"},
+    {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"},
+    {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
+    {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
+    {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
+    {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"},
+    {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"},
+    {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
+    {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
+    {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
+    {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
+    {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"},
+    {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"},
+    {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
+    {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
+    {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
+]
+requests = [
+    {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
+    {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
+]
+requests-toolbelt = [
+    {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"},
+    {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"},
+]
+rtree = [
+    {file = "Rtree-0.9.7-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:40a1b08fc4d39521d6dd801a4bc14ac5e3f45f4ed1e265d06d43ceb911764e3c"},
+    {file = "Rtree-0.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:bcc6109c5ed6ddcb2c45c0c4aa07e97a78b75496d254af58520fcfc995b4edd9"},
+    {file = "Rtree-0.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:0a2a57c25c936d66ef11df9a48d4a7172adec9daf3828b989f1d8084bbcdfebd"},
+    {file = "Rtree-0.9.7-cp27-cp27m-win_amd64.whl", hash = "sha256:c50e178620c052596013d9ea5f1c716f70d3ab3eb98fba67b1e3843b72523323"},
+    {file = "Rtree-0.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e5a1e352cb4473372d201b41fb92e71791a3e808a6533af002917e8904863ab5"},
+    {file = "Rtree-0.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:fe06b208488c11a311570c9a37ec52116a41107ad265cf53b1ffdeaa09f2d37b"},
+    {file = "Rtree-0.9.7-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:4d0c1c2f6ec0e34afbf487d960025fc4026e70a967bc0b41a9e9d159380539a2"},
+    {file = "Rtree-0.9.7-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e017b7faa0b93a36ef70319616cea8ba800ad80f327a4ffb1bb4d7f47e8bb945"},
+    {file = "Rtree-0.9.7-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:ebe884fdf20d83b2eabd293ea28fbcbf84353eb0c6f6f3521fa66f1245b3d8e8"},
+    {file = "Rtree-0.9.7-cp35-cp35m-win_amd64.whl", hash = "sha256:de62f5b66dd90fba9559f019b9d8a3bbedf405ce51ae74ec9f4d47c248c71362"},
+    {file = "Rtree-0.9.7-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b651e12617634fc3ad3d68e5425fc566a704fa0ccaf0e0c4328ca6776d1949a1"},
+    {file = "Rtree-0.9.7-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a3a7129f18f721db7e28fac796b3e0cc5708581473632afb430b6ca499b070f9"},
+    {file = "Rtree-0.9.7-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:22840737c2892d75de30115e4f392557bbc6382d6831f8588b9cb98ea82e5539"},
+    {file = "Rtree-0.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:275f5a4fbe9c74508ad2c0b334060ceec0b7fae061f7bc404d0d94617134f6a3"},
+    {file = "Rtree-0.9.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:7a4ea00398cdda8dd0e96142ba10c44d48989e204945d0cded4d68e00859adcf"},
+    {file = "Rtree-0.9.7-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:bf465facf7e76e732ffef7a6db666478de05e1286407212ce2935410f32cdb64"},
+    {file = "Rtree-0.9.7-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:c34618947cfe2d8b4e52c0669e6c47e46ffa2413f7dae5c82dc63f9aee95b7a5"},
+    {file = "Rtree-0.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b8c45987c9966b7341afbc70a7d0bd1a1b6361eff50379a7447512d169c1bd1e"},
+    {file = "Rtree-0.9.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7f4c44b0e6840ce3202ab8c48c12edfd8b3104084d312a5718c16e65eddffdd7"},
+    {file = "Rtree-0.9.7-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:64c89ec82b86d3e8ed91ee0cec83ad48aa1f2a633fbd83fe39ce1d14eb15454e"},
+    {file = "Rtree-0.9.7-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:908775b905462f945b583f34cdbe77baad483243b22c2f671598f35327af2888"},
+    {file = "Rtree-0.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:3fd5477a25fa0084305eea795999e51a94ca9b429089f852f231fe24bee4218d"},
+    {file = "Rtree-0.9.7-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:000dfc003cbebf5db2b8bc97cf3a1945da62388a46d00804804a375e6fcc3680"},
+    {file = "Rtree-0.9.7-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:9e3a4ba7d58c598fae9c7fbbfe3a641a0a6fdb04720e7951048be43bbd97ebc5"},
+    {file = "Rtree-0.9.7-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:a935e7a2d25d146b5129d127fc4eedded76e3a4feff989fcedc8e72cbcf2c555"},
+    {file = "Rtree-0.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:824a7e4639665a32ffdfd28aa8b090a1dee60fa254f81317634362740be0b2d1"},
+    {file = "Rtree-0.9.7.tar.gz", hash = "sha256:be8772ca34699a9ad3fb4cfe2cfb6629854e453c10b3328039301bbfc128ca3e"},
+]
+scikit-learn = [
+    {file = "scikit-learn-0.24.2.tar.gz", hash = "sha256:d14701a12417930392cd3898e9646cf5670c190b933625ebe7511b1f7d7b8736"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:d5bf9c863ba4717b3917b5227463ee06860fc43931dc9026747de416c0a10fee"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5beaeb091071625e83f5905192d8aecde65ba2f26f8b6719845bbf586f7a04a1"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:06ffdcaaf81e2a3b1b50c3ac6842cfb13df2d8b737d61f64643ed61da7389cde"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:fec42690a2eb646b384eafb021c425fab48991587edb412d4db77acc358b27ce"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:5ff3e4e4cf7592d36541edec434e09fb8ab9ba6b47608c4ffe30c9038d301897"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:3cbd734e1aefc7c5080e6b6973fe062f97c26a1cdf1a991037ca196ce1c8f427"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-win32.whl", hash = "sha256:f74429a07fedb36a03c159332b914e6de757176064f9fed94b5f79ebac07d913"},
+    {file = "scikit_learn-0.24.2-cp36-cp36m-win_amd64.whl", hash = "sha256:dd968a174aa82f3341a615a033fa6a8169e9320cbb46130686562db132d7f1f0"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:49ec0b1361da328da9bb7f1a162836028e72556356adeb53342f8fae6b450d47"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f18c3ed484eeeaa43a0d45dc2efb4d00fc6542ccdcfa2c45d7b635096a2ae534"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cdf24c1b9bbeb4936456b42ac5bd32c60bb194a344951acb6bfb0cddee5439a4"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d177fe1ff47cc235942d628d41ee5b1c6930d8f009f1a451c39b5411e8d0d4cf"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f3ec00f023d84526381ad0c0f2cff982852d035c921bbf8ceb994f4886c00c64"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ae19ac105cf7ce8c205a46166992fdec88081d6e783ab6e38ecfbe45729f3c39"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-win32.whl", hash = "sha256:f0ed4483c258fb23150e31b91ea7d25ff8495dba108aea0b0d4206a777705350"},
+    {file = "scikit_learn-0.24.2-cp37-cp37m-win_amd64.whl", hash = "sha256:39b7e3b71bcb1fe46397185d6c1a5db1c441e71c23c91a31e7ad8cc3f7305f9a"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:90a297330f608adeb4d2e9786c6fda395d3150739deb3d42a86d9a4c2d15bc1d"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f1d2108e770907540b5248977e4cff9ffaf0f73d0d13445ee938df06ca7579c6"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1eec963fe9ffc827442c2e9333227c4d49749a44e592f305398c1db5c1563393"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:2db429090b98045d71218a9ba913cc9b3fe78e0ba0b6b647d8748bc6d5a44080"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:62214d2954377fcf3f31ec867dd4e436df80121e7a32947a0b3244f58f45e455"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8fac72b9688176922f9f54fda1ba5f7ffd28cbeb9aad282760186e8ceba9139a"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-win32.whl", hash = "sha256:ae426e3a52842c6b6d77d00f906b6031c8c2cfdfabd6af7511bb4bc9a68d720e"},
+    {file = "scikit_learn-0.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:038f4e9d6ef10e1f3fe82addc3a14735c299866eb10f2c77c090410904828312"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:48f273836e19901ba2beecd919f7b352f09310ce67c762f6e53bc6b81cacf1f0"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a2a47449093dcf70babc930beba2ca0423cb7df2fa5fd76be5260703d67fa574"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0e71ce9c7cbc20f6f8b860107ce15114da26e8675238b4b82b7e7cd37ca0c087"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2754c85b2287333f9719db7f23fb7e357f436deed512db3417a02bf6f2830aa5"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7be1b88c23cfac46e06404582215a917017cd2edaa2e4d40abe6aaff5458f24b"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4e6198675a6f9d333774671bd536668680eea78e2e81c0b19e57224f58d17f37"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-win32.whl", hash = "sha256:cbdb0b3db99dd1d5f69d31b4234367d55475add31df4d84a3bd690ef017b55e2"},
+    {file = "scikit_learn-0.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:40556bea1ef26ef54bc678d00cf138a63069144a0b5f3a436eecd8f3468b903e"},
+]
+scipy = [
+    {file = "scipy-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4f12d13ffbc16e988fa40809cbbd7a8b45bc05ff6ea0ba8e3e41f6f4db3a9e47"},
+    {file = "scipy-1.5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a254b98dbcc744c723a838c03b74a8a34c0558c9ac5c86d5561703362231107d"},
+    {file = "scipy-1.5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:368c0f69f93186309e1b4beb8e26d51dd6f5010b79264c0f1e9ca00cd92ea8c9"},
+    {file = "scipy-1.5.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4598cf03136067000855d6b44d7a1f4f46994164bcd450fb2c3d481afc25dd06"},
+    {file = "scipy-1.5.4-cp36-cp36m-win32.whl", hash = "sha256:e98d49a5717369d8241d6cf33ecb0ca72deee392414118198a8e5b4c35c56340"},
+    {file = "scipy-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:65923bc3809524e46fb7eb4d6346552cbb6a1ffc41be748535aa502a2e3d3389"},
+    {file = "scipy-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9ad4fcddcbf5dc67619379782e6aeef41218a79e17979aaed01ed099876c0e62"},
+    {file = "scipy-1.5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f87b39f4d69cf7d7529d7b1098cb712033b17ea7714aed831b95628f483fd012"},
+    {file = "scipy-1.5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:25b241034215247481f53355e05f9e25462682b13bd9191359075682adcd9554"},
+    {file = "scipy-1.5.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:fa789583fc94a7689b45834453fec095245c7e69c58561dc159b5d5277057e4c"},
+    {file = "scipy-1.5.4-cp37-cp37m-win32.whl", hash = "sha256:d6d25c41a009e3c6b7e757338948d0076ee1dd1770d1c09ec131f11946883c54"},
+    {file = "scipy-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:2c872de0c69ed20fb1a9b9cf6f77298b04a26f0b8720a5457be08be254366c6e"},
+    {file = "scipy-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e360cb2299028d0b0d0f65a5c5e51fc16a335f1603aa2357c25766c8dab56938"},
+    {file = "scipy-1.5.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3397c129b479846d7eaa18f999369a24322d008fac0782e7828fa567358c36ce"},
+    {file = "scipy-1.5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:168c45c0c32e23f613db7c9e4e780bc61982d71dcd406ead746c7c7c2f2004ce"},
+    {file = "scipy-1.5.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:213bc59191da2f479984ad4ec39406bf949a99aba70e9237b916ce7547b6ef42"},
+    {file = "scipy-1.5.4-cp38-cp38-win32.whl", hash = "sha256:634568a3018bc16a83cda28d4f7aed0d803dd5618facb36e977e53b2df868443"},
+    {file = "scipy-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b03c4338d6d3d299e8ca494194c0ae4f611548da59e3c038813f1a43976cb437"},
+    {file = "scipy-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d5db5d815370c28d938cf9b0809dade4acf7aba57eaf7ef733bfedc9b2474c4"},
+    {file = "scipy-1.5.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b0ceb23560f46dd236a8ad4378fc40bad1783e997604ba845e131d6c680963e"},
+    {file = "scipy-1.5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:ed572470af2438b526ea574ff8f05e7f39b44ac37f712105e57fc4d53a6fb660"},
+    {file = "scipy-1.5.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8c8d6ca19c8497344b810b0b0344f8375af5f6bb9c98bd42e33f747417ab3f57"},
+    {file = "scipy-1.5.4-cp39-cp39-win32.whl", hash = "sha256:d84cadd7d7998433334c99fa55bcba0d8b4aeff0edb123b2a1dfcface538e474"},
+    {file = "scipy-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:cc1f78ebc982cd0602c9a7615d878396bec94908db67d4ecddca864d049112f2"},
+    {file = "scipy-1.5.4.tar.gz", hash = "sha256:4a453d5e5689de62e5d38edf40af3f17560bfd63c9c5bd228c18c1f99afa155b"},
+]
+secretstorage = [
+    {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"},
+    {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"},
+]
+shapely = [
+    {file = "Shapely-1.7.1-1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46da0ea527da9cf9503e66c18bab6981c5556859e518fe71578b47126e54ca93"},
+    {file = "Shapely-1.7.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4c10f317e379cc404f8fc510cd9982d5d3e7ba13a9cfd39aa251d894c6366798"},
+    {file = "Shapely-1.7.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:17df66e87d0fe0193910aeaa938c99f0b04f67b430edb8adae01e7be557b141b"},
+    {file = "Shapely-1.7.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:da38ed3d65b8091447dc3717e5218cc336d20303b77b0634b261bc5c1aa2bae8"},
+    {file = "Shapely-1.7.1-cp35-cp35m-win32.whl", hash = "sha256:8e7659dd994792a0aad8fb80439f59055a21163e236faf2f9823beb63a380e19"},
+    {file = "Shapely-1.7.1-cp35-cp35m-win_amd64.whl", hash = "sha256:791477edb422692e7dc351c5ed6530eb0e949a31b45569946619a0d9cd5f53cb"},
+    {file = "Shapely-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3afccf0437edc108eef1e2bb9cc4c7073e7705924eb4cd0bf7715cd1ef0ce1b"},
+    {file = "Shapely-1.7.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8f15b6ce67dcc05b61f19c689b60f3fe58550ba994290ff8332f711f5aaa9840"},
+    {file = "Shapely-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:60e5b2282619249dbe8dc5266d781cc7d7fb1b27fa49f8241f2167672ad26719"},
+    {file = "Shapely-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de618e67b64a51a0768d26a9963ecd7d338a2cf6e9e7582d2385f88ad005b3d1"},
+    {file = "Shapely-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:182716ffb500d114b5d1b75d7fd9d14b7d3414cef3c38c0490534cc9ce20981a"},
+    {file = "Shapely-1.7.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4f3c59f6dbf86a9fc293546de492f5e07344e045f9333f3a753f2dda903c45d1"},
+    {file = "Shapely-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:6871acba8fbe744efa4f9f34e726d070bfbf9bffb356a8f6d64557846324232b"},
+    {file = "Shapely-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:35be1c5d869966569d3dfd4ec31832d7c780e9df760e1fe52131105685941891"},
+    {file = "Shapely-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:052eb5b9ba756808a7825e8a8020fb146ec489dd5c919e7d139014775411e688"},
+    {file = "Shapely-1.7.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:90a3e2ae0d6d7d50ff2370ba168fbd416a53e7d8448410758c5d6a5920646c1d"},
+    {file = "Shapely-1.7.1-cp38-cp38-win32.whl", hash = "sha256:a3774516c8a83abfd1ddffb8b6ec1b0935d7fe6ea0ff5c31a18bfdae567b4eba"},
+    {file = "Shapely-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:6593026cd3f5daaea12bcc51ae5c979318070fefee210e7990cb8ac2364e79a1"},
+    {file = "Shapely-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:617bf046a6861d7c6b44d2d9cb9e2311548638e684c2cd071d8945f24a926263"},
+    {file = "Shapely-1.7.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b40cc7bb089ae4aa9ddba1db900b4cd1bce3925d2a4b5837b639e49de054784f"},
+    {file = "Shapely-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2df5260d0f2983309776cb41bfa85c464ec07018d88c0ecfca23d40bfadae2f1"},
+    {file = "Shapely-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5c3a50d823c192f32615a2a6920e8c046b09e07a58eba220407335a9cd2e8ea"},
+    {file = "Shapely-1.7.1.tar.gz", hash = "sha256:1641724c1055459a7e2b8bbe47ba25bdc89554582e62aec23cb3f3ca25f9b129"},
+]
+shellingham = [
+    {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"},
+    {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+statsmodels = [
+    {file = "statsmodels-0.12.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c1d98ce2072f5e772cbf91d05475490368da5d3ee4a3150062330c7b83221ceb"},
+    {file = "statsmodels-0.12.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4184487e9c281acad3d0bda19445c69db292f0dbb18f25ebf56a7966a0a28eef"},
+    {file = "statsmodels-0.12.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:37e107fa11299090ed90f93c7172162b850c28fd09999937b971926813e887c5"},
+    {file = "statsmodels-0.12.2-cp36-none-win32.whl", hash = "sha256:5d3e7333e1c5b234797ed57c3d1533371374c1e1e7e7ed54d27805611f96e2d5"},
+    {file = "statsmodels-0.12.2-cp36-none-win_amd64.whl", hash = "sha256:aaf3c75fd22cb9dcf9c1b28f8ae87521310870f4dd8a6a4f1010f1e46d992377"},
+    {file = "statsmodels-0.12.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c48b7cbb37a651bb1cd23614abc10f447845ad3c3a713bf74e2aad20cfc94ae7"},
+    {file = "statsmodels-0.12.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a3bd3922463dda8ad33e5e5075d2080e9e012aeb2032b5cdaeea9b79c2472000"},
+    {file = "statsmodels-0.12.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:43de84bc08c8b9f778502aed7a476d6e68674e6878718e533b07d569cf0927a9"},
+    {file = "statsmodels-0.12.2-cp37-none-win32.whl", hash = "sha256:0197855aa1d40c42532d6a75b4ca72e30826a50d90ec3047a404f9702d8b814f"},
+    {file = "statsmodels-0.12.2-cp37-none-win_amd64.whl", hash = "sha256:93273aa1c31caf59bcce9790ca4c3f54fdc45a37c61084d06f1ba4fbe56e7752"},
+    {file = "statsmodels-0.12.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:3e94306d4c07e332532ea4911d1f1d1f661c79aa73f22c5bb22e6dd47b40d562"},
+    {file = "statsmodels-0.12.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f3a7622f3d0ce2fc204f43b74de4e03e42775609705bf94d656b730482ca935a"},
+    {file = "statsmodels-0.12.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:587deb788e7f8f3f866d28e812cf5c082b4d4a2d3f5beea94d0e9699ea71ef22"},
+    {file = "statsmodels-0.12.2-cp38-none-win32.whl", hash = "sha256:cbbdf6f708c9a1f1fad5cdea5e4342d6fdb37e42e92288c2cf906b99976ffe15"},
+    {file = "statsmodels-0.12.2-cp38-none-win_amd64.whl", hash = "sha256:1fa720e895112a1b04b27002218b0ea7f10dd1d9cffd1c018c88bbfb82520f57"},
+    {file = "statsmodels-0.12.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:c3782ce846a52862ac72f89d22b6b1ca13d877bc593872309228a6f05d934321"},
+    {file = "statsmodels-0.12.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8f93cb3f7d87c1fc7e51b3b239371c25a17a0a8e782467fdf4788cfef600724a"},
+    {file = "statsmodels-0.12.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f61f33f64760a22100b6b146217823f73cfedd251c9bdbd58453ca94e63326c7"},
+    {file = "statsmodels-0.12.2-cp39-none-win32.whl", hash = "sha256:3aab85174444f1bcad1e9218a3d3db08f0f86eeb97985236ca8605a0a39ce305"},
+    {file = "statsmodels-0.12.2-cp39-none-win_amd64.whl", hash = "sha256:94d3632d56c13eebebaefb52bd4b43144ad5a131337b57842f46db826fa7d2d3"},
+    {file = "statsmodels-0.12.2.tar.gz", hash = "sha256:8ad7a7ae7cdd929095684118e3b05836c0ccb08b6a01fe984159475d174a1b10"},
+]
+texttable = [
+    {file = "texttable-1.6.3-py2.py3-none-any.whl", hash = "sha256:f802f2ef8459058736264210f716c757cbf85007a30886d8541aa8c3404f1dda"},
+    {file = "texttable-1.6.3.tar.gz", hash = "sha256:ce0faf21aa77d806bbff22b107cc22cce68dc9438f97a2df32c93e9afa4ce436"},
+]
+threadpoolctl = [
+    {file = "threadpoolctl-2.1.0-py3-none-any.whl", hash = "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725"},
+    {file = "threadpoolctl-2.1.0.tar.gz", hash = "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b"},
+]
+toml = [
+    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
+    {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
+]
+tomlkit = [
+    {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"},
+    {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"},
+]
+tox = [
+    {file = "tox-3.23.1-py2.py3-none-any.whl", hash = "sha256:b0b5818049a1c1997599d42012a637a33f24c62ab8187223fdd318fa8522637b"},
+    {file = "tox-3.23.1.tar.gz", hash = "sha256:307a81ddb82bd463971a273f33e9533a24ed22185f27db8ce3386bff27d324e3"},
+]
+tqdm = [
+    {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"},
+    {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"},
+]
+urllib3 = [
+    {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"},
+    {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"},
+]
+virtualenv = [
+    {file = "virtualenv-20.4.6-py2.py3-none-any.whl", hash = "sha256:307a555cf21e1550885c82120eccaf5acedf42978fd362d32ba8410f9593f543"},
+    {file = "virtualenv-20.4.6.tar.gz", hash = "sha256:72cf267afc04bf9c86ec932329b7e94db6a0331ae9847576daaa7ca3c86b29a4"},
+]
+webencodings = [
+    {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
+    {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
+]
+zipp = [
+    {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
+    {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..7c4ef2d
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,90 @@
+[build-system]
+requires = ["setuptools>=54.1.2", "poetry_core>=1.0"]
+build-backend = "poetry.core.masonry.api"
+
+
+[tool.poetry]
+name = "skmob"
+description = "A toolbox for analyzing and processing mobility data."
+version="1.2.2"
+authors = ["skmob Developers"]
+maintainers = ["Gianni Barlacchi <gianni.barlacchi@gmail.com>"]
+documentation= "https://scikit-mobility.github.io/scikit-mobility"
+license='new BSD'
+readme='README.md'
+classifiers=['Intended Audience :: Science/Research',
+                 'Intended Audience :: Developers',
+                 'License :: OSI Approved',
+                 'Programming Language :: Python',
+                 'Topic :: Software Development',
+                 'Topic :: Scientific/Engineering',
+                 'Operating System :: Microsoft :: Windows',
+                 'Operating System :: Unix',
+                 'Operating System :: MacOS',
+                 'Programming Language :: Python :: 3.6',
+                 'Programming Language :: Python :: 3.7',
+                 'Programming Language :: Python :: 3.8',
+                 ]
+
+[tool.poetry.dependencies]
+python = ">=3.6.1,<4"
+pandas = "1.1.5"
+python-igraph = "^0.9.1"
+geopandas = "^0.9.0"
+powerlaw = "^1.4.6"
+tqdm = "^4.60.0"
+requests = "^2.25.1"
+scikit-learn = "^0.24.2"
+statsmodels = "^0.12.2"
+folium = "^0.12.1"
+geojson = "^2.5.0"
+h3 = "^3.7.2"
+
+[tool.poetry.dev-dependencies]
+tox = "^3.23.1"
+pytest = "^6.2.4"
+coverage = "^5.5"
+pre-commit = "^2.12.1"
+poetry = "^1.1.6"
+Rtree = "^0.9.7"
+
+
+
+[tool.black]
+line-length = 120
+include = '\.pyi?$'
+exclude = '''
+/(
+    \.git
+  | \.hg
+  | \.mypy_cache
+  | \.tox
+  | \.venv
+  | _build
+  | buck-out
+  | build
+  | dist
+)/
+'''
+
+[tool.isort]
+multi_line_output = 3
+include_trailing_comma = "True"
+force_grid_wrap = 0
+use_parentheses = "True"
+ensure_newline_before_comments = "True"
+line_length = 100
+
+[tool.tox]
+legacy_tox_ini = """
+[tox]
+envlist = py36
+isolated_build = True
+
+[testenv]
+whitelist_externals = poetry
+commands =
+    poetry install -v
+    poetry run coverage run -m pytest --verbose  skmob
+    poetry run coverage html -d coverage --omit='.tox/*,**/tests/*,**/.virtualenvs/*'
+"""
diff --git a/setup.py b/setup.py
old mode 100755
new mode 100644
index 7e6b159..bac24a4
--- a/setup.py
+++ b/setup.py
@@ -1,44 +1,6 @@
-from setuptools import setup
-from setuptools import find_packages
+#!/usr/bin/env python
 
-long_description = open('README.md').read()
+import setuptools
 
-REQUIRED_PKGS = ['python-igraph',
-                 'pandas',
-                 'geopandas',
-                 'powerlaw',
-                 'tqdm',
-                 'requests',
-                 'scikit-learn',
-                 'statsmodels',
-                 'folium',
-                 'geojson',
-                 'h3']
-TESTS_REQUIRES = ['pytest']
-EXTRAS_REQUIRE = {'test': TESTS_REQUIRES}
-setup(
-    name='scikit-mobility',
-    packages=find_packages(include=["skmob", "skmob.*"]),
-    version='1.2.1',
-    extras_require=EXTRAS_REQUIRE,
-    license='new BSD',
-    python_requires='>=3.6',
-    description='A toolbox for analyzing and processing mobility data.',
-    long_description=long_description,
-    maintainer='skmob Developers',
-    maintainer_email='gianni.barlacchi@gmail.com',
-    classifiers=['Intended Audience :: Science/Research',
-                 'Intended Audience :: Developers',
-                 'License :: OSI Approved',
-                 'Programming Language :: Python',
-                 'Topic :: Software Development',
-                 'Topic :: Scientific/Engineering',
-                 'Operating System :: Microsoft :: Windows',
-                 'Operating System :: Unix',
-                 'Operating System :: MacOS',
-                 'Programming Language :: Python :: 3.6',
-                 'Programming Language :: Python :: 3.7',
-                 'Programming Language :: Python :: 3.8',
-                 ],
-    install_requires=REQUIRED_PKGS
-    )
+if __name__ == "__main__":
+    setuptools.setup()
diff --git a/skmob/__init__.py b/skmob/__init__.py
old mode 100755
new mode 100644
index f0c7a97..e69de29
--- a/skmob/__init__.py
+++ b/skmob/__init__.py
@@ -1,3 +0,0 @@
-from .core.trajectorydataframe import TrajDataFrame
-from .core.flowdataframe import FlowDataFrame
-from .io.file import read, write
diff --git a/skmob/models/__init__.py b/skmob/models/__init__.py
old mode 100755
new mode 100644
index fb05832..e69de29
--- a/skmob/models/__init__.py
+++ b/skmob/models/__init__.py
@@ -1,2 +0,0 @@
-from .gravity import Gravity
-from .radiation import Radiation
diff --git a/skmob/tessellation/tilers.py b/skmob/tessellation/tilers.py
index a5a7721..9166b16 100755
--- a/skmob/tessellation/tilers.py
+++ b/skmob/tessellation/tilers.py
@@ -1,16 +1,17 @@
-from abc import ABC, abstractmethod
 import math
+import warnings
+from abc import ABC, abstractmethod
+
 import geopandas as gpd
-from shapely.geometry import MultiPolygon, Polygon, Point
-from shapely.ops import cascaded_union
-from ..utils import constants, utils
-import numpy as np
 import h3.api.numpy_int as h3
-import warnings
+import numpy as np
+from shapely.geometry import MultiPolygon, Point, Polygon
+from shapely.ops import cascaded_union
 
+from skmob.utils import constants, utils
 
-class TessellationTilers:
 
+class TessellationTilers:
     def __init__(self):
         self._tilers = {}
 
@@ -33,7 +34,6 @@ tiler = TessellationTilers()
 
 
 class TessellationTiler(ABC):
-
     @abstractmethod
     def __call__(self, **kwargs):
         pass
@@ -44,7 +44,6 @@ class TessellationTiler(ABC):
 
 
 class VoronoiTessellationTiler(TessellationTiler):
-
     def __init__(self):
 
         super().__init__()
@@ -57,8 +56,7 @@ class VoronoiTessellationTiler(TessellationTiler):
             if isinstance(points, gpd.GeoDataFrame):
 
                 if not all(isinstance(x, Point) for x in points.geometry):
-                    raise ValueError(
-                        "Not valid points object. Accepted type is GeoDataFrame.")
+                    raise ValueError("Not valid points object. Accepted type is GeoDataFrame.")
 
         return self._build(points, crs)
 
@@ -68,23 +66,29 @@ class VoronoiTessellationTiler(TessellationTiler):
         gdf.loc[:, constants.TILE_ID] = list(np.arange(0, len(gdf)))
 
         # Convert TILE_ID to have str type
-        gdf[constants.TILE_ID] = gdf[constants.TILE_ID].astype('str')
+        gdf[constants.TILE_ID] = gdf[constants.TILE_ID].astype("str")
 
-        return gdf[[constants.TILE_ID, 'geometry']]
+        return gdf[[constants.TILE_ID, "geometry"]]
 
 
 # Register the builder
-tiler.register_tiler('voronoi', VoronoiTessellationTiler())
+tiler.register_tiler("voronoi", VoronoiTessellationTiler())
 
 
 class SquaredTessellationTiler(TessellationTiler):
-
     def __init__(self):
 
         super().__init__()
         self._instance = None
 
-    def __call__(self, base_shape, meters=50, which_osm_result=-1, crs=constants.DEFAULT_CRS, window_size=None):
+    def __call__(
+        self,
+        base_shape,
+        meters=50,
+        which_osm_result=-1,
+        crs=constants.DEFAULT_CRS,
+        window_size=None,
+    ):
         if not self._instance:
 
             if isinstance(base_shape, str):
@@ -92,29 +96,28 @@ class SquaredTessellationTiler(TessellationTiler):
                 base_shapes = utils.bbox_from_name(base_shape, which_osm_result=which_osm_result)
                 i = 0
                 base_shape = base_shapes.loc[[i]]
-                while not (isinstance(base_shape.geometry.iloc[0], Polygon) or
-                           isinstance(base_shape.geometry.iloc[0], MultiPolygon)):
+                while not (
+                    isinstance(base_shape.geometry.iloc[0], Polygon)
+                    or isinstance(base_shape.geometry.iloc[0], MultiPolygon)
+                ):
                     i += 1
                     base_shape = base_shapes.loc[[i]]
 
             elif isinstance(base_shape, gpd.GeoDataFrame) or isinstance(base_shape, gpd.GeoSeries):
 
                 if all(isinstance(x, Point) for x in base_shape.geometry):
-                    # Build a base shape that contains all the points in the given geodataframe
+                    # Build a base shape that contains all the points
+                    # in the given geodataframe
                     base_shape = utils.bbox_from_points(base_shape)
 
                 elif all(isinstance(x, Polygon) for x in base_shape.geometry) and len(base_shape) >= 1:
 
                     # Merge all the polygons
                     polygons = base_shape.geometry.values
-                    base_shape = gpd.GeoSeries(
-                        cascaded_union(polygons), crs=base_shape.crs)
+                    base_shape = gpd.GeoSeries(cascaded_union(polygons), crs=base_shape.crs)
 
-                # elif not all(isinstance(x, Polygon) for x in base_shape.geometry):
-                #    raise ValueError("Not valid geometry object. Accepted types are Point and Polygon.")
             else:
-                raise ValueError(
-                    "Not valid base_shape object. Accepted types are str, GeoDataFrame or GeoSeries.")
+                raise ValueError("Not valid base_shape object. " "Accepted types are str, GeoDataFrame or GeoSeries.")
 
         return self._build(base_shape, meters, crs)
 
@@ -126,16 +129,18 @@ class SquaredTessellationTiler(TessellationTiler):
         area = base_shape.to_crs(tmp_crs)
 
         # Obtain the boundaries of the geometry
-        boundaries = dict({'min_x': area.total_bounds[0],
-                           'min_y': area.total_bounds[1],
-                           'max_x': area.total_bounds[2],
-                           'max_y': area.total_bounds[3]})
+        boundaries = dict(
+            {
+                "min_x": area.total_bounds[0],
+                "min_y": area.total_bounds[1],
+                "max_x": area.total_bounds[2],
+                "max_y": area.total_bounds[3],
+            }
+        )
 
         # Find number of square for each side
-        x_squares = int(
-            math.ceil(math.fabs(boundaries['max_x'] - boundaries['min_x']) / meters))
-        y_squares = int(
-            math.ceil(math.fabs(boundaries['min_y'] - boundaries['max_y']) / meters))
+        x_squares = int(math.ceil(math.fabs(boundaries["max_x"] - boundaries["min_x"]) / meters))
+        y_squares = int(math.ceil(math.fabs(boundaries["min_y"] - boundaries["max_y"]) / meters))
 
         # Placeholder for the polygon
         polygons = []
@@ -146,15 +151,15 @@ class SquaredTessellationTiler(TessellationTiler):
         for i in range(0, x_squares):
 
             # Increment x
-            x1 = boundaries['min_x'] + (meters * i)
-            x2 = boundaries['min_x'] + (meters * (i + 1))
+            x1 = boundaries["min_x"] + (meters * i)
+            x2 = boundaries["min_x"] + (meters * (i + 1))
 
             # Iterate on y
             for j in range(0, y_squares):
 
                 # Increment y
-                y1 = boundaries['min_y'] + (meters * j)
-                y2 = boundaries['min_y'] + (meters * (j + 1))
+                y1 = boundaries["min_y"] + (meters * j)
+                y2 = boundaries["min_y"] + (meters * (j + 1))
                 polygon_desc = {}
 
                 # Create shape (polygon)
@@ -165,132 +170,173 @@ class SquaredTessellationTiler(TessellationTiler):
 
                 # if(s.area>0):
                 if s:
-                    # shape.intersection(p) ATTENTION! If you use the intersection than the crawler fails!
-                    polygon_desc['geometry'] = p
+                    # shape.intersection(p)
+                    # ATTENTION! If you use the intersection than the crawler fails!
+                    polygon_desc["geometry"] = p
                     polygons.append(polygon_desc)
 
         gdf = gpd.GeoDataFrame(polygons, crs=tmp_crs)
         gdf = gdf.reset_index().rename(columns={"index": constants.TILE_ID})
 
         # Convert TILE_ID to have str type
-        gdf[constants.TILE_ID] = gdf[constants.TILE_ID].astype('str')
+        gdf[constants.TILE_ID] = gdf[constants.TILE_ID].astype("str")
 
         return gdf.to_crs(crs)
 
 
 # Register the builder
-tiler.register_tiler('squared', SquaredTessellationTiler())
+tiler.register_tiler("squared", SquaredTessellationTiler())
 
 
 class H3TessellationTiler(TessellationTiler):
-
     def __init__(self):
 
         super().__init__()
         self._instance = None
 
-    def _meters_to_res(self, meters):
-        hex_side_len_km = meters / 1000
-        array = np.asarray(list(constants.H3_UTILS['avg_hex_edge_len_km'].values()))
-        res = (np.abs(array - hex_side_len_km)).argmin()
-        return res
-
-    def _get_appropriate_res(self, base_shape, meters):
-
-        # translate meters to h3 resolution
-        res = self._meters_to_res(meters)
-
-        # find the minimum resolution level which will cover the base_shape 
-        min_res_cover = np.where(
-            np.array(list(constants.H3_UTILS['avg_hex_area_km2'].values())) > base_shape.area.values[0])[0][-1]
-
-        # are the hexagons enough to fill the base_shape?
-        # if not suggest the largest of the smallest resolutions/meters which fit in base_shape
-        if res >= min_res_cover:
-            pass
-        else:
-            warnings.warn(f' The cell side-length you provided is too large to cover the input area.'
-                          f' Try something smaller, e.g. :'
-                          f' Side-Length {constants.H3_UTILS["avg_hex_edge_len_km"][str(min_res_cover - 1)] / 1000} Km')
-            res = min_res_cover - 1
-        return res
-
-    def _handle_polyfill(self, base_shape, res):
-
-        def get_hex(x):
-            h = h3.polyfill(x.__geo_interface__, res, geo_json_conformant=True)
-            if len(h) > 0:
-                return h
-            else:
-                return None
-
-        if base_shape.type[0] == "MultiPolygon":
-            tmp_hexs = base_shape.explode().apply(lambda x: get_hex(x))
-            hexs = list(set(np.concatenate(tmp_hexs[tmp_hexs.notna()].to_list())))
-        else:
-            hexs = h3.polyfill(
-                base_shape.geometry.__geo_interface__['features'][0]['geometry'], res, geo_json_conformant=True)
-
-        return hexs
-
-    def __call__(self, base_shape, meters=50, which_osm_result=-1, crs=constants.DEFAULT_CRS, window_size=None):
+    def __call__(
+        self,
+        base_shape,
+        meters=50,
+        which_osm_result=-1,
+        crs=constants.DEFAULT_CRS,
+        window_size=None,
+    ):
+        base_shape_geometry = self._create_geometry_if_does_not_exists(base_shape, which_osm_result)
+        base_shape_geometry_merged = self._merge_all_polygons(base_shape_geometry)
+        return self._build(base_shape_geometry_merged, meters, crs)
+
+    def _create_geometry_if_does_not_exists(self, base_shape, which_osm_result):
         if not self._instance:
 
             if isinstance(base_shape, str):
-                # Try to obtain the base shape from OSM
-                base_shapes = utils.bbox_from_name(base_shape, which_osm_result=which_osm_result)
-                i = 0
-                base_shape = base_shapes.loc[[i]]
-                while not (isinstance(base_shape.geometry.iloc[0], Polygon) or
-                           isinstance(base_shape.geometry.iloc[0], MultiPolygon)):
-                    i += 1
-                    base_shape = base_shapes.loc[[i]]
-
-            elif isinstance(base_shape, gpd.GeoDataFrame) or isinstance(base_shape, gpd.GeoSeries):
+                base_shape = self._str_to_geometry(base_shape, which_osm_result)
 
+            elif self._isinstance_geodataframe_or_geoseries(base_shape):
                 if all(isinstance(x, Point) for x in base_shape.geometry):
-                    # Build a base shape that contains all the points in the
-                    # given geodataframe
-                    base_shape = utils.bbox_from_points(base_shape)
+                    base_shape = utils.bbox_from_points(base_shape, base_shape.crs)
             else:
-                raise ValueError(
-                    "Not valid base_shape object. Accepted types are str, GeoDataFrame or GeoSeries.")
+                raise ValueError("Not valid base_shape object." " Accepted types are str, GeoDataFrame or GeoSeries.")
+        return base_shape
 
-        # Merge all the polygons
-        polygons = base_shape.geometry.values
-        base_shape = gpd.GeoSeries(
-            cascaded_union(polygons), crs=base_shape.crs)
+    def _isinstance_geodataframe_or_geoseries(self, base_shape):
+        return True if (isinstance(base_shape, gpd.GeoDataFrame) or isinstance(base_shape, gpd.GeoSeries)) else False
 
-        return self._build(base_shape, meters, crs)
+    def _str_to_geometry(self, base_shape, which_osm_result):
+        base_shapes = utils.bbox_from_name(base_shape, which_osm_result=which_osm_result)
+        polygon_shape = self._find_first_polygon(base_shapes)
+        return polygon_shape
 
-    def _build(self, base_shape, meters, crs=constants.DEFAULT_CRS):
+    def _find_first_polygon(self, base_shapes):
+        return_shape = base_shapes.iloc[[0]]
+        for i, current_shape in enumerate(base_shapes["geometry"].values):
+            if self._isinstance_poly_or_multipolygon(current_shape):
+                return_shape = base_shapes.iloc[[i]]
+                break
+        return return_shape
 
-        #  translate input meters to appropriate h3 resolution 
-        res = self._get_appropriate_res(base_shape, meters)
+    def _isinstance_poly_or_multipolygon(self, shape):
+        return True if (isinstance(shape, Polygon) or isinstance(shape, MultiPolygon)) else False
 
-        # cover the base_shape with h3 hexagonal polygons
-        hexs = self._handle_polyfill(base_shape, res)
+    def _merge_all_polygons(self, base_shape):
+        polygons = base_shape.geometry.values
+        base_shape = gpd.GeoSeries(cascaded_union(polygons), crs=base_shape.crs)
+        return base_shape
 
-        # get actual geoms out of H3 hexagons
-        # from https://geographicdata.science/book/data/h3_grid/build_sd_h3_grid.html
-        polygonise = lambda hex_id: Polygon(
-            h3.h3_to_geo_boundary(
-                hex_id, geo_json=True)
+    def _build(self, base_shape, meters, crs=constants.DEFAULT_CRS):
+        if base_shape.crs != constants.DEFAULT_CRS:
+            base_shape = base_shape.to_crs(constants.DEFAULT_CRS)
+        resolution = self._get_resolution(base_shape, meters)
+        hexagon_ids = self._handle_polyfill(base_shape, resolution)
+        hexagon_polygons = self._create_hexagon_polygons(hexagon_ids)
+        hexagon_polygons_with_id = self._add_tile_id(hexagon_polygons)
+        return hexagon_polygons_with_id
+
+    def _get_resolution(self, base_shape, meters):
+        resolution = self._meters_to_resolution(meters)
+        base_shape_projected = base_shape.to_crs(constants.UNIVERSAL_CRS)
+        minimum_resolution = self._find_min_resolution(base_shape_projected)
+        if resolution <= minimum_resolution:
+            self._suggest_minimum_resolution_which_still_fits(minimum_resolution)
+            resolution = minimum_resolution - 1
+        return resolution
+
+    def _suggest_minimum_resolution_which_still_fits(self, minimum_resolution):
+        minimum_resolution_which_still_fits = str(minimum_resolution - 1)
+        hexagon_edges = constants.H3_UTILS["average_hexagon_edge_length"]
+        suggestion = hexagon_edges[minimum_resolution_which_still_fits] / 100
+        warnings.warn(
+            f" The cell side-length you provided is too large to cover the input area."
+            f" Try something smaller, e.g. :"
+            f" Side-Length {suggestion} Km"
         )
-        # prepare a geodf with all the H3 geoms
-        all_polys = gpd.GeoDataFrame(
-            {'geometry': list(map(polygonise, hexs)),
-             'H3_INDEX': hexs},
-            crs=constants.DEFAULT_CRS
+
+    def _handle_polyfill(self, base_shape, resolution):
+        if isinstance(base_shape, MultiPolygon):
+            temporary_hexagons = base_shape.explode().apply(lambda x: self._get_hexagons(x, resolution))
+            hexagons = list(set(np.concatenate(temporary_hexagons[temporary_hexagons.notna()].to_list())))
+        else:
+            hexagons = h3.polyfill(
+                self._extract_geometry(base_shape),
+                resolution,
+                geo_json_conformant=True,
+            )
+        return hexagons
+
+    def _extract_geometry(self, base_shape):
+        try:
+            extracted_geometry = base_shape.geometry.__geo_interface__["features"][0]["geometry"]
+            return extracted_geometry
+        except Exception as e:
+            print(f"Error '{e}' occured.")
+
+    def _get_hexagons(self, x, resolution):
+        hexagons = h3.polyfill(x.__geo_interface__, resolution, geo_json_conformant=True)
+        if hexagons.all():
+            return hexagons
+
+    def _create_hexagon_polygons(self, hexagon_ids):
+        # from https://geographicdata.science/book/data/h3_grid/build_sd_h3_grid.html
+        return gpd.GeoDataFrame(
+            {
+                "geometry": [Polygon(h3.h3_to_geo_boundary(hexagon_id, geo_json=True)) for hexagon_id in hexagon_ids],
+                "H3_INDEX": hexagon_ids,
+            },
+            crs=constants.DEFAULT_CRS,
         )
 
-        # add TileID
-        all_polys['TILE_ID'] = all_polys.index
-        # Convert TILE_ID to have str type
-        all_polys['TILE_ID'] = all_polys['TILE_ID'].astype('str')
+    def _add_tile_id(self, hexagon_polygons):
+        hexagon_polygons[constants.TILE_ID] = hexagon_polygons.index
+        hexagon_polygons[constants.TILE_ID] = hexagon_polygons[constants.TILE_ID].astype("str")
+        return hexagon_polygons
+
+    def _meters_to_resolution(self, meters):
+        hexagon_side_length = self._meters_to_kilometers(meters)
+        average_hexagon_edge_lengths = self._load_h3_utils("average_hexagon_edge_length")
+        resolution = (np.abs(average_hexagon_edge_lengths - hexagon_side_length)).argmin()
+        return resolution
+
+    def _meters_to_kilometers(self, meters):
+        kilometers = meters / 1000
+        return kilometers
+
+    def _load_h3_utils(self, util):
+        loaded_util = np.asarray(list(constants.H3_UTILS[util].values()))
+        return loaded_util
+
+    def _find_min_resolution(self, base_shape):
+        try:
+            minimum_resolution = np.where(
+                self._load_h3_utils("average_hexagon_area") > self._squared_meters_to_squared_kilometers(base_shape)
+            )[0][-1]
+            return minimum_resolution
+        except Exception as e:
+            print(f"Error '{e}' occured.")
 
-        return all_polys
+    def _squared_meters_to_squared_kilometers(self, squared_meters):
+        squared_kilometers = squared_meters.area.values[0] / 1000000
+        return squared_kilometers
 
 
 # Register the builder
-tiler.register_tiler('h3_tessellation', H3TessellationTiler())
+tiler.register_tiler("h3_tessellation", H3TessellationTiler())
diff --git a/skmob/utils/__init__.py b/skmob/utils/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/utils/constants.py b/skmob/utils/constants.py
index f8c8ac5..220ba0d 100755
--- a/skmob/utils/constants.py
+++ b/skmob/utils/constants.py
@@ -51,7 +51,7 @@ NY_FLOWS_2011 = 'https://raw.githubusercontent.com/scikit-mobility/scikit-mobili
 
 # https://github.com/uber/h3/blob/master/docs/core-library/restable.md
 H3_UTILS ={
-  "avg_hex_area_km2": {
+  "average_hexagon_area": {
     "0": 4250546.8477,
     "1": 607220.9782429,
     "2": 86745.8540347,
@@ -69,7 +69,7 @@ H3_UTILS ={
     "14": 0.0000063,
     "15": 9e-7
   },
-  "avg_hex_edge_len_km": {
+  "average_hexagon_edge_length": {
     "0": 1107.712591,
     "1": 418.6760055,
     "2": 158.2446558,


Test patch:
diff --git a/skmob/core/__init__.py b/skmob/core/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/io/__init__.py b/skmob/io/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/measures/__init__.py b/skmob/measures/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/measures/tests/test_collective.py b/skmob/measures/tests/test_collective.py
index 7f5983c..5ee7362 100644
--- a/skmob/measures/tests/test_collective.py
+++ b/skmob/measures/tests/test_collective.py
@@ -1,9 +1,11 @@
-from skmob import TrajDataFrame
-from skmob.measures import collective
-from skmob.utils import constants
+import math
+
 import numpy as np
 import pandas as pd
-import math
+
+from skmob.core.trajectorydataframe import TrajDataFrame
+from skmob.measures import collective
+from skmob.utils import constants
 
 
 class TestCollectiveMetrics:
@@ -13,138 +15,228 @@ class TestCollectiveMetrics:
         date_time = constants.DATETIME
         user_id = constants.UID
 
-        lat_lons = np.array([[43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.5442700, 10.3261500],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500]])
+        lat_lons = np.array(
+            [
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.5442700, 10.3261500],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+            ]
+        )
 
         traj = pd.DataFrame(lat_lons, columns=[latitude, longitude])
 
-        traj[date_time] = pd.to_datetime([
-            '20110203 8:34:04', '20110203 9:34:04', '20110203 10:34:04', '20110204 10:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110204 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110205 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04'])
-
-        traj[user_id] = [1 for _ in range(4)] + [2 for _ in range(4)] + \
-                        [3 for _ in range(4)] + [4 for _ in range(3)] + \
-                        [5 for _ in range(3)] + [6 for _ in range(2)]
-
-        self.unique_points = [(43.544270, 10.326150), (43.708530, 10.403600), (43.779250, 11.246260), (43.843014, 10.507994)]
+        traj[date_time] = pd.to_datetime(
+            [
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110203 10:34:04",
+                "20110204 10:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110205 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+            ]
+        )
+
+        traj[user_id] = (
+            [1 for _ in range(4)]
+            + [2 for _ in range(4)]
+            + [3 for _ in range(4)]
+            + [4 for _ in range(3)]
+            + [5 for _ in range(3)]
+            + [6 for _ in range(2)]
+        )
+
+        self.unique_points = [
+            (43.544270, 10.326150),
+            (43.708530, 10.403600),
+            (43.779250, 11.246260),
+            (43.843014, 10.507994),
+        ]
 
         self.traj = traj.sort_values([user_id, date_time])
         self.trjdat = TrajDataFrame(traj, user_id=user_id)
 
     def test_random_location_entropy(self):
         output = collective.random_location_entropy(self.trjdat)
-        assert (len(output) == 4)
-        assert (isinstance(output, pd.core.frame.DataFrame))
-        assert (math.isclose(output[(output.lat == 43.544270)]['random_location_entropy'].values[0], 2.321928094))
-        assert (math.isclose(output[(output.lat == 43.708530)]['random_location_entropy'].values[0], 2.321928094))
-        assert (math.isclose(output[(output.lat == 43.779250)]['random_location_entropy'].values[0], 2.000000000))
-        assert (math.isclose(output[(output.lng == 10.507994)]['random_location_entropy'].values[0], 2.321928094))
+        assert len(output) == 4
+        assert isinstance(output, pd.core.frame.DataFrame)
+        assert math.isclose(output[(output.lat == 43.544270)]["random_location_entropy"].values[0], 2.321928094)
+        assert math.isclose(output[(output.lat == 43.708530)]["random_location_entropy"].values[0], 2.321928094)
+        assert math.isclose(output[(output.lat == 43.779250)]["random_location_entropy"].values[0], 2.000000000)
+        assert math.isclose(output[(output.lng == 10.507994)]["random_location_entropy"].values[0], 2.321928094)
 
     def test_uncorrelated_location_entropy(self):
         output_1 = collective.uncorrelated_location_entropy(self.trjdat)
 
-        assert (len(output_1) == 4)
-        assert (isinstance(output_1, pd.core.frame.DataFrame))
-        assert (math.isclose(output_1[(output_1.lat == 43.544270)]['uncorrelated_location_entropy'].values[0],
-                             1.6094379124))
-        assert (math.isclose(output_1[(output_1.lat == 43.708530)]['uncorrelated_location_entropy'].values[0],
-                             1.6094379124))
-        assert (math.isclose(output_1[(output_1.lat == 43.779250)]['uncorrelated_location_entropy'].values[0],
-                             1.3862943611))
-        assert (math.isclose(output_1[(output_1.lng == 10.507994)]['uncorrelated_location_entropy'].values[0],
-                             1.5607104090))
+        assert len(output_1) == 4
+        assert isinstance(output_1, pd.core.frame.DataFrame)
+        assert math.isclose(
+            output_1[(output_1.lat == 43.544270)]["uncorrelated_location_entropy"].values[0], 1.6094379124
+        )
+        assert math.isclose(
+            output_1[(output_1.lat == 43.708530)]["uncorrelated_location_entropy"].values[0], 1.6094379124
+        )
+        assert math.isclose(
+            output_1[(output_1.lat == 43.779250)]["uncorrelated_location_entropy"].values[0], 1.3862943611
+        )
+        assert math.isclose(
+            output_1[(output_1.lng == 10.507994)]["uncorrelated_location_entropy"].values[0], 1.5607104090
+        )
 
         output_2 = collective.uncorrelated_location_entropy(self.trjdat, normalize=True)
 
-        assert (len(output_2) == 4)
-        assert (isinstance(output_2, pd.core.frame.DataFrame))
-        assert (math.isclose(output_2[(output_2.lat == 43.544270)]['norm_uncorrelated_location_entropy'].values[0],
-                             0.6931471805))
-        assert (math.isclose(output_2[(output_2.lat == 43.708530)]['norm_uncorrelated_location_entropy'].values[0],
-                             0.6931471805))
-        assert (math.isclose(output_2[(output_2.lat == 43.779250)]['norm_uncorrelated_location_entropy'].values[0],
-                             0.6931471805))
-        assert (math.isclose(output_2[(output_2.lng == 10.507994)]['norm_uncorrelated_location_entropy'].values[0],
-                             0.6721613871))
-
+        assert len(output_2) == 4
+        assert isinstance(output_2, pd.core.frame.DataFrame)
+        assert math.isclose(
+            output_2[(output_2.lat == 43.544270)]["norm_uncorrelated_location_entropy"].values[0], 0.6931471805
+        )
+        assert math.isclose(
+            output_2[(output_2.lat == 43.708530)]["norm_uncorrelated_location_entropy"].values[0], 0.6931471805
+        )
+        assert math.isclose(
+            output_2[(output_2.lat == 43.779250)]["norm_uncorrelated_location_entropy"].values[0], 0.6931471805
+        )
+        assert math.isclose(
+            output_2[(output_2.lng == 10.507994)]["norm_uncorrelated_location_entropy"].values[0], 0.6721613871
+        )
 
     def test_mean_square_displacement(self):
 
         output_1 = collective.mean_square_displacement(self.trjdat)
         output_2 = collective.mean_square_displacement(self.trjdat, days=0, hours=1, minutes=0)
 
-        assert (math.isclose(output_1, output_2))
-        assert (math.isclose(output_1, 1386.2137565731))
+        assert math.isclose(output_1, output_2)
+        assert math.isclose(output_1, 1386.2137565731)
 
         output_3 = collective.mean_square_displacement(self.trjdat, days=1, hours=0, minutes=0)
 
-        assert (math.isclose(output_3, 1927.57775786))
+        assert math.isclose(output_3, 1927.57775786)
 
         output_4 = collective.mean_square_displacement(self.trjdat, days=0, hours=0, minutes=15)
 
-        assert (math.isclose(output_4, 0))
+        assert math.isclose(output_4, 0)
 
         output_5 = collective.mean_square_displacement(self.trjdat, days=0, hours=0, minutes=60)
 
-        assert (math.isclose(output_5, output_2))
+        assert math.isclose(output_5, output_2)
 
     def test_visits_per_location(self):
         output = collective.visits_per_location(self.trjdat)
-        assert (len(output) == 4)
-        assert (isinstance(output, pd.core.frame.DataFrame))
-        assert (output[(output.lat == 43.544270)]['n_visits'].values[0] == 5)
-        assert (output[(output.lat == 43.708530)]['n_visits'].values[0] == 5)
-        assert (output[(output.lat == 43.779250)]['n_visits'].values[0] == 4)
-        assert (output[(output.lng == 10.507994)]['n_visits'].values[0] == 6)
+        assert len(output) == 4
+        assert isinstance(output, pd.core.frame.DataFrame)
+        assert output[(output.lat == 43.544270)]["n_visits"].values[0] == 5
+        assert output[(output.lat == 43.708530)]["n_visits"].values[0] == 5
+        assert output[(output.lat == 43.779250)]["n_visits"].values[0] == 4
+        assert output[(output.lng == 10.507994)]["n_visits"].values[0] == 6
 
     def test_homes_per_location(self):
-        output = collective.homes_per_location(self.trjdat, start_night='22:00', end_night='07:00')
+        output = collective.homes_per_location(self.trjdat, start_night="22:00", end_night="07:00")
 
-        assert (len(output) == 3)
-        assert (isinstance(output, pd.core.frame.DataFrame))
-        assert (output[(output.lat == 43.544270)]['n_homes'].values[0] == 4)
-        assert (output[(output.lat == 43.708530)]['n_homes'].values[0] == 1)
-        assert (output[(output.lng == 10.507994)]['n_homes'].values[0] == 1)
+        assert len(output) == 3
+        assert isinstance(output, pd.core.frame.DataFrame)
+        assert output[(output.lat == 43.544270)]["n_homes"].values[0] == 4
+        assert output[(output.lat == 43.708530)]["n_homes"].values[0] == 1
+        assert output[(output.lng == 10.507994)]["n_homes"].values[0] == 1
 
-        output_2 = collective.homes_per_location(self.trjdat, start_night='18:00', end_night='11:00')
+        output_2 = collective.homes_per_location(self.trjdat, start_night="18:00", end_night="11:00")
 
-        assert (len(output_2) == 3)
-        assert (isinstance(output_2, pd.core.frame.DataFrame))
-        assert (output_2[(output_2.lat == 43.544270)]['n_homes'].values[0] == 2)
-        assert (output_2[(output_2.lat == 43.708530)]['n_homes'].values[0] == 2)
-        assert (output_2[(output_2.lng == 10.507994)]['n_homes'].values[0] == 2)
+        assert len(output_2) == 3
+        assert isinstance(output_2, pd.core.frame.DataFrame)
+        assert output_2[(output_2.lat == 43.544270)]["n_homes"].values[0] == 2
+        assert output_2[(output_2.lat == 43.708530)]["n_homes"].values[0] == 2
+        assert output_2[(output_2.lng == 10.507994)]["n_homes"].values[0] == 2
 
     def test_visits_per_time_unit(self):
 
-        output_1 = collective.visits_per_time_unit(self.trjdat)['n_visits'].values
-
-        expected_out_1 = [3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                          0, 0, 0, 0, 6, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                          0, 0, 0, 0, 0, 0, 0, 0, 1]
-
-        assert(len(output_1) == len(expected_out_1))
+        output_1 = collective.visits_per_time_unit(self.trjdat)["n_visits"].values
+
+        expected_out_1 = [
+            3,
+            3,
+            1,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            6,
+            5,
+            1,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            1,
+        ]
+
+        assert len(output_1) == len(expected_out_1)
 
         for i in range(len(output_1)):
-            assert (output_1[i] == expected_out_1[i])
+            assert output_1[i] == expected_out_1[i]
diff --git a/skmob/models/tests/test_radiation.py b/skmob/models/tests/test_radiation.py
index c1d6e97..2cad97f 100644
--- a/skmob/models/tests/test_radiation.py
+++ b/skmob/models/tests/test_radiation.py
@@ -1,10 +1,11 @@
-from ...core.flowdataframe import FlowDataFrame
-from ...utils import constants, gislib
 import geopandas as gpd
-from ...models import Radiation
 import numpy as np
-import shapely
 import pytest
+import shapely
+
+from skmob.core.flowdataframe import FlowDataFrame
+from skmob.models.radiation import Radiation
+from skmob.utils import constants, gislib
 
 distfunc = gislib.getDistance
 
@@ -15,31 +16,17 @@ np.random.seed(2)
 
 
 def all_equal(a, b):
-    return np.allclose(a, b, rtol=0., atol=atol)
+    return np.allclose(a, b, rtol=0.0, atol=atol)
 
 
 # tessellation
 
-tess_polygons = [[[7.481, 45.184],
-                  [7.481, 45.216],
-                  [7.526, 45.216],
-                  [7.526, 45.184],
-                  [7.481, 45.184]],
-                 [[7.481, 45.216],
-                  [7.481, 45.247],
-                  [7.526, 45.247],
-                  [7.526, 45.216],
-                  [7.481, 45.216]],
-                 [[7.526, 45.184],
-                  [7.526, 45.216],
-                  [7.571, 45.216],
-                  [7.571, 45.184],
-                  [7.526, 45.184]],
-                 [[7.526, 45.216],
-                  [7.526, 45.247],
-                  [7.571, 45.247],
-                  [7.571, 45.216],
-                  [7.526, 45.216]]]
+tess_polygons = [
+    [[7.481, 45.184], [7.481, 45.216], [7.526, 45.216], [7.526, 45.184], [7.481, 45.184]],
+    [[7.481, 45.216], [7.481, 45.247], [7.526, 45.247], [7.526, 45.216], [7.481, 45.216]],
+    [[7.526, 45.184], [7.526, 45.216], [7.571, 45.216], [7.571, 45.184], [7.526, 45.184]],
+    [[7.526, 45.216], [7.526, 45.247], [7.571, 45.247], [7.571, 45.216], [7.526, 45.216]],
+]
 
 geom = [shapely.geometry.Polygon(p) for p in tess_polygons]
 tessellation = gpd.GeoDataFrame(geometry=geom, crs="EPSG:4326")
@@ -62,6 +49,7 @@ tessellation[constants.RELEVANCE] = relevance
 
 # compute expected flows and probabilities
 
+
 def correct_radiation():
     # TODO
     return 0
@@ -69,7 +57,8 @@ def correct_radiation():
 
 # generate
 
-@pytest.mark.parametrize('out_format', ['flows', 'flows_sample', 'probabilities'])
+
+@pytest.mark.parametrize("out_format", ["flows", "flows_sample", "probabilities"])
 def test_radiation_generate(out_format):
 
     # TODO: check correctness of results
@@ -78,5 +67,3 @@ def test_radiation_generate(out_format):
     rad_fdf = radiation.generate(tessellation, out_format=out_format)
 
     assert isinstance(rad_fdf, FlowDataFrame)
-
-
diff --git a/skmob/preprocessing/__init__.py b/skmob/preprocessing/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/preprocessing/tests/test_clustering.py b/skmob/preprocessing/tests/test_clustering.py
index 2c0d8df..2124ebd 100644
--- a/skmob/preprocessing/tests/test_clustering.py
+++ b/skmob/preprocessing/tests/test_clustering.py
@@ -1,57 +1,85 @@
-import pandas as pd
 import numpy as np
+import pandas as pd
 
-from skmob import TrajDataFrame
-from skmob.utils import constants
-
+from skmob.core.trajectorydataframe import TrajDataFrame
 from skmob.preprocessing import clustering
+from skmob.utils import constants
 
 
 class TestClustering:
-
     def setup_method(self):
         latitude = constants.LATITUDE
         longitude = constants.LONGITUDE
         date_time = constants.DATETIME
         user_id = constants.UID
 
-        lat_lons = np.array([[43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.5442700, 10.3261500],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500]])
+        lat_lons = np.array(
+            [
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.5442700, 10.3261500],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+            ]
+        )
 
         traj = pd.DataFrame(lat_lons, columns=[latitude, longitude])
 
-        traj[date_time] = pd.to_datetime([
-            '20110203 8:34:04', '20110203 9:34:04', '20110203 10:34:04', '20110204 10:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110204 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110205 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04'])
-
-        traj[user_id] = [1 for _ in range(4)] + [2 for _ in range(4)] + \
-                        [3 for _ in range(4)] + [4 for _ in range(3)] + \
-                        [5 for _ in range(3)] + [6 for _ in range(2)]
-
-        self.unique_points = [(43.544270, 10.326150), (43.708530, 10.403600), (43.779250, 11.246260),
-                              (43.843014, 10.507994)]
+        traj[date_time] = pd.to_datetime(
+            [
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110203 10:34:04",
+                "20110204 10:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110205 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+            ]
+        )
+
+        traj[user_id] = (
+            [1 for _ in range(4)]
+            + [2 for _ in range(4)]
+            + [3 for _ in range(4)]
+            + [4 for _ in range(3)]
+            + [5 for _ in range(3)]
+            + [6 for _ in range(2)]
+        )
+
+        self.unique_points = [
+            (43.544270, 10.326150),
+            (43.708530, 10.403600),
+            (43.779250, 11.246260),
+            (43.843014, 10.507994),
+        ]
 
         self.traj = traj.sort_values([user_id, date_time])
         self.trjdat = TrajDataFrame(traj, user_id=user_id)
@@ -61,7 +89,7 @@ class TestClustering:
 
         expected_cluster = [3, 2, 1, 0, 0, 2, 0, 1, 3, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0]
         expected = self.trjdat
-        expected['cluster'] = expected_cluster
+        expected["cluster"] = expected_cluster
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
@@ -70,7 +98,7 @@ class TestClustering:
 
         expected_cluster = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0]
         expected = self.trjdat
-        expected['cluster'] = expected_cluster
+        expected["cluster"] = expected_cluster
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
diff --git a/skmob/preprocessing/tests/test_compression.py b/skmob/preprocessing/tests/test_compression.py
index 2d14459..33c9c81 100644
--- a/skmob/preprocessing/tests/test_compression.py
+++ b/skmob/preprocessing/tests/test_compression.py
@@ -1,57 +1,85 @@
-import pandas as pd
 import numpy as np
+import pandas as pd
 
-from skmob import TrajDataFrame
-from skmob.utils import constants
-
+from skmob.core.trajectorydataframe import TrajDataFrame
 from skmob.preprocessing import compression
+from skmob.utils import constants
 
 
 class TestCompression:
-
     def setup_method(self):
         latitude = constants.LATITUDE
         longitude = constants.LONGITUDE
         date_time = constants.DATETIME
         user_id = constants.UID
 
-        lat_lons = np.array([[43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.5442700, 10.3261500],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500]])
+        lat_lons = np.array(
+            [
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.5442700, 10.3261500],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+            ]
+        )
 
         traj = pd.DataFrame(lat_lons, columns=[latitude, longitude])
 
-        traj[date_time] = pd.to_datetime([
-            '20110203 8:34:04', '20110203 9:34:04', '20110203 10:34:04', '20110204 10:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110204 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110205 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04'])
-
-        traj[user_id] = [1 for _ in range(4)] + [2 for _ in range(4)] + \
-                        [3 for _ in range(4)] + [4 for _ in range(3)] + \
-                        [5 for _ in range(3)] + [6 for _ in range(2)]
-
-        self.unique_points = [(43.544270, 10.326150), (43.708530, 10.403600), (43.779250, 11.246260),
-                              (43.843014, 10.507994)]
+        traj[date_time] = pd.to_datetime(
+            [
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110203 10:34:04",
+                "20110204 10:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110205 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+            ]
+        )
+
+        traj[user_id] = (
+            [1 for _ in range(4)]
+            + [2 for _ in range(4)]
+            + [3 for _ in range(4)]
+            + [4 for _ in range(3)]
+            + [5 for _ in range(3)]
+            + [6 for _ in range(2)]
+        )
+
+        self.unique_points = [
+            (43.544270, 10.326150),
+            (43.708530, 10.403600),
+            (43.779250, 11.246260),
+            (43.843014, 10.507994),
+        ]
 
         self.traj = traj.sort_values([user_id, date_time])
         self.trjdat = TrajDataFrame(traj, user_id=user_id)
@@ -62,34 +90,95 @@ class TestCompression:
         expected = self.trjdat.copy()
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
 
         output = compression.compress(self.trjdat, spatial_radius_km=20)
 
-        expected = TrajDataFrame({"lat":{"0":43.8430139,"1":43.6264,"2":43.77925,"3":43.8430139,"4":43.54427,
-                                         "5":43.6264,"6":43.8430139,"7":43.77925,"8":43.6264,"9":43.77925,
-                                         "10":43.70853,"11":43.77925,"12":43.8430139,"13":43.8430139,"14":43.54427},
-                                  "lng":{"0":10.507994,"1":10.364875,"2":11.24626,"3":10.507994,"4":10.32615,
-                                         "5":10.364875,"6":10.507994,"7":11.24626,"8":10.364875,"9":11.24626,
-                                         "10":10.4036,"11":11.24626,"12":10.507994,"13":10.507994,"14":10.32615},
-                                  "datetime":{"0":1296722044,"1":1296725644,"2":1296815644,"3":1296722044,
-                                              "4":1296819244,"5":1296722044,"6":1296815644,"7":1296819244,
-                                              "8":1296815644,"9":1296822844,"10":1296815644,"11":1296819244,
-                                              "12":1296909244,"13":1296815644,"14":1296819244},
-                                  "uid":{"0":1,"1":1,"2":1,"3":2,"4":2,"5":3,"6":3,"7":3,"8":4,"9":4,"10":5,
-                                         "11":5,"12":5,"13":6,"14":6}}, timestamp=True)
+        expected = TrajDataFrame(
+            {
+                "lat": {
+                    "0": 43.8430139,
+                    "1": 43.6264,
+                    "2": 43.77925,
+                    "3": 43.8430139,
+                    "4": 43.54427,
+                    "5": 43.6264,
+                    "6": 43.8430139,
+                    "7": 43.77925,
+                    "8": 43.6264,
+                    "9": 43.77925,
+                    "10": 43.70853,
+                    "11": 43.77925,
+                    "12": 43.8430139,
+                    "13": 43.8430139,
+                    "14": 43.54427,
+                },
+                "lng": {
+                    "0": 10.507994,
+                    "1": 10.364875,
+                    "2": 11.24626,
+                    "3": 10.507994,
+                    "4": 10.32615,
+                    "5": 10.364875,
+                    "6": 10.507994,
+                    "7": 11.24626,
+                    "8": 10.364875,
+                    "9": 11.24626,
+                    "10": 10.4036,
+                    "11": 11.24626,
+                    "12": 10.507994,
+                    "13": 10.507994,
+                    "14": 10.32615,
+                },
+                "datetime": {
+                    "0": 1296722044,
+                    "1": 1296725644,
+                    "2": 1296815644,
+                    "3": 1296722044,
+                    "4": 1296819244,
+                    "5": 1296722044,
+                    "6": 1296815644,
+                    "7": 1296819244,
+                    "8": 1296815644,
+                    "9": 1296822844,
+                    "10": 1296815644,
+                    "11": 1296819244,
+                    "12": 1296909244,
+                    "13": 1296815644,
+                    "14": 1296819244,
+                },
+                "uid": {
+                    "0": 1,
+                    "1": 1,
+                    "2": 1,
+                    "3": 2,
+                    "4": 2,
+                    "5": 3,
+                    "6": 3,
+                    "7": 3,
+                    "8": 4,
+                    "9": 4,
+                    "10": 5,
+                    "11": 5,
+                    "12": 5,
+                    "13": 6,
+                    "14": 6,
+                },
+            },
+            timestamp=True,
+        )
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected, check_dtype=False)
diff --git a/skmob/preprocessing/tests/test_detection.py b/skmob/preprocessing/tests/test_detection.py
index ee698e3..d306aa5 100644
--- a/skmob/preprocessing/tests/test_detection.py
+++ b/skmob/preprocessing/tests/test_detection.py
@@ -1,57 +1,85 @@
-import pandas as pd
 import numpy as np
+import pandas as pd
 
-from skmob import TrajDataFrame
-from skmob.utils import constants
-
+from skmob.core.trajectorydataframe import TrajDataFrame
 from skmob.preprocessing import detection
+from skmob.utils import constants
 
 
 class TestDetection:
-
     def setup_method(self):
         latitude = constants.LATITUDE
         longitude = constants.LONGITUDE
         date_time = constants.DATETIME
         user_id = constants.UID
 
-        lat_lons = np.array([[43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.5442700, 10.3261500],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500]])
+        lat_lons = np.array(
+            [
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.5442700, 10.3261500],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+            ]
+        )
 
         traj = pd.DataFrame(lat_lons, columns=[latitude, longitude])
 
-        traj[date_time] = pd.to_datetime([
-            '20110203 8:34:04', '20110203 9:34:04', '20110203 10:34:04', '20110204 10:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110204 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110205 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04'])
-
-        traj[user_id] = [1 for _ in range(4)] + [2 for _ in range(4)] + \
-                        [3 for _ in range(4)] + [4 for _ in range(3)] + \
-                        [5 for _ in range(3)] + [6 for _ in range(2)]
-
-        self.unique_points = [(43.544270, 10.326150), (43.708530, 10.403600), (43.779250, 11.246260),
-                              (43.843014, 10.507994)]
+        traj[date_time] = pd.to_datetime(
+            [
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110203 10:34:04",
+                "20110204 10:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110205 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+            ]
+        )
+
+        traj[user_id] = (
+            [1 for _ in range(4)]
+            + [2 for _ in range(4)]
+            + [3 for _ in range(4)]
+            + [4 for _ in range(3)]
+            + [5 for _ in range(3)]
+            + [6 for _ in range(2)]
+        )
+
+        self.unique_points = [
+            (43.544270, 10.326150),
+            (43.708530, 10.403600),
+            (43.779250, 11.246260),
+            (43.843014, 10.507994),
+        ]
 
         self.traj = traj.sort_values([user_id, date_time])
         self.trjdat = TrajDataFrame(traj, user_id=user_id)
@@ -59,36 +87,44 @@ class TestDetection:
     def test_stops(self):
         output = detection.stops(self.trjdat)
 
-        expected = self.trjdat.drop([3,7,11,14,17,19])
-        stamps =  [pd.Timestamp('2011-02-03 09:34:04'), pd.Timestamp('2011-02-03 10:34:04'),
-                   pd.Timestamp('2011-02-04 10:34:04'), pd.Timestamp('2011-02-03 09:34:04'),
-                   pd.Timestamp('2011-02-04 10:34:04'), pd.Timestamp('2011-02-04 11:34:04'),
-                   pd.Timestamp('2011-02-03 09:34:04'), pd.Timestamp('2011-02-04 10:34:04'),
-                   pd.Timestamp('2011-02-04 11:34:04'), pd.Timestamp('2011-02-04 11:34:04'),
-                   pd.Timestamp('2011-02-04 12:34:04'), pd.Timestamp('2011-02-04 11:34:04'),
-                   pd.Timestamp('2011-02-05 12:34:04'), pd.Timestamp('2011-02-04 11:34:04')]
-
-        expected['leaving_datetime'] = stamps
+        expected = self.trjdat.drop([3, 7, 11, 14, 17, 19])
+        stamps = [
+            pd.Timestamp("2011-02-03 09:34:04"),
+            pd.Timestamp("2011-02-03 10:34:04"),
+            pd.Timestamp("2011-02-04 10:34:04"),
+            pd.Timestamp("2011-02-03 09:34:04"),
+            pd.Timestamp("2011-02-04 10:34:04"),
+            pd.Timestamp("2011-02-04 11:34:04"),
+            pd.Timestamp("2011-02-03 09:34:04"),
+            pd.Timestamp("2011-02-04 10:34:04"),
+            pd.Timestamp("2011-02-04 11:34:04"),
+            pd.Timestamp("2011-02-04 11:34:04"),
+            pd.Timestamp("2011-02-04 12:34:04"),
+            pd.Timestamp("2011-02-04 11:34:04"),
+            pd.Timestamp("2011-02-05 12:34:04"),
+            pd.Timestamp("2011-02-04 11:34:04"),
+        ]
+
+        expected["leaving_datetime"] = stamps
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected, check_dtype=False)
 
         output = detection.stops(self.trjdat, minutes_for_a_stop=60.0, leaving_time=False)
 
-        expected = self.trjdat.drop([0,1,3,4,6,7,8,10,11,12,13,14,15,17,18,19])
+        expected = self.trjdat.drop([0, 1, 3, 4, 6, 7, 8, 10, 11, 12, 13, 14, 15, 17, 18, 19])
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected, check_dtype=False)
-
diff --git a/skmob/preprocessing/tests/test_filtering.py b/skmob/preprocessing/tests/test_filtering.py
index 90ae01b..571a63d 100644
--- a/skmob/preprocessing/tests/test_filtering.py
+++ b/skmob/preprocessing/tests/test_filtering.py
@@ -1,104 +1,131 @@
-import pandas as pd
 import numpy as np
+import pandas as pd
 
-from skmob import TrajDataFrame
-from skmob.utils import constants
-
+from skmob.core.trajectorydataframe import TrajDataFrame
 from skmob.preprocessing import filtering
+from skmob.utils import constants
 
 
 class TestFiltering:
-
     def setup_method(self):
         latitude = constants.LATITUDE
         longitude = constants.LONGITUDE
         date_time = constants.DATETIME
         user_id = constants.UID
 
-        lat_lons = np.array([[43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500],
-                             [43.5442700, 10.3261500],
-                             [43.7085300, 10.4036000],
-                             [43.8430139, 10.5079940],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.5442700, 10.3261500],
-                             [43.7792500, 11.2462600],
-                             [43.7085300, 10.4036000],
-                             [43.7792500, 11.2462600],
-                             [43.8430139, 10.5079940],
-                             [43.8430139, 10.5079940],
-                             [43.5442700, 10.3261500]])
+        lat_lons = np.array(
+            [
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+                [43.5442700, 10.3261500],
+                [43.7085300, 10.4036000],
+                [43.8430139, 10.5079940],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.5442700, 10.3261500],
+                [43.7792500, 11.2462600],
+                [43.7085300, 10.4036000],
+                [43.7792500, 11.2462600],
+                [43.8430139, 10.5079940],
+                [43.8430139, 10.5079940],
+                [43.5442700, 10.3261500],
+            ]
+        )
 
         traj = pd.DataFrame(lat_lons, columns=[latitude, longitude])
 
-        traj[date_time] = pd.to_datetime([
-            '20110203 8:34:04', '20110203 9:34:04', '20110203 10:34:04', '20110204 10:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110203 8:34:04', '20110203 9:34:04', '20110204 10:34:04', '20110204 11:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110204 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04', '20110205 12:34:04',
-            '20110204 10:34:04', '20110204 11:34:04'])
-
-        traj[user_id] = [1 for _ in range(4)] + [2 for _ in range(4)] + \
-                        [3 for _ in range(4)] + [4 for _ in range(3)] + \
-                        [5 for _ in range(3)] + [6 for _ in range(2)]
-
-        self.unique_points = [(43.544270, 10.326150), (43.708530, 10.403600), (43.779250, 11.246260),
-                              (43.843014, 10.507994)]
+        traj[date_time] = pd.to_datetime(
+            [
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110203 10:34:04",
+                "20110204 10:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110203 8:34:04",
+                "20110203 9:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110204 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+                "20110205 12:34:04",
+                "20110204 10:34:04",
+                "20110204 11:34:04",
+            ]
+        )
+
+        traj[user_id] = (
+            [1 for _ in range(4)]
+            + [2 for _ in range(4)]
+            + [3 for _ in range(4)]
+            + [4 for _ in range(3)]
+            + [5 for _ in range(3)]
+            + [6 for _ in range(2)]
+        )
+
+        self.unique_points = [
+            (43.544270, 10.326150),
+            (43.708530, 10.403600),
+            (43.779250, 11.246260),
+            (43.843014, 10.507994),
+        ]
 
         self.traj = traj.sort_values([user_id, date_time])
         self.trjdat = TrajDataFrame(traj, user_id=user_id)
 
     def test_filter(self):
-        output = filtering.filter(self.trjdat, max_speed_kmh=10.)
+        output = filtering.filter(self.trjdat, max_speed_kmh=10.0)
 
         expected = self.trjdat.drop([1, 5, 9, 13, 16])
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
 
-        output = filtering.filter(self.trjdat, max_speed_kmh=120.)
+        output = filtering.filter(self.trjdat, max_speed_kmh=120.0)
         expected = self.trjdat
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
 
-        output = filtering.filter(self.trjdat, max_speed_kmh=10., max_loop=1)
+        output = filtering.filter(self.trjdat, max_speed_kmh=10.0, max_loop=1)
 
         expected = self.trjdat.drop([1, 5, 9, 13, 16])
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
 
-        output = filtering.filter(self.trjdat, max_speed_kmh=10., ratio_max=0.9)
+        output = filtering.filter(self.trjdat, max_speed_kmh=10.0, ratio_max=0.9)
 
         expected = self.trjdat.drop([1, 5, 9, 13, 16])
 
         output.reset_index(inplace=True)
-        output.drop(columns=['index'], inplace=True)
+        output.drop(columns=["index"], inplace=True)
 
         expected.reset_index(inplace=True)
-        expected.drop(columns=['index'], inplace=True)
+        expected.drop(columns=["index"], inplace=True)
 
         # assert
         pd.testing.assert_frame_equal(output, expected)
-
diff --git a/skmob/privacy/__init__.py b/skmob/privacy/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/privacy/tests/__init__.py b/skmob/privacy/tests/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/tessellation/__init__.py b/skmob/tessellation/__init__.py
old mode 100755
new mode 100644
diff --git a/skmob/tessellation/tests/test_tilers.py b/skmob/tessellation/tests/test_tilers.py
index 3aac6d8..e0e7a1b 100644
--- a/skmob/tessellation/tests/test_tilers.py
+++ b/skmob/tessellation/tests/test_tilers.py
@@ -1,45 +1,128 @@
-import re
 import geopandas as gpd
-from ...tessellation import tilers
-import shapely
 import pytest
+import shapely
+from pandas import DataFrame
+from shapely.geometry import Point, Polygon
+
+from skmob.tessellation import tilers
 
-poly = [[[116.1440758191, 39.8846396072],
-         [116.3449987678, 39.8846396072],
-         [116.3449987678, 40.0430521004],
-         [116.1440758191, 40.0430521004],
-         [116.1440758191, 39.8846396072]]]
+poly = [
+    [
+        [116.1440758191, 39.8846396072],
+        [116.3449987678, 39.8846396072],
+        [116.3449987678, 40.0430521004],
+        [116.1440758191, 40.0430521004],
+        [116.1440758191, 39.8846396072],
+    ]
+]
 geom = [shapely.geometry.Polygon(p) for p in poly]
 bbox = gpd.GeoDataFrame(geometry=geom, crs="EPSG:4326")
 
 
-@pytest.mark.parametrize('tiler_type', ["squared", "h3_tessellation"])
-@pytest.mark.parametrize('base_shape', ['Beijing, China', bbox])
-@pytest.mark.parametrize('meters', [15000])
+@pytest.fixture()
+def h3_tess():
+    return tilers.H3TessellationTiler()
+
+
+@pytest.mark.parametrize("tiler_type", ["squared", "h3_tessellation"])
+@pytest.mark.parametrize("base_shape", ["Beijing, China", bbox])
+@pytest.mark.parametrize("meters", [15000])
 def test_tiler_get(tiler_type, base_shape, meters):
     tessellation = tilers.tiler.get(tiler_type, base_shape=base_shape, meters=meters)
     assert isinstance(tessellation, gpd.GeoDataFrame)
 
-# Arrange
-@pytest.fixture()
-def h3_tess():
-    return tilers.H3TessellationTiler()
 
-@pytest.mark.parametrize("input_meters, expected_res", [(500, 8), (1500, 7), (5000, 6)])
-def test__meters_to_res(h3_tess, input_meters, expected_res):
-    assert h3_tess._meters_to_res(input_meters) == expected_res
+def test__isinstance_geodataframe_or_geoseries(h3_tess):
+    if h3_tess._isinstance_geodataframe_or_geoseries(bbox):
+        return True
+
+
+def test__str_to_geometry(h3_tess):
+    assert isinstance(h3_tess._str_to_geometry("Milan, Italy", 1), gpd.GeoDataFrame)
+
+
+def test__find_first_polygon_expected_length(h3_tess):
+    base_shapes = bbox.append({"geometry": Point(9, 45)}, ignore_index=True)
+    first_polygon = h3_tess._find_first_polygon(base_shapes)
+    assert isinstance(first_polygon.values.tolist()[0][0], Polygon)
+
+
+def test__find_first_polygon_expected_type(h3_tess):
+    base_shapes = bbox.append({"geometry": Point(9, 45)}, ignore_index=True)
+    first_polygon = h3_tess._find_first_polygon(base_shapes)
+    assert isinstance(first_polygon.values.tolist()[0][0], Polygon)
+
+
+def test__isinstance_poly_or_multipolygon(h3_tess):
+    candidate_polygon = Polygon([[1, 0], [1, 1], [0, 1], [0, 0]])
+    if h3_tess._isinstance_poly_or_multipolygon(candidate_polygon):
+        return True
+
+
+def test__merge_all_polygons(h3_tess):
+    assert h3_tess._merge_all_polygons(bbox).shape[0] == 1
+
+
+@pytest.mark.parametrize("input_meters, expected_resolution", [(5000, 6), (50000, 3)])
+def test__get_resolution(h3_tess, input_meters, expected_resolution):
+    assert (
+        h3_tess._get_resolution(base_shape=bbox, meters=input_meters)
+        == expected_resolution
+    )
+
+
+def test__suggest_minimum_resolution_which_still_fits(h3_tess):
+    with pytest.warns(UserWarning) as user_warnings:  # noqa: F841
+        h3_tess._suggest_minimum_resolution_which_still_fits(4)
+
+
+def test__handle_polyfill(h3_tess):
+    hexagons = h3_tess._handle_polyfill(bbox, 5)
+    assert hexagons[0] == 599852472416075775
+
+
+def test__extract_geometry(h3_tess):
+    extracted_geometry = h3_tess._extract_geometry(bbox)
+    assert extracted_geometry["type"] == "Polygon"
+
+
+def test__get_hexagons(h3_tess):
+    hexagon = h3_tess._get_hexagons(Polygon(geom[0]), 5)
+    assert hexagon == 599852472416075775
+
+
+def test__create_hexagon_polygons(h3_tess):
+    hexagon_polygons = h3_tess._create_hexagon_polygons([599852472416075775])
+    assert isinstance(hexagon_polygons, DataFrame)
+
+
+def test__add_tile_id(h3_tess):
+
+    hexagon_polygons_with_id = h3_tess._add_tile_id(bbox)
+
+    assert "tile_ID" in hexagon_polygons_with_id.columns
+
+
+@pytest.mark.parametrize(
+    "input_meters, expected_resolution", [(50, 10), (500, 8), (5000, 6)]
+)
+def test__meters_to_resolution(h3_tess, input_meters, expected_resolution):
+    assert h3_tess._meters_to_resolution(input_meters) == expected_resolution
+
+
+@pytest.mark.parametrize("input_meters, expected_kilometers", [(1000, 1), (10000, 10)])
+def test__meters_to_kilometers(h3_tess, input_meters, expected_kilometers):
+    assert h3_tess._meters_to_kilometers(input_meters) == expected_kilometers
+
+
+def test__load_h3_utils(h3_tess):
+    assert len(h3_tess._load_h3_utils("average_hexagon_area")) == 16
+    assert len(h3_tess._load_h3_utils("average_hexagon_edge_length")) == 16
+
 
-def test__get_appropriate_res(h3_tess):
-    assert h3_tess._get_appropriate_res(bbox, 5000) == 8
+def test__find_min_resolution(h3_tess):
+    assert h3_tess._find_min_resolution(bbox) == 15
 
-# test UserWarning is triggered for input hexs
-# that are larger than the base_shape
-def test_warning(h3_tess):
-    with pytest.warns(UserWarning) as uws:
-        pattern=r".*Try something smaller.*"
-        h3_tess._get_appropriate_res(bbox, 50000)
 
-        # check that 2 warnings were raised
-        assert len(uws) == 2
-        # check that the message matches
-        assert re.match(pattern, uws[1].message.args[0])
+def test__squared_meters_to_squared_kilometers(h3_tess):
+    assert h3_tess._squared_meters_to_squared_kilometers(bbox) == 3.18287052446638e-08