From 2f0579f77b740e4cb54bdcf285b5b6a0b240df54 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Fri, 31 Mar 2023 22:39:18 -0400 Subject: [PATCH 1/9] updated type annotations to python 3.10 style, modularized code --- .gitignore | 4 + .pre-commit-config.yaml | 32 +- poetry.lock | 2011 ------------ pyproject.toml | 221 +- src/notebooks/ZenTables Demo.ipynb | 4698 +--------------------------- src/zentables/pretty_styler.py | 344 ++ src/zentables/zentables.py | 374 +-- 7 files changed, 610 insertions(+), 7074 deletions(-) delete mode 100644 poetry.lock create mode 100644 src/zentables/pretty_styler.py diff --git a/.gitignore b/.gitignore index 92043fe..d519db4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,10 @@ __pycache__ /dist .ipynb_checkpoints +/.ruff_cache + +# poetry cruft +poetry.lock # Editor cruft .vscode diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 704a311..b3b56f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,27 +1,29 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 + rev: v4.4.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - - repo: https://github.com/psf/black - rev: 19.3b0 + - repo: local + hooks: + # NOTE: we make `black` a local hook because if it's installed from + # PyPI (rather than from source) then it'll run twice as fast thanks to mypyc + - id: black + name: black + description: "Black: The uncompromising Python code formatter" + entry: black + language: python + require_serial: true + types_or: [python, pyi] + additional_dependencies: [black==23.3.0] + - repo: https://github.com/charliermarsh/ruff-pre-commit + # Ruff version. + rev: 'v0.0.257' hooks: - - id: black - - repo: https://github.com/PyCQA/isort - rev: 5.9.3 - hooks: - - id: isort + - id: ruff - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.910 # Use the sha / tag you want to point at hooks: - id: mypy args: [--no-strict-optional, --ignore-missing-imports] - - repo: https://github.com/nbQA-dev/nbQA - rev: 1.1.1 - hooks: - - id: nbqa-black - - id: nbqa-pyupgrade - args: [--py36-plus] - - id: nbqa-isort diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 714fa13..0000000 --- a/poetry.lock +++ /dev/null @@ -1,2011 +0,0 @@ -[[package]] -name = "anyio" -version = "3.3.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} - -[package.extras] -doc = ["sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16)"] - -[[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 = "appnope" -version = "0.1.2" -description = "Disable App Nap on macOS >= 10.9" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "argcomplete" -version = "1.12.3" -description = "Bash tab completion for argparse" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -importlib-metadata = {version = ">=0.23,<5", markers = "python_version == \"3.7\""} - -[package.extras] -test = ["coverage", "flake8", "pexpect", "wheel"] - -[[package]] -name = "argon2-cffi" -version = "21.1.0" -description = "The secure Argon2 password hashing algorithm." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -cffi = ">=1.0.0" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "furo", "wheel", "pre-commit"] -docs = ["sphinx", "furo"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] - -[[package]] -name = "astroid" -version = "2.8.0" -description = "An abstract syntax tree for Python with inference support." -category = "dev" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -lazy-object-proxy = ">=1.4.0" -typed-ast = {version = ">=1.4.0,<1.5", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<1.13" - -[[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 = "dev" -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 = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "beautifulsoup4" -version = "4.10.0" -description = "Screen-scraping library" -category = "dev" -optional = false -python-versions = ">3.0.0" - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "black" -version = "20.8b1" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -name = "bleach" -version = "4.1.0" -description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = "*" -six = ">=1.9.0" -webencodings = "*" - -[[package]] -name = "certifi" -version = "2021.5.30" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cffi" -version = "1.14.6" -description = "Foreign Function Interface for Python calling C code." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "2.0.6" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "click" -version = "8.0.1" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - -[[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 = "debugpy" -version = "1.4.3" -description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[[package]] -name = "decorator" -version = "5.1.0" -description = "Decorators for Humans" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "entrypoints" -version = "0.3" -description = "Discover and load entry points from installed packages." -category = "dev" -optional = false -python-versions = ">=2.7" - -[[package]] -name = "idna" -version = "3.2" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "importlib-metadata" -version = "4.8.1" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "ipdb" -version = "0.13.9" -description = "IPython-enabled pdb" -category = "dev" -optional = false -python-versions = ">=2.7" - -[package.dependencies] -decorator = {version = "*", markers = "python_version > \"3.6\""} -ipython = {version = ">=7.17.0", markers = "python_version > \"3.6\""} -toml = {version = ">=0.10.2", markers = "python_version > \"3.6\""} - -[[package]] -name = "ipykernel" -version = "6.4.1" -description = "IPython Kernel for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -argcomplete = {version = ">=1.12.3", markers = "python_version < \"3.8.0\""} -debugpy = ">=1.0.0,<2.0" -importlib-metadata = {version = "<5", markers = "python_version < \"3.8.0\""} -ipython = ">=7.23.1,<8.0" -ipython-genutils = "*" -jupyter-client = "<8.0" -matplotlib-inline = ">=0.1.0,<0.2.0" -tornado = ">=4.2,<7.0" -traitlets = ">=4.1.0,<6.0" - -[package.extras] -test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "ipyparallel"] - -[[package]] -name = "ipython" -version = "7.28.0" -description = "IPython: Productive Interactive Computing" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -traitlets = ">=4.2" - -[package.extras] -all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] -doc = ["Sphinx (>=1.3)"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] - -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "isort" -version = "5.9.3" -description = "A Python utility / library to sort Python imports." -category = "dev" -optional = false -python-versions = ">=3.6.1,<4.0" - -[package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] -colors = ["colorama (>=0.4.3,<0.5.0)"] -plugins = ["setuptools"] - -[[package]] -name = "jedi" -version = "0.18.0" -description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -parso = ">=0.8.0,<0.9.0" - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] - -[[package]] -name = "jinja2" -version = "3.0.1" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "json5" -version = "0.9.6" -description = "A Python implementation of the JSON5 data format." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -dev = ["hypothesis"] - -[[package]] -name = "jsonschema" -version = "4.0.1" -description = "An implementation of JSON Schema validation for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jupyter-client" -version = "7.0.5" -description = "Jupyter protocol implementation and client libraries" -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.6.0" -nest-asyncio = ">=1.5" -python-dateutil = ">=2.1" -pyzmq = ">=13" -tornado = ">=4.1" -traitlets = "*" - -[package.extras] -doc = ["myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "pytest-timeout", "jedi (<0.18)"] - -[[package]] -name = "jupyter-core" -version = "4.8.1" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = "*" - -[[package]] -name = "jupyter-server" -version = "1.11.0" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -anyio = ">=3.1.0,<4" -argon2-cffi = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=6.1.1" -jupyter-core = ">=4.6.0" -nbconvert = "*" -nbformat = "*" -prometheus-client = "*" -pyzmq = ">=17" -requests-unixsocket = "*" -Send2Trash = "*" -terminado = ">=0.8.3" -tornado = ">=6.1.0" -traitlets = ">=4.2.1" -websocket-client = "*" - -[package.extras] -test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel"] - -[[package]] -name = "jupyterlab" -version = "3.1.14" -description = "JupyterLab computational environment" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -ipython = "*" -jinja2 = ">=2.1" -jupyter-core = "*" -jupyter-server = ">=1.4,<2.0" -jupyterlab-server = ">=2.3,<3.0" -nbclassic = ">=0.2,<1.0" -packaging = "*" -tornado = ">=6.1.0" - -[package.extras] -test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-console-scripts", "pytest-check-links (>=0.5)", "jupyterlab-server[test] (>=2.2,<3.0)", "requests", "requests-cache", "virtualenv", "check-manifest"] -ui-tests = ["build"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.1.2" -description = "Pygments theme using JupyterLab CSS variables" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pygments = ">=2.4.1,<3" - -[[package]] -name = "jupyterlab-server" -version = "2.8.2" -description = "A set of server components for JupyterLab and JupyterLab like applications ." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -babel = "*" -entrypoints = ">=0.2.2" -jinja2 = ">=2.10" -json5 = "*" -jsonschema = ">=3.0.1" -jupyter-server = ">=1.4,<2.0" -packaging = "*" -requests = "*" - -[package.extras] -test = ["codecov", "ipykernel", "pytest (>=5.3.2)", "pytest-cov", "jupyter-server", "openapi-core (>=0.14.0,<0.15.0)", "pytest-console-scripts", "strict-rfc3339", "ruamel.yaml", "wheel"] - -[[package]] -name = "lazy-object-proxy" -version = "1.6.0" -description = "A fast and thorough lazy object proxy." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "matplotlib-inline" -version = "0.1.3" -description = "Inline Matplotlib backend for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mypy" -version = "0.910" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -toml = "*" -typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""} -typing-extensions = ">=3.7.4" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<1.5.0)"] - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "nb-black" -version = "1.0.7" -description = "A simple extension for Jupyter Notebook and Jupyter Lab to beautify Python code automatically using Black." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -ipython = "*" - -[[package]] -name = "nbclassic" -version = "0.3.2" -description = "Jupyter Notebook as a Jupyter Server Extension." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -jupyter-server = ">=1.8,<2.0" -notebook = "<7" - -[package.extras] -test = ["pytest", "pytest-tornasync", "pytest-console-scripts"] - -[[package]] -name = "nbclient" -version = "0.5.4" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -jupyter-client = ">=6.1.5" -nbformat = ">=5.0" -nest-asyncio = "*" -traitlets = ">=4.2" - -[package.extras] -dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] -sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] - -[[package]] -name = "nbconvert" -version = "6.2.0" -description = "Converting Jupyter Notebooks" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -bleach = "*" -defusedxml = "*" -entrypoints = ">=0.2.2" -jinja2 = ">=2.4" -jupyter-core = "*" -jupyterlab-pygments = "*" -mistune = ">=0.8.1,<2" -nbclient = ">=0.5.0,<0.6.0" -nbformat = ">=4.4" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -testpath = "*" -traitlets = ">=5.0" - -[package.extras] -all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.6)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] -docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] -serve = ["tornado (>=4.0)"] -test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.6)"] -webpdf = ["pyppeteer (==0.2.6)"] - -[[package]] -name = "nbformat" -version = "5.1.3" -description = "The Jupyter Notebook format" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -ipython-genutils = "*" -jsonschema = ">=2.4,<2.5.0 || >2.5.0" -jupyter-core = "*" -traitlets = ">=4.1" - -[package.extras] -fast = ["fastjsonschema"] -test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] - -[[package]] -name = "nest-asyncio" -version = "1.5.1" -description = "Patch asyncio to allow nested event loops" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "notebook" -version = "6.4.4" -description = "A web-based notebook environment for interactive computing" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=5.3.4" -jupyter-core = ">=4.6.1" -nbconvert = "*" -nbformat = "*" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.5.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] -json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] - -[[package]] -name = "numpy" -version = "1.21.1" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "packaging" -version = "21.0" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "pandas" -version = "1.3.3" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.7.1" - -[package.dependencies] -numpy = ">=1.17.3" -python-dateutil = ">=2.7.3" -pytz = ">=2017.3" - -[package.extras] -test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] - -[[package]] -name = "pandocfilters" -version = "1.5.0" -description = "Utilities for writing pandoc filters in python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "parso" -version = "0.8.2" -description = "A Python Parser" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "pathspec" -version = "0.9.0" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[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 = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "platformdirs" -version = "2.4.0" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "prometheus-client" -version = "0.11.0" -description = "Python client for the Prometheus monitoring system." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.20" -description = "Library for building powerful interactive command lines in Python" -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -wcwidth = "*" - -[[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 = "pygments" -version = "2.10.0" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pylint" -version = "2.11.1" -description = "python code static checker" -category = "dev" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -astroid = ">=2.8.0,<2.9" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.7" -platformdirs = ">=2.2.0" -toml = ">=0.7.1" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pyrsistent" -version = "0.18.0" -description = "Persistent/Functional/Immutable data structures" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pytest" -version = "6.2.5" -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,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.14.0" -description = "Pytest support for asyncio." -category = "dev" -optional = false -python-versions = ">= 3.5" - -[package.dependencies] -pytest = ">=5.4.0" - -[package.extras] -testing = ["async-generator (>=1.3)", "coverage", "hypothesis (>=5.7.1)"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -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 = "pytz" -version = "2021.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pywin32" -version = "301" -description = "Python for Window Extensions" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pywinpty" -version = "1.1.4" -description = "Pseudo terminal support for Windows from Python." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyzmq" -version = "22.3.0" -description = "Python bindings for 0MQ" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} -py = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "regex" -version = "2021.9.30" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "requests" -version = "2.26.0" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "requests-unixsocket" -version = "0.2.0" -description = "Use requests to talk HTTP via a UNIX domain socket" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=1.1" -urllib3 = ">=1.8" - -[[package]] -name = "send2trash" -version = "1.8.0" -description = "Send file to trash natively under Mac OS X, Windows and Linux." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -nativelib = ["pyobjc-framework-cocoa", "pywin32"] -objc = ["pyobjc-framework-cocoa"] -win32 = ["pywin32"] - -[[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 = "sniffio" -version = "1.2.0" -description = "Sniff out which async library your code is running under" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "soupsieve" -version = "2.2.1" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "terminado" -version = "0.12.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=4" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "testpath" -version = "0.5.0" -description = "Test utilities for code working with files and commands" -category = "dev" -optional = false -python-versions = ">= 3.5" - -[package.extras] -test = ["pytest", "pathlib2"] - -[[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 = "tornado" -version = "6.1" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" -optional = false -python-versions = ">= 3.5" - -[[package]] -name = "traitlets" -version = "5.1.0" -description = "Traitlets Python configuration system" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "urllib3" -version = "1.26.7" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "websocket-client" -version = "1.2.1" -description = "WebSocket client for Python with low level API options" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "wrapt" -version = "1.12.1" -description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "zipp" -version = "3.6.0" -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 (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.7.1" -content-hash = "26351f5e55c7ca7758bbb3ce708fbdc66631fc0aeb786f6211ace514a745d2ce" - -[metadata.files] -anyio = [ - {file = "anyio-3.3.2-py3-none-any.whl", hash = "sha256:c32da314c510b34a862f5afeaf8a446ffed2c2fde21583e654bd71ecfb5b744b"}, - {file = "anyio-3.3.2.tar.gz", hash = "sha256:0b993a2ef6c1dc456815c2b5ca2819f382f20af98087cc2090a4afed3a501436"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, -] -argcomplete = [ - {file = "argcomplete-1.12.3-py2.py3-none-any.whl", hash = "sha256:291f0beca7fd49ce285d2f10e4c1c77e9460cf823eef2de54df0c0fec88b0d81"}, - {file = "argcomplete-1.12.3.tar.gz", hash = "sha256:2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445"}, -] -argon2-cffi = [ - {file = "argon2-cffi-21.1.0.tar.gz", hash = "sha256:f710b61103d1a1f692ca3ecbd1373e28aa5e545ac625ba067ff2feca1b2bb870"}, - {file = "argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl", hash = "sha256:217b4f0f853ccbbb5045242946ad2e162e396064575860141b71a85eb47e475a"}, - {file = "argon2_cffi-21.1.0-cp35-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fa7e7d1fc22514a32b1761fdfa1882b6baa5c36bb3ef557bdd69e6fc9ba14a41"}, - {file = "argon2_cffi-21.1.0-cp35-abi3-win32.whl", hash = "sha256:e4d8f0ae1524b7b0372a3e574a2561cbdddb3fdb6c28b70a72868189bda19659"}, - {file = "argon2_cffi-21.1.0-cp35-abi3-win_amd64.whl", hash = "sha256:65213a9174320a1aee03fe826596e0620783966b49eb636955958b3074e87ff9"}, - {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-macosx_10_7_x86_64.whl", hash = "sha256:245f64a203012b144b7b8c8ea6d468cb02b37caa5afee5ba4a10c80599334f6a"}, - {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4ad152c418f7eb640eac41ac815534e6aa61d1624530b8e7779114ecfbf327f8"}, - {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:bc513db2283c385ea4da31a2cd039c33380701f376f4edd12fe56db118a3b21a"}, - {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c7a7c8cc98ac418002090e4add5bebfff1b915ea1cb459c578cd8206fef10378"}, - {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:165cadae5ac1e26644f5ade3bd9c18d89963be51d9ea8817bd671006d7909057"}, - {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:566ffb581bbd9db5562327aee71b2eda24a1c15b23a356740abe3c011bbe0dcb"}, -] -astroid = [ - {file = "astroid-2.8.0-py3-none-any.whl", hash = "sha256:dcc06f6165f415220013801642bd6c9808a02967070919c4b746c6864c205471"}, - {file = "astroid-2.8.0.tar.gz", hash = "sha256:fe81f80c0b35264acb5653302ffbd935d394f1775c5e4487df745bf9c2442708"}, -] -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"}, -] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, - {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, -] -black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] -bleach = [ - {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, - {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, -] -certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, -] -cffi = [ - {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, - {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, - {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, - {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, - {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, - {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, - {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, - {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, - {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, - {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, - {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, - {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, - {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, - {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, - {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, - {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, - {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, - {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, - {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, -] -click = [ - {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, - {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -debugpy = [ - {file = "debugpy-1.4.3-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:88b17d7c2130968f75bdc706a33f46a8a6bb90f09512ea3bd984659d446ee4f4"}, - {file = "debugpy-1.4.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ded60b402f83df46dee3f25ae5851809937176afdafd3fdbaab60b633b77cad"}, - {file = "debugpy-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:c0fd1a66e104752f86ca2faa6a0194dae61442a768f85369fc3d11bacff8120f"}, - {file = "debugpy-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f907941ad7a460646773eb3baae4c88836e9256b390dfbfae8d92a3d3b849a7d"}, - {file = "debugpy-1.4.3-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:135a77ac1a8f6ea49a69928f088967d36842bc492d89b45941c6b19222cffa42"}, - {file = "debugpy-1.4.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f3dcc294f3b4d79fdd7ffe1350d5d1e3cc29acaec67dd1c43143a43305bbbc91"}, - {file = "debugpy-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:c3d7db37b7eb234e49f50ba22b3b1637e8daadd68985d9cd35a6152aa10faa75"}, - {file = "debugpy-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:dbda8f877c3dec1559c01c63a1de63969e51a4907dc308f4824238bb776026fe"}, - {file = "debugpy-1.4.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7c15014290150b76f0311debf7fbba2e934680572ea60750b0f048143e873b3e"}, - {file = "debugpy-1.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d488356cc66172f1ea29635fd148ad131f13fad0e368ae03cc5c0a402372756"}, - {file = "debugpy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:7e7210a3721fc54b52d8dc2f325e7c937ffcbba02b808e2e3215dcbf0c0b8349"}, - {file = "debugpy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:3e4de96c70f3398abd1777f048b47564d98a40df1f72d33b47ef5b9478e07206"}, - {file = "debugpy-1.4.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2019ffcd08d7e643c644cd64bee0fd53c730cb8f15ff37e6a320b5afd3785bfa"}, - {file = "debugpy-1.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:847926f78c1e33f7318a743837adb6a9b360a825b558fd21f9240ba518fe1bb1"}, - {file = "debugpy-1.4.3-cp39-cp39-win32.whl", hash = "sha256:c9665e58b80d839ae1b0815341c63d00cae557c018f198c0b6b7bc5de9eca144"}, - {file = "debugpy-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:ab3f33499c597a2ce454b81088e7f9d56127686e003c4f7a1c97ad4b38a55404"}, - {file = "debugpy-1.4.3-py2.py3-none-any.whl", hash = "sha256:0c523fcbb6fb395403ee8508853767b74949335d5cdacc9f83d350670c2c0db2"}, - {file = "debugpy-1.4.3.zip", hash = "sha256:4d53fe5aecf03ba466aa7fa7474c2b2fe28b2a6c0d36688d1e29382bfe88dd5f"}, -] -decorator = [ - {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, - {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, -] -defusedxml = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] -entrypoints = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, -] -idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, - {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipdb = [ - {file = "ipdb-0.13.9.tar.gz", hash = "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"}, -] -ipykernel = [ - {file = "ipykernel-6.4.1-py3-none-any.whl", hash = "sha256:a3f6c2dda2ecf63b37446808a70ed825fea04790779ca524889c596deae0def8"}, - {file = "ipykernel-6.4.1.tar.gz", hash = "sha256:df3355e5eec23126bc89767a676c5f0abfc7f4c3497d118c592b83b316e8c0cd"}, -] -ipython = [ - {file = "ipython-7.28.0-py3-none-any.whl", hash = "sha256:f16148f9163e1e526f1008d7c8d966d9c15600ca20d1a754287cf96d00ba6f1d"}, - {file = "ipython-7.28.0.tar.gz", hash = "sha256:2097be5c814d1b974aea57673176a924c4c8c9583890e7a5f082f547b9975b11"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -isort = [ - {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, - {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, -] -jedi = [ - {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, - {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, -] -jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, -] -json5 = [ - {file = "json5-0.9.6-py2.py3-none-any.whl", hash = "sha256:823e510eb355949bed817e1f3e2d682455dc6af9daf6066d5698d6a2ca4481c2"}, - {file = "json5-0.9.6.tar.gz", hash = "sha256:9175ad1bc248e22bb8d95a8e8d765958bf0008fef2fe8abab5bc04e0f1ac8302"}, -] -jsonschema = [ - {file = "jsonschema-4.0.1-py3-none-any.whl", hash = "sha256:9938802041347f2c62cad2aef59e9a0826cd34584f3609db950efacb4dbf6518"}, - {file = "jsonschema-4.0.1.tar.gz", hash = "sha256:48f4e74f8bec0c2f75e9fcfffa264e78342873e1b57e2cfeae54864cc5e9e4dd"}, -] -jupyter-client = [ - {file = "jupyter_client-7.0.5-py3-none-any.whl", hash = "sha256:124a6e6979c38999d9153b1c4d1808c4c820a45066d5ed1857a5b59c04ffccb3"}, - {file = "jupyter_client-7.0.5.tar.gz", hash = "sha256:382aca66dcaf96d7eaaa6c546d57cdf8b3b1cf5bc1f2704c58a1d8d244f1163d"}, -] -jupyter-core = [ - {file = "jupyter_core-4.8.1-py3-none-any.whl", hash = "sha256:8dd262ec8afae95bd512518eb003bc546b76adbf34bf99410e9accdf4be9aa3a"}, - {file = "jupyter_core-4.8.1.tar.gz", hash = "sha256:ef210dcb4fca04de07f2ead4adf408776aca94d17151d6f750ad6ded0b91ea16"}, -] -jupyter-server = [ - {file = "jupyter_server-1.11.0-py3-none-any.whl", hash = "sha256:827c134da7a9e09136c2dc2fd16743350970105247f085abfc6ce0432d0c979e"}, - {file = "jupyter_server-1.11.0.tar.gz", hash = "sha256:8ab4f484a4a2698f757cff0769d27b5d991e0232a666d54f4d6ada4e6a61330b"}, -] -jupyterlab = [ - {file = "jupyterlab-3.1.14-py3-none-any.whl", hash = "sha256:1241ff4ab8604a281eda5d8215fe59e418737edcdfe71df09a0bd5fdd4ccfd2c"}, - {file = "jupyterlab-3.1.14.tar.gz", hash = "sha256:13174cb6076dd5da6f1b85725ccfcc9518d8f98e86b8b644fc89b1dfaeda63a9"}, -] -jupyterlab-pygments = [ - {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, - {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, -] -jupyterlab-server = [ - {file = "jupyterlab_server-2.8.2-py3-none-any.whl", hash = "sha256:9507f059ddb3d088674ed76fd3d751cedd940f8a74055e2250bf44babcc2ea1f"}, - {file = "jupyterlab_server-2.8.2.tar.gz", hash = "sha256:26d813c8162c83d466df7d155865987dabe70aa452f9187dfb79fd88afc8fa0b"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"}, - {file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"}, - {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win32.whl", hash = "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e"}, - {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93"}, - {file = "lazy_object_proxy-1.6.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741"}, - {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587"}, - {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4"}, - {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win32.whl", hash = "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f"}, - {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3"}, - {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981"}, - {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2"}, - {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd"}, - {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837"}, - {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653"}, - {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3"}, - {file = "lazy_object_proxy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8"}, - {file = "lazy_object_proxy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf"}, - {file = "lazy_object_proxy-1.6.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad"}, - {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43"}, - {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a"}, - {file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"}, - {file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -matplotlib-inline = [ - {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, - {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] -mypy = [ - {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, - {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, - {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, - {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, - {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, - {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, - {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, - {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, - {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, - {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, - {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, - {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, - {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, - {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, - {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, - {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, - {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, - {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, - {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, - {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, - {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, - {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, - {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nb-black = [ - {file = "nb_black-1.0.7.tar.gz", hash = "sha256:1ca52e3a46675f6a0a6d79ac73a1f8f951bef60f919eced56173e76ab1b6d62b"}, -] -nbclassic = [ - {file = "nbclassic-0.3.2-py3-none-any.whl", hash = "sha256:57936a39410a18261442ca3b298421f859c9012272b87bf55e17b5507f052f4d"}, - {file = "nbclassic-0.3.2.tar.gz", hash = "sha256:863462bf6a6e0e5e502dcc479ce2ea1edf60437c969f1850d0c0823dba0c39b7"}, -] -nbclient = [ - {file = "nbclient-0.5.4-py3-none-any.whl", hash = "sha256:95a300c6fbe73721736cf13972a46d8d666f78794b832866ed7197a504269e11"}, - {file = "nbclient-0.5.4.tar.gz", hash = "sha256:6c8ad36a28edad4562580847f9f1636fe5316a51a323ed85a24a4ad37d4aefce"}, -] -nbconvert = [ - {file = "nbconvert-6.2.0-py3-none-any.whl", hash = "sha256:b1b9dc4f1ff6cafae0e6d91f42fb9046fdc32e6beb6d7e2fa2cd7191ad535240"}, - {file = "nbconvert-6.2.0.tar.gz", hash = "sha256:16ceecd0afaa8fd26c245fa32e2c52066c02f13aa73387fffafd84750baea863"}, -] -nbformat = [ - {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, - {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, -] -nest-asyncio = [ - {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, - {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, -] -notebook = [ - {file = "notebook-6.4.4-py3-none-any.whl", hash = "sha256:33488bdcc5cbef23c3cfa12cd51b0b5459a211945b5053d17405980611818149"}, - {file = "notebook-6.4.4.tar.gz", hash = "sha256:26b0095c568e307a310fd78818ad8ebade4f00462dada4c0e34cbad632b9085d"}, -] -numpy = [ - {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, - {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, - {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, - {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, - {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, - {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, - {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, - {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, - {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, -] -packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, -] -pandas = [ - {file = "pandas-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68408a39a54ebadb9014ee5a4fae27b2fe524317bc80adf56c9ac59e8f8ea431"}, - {file = "pandas-1.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b16b1b920c4cb27fdd65a2c20258bcd9c794be491290660722bb0ea765054d"}, - {file = "pandas-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37d63e78e87eb3791da7be4100a65da0383670c2b59e493d9e73098d7a879226"}, - {file = "pandas-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e2fb11f86f6253bb1df26e3aeab3bf2e000aaa32a953ec394571bec5dc6fd6"}, - {file = "pandas-1.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7326b37de08d42dd3fff5b7ef7691d0fd0bf2428f4ba5a2bdc3b3247e9a52e4c"}, - {file = "pandas-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2f29b4da6f6ae7c68f4b3708d9d9e59fa89b2f9e87c2b64ce055cbd39f729e"}, - {file = "pandas-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:3f5020613c1d8e304840c34aeb171377dc755521bf5e69804991030c2a48aec3"}, - {file = "pandas-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c399200631db9bd9335d013ec7fce4edb98651035c249d532945c78ad453f23a"}, - {file = "pandas-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a800df4e101b721e94d04c355e611863cc31887f24c0b019572e26518cbbcab6"}, - {file = "pandas-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3334a5a9eeaca953b9db1b2b165dcdc5180b5011f3bec3a57a3580c9c22eae68"}, - {file = "pandas-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fd2889d8116d7acef0709e4c82b8560a8b22b0f77471391d12c27596e90267"}, - {file = "pandas-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7557b39c8e86eb0543a17a002ac1ea0f38911c3c17095bc9350d0a65b32d801c"}, - {file = "pandas-1.3.3-cp38-cp38-win32.whl", hash = "sha256:629138b7cf81a2e55aa29ce7b04c1cece20485271d1f6c469c6a0c03857db6a4"}, - {file = "pandas-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:45649503e167d45360aa7c52f18d1591a6d5c70d2f3a26bc90a3297a30ce9a66"}, - {file = "pandas-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebbed7312547a924df0cbe133ff1250eeb94cdff3c09a794dc991c5621c8c735"}, - {file = "pandas-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f1b54d7efc9df05320b14a48fb18686f781aa66cc7b47bb62fabfc67a0985c"}, - {file = "pandas-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9bc59855598cb57f68fdabd4897d3ed2bc3a3b3bef7b868a0153c4cd03f3207"}, - {file = "pandas-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4def2ef2fb7fcd62f2aa51bacb817ee9029e5c8efe42fe527ba21f6a3ddf1a9f"}, - {file = "pandas-1.3.3-cp39-cp39-win32.whl", hash = "sha256:f7d84f321674c2f0f31887ee6d5755c54ca1ea5e144d6d54b3bbf566dd9ea0cc"}, - {file = "pandas-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:e574c2637c9d27f322e911650b36e858c885702c5996eda8a5a60e35e6648cf2"}, - {file = "pandas-1.3.3.tar.gz", hash = "sha256:272c8cb14aa9793eada6b1ebe81994616e647b5892a370c7135efb2924b701df"}, -] -pandocfilters = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, -] -parso = [ - {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, - {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -platformdirs = [ - {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, - {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -prometheus-client = [ - {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, - {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, - {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, -] -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"}, -] -pygments = [ - {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, - {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, -] -pylint = [ - {file = "pylint-2.11.1-py3-none-any.whl", hash = "sha256:0f358e221c45cbd4dad2a1e4b883e75d28acdcccd29d40c76eb72b307269b126"}, - {file = "pylint-2.11.1.tar.gz", hash = "sha256:2c9843fff1a88ca0ad98a256806c82c5a8f86086e7ccbdb93297d86c3f90c436"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pyrsistent = [ - {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, - {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, - {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, - {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, - {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, - {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, - {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, - {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, - {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, - {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, - {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, - {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytest-asyncio = [ - {file = "pytest-asyncio-0.14.0.tar.gz", hash = "sha256:9882c0c6b24429449f5f969a5158b528f39bde47dc32e85b9f0403965017e700"}, - {file = "pytest_asyncio-0.14.0-py3-none-any.whl", hash = "sha256:2eae1e34f6c68fc0a9dc12d4bea190483843ff4708d24277c41568d6b6044f1d"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] -pywin32 = [ - {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, - {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, - {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, - {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, - {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, - {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, - {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, - {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, - {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, - {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, -] -pywinpty = [ - {file = "pywinpty-1.1.4-cp36-none-win_amd64.whl", hash = "sha256:fb975976ad92be44801de95fdf2b0366747767cb0528478553aff85dd63ebb09"}, - {file = "pywinpty-1.1.4-cp37-none-win_amd64.whl", hash = "sha256:5d25b30a2f87105778bc2f57cb1271f58aaa25568921ef042faf001b3b0a7307"}, - {file = "pywinpty-1.1.4-cp38-none-win_amd64.whl", hash = "sha256:c5c3550100689632f6663f39865ef8716835dab1838a9eb9b472644af92673f8"}, - {file = "pywinpty-1.1.4-cp39-none-win_amd64.whl", hash = "sha256:ad60a336d92ac38e2159320db6d5999c4c2726a141c3ed3f9694021feb6a234e"}, - {file = "pywinpty-1.1.4.tar.gz", hash = "sha256:cc700c9d5a9fcebf677ac93a4943ca9a24db6e2f11a5f0e7e8e226184c5036f7"}, -] -pyzmq = [ - {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, - {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, - {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, - {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, - {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, - {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, - {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, - {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, - {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, - {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, - {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, - {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, - {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, - {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, - {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, - {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, - {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, - {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, - {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, - {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, - {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, - {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, - {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, - {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, - {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, - {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, - {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, - {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, - {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, - {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, - {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, - {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, - {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, -] -regex = [ - {file = "regex-2021.9.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66696c8336a1b5d1182464f3af3427cc760118f26d0b09a2ddc16a976a4d2637"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d87459ad3ab40cd8493774f8a454b2e490d8e729e7e402a0625867a983e4e02"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf6a1e023caf5e9a982f5377414e1aeac55198831b852835732cfd0a0ca5ff"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:255791523f80ea8e48e79af7120b4697ef3b74f6886995dcdb08c41f8e516be0"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e502f8d4e5ef714bcc2c94d499684890c94239526d61fdf1096547db91ca6aa6"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4907fb0f9b9309a5bded72343e675a252c2589a41871874feace9a05a540241e"}, - {file = "regex-2021.9.30-cp310-cp310-win32.whl", hash = "sha256:3be40f720af170a6b20ddd2ad7904c58b13d2b56f6734ee5d09bbdeed2fa4816"}, - {file = "regex-2021.9.30-cp310-cp310-win_amd64.whl", hash = "sha256:c2b180ed30856dfa70cfe927b0fd38e6b68198a03039abdbeb1f2029758d87e7"}, - {file = "regex-2021.9.30-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6f2d2f93001801296fe3ca86515eb04915472b5380d4d8752f09f25f0b9b0ed"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa7ba9ab2eba7284e0d7d94f61df7af86015b0398e123331362270d71fab0b9"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28040e89a04b60d579c69095c509a4f6a1a5379cd865258e3a186b7105de72c6"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f588209d3e4797882cd238195c175290dbc501973b10a581086b5c6bcd095ffb"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42952d325439ef223e4e9db7ee6d9087b5c68c5c15b1f9de68e990837682fc7b"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cae4099031d80703954c39680323dabd87a69b21262303160776aa0e55970ca0"}, - {file = "regex-2021.9.30-cp36-cp36m-win32.whl", hash = "sha256:0de8ad66b08c3e673b61981b9e3626f8784d5564f8c3928e2ad408c0eb5ac38c"}, - {file = "regex-2021.9.30-cp36-cp36m-win_amd64.whl", hash = "sha256:b345ecde37c86dd7084c62954468a4a655fd2d24fd9b237949dd07a4d0dd6f4c"}, - {file = "regex-2021.9.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6f08187136f11e430638c2c66e1db091105d7c2e9902489f0dbc69b44c222b4"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55442650f541d195a535ccec33078c78a9521973fb960923da7515e9ed78fa6"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e9c489aa98f50f367fb26cc9c8908d668e9228d327644d7aa568d47e456f47"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2cb7d4909ed16ed35729d38af585673f1f0833e73dfdf0c18e5be0061107b99"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0861e7f6325e821d5c40514c551fd538b292f8cc3960086e73491b9c5d8291d"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:81fdc90f999b2147fc62e303440c424c47e5573a9b615ed5d43a5b832efcca9e"}, - {file = "regex-2021.9.30-cp37-cp37m-win32.whl", hash = "sha256:8c1ad61fa024195136a6b7b89538030bd00df15f90ac177ca278df9b2386c96f"}, - {file = "regex-2021.9.30-cp37-cp37m-win_amd64.whl", hash = "sha256:e3770781353a4886b68ef10cec31c1f61e8e3a0be5f213c2bb15a86efd999bc4"}, - {file = "regex-2021.9.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c065d95a514a06b92a5026766d72ac91bfabf581adb5b29bc5c91d4b3ee9b83"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9925985be05d54b3d25fd6c1ea8e50ff1f7c2744c75bdc4d3b45c790afa2bcb3"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470f2c882f2672d8eeda8ab27992aec277c067d280b52541357e1acd7e606dae"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad0517df22a97f1da20d8f1c8cb71a5d1997fa383326b81f9cf22c9dadfbdf34"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e30838df7bfd20db6466fd309d9b580d32855f8e2c2e6d74cf9da27dcd9b63"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b34d2335d6aedec7dcadd3f8283b9682fadad8b9b008da8788d2fce76125ebe"}, - {file = "regex-2021.9.30-cp38-cp38-win32.whl", hash = "sha256:e07049cece3462c626d650e8bf42ddbca3abf4aa08155002c28cb6d9a5a281e2"}, - {file = "regex-2021.9.30-cp38-cp38-win_amd64.whl", hash = "sha256:37868075eda024470bd0feab872c692ac4ee29db1e14baec103257bf6cc64346"}, - {file = "regex-2021.9.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d331f238a7accfbbe1c4cd1ba610d4c087b206353539331e32a8f05345c74aec"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6348a7ab2a502cbdd0b7fd0496d614007489adb7361956b38044d1d588e66e04"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b1cca6c23f19bee8dc40228d9c314d86d1e51996b86f924aca302fc8f8bf9"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f1125bc5172ab3a049bc6f4b9c0aae95a2a2001a77e6d6e4239fa3653e202b5"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:638e98d069b14113e8afba6a54d1ca123f712c0d105e67c1f9211b2a825ef926"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a0b0db6b49da7fa37ca8eddf9f40a8dbc599bad43e64f452284f37b6c34d91c"}, - {file = "regex-2021.9.30-cp39-cp39-win32.whl", hash = "sha256:9910869c472e5a6728680ca357b5846546cbbd2ab3ad5bef986ef0bc438d0aa6"}, - {file = "regex-2021.9.30-cp39-cp39-win_amd64.whl", hash = "sha256:3b71213ec3bad9a5a02e049f2ec86b3d7c3e350129ae0f4e2f99c12b5da919ed"}, - {file = "regex-2021.9.30.tar.gz", hash = "sha256:81e125d9ba54c34579e4539a967e976a3c56150796674aec318b1b2f49251be7"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -requests-unixsocket = [ - {file = "requests-unixsocket-0.2.0.tar.gz", hash = "sha256:9e5c1a20afc3cf786197ae59c79bcdb0e7565f218f27df5f891307ee8817c1ea"}, - {file = "requests_unixsocket-0.2.0-py2.py3-none-any.whl", hash = "sha256:014d07bfb66dc805a011a8b4b306cf4ec96d2eddb589f6b2b5765e626f0dc0cc"}, -] -send2trash = [ - {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, - {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sniffio = [ - {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, - {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, -] -soupsieve = [ - {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"}, - {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, -] -terminado = [ - {file = "terminado-0.12.1-py3-none-any.whl", hash = "sha256:09fdde344324a1c9c6e610ee4ca165c4bb7f5bbf982fceeeb38998a988ef8452"}, - {file = "terminado-0.12.1.tar.gz", hash = "sha256:b20fd93cc57c1678c799799d117874367cc07a3d2d55be95205b1a88fa08393f"}, -] -testpath = [ - {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, - {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -traitlets = [ - {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, - {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, -] -typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -websocket-client = [ - {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, - {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, -] -wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, -] -zipp = [ - {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, - {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, -] diff --git a/pyproject.toml b/pyproject.toml index e627991..eebb987 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,21 +1,18 @@ -[tool.poetry] -name = "ZenTables" -version = "0.2.0b3" +[project] +name = "zentables" +version = "0.3.0b1" description = "Stress-free descriptive tables in Python." authors = [ - "Paul Xu ", - "Edward Huh ", - "Kevin Wilson ", - "The Policy Lab " -] -license = "MIT" -packages = [ - { include = "zentables", from = "src" } + { name = "Paul Xu", email = "yang_xu@brown.edu" }, + { name = "Edward Huh", email = "edward_huh@brown.edu" }, + { name = "Kevin Wilson", email = "kevin_wilson@brown.edu" }, + { name = "The Policy Lab", email = "thepolicylab@brown.edu" }, ] +maintainers = [{ name = "Paul Xu", email = "yang_xu@brown.edu" }] +requires-python = ">=3.9" readme = "README.md" -repository = "https://github.com/thepolicylab/ZenTables.git" keywords = ["pandas", "tables", "display", "styler"] -classifiers=[ +classifiers = [ 'Development Status :: 4 - Beta', 'Intended Audience :: Science/Research', @@ -23,48 +20,178 @@ classifiers=[ 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9' + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', ] +dependencies = ["pandas>=2.0.0rc1"] -[tool.poetry.dependencies] -python = "^3.7.1" -pandas = "^1.3.0" -Jinja2 = "^3.0.1" - -[tool.poetry.dev-dependencies] -black = "^20.8b1" -pylint = "^2.6.0" -pytest = "^6.2.1" -isort = "^5.7.0" -ipdb = "^0.13.4" -pytest-asyncio = "^0.14.0" -nb-black = "^1.0.7" -jupyterlab = "^3.0.16" -mypy = "^0.910" +[project.urls] +repository = "https://github.com/thepolicylab/ZenTables.git" + +[project.optional-dependencies] +dev = ["black[jupyter]", "ruff", "pytest", "pytest-asyncio", "mypy", "jupyterlab", "pre-commit"] + +[tool.hatch.envs.dev] +python = "3.9" +features = ["dev"] + +[tool.black] +target-version = ['py39'] +required-version = '23.3.0' +exclude = ''' +( + asv_bench/env + | \.egg + | \.git + | \.hg + | \.mypy_cache + | \.nox + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + | setup.py +) +''' + +[tool.ruff] +line-length = 88 +update-check = false +target-version = "py39" +fix = true +unfixable = ["E711"] + +select = [ + # pyflakes + "F", + # pycodestyle + "E", + "W", + # flake8-2020 + "YTT", + # flake8-bugbear + "B", + # flake8-quotes + "Q", + # pylint + "PLE", + "PLR", + "PLW", + # misc lints + "PIE", + # flake8-pyi + "PYI", + # tidy imports + "TID", + # implicit string concatenation + "ISC", + # type-checking imports + "TCH", +] -[tool.isort] -multi_line_output = 3 -include_trailing_comma = true -force_grid_wrap = 0 -use_parentheses = true -ensure_newline_before_comments = true -line_length = 88 -[tool.pylint.basic] -good-names = "i,j,k,ex,Run,_,df,pc" +ignore = [ + # space before : (needed for how black formats slicing) + # "E203", # not yet implemented + # module level import not at top of file + "E402", + # do not assign a lambda expression, use a def + "E731", + # line break before binary operator + # "W503", # not yet implemented + # line break after binary operator + # "W504", # not yet implemented + # controversial + "B006", + # controversial + "B007", + # controversial + "B008", + # setattr is used to side-step mypy + "B009", + # getattr is used to side-step mypy + "B010", + # tests use assert False + "B011", + # tests use comparisons but not their returned value + "B015", + # false positives + "B019", + # Loop control variable overrides iterable it iterates + "B020", + # Function definition does not bind loop variable + "B023", + # Functions defined inside a loop must not use variables redefined in the loop + # "B301", # not yet implemented + # Too many arguments to function call + "PLR0913", + # Too many returns + "PLR0911", + # Too many branches + "PLR0912", + # Too many statements + "PLR0915", + # Global statements are discouraged + "PLW0603", + # Docstrings should not be included in stubs + "PYI021", + # Use typing_extensions.TypeAlias for type aliases + # "PYI026", # not yet implemented + # Use "collections.abc.*" instead of "typing.*" (PEP 585 syntax) + # "PYI027", # not yet implemented + # while int | float can be shortened to float, the former is more explicit + # "PYI041", # not yet implemented -[tool.pylint.messages_control] -disable = "C0330, C0326, R0912, R0913, R0914, R0915" + # Additional checks that don't pass yet + # Within an except clause, raise exceptions with ... + "B904", + # Magic number + "PLR2004", + # Consider `elif` instead of `else` then `if` to remove indentation level + "PLR5501", +] -[tool.pylint.format] -max-line-length = "88" +exclude = [".github", "docs", "src/notebook"] [tool.mypy] ignore_missing_imports = true +python_version = "3.9" + +[tool.isort] +known_pre_libs = "pandas._config" +known_pre_core = [ + "pandas._libs", + "pandas._typing", + "pandas.util._*", + "pandas.compat", + "pandas.errors", +] +known_dtypes = "pandas.core.dtypes" +known_post_core = ["pandas.tseries", "pandas.io", "pandas.plotting"] +sections = [ + "FUTURE", + "STDLIB", + "THIRDPARTY", + "PRE_LIBS", + "PRE_CORE", + "DTYPES", + "FIRSTPARTY", + "POST_CORE", + "LOCALFOLDER", +] +profile = "black" +combine_as_imports = true +force_grid_wrap = 2 +force_sort_within_sections = true +skip_glob = "env" +skip = "pandas/__init__.py" [build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build] +sources = ["src/zentables"] diff --git a/src/notebooks/ZenTables Demo.ipynb b/src/notebooks/ZenTables Demo.ipynb index 5fb0b81..2a991bd 100644 --- a/src/notebooks/ZenTables Demo.ipynb +++ b/src/notebooks/ZenTables Demo.ipynb @@ -23,7 +23,19 @@ "execution_count": 1, "id": "higher-trainer", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'zentables'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mzentables\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mzen\u001b[39;00m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'zentables'" + ] + } + ], "source": [ "import pandas as pd\n", "\n", @@ -32,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "liberal-spiritual", "metadata": {}, "outputs": [], @@ -51,398 +63,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "published-death", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Row IDOrder IDOrder DateShip DateShip ModeCustomer IDCustomer NameSegmentCountryCity...Postal CodeRegionProduct IDCategorySub-CategoryProduct NameSalesQuantityDiscountProfit
01CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-BO-10001798FurnitureBookcasesBush Somerset Collection Bookcase261.960020.0041.9136
12CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-CH-10000454FurnitureChairsHon Deluxe Fabric Upholstered Stacking Chairs,...731.940030.00219.5820
23CA-2013-1386886/13/20136/17/2013Second ClassDV-13045Darrin Van HuffCorporateUnited StatesLos Angeles...90036WestOFF-LA-10000240Office SuppliesLabelsSelf-Adhesive Address Labels for Typewriters b...14.620020.006.8714
34US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthFUR-TA-10000577FurnitureTablesBretford CR4500 Series Slim Rectangular Table957.577550.45-383.0310
45US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthOFF-ST-10000760Office SuppliesStorageEldon Fold 'N Roll Cart System22.368020.202.5164
..................................................................
99899990CA-2011-1104221/22/20111/24/2011Second ClassTB-21400Tom BoeckenhauerConsumerUnited StatesMiami...33180SouthFUR-FU-10001889FurnitureFurnishingsUltra Door Pull Handle25.248030.204.1028
99909991CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestFUR-FU-10000747FurnitureFurnishingsTenex B1-RE Series Chair Mats for Low Pile Car...91.960020.0015.6332
99919992CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestTEC-PH-10003645TechnologyPhonesAastra 57i VoIP phone258.576020.2019.3932
99929993CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestOFF-PA-10004041Office SuppliesPaperIt's Hot Message Books with Stickers, 2 3/4\" x 5\"29.600040.0013.3200
99939994CA-2014-1199145/5/20145/10/2014Second ClassCC-12220Chris CortesConsumerUnited StatesWestminster...92683WestOFF-AP-10002684Office SuppliesAppliancesAcco 7-Outlet Masterpiece Power Center, Wihtou...243.160020.0072.9480
\n", - "

9994 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " Row ID Order ID Order Date Ship Date Ship Mode \\\n", - "0 1 CA-2013-152156 11/9/2013 11/12/2013 Second Class \n", - "1 2 CA-2013-152156 11/9/2013 11/12/2013 Second Class \n", - "2 3 CA-2013-138688 6/13/2013 6/17/2013 Second Class \n", - "3 4 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", - "4 5 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", - "... ... ... ... ... ... \n", - "9989 9990 CA-2011-110422 1/22/2011 1/24/2011 Second Class \n", - "9990 9991 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", - "9991 9992 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", - "9992 9993 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", - "9993 9994 CA-2014-119914 5/5/2014 5/10/2014 Second Class \n", - "\n", - " Customer ID Customer Name Segment Country City \\\n", - "0 CG-12520 Claire Gute Consumer United States Henderson \n", - "1 CG-12520 Claire Gute Consumer United States Henderson \n", - "2 DV-13045 Darrin Van Huff Corporate United States Los Angeles \n", - "3 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", - "4 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", - "... ... ... ... ... ... \n", - "9989 TB-21400 Tom Boeckenhauer Consumer United States Miami \n", - "9990 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", - "9991 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", - "9992 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", - "9993 CC-12220 Chris Cortes Consumer United States Westminster \n", - "\n", - " ... Postal Code Region Product ID Category Sub-Category \\\n", - "0 ... 42420 South FUR-BO-10001798 Furniture Bookcases \n", - "1 ... 42420 South FUR-CH-10000454 Furniture Chairs \n", - "2 ... 90036 West OFF-LA-10000240 Office Supplies Labels \n", - "3 ... 33311 South FUR-TA-10000577 Furniture Tables \n", - "4 ... 33311 South OFF-ST-10000760 Office Supplies Storage \n", - "... ... ... ... ... ... ... \n", - "9989 ... 33180 South FUR-FU-10001889 Furniture Furnishings \n", - "9990 ... 92627 West FUR-FU-10000747 Furniture Furnishings \n", - "9991 ... 92627 West TEC-PH-10003645 Technology Phones \n", - "9992 ... 92627 West OFF-PA-10004041 Office Supplies Paper \n", - "9993 ... 92683 West OFF-AP-10002684 Office Supplies Appliances \n", - "\n", - " Product Name Sales Quantity \\\n", - "0 Bush Somerset Collection Bookcase 261.9600 2 \n", - "1 Hon Deluxe Fabric Upholstered Stacking Chairs,... 731.9400 3 \n", - "2 Self-Adhesive Address Labels for Typewriters b... 14.6200 2 \n", - "3 Bretford CR4500 Series Slim Rectangular Table 957.5775 5 \n", - "4 Eldon Fold 'N Roll Cart System 22.3680 2 \n", - "... ... ... ... \n", - "9989 Ultra Door Pull Handle 25.2480 3 \n", - "9990 Tenex B1-RE Series Chair Mats for Low Pile Car... 91.9600 2 \n", - "9991 Aastra 57i VoIP phone 258.5760 2 \n", - "9992 It's Hot Message Books with Stickers, 2 3/4\" x 5\" 29.6000 4 \n", - "9993 Acco 7-Outlet Masterpiece Power Center, Wihtou... 243.1600 2 \n", - "\n", - " Discount Profit \n", - "0 0.00 41.9136 \n", - "1 0.00 219.5820 \n", - "2 0.00 6.8714 \n", - "3 0.45 -383.0310 \n", - "4 0.20 2.5164 \n", - "... ... ... \n", - "9989 0.20 4.1028 \n", - "9990 0.00 15.6332 \n", - "9991 0.20 19.3932 \n", - "9992 0.00 13.3200 \n", - "9993 0.00 72.9480 \n", - "\n", - "[9994 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "demo_data = pd.read_csv(\"../../tests/fixtures/superstore.csv\")\n", "demo_data" @@ -450,34 +74,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "845697f3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Segment Region \n", - "Consumer West 1672\n", - " East 1469\n", - " Central 1212\n", - "Corporate West 960\n", - " East 877\n", - "Consumer South 838\n", - "Corporate Central 673\n", - "Home Office West 571\n", - "Corporate South 510\n", - "Home Office East 502\n", - " Central 438\n", - " South 272\n", - "dtype: int64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "demo_data[[\"Segment\", \"Region\"]].value_counts()" ] @@ -492,169 +92,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "caring-hacker", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n", - "
" - ], - "text/plain": [ - "Category Furniture Office Supplies Technology All\n", - "Segment Region \n", - "Consumer Central 255 739 218 1212\n", - " East 303 888 278 1469\n", - " South 180 505 153 838\n", - " West 375 995 302 1672\n", - "Corporate Central 137 417 119 673\n", - " East 198 520 159 877\n", - " South 101 324 85 510\n", - " West 210 559 191 960\n", - "Home Office Central 89 266 83 438\n", - " East 100 304 98 502\n", - " South 51 166 55 272\n", - " West 122 343 106 571\n", - "All 2121 6026 1847 9994" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = demo_data.pivot_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -676,174 +117,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "increasing-guinea", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
 CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion    
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "_table_styles = [\n", " dict(selector=\"thead\", props=[(\"border-bottom\", \"1.5pt solid black\")]),\n", @@ -896,376 +173,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "alert-combat", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnologyAll
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.zen.pretty(font_size=12, font_family=\"Times New Roman\")" ] @@ -1280,430 +191,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "wired-netscape", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnologyTotal
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)1212 (23.3%)
East303 (27.2%)888 (28.4%)278 (29.2%)1469 (28.3%)
South180 (16.2%)505 (16.1%)153 (16.1%)838 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)1672 (32.2%)
Subtotal1113 (100.0%)3127 (100.0%)951 (100.0%)5191 (100.0%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)673 (22.3%)
East198 (30.7%)520 (28.6%)159 (28.7%)877 (29.0%)
South101 (15.6%)324 (17.8%)85 (15.3%)510 (16.9%)
West210 (32.5%)559 (30.7%)191 (34.5%)960 (31.8%)
Subtotal646 (100.0%)1820 (100.0%)554 (100.0%)3020 (100.0%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)438 (24.6%)
East100 (27.6%)304 (28.2%)98 (28.7%)502 (28.2%)
South51 (14.1%)166 (15.4%)55 (16.1%)272 (15.3%)
West122 (33.7%)343 (31.8%)106 (31.0%)571 (32.0%)
Subtotal362 (100.0%)1079 (100.0%)342 (100.0%)1783 (100.0%)
Total2121 (100.0%)6026 (100.0%)1847 (100.0%)9994 (100.0%)
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "freq_table = demo_data.zen.freq_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -1719,376 +210,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "6d77aa99-0133-4283-a711-32ecc7202565", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnology
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)
East303 (27.2%)888 (28.4%)278 (29.2%)
South180 (16.2%)505 (16.1%)153 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)
Subtotal1113 (100.0%)3127 (100.0%)951 (100.0%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)
East198 (30.7%)520 (28.6%)159 (28.7%)
South101 (15.6%)324 (17.8%)85 (15.3%)
West210 (32.5%)559 (30.7%)191 (34.5%)
Subtotal646 (100.0%)1820 (100.0%)554 (100.0%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)
East100 (27.6%)304 (28.2%)98 (28.7%)
South51 (14.1%)166 (15.4%)55 (16.1%)
West122 (33.7%)343 (31.8%)106 (31.0%)
Subtotal362 (100.0%)1079 (100.0%)342 (100.0%)
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "freq_table = demo_data.zen.freq_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -2104,376 +229,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "59ea1434-edf4-4a4c-b141-49f14d694f78", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnologyTotal
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)1212 (23.3%)
East303 (27.2%)888 (28.4%)278 (29.2%)1469 (28.3%)
South180 (16.2%)505 (16.1%)153 (16.1%)838 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)1672 (32.2%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)673 (22.3%)
East198 (30.7%)520 (28.6%)159 (28.7%)877 (29.0%)
South101 (15.6%)324 (17.8%)85 (15.3%)510 (16.9%)
West210 (32.5%)559 (30.7%)191 (34.5%)960 (31.8%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)438 (24.6%)
East100 (27.6%)304 (28.2%)98 (28.7%)502 (28.2%)
South51 (14.1%)166 (15.4%)55 (16.1%)272 (15.3%)
West122 (33.7%)343 (31.8%)106 (31.0%)571 (32.0%)
Total2121 (100.0%)6026 (100.0%)1847 (100.0%)9994 (100.0%)
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "freq_table = demo_data.zen.freq_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -2489,24 +248,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "50d08f60-15aa-46de-a710-79f4f2baa1d7", "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "Row number 20 is out of range for the data.", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_35108/3242781631.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[0mdigits\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m )\n\u001b[1;32m---> 10\u001b[1;33m \u001b[0mfreq_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzen\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrow_borders\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m~\\ZenTables\\src\\zentables\\zentables.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(self, **kwargs)\u001b[0m\n\u001b[0;32m 389\u001b[0m \"\"\"\n\u001b[0;32m 390\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 391\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mPrettyStyler\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_pandas_obj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 392\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 393\u001b[0m def freq_table(\n", - "\u001b[1;32m~\\ZenTables\\src\\zentables\\zentables.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, data, precision, table_styles, uuid, caption, table_attributes, cell_ids, na_rep, uuid_len, decimal, thousands, escape, font_family, font_size, show_index_names, show_column_names, show_copy_button, row_borders)\u001b[0m\n\u001b[0;32m 131\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mrow_number\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrow_borders\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 132\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mrow_number\u001b[0m \u001b[1;33m>=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 133\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf\"Row number {row_number} is out of range for the data.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 134\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 135\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrow_borders\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrow_borders\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mValueError\u001b[0m: Row number 20 is out of range for the data." - ] - } - ], + "outputs": [], "source": [ "freq_table = demo_data.zen.freq_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -2530,430 +275,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "2013baf5", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnologyTotal
ConsumerCentral*739 (23.6%)*1212 (23.3%)
East*888 (28.4%)*1469 (28.3%)
South*505 (16.1%)*838 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)1672 (32.2%)
Subtotal1113 (100.0%)3127 (100.0%)951 (100.0%)5191 (100.0%)
CorporateCentral*417 (22.9%)*673 (22.3%)
East*520 (28.6%)*877 (29.0%)
South*324 (17.8%)*510 (16.9%)
West*559 (30.7%)*960 (31.8%)
Subtotal646 (100.0%)1820 (100.0%)554 (100.0%)3020 (100.0%)
Home OfficeCentral89 (24.6%)***
East*304 (28.2%)*502 (28.2%)
South51 (14.1%)*55 (16.1%)*
West*343 (31.8%)*571 (32.0%)
Subtotal362 (100.0%)1079 (100.0%)342 (100.0%)1783 (100.0%)
Total2121 (100.0%)6026 (100.0%)1847 (100.0%)9994 (100.0%)
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "freq_table_suppressed = demo_data.zen.freq_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -2980,262 +305,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "4ac6e5ce", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
 CategorySales
0Furniture261.960000
1Furniture731.940000
2Office Supplies14.620000
3Furniture957.577500
4Office Supplies22.368000
5Furniture48.860000
6Office Supplies7.280000
7Technology907.152000
8Office Supplies18.504000
9Office Supplies114.900000
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "demo_data[[\"Category\", \"Sales\"]].iloc[:10, :].zen.pretty(row_borders=[1])" ] @@ -3262,614 +335,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "6907d4c8", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnologyAll
  nMean (SD)nMean (SD)nMean (SD)nMean (SD)
ConsumerCentral255.000000338.15 (444.75)739126.00 (587.09)218.000000333.44 (683.00)1212207.95 (587.91)
East303.000000376.94 (628.48)888114.03 (333.98)278.000000487.20 (1097.94)1469238.88 (633.37)
South180.000000393.33 (547.50)505117.83 (364.98)153.000000426.64 (903.27)838233.39 (559.35)
West375.000000319.49 (461.58)995110.63 (353.49)302.000000440.37 (955.83)1672217.03 (552.00)
All Regions1113.000000351.35 (522.69)3127116.39 (417.46)951.000000427.34 (938.72)5191223.73 (585.52)
CorporateCentral**41798.65 (294.85)**673234.76 (818.95)
East198.000000324.29 (469.16)520127.84 (305.96)159.000000438.53 (941.39)877228.52 (530.00)
South**324141.76 (391.90)**510238.99 (586.18)
West210.000000395.62 (476.57)559137.99 (397.48)191.000000343.67 (582.39)960235.27 (471.29)
All Regions646.000000354.52 (483.44)1820126.75 (350.13)554.000000444.86 (1089.17)3020233.82 (599.41)
Home OfficeCentral**266123.22 (330.32)**438208.25 (371.01)
East**304124.30 (360.59)**502253.91 (722.78)
South**166121.79 (251.03)**272273.00 (1404.80)
West122.000000407.58 (559.87)34398.07 (311.89)106.000000503.38 (820.98)571239.44 (529.24)
All Regions362.000000336.83 (476.99)1079115.31 (322.51)342.000000535.98 (1505.40)1783240.97 (755.52)
All2121.000000349.83 (503.18)6026119.32 (382.18)1847.000000452.71 (1108.66)9994229.86 (623.25)
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Can also create suppressed tables\n", "mean_sd_table = demo_data.zen.mean_sd_table(\n", @@ -3898,766 +367,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "acc41439-4d4f-427c-bfee-93460280b4af", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - " \n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
  FurnitureOffice SuppliesTechnologyAll
  nMeanMediannMeanMediannMeanMediannMeanMedian
ConsumerCentral255338.2193.1739126.023.8218333.4150.21212207.946.1
East303376.9172.8888114.025.6278487.2140.21469238.951.6
South180393.3222.7505117.827.9153426.6146.4838233.458.2
West375319.5171.3995110.631.1302440.4201.61672217.059.5
All Regions1113351.3184.03127116.426.6951427.3160.05191223.753.7
CorporateCentral137380.2155.441798.723.5119544.3150.0673234.842.2
East198324.3185.0520127.832.0159438.5179.9877228.559.9
South101293.5132.2324141.831.085544.8178.4510239.049.6
West210395.6230.3559138.030.1191343.7160.0960235.369.5
All Regions646354.5190.81820126.728.8554444.9160.03020233.856.5
Home OfficeCentral89286.3212.1266123.226.583397.0258.7438208.250.9
East100298.7147.0304124.328.998610.3155.4502253.952.7
South51330.5109.8166121.829.955676.1188.0272273.055.8
West122407.6156.134398.129.6106503.4203.6571239.452.8
All Regions362336.8148.31079115.328.8342536.0200.01783241.052.4
All2121349.8182.26026119.327.41847452.7166.29994229.954.5
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "mean_median_table = demo_data.zen.pivot_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -4714,335 +427,10 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "split-toyota", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nMeanMedian
CategoryFurnitureOffice SuppliesTechnologyAllFurnitureOffice SuppliesTechnologyAllFurnitureOffice SuppliesTechnologyAll
SegmentRegion
ConsumerCentral2557392181212338.153800125.996589333.443743207.946728193.065623.832150.17746.060
East3038882781469376.936640114.026054487.198665238.875539172.764025.632140.21451.560
South180505153838393.334467117.830853426.641739233.390180222.680027.860146.45058.195
West3759953021672319.488232110.634111440.370020217.033955171.288031.104201.57659.520
CorporateCentral137417119673380.18687498.651561544.306807234.763466155.372023.520149.97042.240
East198520159877324.288111127.836029438.525572228.516929184.984032.040179.94059.900
South10132485510293.515163141.759784544.832129238.992025132.224031.047178.38449.640
West210559191960395.619555137.985431343.671791235.265911230.280030.144159.98069.468
Home OfficeCentral8926683438286.318461123.222688397.024892208.248046212.058026.540258.69650.935
East10030498502298.703560124.296658610.277408253.911805147.026028.850155.45052.715
South5116655272330.459775121.786518676.090745272.996329109.800029.920187.98055.785
West122343106571407.57827998.071292503.384660239.442692156.068529.600203.58052.760
All2121602618479994349.834887119.324101452.709276229.858001182.220027.418166.16054.490
\n", - "
" - ], - "text/plain": [ - " n Mean \\\n", - "Category Furniture Office Supplies Technology All Furniture \n", - "Segment Region \n", - "Consumer Central 255 739 218 1212 338.153800 \n", - " East 303 888 278 1469 376.936640 \n", - " South 180 505 153 838 393.334467 \n", - " West 375 995 302 1672 319.488232 \n", - "Corporate Central 137 417 119 673 380.186874 \n", - " East 198 520 159 877 324.288111 \n", - " South 101 324 85 510 293.515163 \n", - " West 210 559 191 960 395.619555 \n", - "Home Office Central 89 266 83 438 286.318461 \n", - " East 100 304 98 502 298.703560 \n", - " South 51 166 55 272 330.459775 \n", - " West 122 343 106 571 407.578279 \n", - "All 2121 6026 1847 9994 349.834887 \n", - "\n", - " Median \\\n", - "Category Office Supplies Technology All Furniture \n", - "Segment Region \n", - "Consumer Central 125.996589 333.443743 207.946728 193.0656 \n", - " East 114.026054 487.198665 238.875539 172.7640 \n", - " South 117.830853 426.641739 233.390180 222.6800 \n", - " West 110.634111 440.370020 217.033955 171.2880 \n", - "Corporate Central 98.651561 544.306807 234.763466 155.3720 \n", - " East 127.836029 438.525572 228.516929 184.9840 \n", - " South 141.759784 544.832129 238.992025 132.2240 \n", - " West 137.985431 343.671791 235.265911 230.2800 \n", - "Home Office Central 123.222688 397.024892 208.248046 212.0580 \n", - " East 124.296658 610.277408 253.911805 147.0260 \n", - " South 121.786518 676.090745 272.996329 109.8000 \n", - " West 98.071292 503.384660 239.442692 156.0685 \n", - "All 119.324101 452.709276 229.858001 182.2200 \n", - "\n", - " \n", - "Category Office Supplies Technology All \n", - "Segment Region \n", - "Consumer Central 23.832 150.177 46.060 \n", - " East 25.632 140.214 51.560 \n", - " South 27.860 146.450 58.195 \n", - " West 31.104 201.576 59.520 \n", - "Corporate Central 23.520 149.970 42.240 \n", - " East 32.040 179.940 59.900 \n", - " South 31.047 178.384 49.640 \n", - " West 30.144 159.980 69.468 \n", - "Home Office Central 26.540 258.696 50.935 \n", - " East 28.850 155.450 52.715 \n", - " South 29.920 187.980 55.785 \n", - " West 29.600 203.580 52.760 \n", - "All 27.418 166.160 54.490 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "demo_data.pivot_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -5085,7 +473,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.9.13" }, "toc-autonumbering": true, "toc-showtags": false diff --git a/src/zentables/pretty_styler.py b/src/zentables/pretty_styler.py new file mode 100644 index 0000000..e595055 --- /dev/null +++ b/src/zentables/pretty_styler.py @@ -0,0 +1,344 @@ +""" +The PrettyStyler class is inherited from the Styler class in pandas that extends +the functionalities of the Styler class for more styling options +""" + + +from __future__ import annotations +from typing import Any, Dict, Iterable, List, TYPE_CHECKING + +import pandas as pd +import pandas.core.common as com +from jinja2 import ChoiceLoader, Environment, PackageLoader +from pandas.io.formats.style import FilePathOrBuffer, Styler, save_to_buffer + +from .zentables import _options + +if TYPE_CHECKING: + from pandas.io.formats.style_render import CSSStyles + + +class PrettyStyler(Styler): + """Custom subclass for pandas.io.format.Styler. + + It uses the two custom templates defined in + the directory and is used by the pandas accessor class + to create a custom Styler object + """ + + # Load the Jinja2 templates. Note that the "prettystyle.tpl" extends the + # original template so we have to use the original styler as well. + + def __init__( + self, + data: pd.DataFrame | pd.Series, + precision: int | None = None, + table_styles: CSSStyles | None = None, + uuid: str | None = None, + caption: tuple | str | None = None, + table_attributes: str | None = None, + cell_ids: bool = True, + na_rep: str | None = None, + uuid_len: int = 5, + decimal: str = ".", + thousands: str | None = None, + escape: str | None = None, + font_family: str | None = None, + font_size: str | int | None = None, + show_index_names: bool | None = None, + show_column_names: bool | None = None, + show_copy_button: bool | None = None, + row_borders: List[int] | None = None, + ): + Styler.__init__( + self, + data=data, + precision=precision, + table_styles=table_styles, + uuid=uuid, + caption=caption, + table_attributes=table_attributes, + cell_ids=cell_ids, + na_rep=na_rep, + uuid_len=uuid_len, + decimal=decimal, + thousands=thousands, + escape=escape, + ) + + self._table_local_styles = _get_font_style(font_size, font_family) + self._index_names = ( + show_index_names + if show_index_names is not None + else _options.show_index_names + ) + self._column_names = ( + show_column_names + if show_column_names is not None + else _options.show_column_names + ) + self._copy_button = ( + show_copy_button + if show_copy_button is not None + else _options.show_copy_button + ) + + if row_borders is not None: + for row_number in row_borders: + if row_number >= len(data): + raise ValueError( + f"Row number {row_number} is out of range for the data." + ) + + self.row_borders = row_borders + + env = Environment( + loader=ChoiceLoader( + [ + PackageLoader("zentables", "templates"), + Styler.loader, # the default templates + ] + ) + ) + + template_html_table = env.get_template("prettyhtml.tpl") + + def render( + self, + sparse_index: bool | None = None, + sparse_columns: bool | None = None, + **kwargs, + ) -> str: + """ + Overrides the `render` method for the Styler class. + """ + + if sparse_index is None: + sparse_index = pd.get_option("styler.sparse.index") + if sparse_columns is None: + sparse_columns = pd.get_option("styler.sparse.columns") + return self._render_html( + sparse_index, + sparse_columns, + table_local_styles=self._table_local_styles, + show_copy_button=self._copy_button, + **kwargs, + ) + + def show_index_names(self): + """ + Shows the names of the index + """ + self._index_names = True + return self + + def show_column_names(self): + """ + Shows the names of the columns + """ + self._column_names = True + return self + + def hide_copy_button(self): + """ + Shows a "Copy Table" button below the rendered table. + """ + self._copy_button = False + return self + + def _translate( + self, sparse_index: bool, sparse_cols: bool, blank: str = " ", **kwargs + ) -> Dict[str, Any]: + """ + Overrides the pandas method to add options to + remove row/column names and add styles. + + Some code used directly from + https://github.com/pandas-dev/pandas/blob/master/pandas/io/formats/style.py + """ + + result = Styler._translate( + self, + sparse_index=sparse_index, + sparse_cols=sparse_cols, + blank=blank, + **kwargs, + ) + + ### Wrangle the header + + head = result["head"] + + if ( + self.data.index.names + and com.any_not_none(*self.data.index.names) + and not self.hide_index_ + and not self.hide_columns_ + # The previous 4 conditions ensure there is a row with index names + # If _index_names is false, + # Then we need to pop the last row of head + and not self._index_names + ): + head.pop() + + for row in head: + for cell in row: + if cell.get("type") == "th": + _add_style_in_element(cell, "text-align: center") + + # Add borders to the first and last line of the header + for cell in head[0]: + _add_style_in_element(cell, "border-top: 1.5pt solid black") + + for cell in head[-1]: + _add_style_in_element(cell, "border-bottom: 1.5pt solid black") + + ### Wrangle the body + + body = result["body"] + + # Updates body to apply cell-wise style attribute + # so that the style copies over to Word and Google Docs. + + if sparse_index and len(body) > 1: + sep_rows = [] + max_th_count = 0 + for row_number, row in enumerate(body): + th_count = 0 + + for cell in row: + if cell.get("type") == "th" and cell.get("is_visible"): + _add_style_in_element( + cell, ["vertical-align: middle", "text-align: left"] + ) + th_count += 1 + if cell.get("type") == "td": + _add_style_in_element( + cell, ["vertical-align: middle", "text-align: center"] + ) + + if th_count >= 2: + sep_rows.append(row_number) + + if row_number == 0: + max_th_count = th_count + + for row_number in sep_rows: + for cell in body[row_number]: + _add_style_in_element(cell, "border-top: 1pt solid black") + + # Vertically walk through row headers to add a bottom border for the table. + for i in range(max_th_count): + for row in body: + if row[i].get("is_visible"): + last_th_for_level = row[i] + + if last_th_for_level and "styles" in last_th_for_level: + _add_style_in_element( + last_th_for_level, "border-bottom: 1.5pt solid black" + ) + # Add bottom border to all body rows + for cell in body[-1]: + if cell.get("type") == "td": + _add_style_in_element(cell, "border-bottom: 1.5pt solid black") + + elif len(body) > 1: + for cell in body[-1]: + _add_style_in_element(cell, "border-bottom: 1.5pt solid black") + + if self.row_borders is not None: + for row_number in self.row_borders: + for cell in body[row_number]: + _add_style_in_element(cell, "border-bottom: 1pt solid black") + + # If _column_names is false, remove column names + if not self._column_names and body: + max_th_count = 0 + for cell in body[0]: + if cell.get("type") == "th": + max_th_count += 1 + + for row in head: + for col_number, cell in enumerate(row): + if col_number < max_th_count: + if "value" in cell: + cell["value"] = blank + else: + break + + return result + + def to_html( + self, + buf: FilePathOrBuffer[str] | None = None, + *, + table_uuid: str | None = None, + table_attributes: str | None = None, + encoding: str | None = None, + doctype_html: bool = False, + exclude_styles: bool = False, + ) -> None: + """Overrides Styler class's to_html methods for compatibility. + + Please see the pandas documentation for more defaults. + + Used source code from + https://github.com/pandas-dev/pandas/blob/master/pandas/io/formats/style.py + """ + if table_uuid: + self.set_uuid(table_uuid) + + if table_attributes: + self.set_table_attributes(table_attributes) + + # Build HTML string.. + html = self.render( + exclude_styles=exclude_styles, + encoding=encoding if encoding else "utf-8", + doctype_html=doctype_html, + show_copy_button=False, # this is the only difference + ) + + return save_to_buffer( + html, buf=buf, encoding=(encoding if buf is not None else None) + ) + + +################################################# +# Helper functions +################################################# + + +def _get_font_style( + font_size: int | str | None = None, font_family: str | None = None +) -> List[str]: + font_size = font_size or _options.font_size + if isinstance(font_size, int): + font_size = f"{font_size}pt" + + font_family = font_family or _options.font_family + + return [f"font-size: {font_size}", rf"font-family: {font_family}"] + + +def _add_style_in_element(ele: Dict[str, Any], style: str | Iterable[str]): + """ + Helper function that sets the `style` field in a dict to `style` if it doesn't + already exist or updates the style field. Maintain the value as a list. + """ + + if "styles" in ele: + if isinstance(style, str): + ele["styles"].append(style) + elif isinstance(style, list): + ele["styles"] += style + else: + ele["styles"] += list(style) + + else: + if isinstance(style, str): + ele["styles"] = [style] + elif isinstance(style, list): + ele["styles"] = style + else: + ele["styles"] = list(style) diff --git a/src/zentables/zentables.py b/src/zentables/zentables.py index 82c5884..868fc4c 100644 --- a/src/zentables/zentables.py +++ b/src/zentables/zentables.py @@ -10,17 +10,16 @@ import zentables as zen df.zen.pretty() """ -import warnings +from __future__ import annotations +import logging from dataclasses import dataclass -from typing import Any, Dict, Iterable, List, Optional, Union, cast +from typing import List, cast import numpy as np -import pandas as pd -import pandas.core.common as com -from jinja2 import ChoiceLoader, Environment, PackageLoader from numpy.random import Generator -from pandas.io.formats.style import FilePathOrBuffer, Styler, save_to_buffer -from pandas.io.formats.style_render import CSSStyles +import pandas as pd + +from .pretty_styler import PrettyStyler @dataclass @@ -57,297 +56,6 @@ def set_options(**kwargs): raise KeyError(f"Invalid option: {opt}") -######################################################### -# Constants for creating css-based tables (faster option) -######################################################### - - -class PrettyStyler(Styler): - """Custom subclass for pandas.io.format.Styler. - - It uses the two custom templates defined in - the directory and is used by the pandas accessor class - to create a custom Styler object - """ - - # Load the Jinja2 templates. Note that the "prettystyle.tpl" extends the - # original template so we have to use the original styler as well. - - def __init__( - self, - data: Union[pd.DataFrame, pd.Series], - precision: Optional[int] = None, - table_styles: Optional[CSSStyles] = None, - uuid: Optional[str] = None, - caption: Union[tuple, str, None] = None, - table_attributes: Optional[str] = None, - cell_ids: bool = True, - na_rep: Optional[str] = None, - uuid_len: int = 5, - decimal: str = ".", - thousands: Optional[str] = None, - escape: Optional[str] = None, - font_family: Optional[str] = None, - font_size: Union[str, int] = None, - show_index_names: Optional[bool] = None, - show_column_names: Optional[bool] = None, - show_copy_button: Optional[bool] = None, - row_borders: Optional[List[int]] = None, - ): - Styler.__init__( - self, - data=data, - precision=precision, - table_styles=table_styles, - uuid=uuid, - caption=caption, - table_attributes=table_attributes, - cell_ids=cell_ids, - na_rep=na_rep, - uuid_len=uuid_len, - decimal=decimal, - thousands=thousands, - escape=escape, - ) - - self._table_local_styles = _get_font_style(font_size, font_family) - self._index_names = ( - show_index_names - if show_index_names is not None - else _options.show_index_names - ) - self._column_names = ( - show_column_names - if show_column_names is not None - else _options.show_column_names - ) - self._copy_button = ( - show_copy_button - if show_copy_button is not None - else _options.show_copy_button - ) - - if row_borders is not None: - for row_number in row_borders: - if row_number >= len(data): - raise ValueError( - f"Row number {row_number} is out of range for the data." - ) - - self.row_borders = row_borders - - env = Environment( - loader=ChoiceLoader( - [ - PackageLoader("zentables", "templates"), - Styler.loader, # the default templates - ] - ) - ) - - template_html_table = env.get_template("prettyhtml.tpl") - - def render( - self, - sparse_index: Optional[bool] = None, - sparse_columns: Optional[bool] = None, - **kwargs, - ) -> str: - """ - Overrides the `render` method for the Styler class. - """ - - if sparse_index is None: - sparse_index = pd.get_option("styler.sparse.index") - if sparse_columns is None: - sparse_columns = pd.get_option("styler.sparse.columns") - return self._render_html( - sparse_index, - sparse_columns, - table_local_styles=self._table_local_styles, - show_copy_button=self._copy_button, - **kwargs, - ) - - def show_index_names(self): - """ - Shows the names of the index - """ - self._index_names = True - return self - - def show_column_names(self): - """ - Shows the names of the columns - """ - self._column_names = True - return self - - def hide_copy_button(self): - """ - Shows a "Copy Table" button below the rendered table. - """ - self._copy_button = False - return self - - def _translate( - self, sparse_index: bool, sparse_cols: bool, blank: str = " " - ) -> Dict[str, Any]: - """ - Overrides the pandas method to add options to - remove row/column names and add styles. - - Some code used directly from - https://github.com/pandas-dev/pandas/blob/master/pandas/io/formats/style.py - """ - - result = Styler._translate( - self, sparse_index=sparse_index, sparse_cols=sparse_cols, blank=blank - ) - - ### Wrangle the header - - head = result["head"] - - if ( - self.data.index.names - and com.any_not_none(*self.data.index.names) - and not self.hide_index_ - and not self.hide_columns_ - # The previous 4 conditions ensure there is a row with index names - # If _index_names is false, - # Then we need to pop the last row of head - and not self._index_names - ): - head.pop() - - for row in head: - for cell in row: - if cell.get("type") == "th": - _add_style_in_element(cell, "text-align: center") - - # Add borders to the first and last line of the header - for cell in head[0]: - _add_style_in_element(cell, "border-top: 1.5pt solid black") - - for cell in head[-1]: - _add_style_in_element(cell, "border-bottom: 1.5pt solid black") - - ### Wrangle the body - - body = result["body"] - - # Updates body to apply cell-wise style attribute - # so that the style copies over to Word and Google Docs. - - if sparse_index and len(body) > 1: - - sep_rows = [] - max_th_count = 0 - for row_number, row in enumerate(body): - th_count = 0 - - for cell in row: - if cell.get("type") == "th" and cell.get("is_visible"): - _add_style_in_element( - cell, ["vertical-align: middle", "text-align: left"] - ) - th_count += 1 - if cell.get("type") == "td": - _add_style_in_element( - cell, ["vertical-align: middle", "text-align: center"] - ) - - if th_count >= 2: - sep_rows.append(row_number) - - if row_number == 0: - max_th_count = th_count - - for row_number in sep_rows: - for cell in body[row_number]: - _add_style_in_element(cell, "border-top: 1pt solid black") - - # Vertically walk through row headers to add a bottom border for the table. - for i in range(max_th_count): - - for row in body: - if row[i].get("is_visible"): - last_th_for_level = row[i] - - if last_th_for_level and "styles" in last_th_for_level: - _add_style_in_element( - last_th_for_level, "border-bottom: 1.5pt solid black" - ) - # Add bottom border to all body rows - for cell in body[-1]: - if cell.get("type") == "td": - _add_style_in_element(cell, "border-bottom: 1.5pt solid black") - - elif len(body) > 1: - - for cell in body[-1]: - _add_style_in_element(cell, "border-bottom: 1.5pt solid black") - - if self.row_borders is not None: - for row_number in self.row_borders: - for cell in body[row_number]: - _add_style_in_element(cell, "border-bottom: 1pt solid black") - - # If _column_names is false, remove column names - if not self._column_names and body: - - max_th_count = 0 - for cell in body[0]: - if cell.get("type") == "th": - max_th_count += 1 - - for row in head: - for col_number, cell in enumerate(row): - if col_number < max_th_count: - if "value" in cell: - cell["value"] = blank - else: - break - - return result - - def to_html( - self, - buf: Optional[FilePathOrBuffer[str]] = None, - *, - table_uuid: Optional[str] = None, - table_attributes: Optional[str] = None, - encoding: Optional[str] = None, - doctype_html: bool = False, - exclude_styles: bool = False, - ): - """Overrides Styler class's to_html methods for compatibility. - - Please see the pandas documentation for more defaults. - - Used source code from - https://github.com/pandas-dev/pandas/blob/master/pandas/io/formats/style.py - """ - if table_uuid: - self.set_uuid(table_uuid) - - if table_attributes: - self.set_table_attributes(table_attributes) - - # Build HTML string.. - html = self.render( - exclude_styles=exclude_styles, - encoding=encoding if encoding else "utf-8", - doctype_html=doctype_html, - show_copy_button=False, # this is the only difference - ) - - return save_to_buffer( - html, buf=buf, encoding=(encoding if buf is not None else None) - ) - - @pd.api.extensions.register_dataframe_accessor("zen") class ZenTablesAccessor: """An accessor class registered to the Pandas API @@ -358,7 +66,7 @@ class ZenTablesAccessor: _pandas_obj: the pandas DataFrame passed to the class. """ - def __init__(self, pandas_obj: Union[pd.Series, pd.DataFrame]): + def __init__(self, pandas_obj: pd.Series | pd.DataFrame): """Constructor for the accessor class. Args: @@ -400,8 +108,8 @@ def freq_table( totals: bool = True, totals_name: str = "Total", subtotals: bool = False, - subtotals_name: Optional[str] = "Subtotal", - props: Optional[str] = None, + subtotals_name: str | None = "Subtotal", + props: str | None = None, digits: int = 1, suppress: bool = False, suppress_symbol: str = "*", @@ -508,8 +216,8 @@ def _internal_freq_table( totals: bool = False, totals_name: str = "Total", subtotals: bool = False, - subtotals_name: Optional[str] = "Subtotal", - props: Optional[str] = None, + subtotals_name: str | None = "Subtotal", + props: str | None = None, digits: int = 1, suppress: bool = False, suppress_symbol: str = "*", @@ -517,9 +225,7 @@ def _internal_freq_table( high: int = 10, **kwargs, ) -> pd.DataFrame: - if props is None: - pivot = self._internal_pivot_table( index=index, columns=columns, @@ -555,7 +261,6 @@ def _internal_freq_table( # If there is only one level on the index, calculate percentages and call # it a day. if index_levels == 1: - if props == "index": pivot_props = pivot.div(pivot.iloc[:, -1], axis=0) elif props == "columns": @@ -564,7 +269,6 @@ def _internal_freq_table( pivot_props = pivot.div(pivot.iloc[-1, -1].squeeze()) if not totals: - if suppress: mask = _do_suppression(pivot, low, high) return ( @@ -638,9 +342,9 @@ def _internal_pivot_table( values=None, aggfunc=None, margins: bool = False, - margins_name: Optional[str] = "All", + margins_name: str | None = "All", submargins: bool = False, - submargins_name: Optional[str] = "All", + submargins_name: str | None = "All", **kwargs, ) -> pd.DataFrame: """ @@ -664,13 +368,14 @@ def _internal_pivot_table( return pivot if submargins and not margins: - warnings.warn("`submargins` is set to True. Overriding `margins` settings") + logging.warning( + "`submargins` is set to True. Overriding `margins` settings" + ) submargins_frames = [pivot] nlevels_index = len(index) for level in range(1, nlevels_index): - submargin = self._pandas_obj.pivot_table( index=index[:level], columns=columns, @@ -757,7 +462,7 @@ def mean_sd_table( margins: bool = True, margins_name: str = "All", submargins: bool = False, - submargins_name: Optional[str] = "All", + submargins_name: str = "All", na_rep: str = "N/A", suppress: bool = False, low: int = 1, @@ -803,7 +508,8 @@ def mean_sd_table( count = pivot.xs("count", axis=1).astype("Int64").fillna(0) mean = pivot.xs("mean", axis=1) std = pivot.xs("std", axis=1) - # issues can arise when the shape is inconsistent because some groupings are entirely empty + # issues can arise when the shape is inconsistent because some groupings are + # entirely empty assert ( count.shape == mean.shape == std.shape ), "Ensure that all categories have at least some entry" @@ -830,9 +536,8 @@ def mean_sd_table( def _get_font_style( - font_size: Optional[Union[int, str]] = None, font_family: Optional[str] = None + font_size: int | str | None = None, font_family: str | None = None ) -> List[str]: - font_size = font_size or _options.font_size if isinstance(font_size, int): font_size = f"{font_size}pt" @@ -843,7 +548,7 @@ def _get_font_style( def _convert_names( - names, max_levels: Optional[int] = None, err_msg: Optional[str] = None + names, max_levels: int | None = None, err_msg: str | None = None ) -> List[str]: """Helper function that converts arguments of index, columns, values to list. @@ -893,7 +598,7 @@ def _combine_n_pct( df_n: pd.DataFrame, df_pct: pd.DataFrame, digits: int = 1, - suppress_symbol: Optional[str] = None, + suppress_symbol: str | None = None, ) -> pd.DataFrame: """ Helper function that formats and combines n and pct values @@ -906,7 +611,7 @@ def _combine_n_pct( return df_n_str.add(df_pct_str) -def _seed_to_rng(seed: Optional[Union[int, Generator]] = None) -> Generator: +def _seed_to_rng(seed: int | Generator | None = None) -> Generator: if seed is None: # When there is no seed set, we start a RNG based on system entropy return np.random.default_rng() @@ -927,7 +632,7 @@ def _local_suppression( mini_df_n: pd.DataFrame, low: int = 1, high: int = 10, - seed: Optional[Union[int, Generator]] = None, + seed: int | Generator | None = None, ): """ Helper function that applies cell suppression to mini_df_n. @@ -970,7 +675,8 @@ def _local_suppression( mask.values[min_rows.values[coi], coi] = True if (len(coi) != 0 or len(roi) != 0) and 1 in mask.shape: - # Corner Case: if there is one row or column, and one is masked, the rest needs to be masked + # Corner Case: if there is one row or column, and one is masked, the rest + # needs to be masked return pd.DataFrame( np.ones(mask.shape, dtype=bool), columns=colnames, index=rownames ) @@ -999,7 +705,8 @@ def _do_suppression( ValueError: when the input DataFrame includes NaN values Returns: - pd.DataFrame where entries are True if df_n needs to be suppress and False if not. + pd.DataFrame where entries are True if df_n needs to be suppress and False if + not. """ # See if there are any NaNs, and raise error if fillna: @@ -1042,28 +749,3 @@ def _combine_mean_std( result[is_sample_size_1] = df_mean_str[is_sample_size_1].add(f" ({na_rep})") result[is_missing] = na_rep return result - - -def _add_style_in_element( - ele: Dict[str, Any], style: Union[str, Iterable[str]] -) -> None: - """ - Helper function that sets the `style` field in a dict to `style` if it doesn't - already exist or updates the style field. Maintain the value as a list. - """ - - if "styles" in ele: - if isinstance(style, str): - ele["styles"].append(style) - elif isinstance(style, list): - ele["styles"] += style - else: - ele["styles"] += list(style) - - else: - if isinstance(style, str): - ele["styles"] = [style] - elif isinstance(style, list): - ele["styles"] = style - else: - ele["styles"] = list(style) From eba3199f23f028ad696ac6cc41ccf028fc0ca659 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 10:40:37 -0400 Subject: [PATCH 2/9] separate source files --- .pre-commit-config.yaml | 27 +- pyproject.toml | 39 +- src/notebooks/ZenTables Demo.ipynb | 794 +++++++++++++++++++- src/zentables/__init__.py | 3 +- src/zentables/{zentables.py => accessor.py} | 67 +- src/zentables/options.py | 39 + src/zentables/pretty_styler.py | 10 +- 7 files changed, 846 insertions(+), 133 deletions(-) rename src/zentables/{zentables.py => accessor.py} (93%) create mode 100644 src/zentables/options.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b3b56f1..e12726b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,21 +5,26 @@ repos: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - - repo: local - hooks: + - repo: local + hooks: # NOTE: we make `black` a local hook because if it's installed from # PyPI (rather than from source) then it'll run twice as fast thanks to mypyc - - id: black - name: black - description: "Black: The uncompromising Python code formatter" - entry: black - language: python - require_serial: true - types_or: [python, pyi] - additional_dependencies: [black==23.3.0] + - id: black + name: black + description: "Black: The uncompromising Python code formatter" + entry: black + language: python + require_serial: true + types_or: [python, pyi] + additional_dependencies: [black==23.3.0] + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + name: isort (python) - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.0.257' + rev: "v0.0.257" hooks: - id: ruff - repo: https://github.com/pre-commit/mirrors-mypy diff --git a/pyproject.toml b/pyproject.toml index eebb987..67d84af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,15 @@ dependencies = ["pandas>=2.0.0rc1"] repository = "https://github.com/thepolicylab/ZenTables.git" [project.optional-dependencies] -dev = ["black[jupyter]", "ruff", "pytest", "pytest-asyncio", "mypy", "jupyterlab", "pre-commit"] +dev = [ + "black[jupyter]", + "ruff", + "pytest", + "mypy", + "jupyterlab", + "pre-commit", + "isort", +] [tool.hatch.envs.dev] python = "3.9" @@ -160,35 +168,6 @@ exclude = [".github", "docs", "src/notebook"] ignore_missing_imports = true python_version = "3.9" -[tool.isort] -known_pre_libs = "pandas._config" -known_pre_core = [ - "pandas._libs", - "pandas._typing", - "pandas.util._*", - "pandas.compat", - "pandas.errors", -] -known_dtypes = "pandas.core.dtypes" -known_post_core = ["pandas.tseries", "pandas.io", "pandas.plotting"] -sections = [ - "FUTURE", - "STDLIB", - "THIRDPARTY", - "PRE_LIBS", - "PRE_CORE", - "DTYPES", - "FIRSTPARTY", - "POST_CORE", - "LOCALFOLDER", -] -profile = "black" -combine_as_imports = true -force_grid_wrap = 2 -force_sort_within_sections = true -skip_glob = "env" -skip = "pandas/__init__.py" - [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/src/notebooks/ZenTables Demo.ipynb b/src/notebooks/ZenTables Demo.ipynb index 2a991bd..62fa92a 100644 --- a/src/notebooks/ZenTables Demo.ipynb +++ b/src/notebooks/ZenTables Demo.ipynb @@ -23,19 +23,7 @@ "execution_count": 1, "id": "higher-trainer", "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'zentables'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mzentables\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mzen\u001b[39;00m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'zentables'" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "\n", @@ -44,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "liberal-spiritual", "metadata": {}, "outputs": [], @@ -63,10 +51,398 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "published-death", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Row IDOrder IDOrder DateShip DateShip ModeCustomer IDCustomer NameSegmentCountryCity...Postal CodeRegionProduct IDCategorySub-CategoryProduct NameSalesQuantityDiscountProfit
01CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-BO-10001798FurnitureBookcasesBush Somerset Collection Bookcase261.960020.0041.9136
12CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-CH-10000454FurnitureChairsHon Deluxe Fabric Upholstered Stacking Chairs,...731.940030.00219.5820
23CA-2013-1386886/13/20136/17/2013Second ClassDV-13045Darrin Van HuffCorporateUnited StatesLos Angeles...90036WestOFF-LA-10000240Office SuppliesLabelsSelf-Adhesive Address Labels for Typewriters b...14.620020.006.8714
34US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthFUR-TA-10000577FurnitureTablesBretford CR4500 Series Slim Rectangular Table957.577550.45-383.0310
45US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthOFF-ST-10000760Office SuppliesStorageEldon Fold 'N Roll Cart System22.368020.202.5164
..................................................................
99899990CA-2011-1104221/22/20111/24/2011Second ClassTB-21400Tom BoeckenhauerConsumerUnited StatesMiami...33180SouthFUR-FU-10001889FurnitureFurnishingsUltra Door Pull Handle25.248030.204.1028
99909991CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestFUR-FU-10000747FurnitureFurnishingsTenex B1-RE Series Chair Mats for Low Pile Car...91.960020.0015.6332
99919992CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestTEC-PH-10003645TechnologyPhonesAastra 57i VoIP phone258.576020.2019.3932
99929993CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestOFF-PA-10004041Office SuppliesPaperIt's Hot Message Books with Stickers, 2 3/4\" x 5\"29.600040.0013.3200
99939994CA-2014-1199145/5/20145/10/2014Second ClassCC-12220Chris CortesConsumerUnited StatesWestminster...92683WestOFF-AP-10002684Office SuppliesAppliancesAcco 7-Outlet Masterpiece Power Center, Wihtou...243.160020.0072.9480
\n", + "

9994 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " Row ID Order ID Order Date Ship Date Ship Mode \n", + "0 1 CA-2013-152156 11/9/2013 11/12/2013 Second Class \\\n", + "1 2 CA-2013-152156 11/9/2013 11/12/2013 Second Class \n", + "2 3 CA-2013-138688 6/13/2013 6/17/2013 Second Class \n", + "3 4 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", + "4 5 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", + "... ... ... ... ... ... \n", + "9989 9990 CA-2011-110422 1/22/2011 1/24/2011 Second Class \n", + "9990 9991 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", + "9991 9992 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", + "9992 9993 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", + "9993 9994 CA-2014-119914 5/5/2014 5/10/2014 Second Class \n", + "\n", + " Customer ID Customer Name Segment Country City \n", + "0 CG-12520 Claire Gute Consumer United States Henderson \\\n", + "1 CG-12520 Claire Gute Consumer United States Henderson \n", + "2 DV-13045 Darrin Van Huff Corporate United States Los Angeles \n", + "3 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", + "4 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", + "... ... ... ... ... ... \n", + "9989 TB-21400 Tom Boeckenhauer Consumer United States Miami \n", + "9990 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", + "9991 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", + "9992 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", + "9993 CC-12220 Chris Cortes Consumer United States Westminster \n", + "\n", + " ... Postal Code Region Product ID Category Sub-Category \n", + "0 ... 42420 South FUR-BO-10001798 Furniture Bookcases \\\n", + "1 ... 42420 South FUR-CH-10000454 Furniture Chairs \n", + "2 ... 90036 West OFF-LA-10000240 Office Supplies Labels \n", + "3 ... 33311 South FUR-TA-10000577 Furniture Tables \n", + "4 ... 33311 South OFF-ST-10000760 Office Supplies Storage \n", + "... ... ... ... ... ... ... \n", + "9989 ... 33180 South FUR-FU-10001889 Furniture Furnishings \n", + "9990 ... 92627 West FUR-FU-10000747 Furniture Furnishings \n", + "9991 ... 92627 West TEC-PH-10003645 Technology Phones \n", + "9992 ... 92627 West OFF-PA-10004041 Office Supplies Paper \n", + "9993 ... 92683 West OFF-AP-10002684 Office Supplies Appliances \n", + "\n", + " Product Name Sales Quantity \n", + "0 Bush Somerset Collection Bookcase 261.9600 2 \\\n", + "1 Hon Deluxe Fabric Upholstered Stacking Chairs,... 731.9400 3 \n", + "2 Self-Adhesive Address Labels for Typewriters b... 14.6200 2 \n", + "3 Bretford CR4500 Series Slim Rectangular Table 957.5775 5 \n", + "4 Eldon Fold 'N Roll Cart System 22.3680 2 \n", + "... ... ... ... \n", + "9989 Ultra Door Pull Handle 25.2480 3 \n", + "9990 Tenex B1-RE Series Chair Mats for Low Pile Car... 91.9600 2 \n", + "9991 Aastra 57i VoIP phone 258.5760 2 \n", + "9992 It's Hot Message Books with Stickers, 2 3/4\" x 5\" 29.6000 4 \n", + "9993 Acco 7-Outlet Masterpiece Power Center, Wihtou... 243.1600 2 \n", + "\n", + " Discount Profit \n", + "0 0.00 41.9136 \n", + "1 0.00 219.5820 \n", + "2 0.00 6.8714 \n", + "3 0.45 -383.0310 \n", + "4 0.20 2.5164 \n", + "... ... ... \n", + "9989 0.20 4.1028 \n", + "9990 0.00 15.6332 \n", + "9991 0.20 19.3932 \n", + "9992 0.00 13.3200 \n", + "9993 0.00 72.9480 \n", + "\n", + "[9994 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "demo_data = pd.read_csv(\"../../tests/fixtures/superstore.csv\")\n", "demo_data" @@ -74,10 +450,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "845697f3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Segment Region \n", + "Consumer West 1672\n", + " East 1469\n", + " Central 1212\n", + "Corporate West 960\n", + " East 877\n", + "Consumer South 838\n", + "Corporate Central 673\n", + "Home Office West 571\n", + "Corporate South 510\n", + "Home Office East 502\n", + " Central 438\n", + " South 272\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "demo_data[[\"Segment\", \"Region\"]].value_counts()" ] @@ -92,10 +492,169 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "caring-hacker", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n", + "
" + ], + "text/plain": [ + "Category Furniture Office Supplies Technology All\n", + "Segment Region \n", + "Consumer Central 255 739 218 1212\n", + " East 303 888 278 1469\n", + " South 180 505 153 838\n", + " West 375 995 302 1672\n", + "Corporate Central 137 417 119 673\n", + " East 198 520 159 877\n", + " South 101 324 85 510\n", + " West 210 559 191 960\n", + "Home Office Central 89 266 83 438\n", + " East 100 304 98 502\n", + " South 51 166 55 272\n", + " West 122 343 106 571\n", + "All 2121 6026 1847 9994" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = demo_data.pivot_table(\n", " index=[\"Segment\", \"Region\"],\n", @@ -117,10 +676,174 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "increasing-guinea", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion    
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "_table_styles = [\n", " dict(selector=\"thead\", props=[(\"border-bottom\", \"1.5pt solid black\")]),\n", @@ -173,10 +896,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "alert-combat", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "TypeError", + "evalue": "to_html() missing 1 required positional argument: 'buf'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/Library/Application Support/hatch/env/virtual/zentables/hVYGP2CT/dev/lib/python3.9/site-packages/IPython/core/formatters.py:344\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 342\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 344\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 346\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/Library/Application Support/hatch/env/virtual/zentables/hVYGP2CT/dev/lib/python3.9/site-packages/pandas/io/formats/style.py:383\u001b[0m, in \u001b[0;36mStyler._repr_html_\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;124;03mHooks into Jupyter notebook rich display system, which calls _repr_html_ by\u001b[39;00m\n\u001b[1;32m 380\u001b[0m \u001b[38;5;124;03mdefault if an object is returned at the end of a cell.\u001b[39;00m\n\u001b[1;32m 381\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 382\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m get_option(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstyler.render.repr\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhtml\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m--> 383\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_html\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[0;31mTypeError\u001b[0m: to_html() missing 1 required positional argument: 'buf'" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df.zen.pretty(font_size=12, font_family=\"Times New Roman\")" ] diff --git a/src/zentables/__init__.py b/src/zentables/__init__.py index 6f13a0d..b6c5cc2 100644 --- a/src/zentables/__init__.py +++ b/src/zentables/__init__.py @@ -13,6 +13,7 @@ df.zen.pretty() """ -from .zentables import ZenTablesAccessor, set_options +from .accessor import ZenTablesAccessor +from .options import set_options __all__ = ["ZenTablesAccessor", "set_options"] diff --git a/src/zentables/zentables.py b/src/zentables/accessor.py similarity index 93% rename from src/zentables/zentables.py rename to src/zentables/accessor.py index 868fc4c..519637a 100644 --- a/src/zentables/zentables.py +++ b/src/zentables/accessor.py @@ -1,61 +1,19 @@ -# -*- coding: utf-8 -*- """ -Main functionalities for `ZenTables` package. - -Provides a wrapper class around a `dict` for global options for the package. -Also provides an Accessor class registered with the `pandas` api to provide -access to package functions. - -Examples: - import zentables as zen - df.zen.pretty() +Provides an accessor class to pandas to enable integration such as `df.zen.pretty()" """ + from __future__ import annotations + import logging -from dataclasses import dataclass from typing import List, cast import numpy as np -from numpy.random import Generator import pandas as pd +from numpy.random import Generator from .pretty_styler import PrettyStyler -@dataclass -class OptionsWrapper: - """A wrapper class around a dict to provide global options functionalities.""" - - font_size: str = "Arial, Helvetica, sans-serif" - font_family: str = "11pt" - show_index_names: bool = False - show_column_names: bool = False - show_copy_button: bool = True - - -_options = OptionsWrapper() - - -def set_options(**kwargs): - """Utility function to set package-wide options. - - Args: - kwargs: pass into the function the option name and value to be set. - - Raises: - KeyError: if the option passed is not a valid option. - - Examples: - import zentables as zen - zen.set_options(option1=value1, option2=value2) - """ - for opt, val in kwargs.items(): - if hasattr(_options, opt): - setattr(_options, opt, val) - else: - raise KeyError(f"Invalid option: {opt}") - - @pd.api.extensions.register_dataframe_accessor("zen") class ZenTablesAccessor: """An accessor class registered to the Pandas API @@ -530,23 +488,6 @@ def mean_sd_table( return _swap_column_levels(result) -################################################# -# Helper functions -################################################# - - -def _get_font_style( - font_size: int | str | None = None, font_family: str | None = None -) -> List[str]: - font_size = font_size or _options.font_size - if isinstance(font_size, int): - font_size = f"{font_size}pt" - - font_family = font_family or _options.font_family - - return [f"font-size: {font_size}", rf"font-family: {font_family}"] - - def _convert_names( names, max_levels: int | None = None, err_msg: str | None = None ) -> List[str]: diff --git a/src/zentables/options.py b/src/zentables/options.py new file mode 100644 index 0000000..1387285 --- /dev/null +++ b/src/zentables/options.py @@ -0,0 +1,39 @@ +""" +Provides ways to change global options +""" + +from dataclasses import dataclass + + +@dataclass +class OptionsWrapper: + """A wrapper class around a dict to provide global options functionalities.""" + + font_size: str = "Arial, Helvetica, sans-serif" + font_family: str = "11pt" + show_index_names: bool = False + show_column_names: bool = False + show_copy_button: bool = True + + +_options = OptionsWrapper() + + +def set_options(**kwargs): + """Utility function to set package-wide options. + + Args: + kwargs: pass into the function the option name and value to be set. + + Raises: + KeyError: if the option passed is not a valid option. + + Examples: + import zentables as zen + zen.set_options(option1=value1, option2=value2) + """ + for opt, val in kwargs.items(): + if hasattr(_options, opt): + setattr(_options, opt, val) + else: + raise KeyError(f"Invalid option: {opt}") diff --git a/src/zentables/pretty_styler.py b/src/zentables/pretty_styler.py index e595055..3df5758 100644 --- a/src/zentables/pretty_styler.py +++ b/src/zentables/pretty_styler.py @@ -5,16 +5,18 @@ from __future__ import annotations -from typing import Any, Dict, Iterable, List, TYPE_CHECKING + +from typing import TYPE_CHECKING, Any, Dict, Iterable, List import pandas as pd import pandas.core.common as com from jinja2 import ChoiceLoader, Environment, PackageLoader -from pandas.io.formats.style import FilePathOrBuffer, Styler, save_to_buffer +from pandas.io.formats.style import Styler, save_to_buffer -from .zentables import _options +from .options import _options if TYPE_CHECKING: + from pandas._typing import FilePath, WriteBuffer from pandas.io.formats.style_render import CSSStyles @@ -270,7 +272,7 @@ def _translate( def to_html( self, - buf: FilePathOrBuffer[str] | None = None, + buf: FilePath | WriteBuffer[str], *, table_uuid: str | None = None, table_attributes: str | None = None, From 6bfa85509fb4a5e85601a2f5ba8c511d6e2d46a4 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 15:49:41 -0400 Subject: [PATCH 3/9] fixed test files --- .github/workflows/run_tests.yml | 29 +- notebooks/ZenTables Demo.ipynb | 6759 ++++++++++++++++++++++++++++ pyproject.toml | 3 - src/notebooks/ZenTables Demo.ipynb | 1229 ----- src/zentables/options.py | 3 +- src/zentables/pretty_styler.py | 216 +- tests/__init__.py | 0 tests/test_suppression.py | 17 +- tests/test_zentables.py | 46 +- 9 files changed, 6933 insertions(+), 1369 deletions(-) create mode 100644 notebooks/ZenTables Demo.ipynb delete mode 100644 src/notebooks/ZenTables Demo.ipynb create mode 100644 tests/__init__.py diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 22a062a..6c68027 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -11,39 +11,24 @@ jobs: strategy: fail-fast: true matrix: - python-version: [3.7, 3.8, 3.9] + python-version: [3.9, 3.10, 3.11] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - - name: Install poetry - uses: snok/install-poetry@v1 - with: - version: 1.1.6 - virtualenvs-create: true - virtualenvs-in-project: true - - - name: Load cache - uses: actions/cache@v2 - id: cache - with: - path: .venv - key: venv-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} - - - name: Install dependencies - if: steps.cache.outputs.cache-hit != 'true' - run: poetry install --no-interaction + - name: Install hatch + run: pip install --upgrade hatch - name: Run mypy - run: poetry run mypy src + run: hatch run dev:mypy src - name: Check styling - run: poetry run black . --check + run: hatch run dev:black . - name: Run tests run: poetry run py.test diff --git a/notebooks/ZenTables Demo.ipynb b/notebooks/ZenTables Demo.ipynb new file mode 100644 index 0000000..cb15fc5 --- /dev/null +++ b/notebooks/ZenTables Demo.ipynb @@ -0,0 +1,6759 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "august-employee", + "metadata": {}, + "source": [ + "# `ZenTables` Demo\n", + "\n", + "## Installation:\n", + "\n", + "You can install this package with\n", + "\n", + "```sh\n", + "pip install zentables\n", + "```\n", + "\n", + "## How to Use `ZenTables` in Python" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "higher-trainer", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "import zentables as zen" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "liberal-spiritual", + "metadata": {}, + "outputs": [], + "source": [ + "# Uncomment this line to use global options\n", + "# zen.set_options(font_family=\"Times New Roman, serif\", font_size=12)" + ] + }, + { + "cell_type": "markdown", + "id": "afraid-value", + "metadata": {}, + "source": [ + "### Load some data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "published-death", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Row IDOrder IDOrder DateShip DateShip ModeCustomer IDCustomer NameSegmentCountryCity...Postal CodeRegionProduct IDCategorySub-CategoryProduct NameSalesQuantityDiscountProfit
01CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-BO-10001798FurnitureBookcasesBush Somerset Collection Bookcase261.960020.0041.9136
12CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-CH-10000454FurnitureChairsHon Deluxe Fabric Upholstered Stacking Chairs,...731.940030.00219.5820
23CA-2013-1386886/13/20136/17/2013Second ClassDV-13045Darrin Van HuffCorporateUnited StatesLos Angeles...90036WestOFF-LA-10000240Office SuppliesLabelsSelf-Adhesive Address Labels for Typewriters b...14.620020.006.8714
34US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthFUR-TA-10000577FurnitureTablesBretford CR4500 Series Slim Rectangular Table957.577550.45-383.0310
45US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthOFF-ST-10000760Office SuppliesStorageEldon Fold 'N Roll Cart System22.368020.202.5164
..................................................................
99899990CA-2011-1104221/22/20111/24/2011Second ClassTB-21400Tom BoeckenhauerConsumerUnited StatesMiami...33180SouthFUR-FU-10001889FurnitureFurnishingsUltra Door Pull Handle25.248030.204.1028
99909991CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestFUR-FU-10000747FurnitureFurnishingsTenex B1-RE Series Chair Mats for Low Pile Car...91.960020.0015.6332
99919992CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestTEC-PH-10003645TechnologyPhonesAastra 57i VoIP phone258.576020.2019.3932
99929993CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestOFF-PA-10004041Office SuppliesPaperIt's Hot Message Books with Stickers, 2 3/4\" x 5\"29.600040.0013.3200
99939994CA-2014-1199145/5/20145/10/2014Second ClassCC-12220Chris CortesConsumerUnited StatesWestminster...92683WestOFF-AP-10002684Office SuppliesAppliancesAcco 7-Outlet Masterpiece Power Center, Wihtou...243.160020.0072.9480
\n", + "

9994 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " Row ID Order ID Order Date Ship Date Ship Mode \n", + "0 1 CA-2013-152156 11/9/2013 11/12/2013 Second Class \\\n", + "1 2 CA-2013-152156 11/9/2013 11/12/2013 Second Class \n", + "2 3 CA-2013-138688 6/13/2013 6/17/2013 Second Class \n", + "3 4 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", + "4 5 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", + "... ... ... ... ... ... \n", + "9989 9990 CA-2011-110422 1/22/2011 1/24/2011 Second Class \n", + "9990 9991 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", + "9991 9992 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", + "9992 9993 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", + "9993 9994 CA-2014-119914 5/5/2014 5/10/2014 Second Class \n", + "\n", + " Customer ID Customer Name Segment Country City \n", + "0 CG-12520 Claire Gute Consumer United States Henderson \\\n", + "1 CG-12520 Claire Gute Consumer United States Henderson \n", + "2 DV-13045 Darrin Van Huff Corporate United States Los Angeles \n", + "3 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", + "4 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", + "... ... ... ... ... ... \n", + "9989 TB-21400 Tom Boeckenhauer Consumer United States Miami \n", + "9990 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", + "9991 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", + "9992 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", + "9993 CC-12220 Chris Cortes Consumer United States Westminster \n", + "\n", + " ... Postal Code Region Product ID Category Sub-Category \n", + "0 ... 42420 South FUR-BO-10001798 Furniture Bookcases \\\n", + "1 ... 42420 South FUR-CH-10000454 Furniture Chairs \n", + "2 ... 90036 West OFF-LA-10000240 Office Supplies Labels \n", + "3 ... 33311 South FUR-TA-10000577 Furniture Tables \n", + "4 ... 33311 South OFF-ST-10000760 Office Supplies Storage \n", + "... ... ... ... ... ... ... \n", + "9989 ... 33180 South FUR-FU-10001889 Furniture Furnishings \n", + "9990 ... 92627 West FUR-FU-10000747 Furniture Furnishings \n", + "9991 ... 92627 West TEC-PH-10003645 Technology Phones \n", + "9992 ... 92627 West OFF-PA-10004041 Office Supplies Paper \n", + "9993 ... 92683 West OFF-AP-10002684 Office Supplies Appliances \n", + "\n", + " Product Name Sales Quantity \n", + "0 Bush Somerset Collection Bookcase 261.9600 2 \\\n", + "1 Hon Deluxe Fabric Upholstered Stacking Chairs,... 731.9400 3 \n", + "2 Self-Adhesive Address Labels for Typewriters b... 14.6200 2 \n", + "3 Bretford CR4500 Series Slim Rectangular Table 957.5775 5 \n", + "4 Eldon Fold 'N Roll Cart System 22.3680 2 \n", + "... ... ... ... \n", + "9989 Ultra Door Pull Handle 25.2480 3 \n", + "9990 Tenex B1-RE Series Chair Mats for Low Pile Car... 91.9600 2 \n", + "9991 Aastra 57i VoIP phone 258.5760 2 \n", + "9992 It's Hot Message Books with Stickers, 2 3/4\" x 5\" 29.6000 4 \n", + "9993 Acco 7-Outlet Masterpiece Power Center, Wihtou... 243.1600 2 \n", + "\n", + " Discount Profit \n", + "0 0.00 41.9136 \n", + "1 0.00 219.5820 \n", + "2 0.00 6.8714 \n", + "3 0.45 -383.0310 \n", + "4 0.20 2.5164 \n", + "... ... ... \n", + "9989 0.20 4.1028 \n", + "9990 0.00 15.6332 \n", + "9991 0.20 19.3932 \n", + "9992 0.00 13.3200 \n", + "9993 0.00 72.9480 \n", + "\n", + "[9994 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demo_data = pd.read_csv(\"../tests/fixtures/superstore.csv\")\n", + "demo_data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "845697f3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Segment Region \n", + "Consumer West 1672\n", + " East 1469\n", + " Central 1212\n", + "Corporate West 960\n", + " East 877\n", + "Consumer South 838\n", + "Corporate Central 673\n", + "Home Office West 571\n", + "Corporate South 510\n", + "Home Office East 502\n", + " Central 438\n", + " South 272\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demo_data[[\"Segment\", \"Region\"]].value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "ignored-church", + "metadata": {}, + "source": [ + "### The usual Python pivot table" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "caring-hacker", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n", + "
" + ], + "text/plain": [ + "Category Furniture Office Supplies Technology All\n", + "Segment Region \n", + "Consumer Central 255 739 218 1212\n", + " East 303 888 278 1469\n", + " South 180 505 153 838\n", + " West 375 995 302 1672\n", + "Corporate Central 137 417 119 673\n", + " East 198 520 159 877\n", + " South 101 324 85 510\n", + " West 210 559 191 960\n", + "Home Office Central 89 266 83 438\n", + " East 100 304 98 502\n", + " South 51 166 55 272\n", + " West 122 343 106 571\n", + "All 2121 6026 1847 9994" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = demo_data.pivot_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Order ID\",\n", + " aggfunc=\"count\",\n", + " margins=True,\n", + ")\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "sharp-thesis", + "metadata": {}, + "source": [ + "### You __can__ make it look good in pandas __with a lot of code__" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "increasing-guinea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion    
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_table_styles = [\n", + " dict(selector=\"thead\", props=[(\"border-bottom\", \"1.5pt solid black\")]),\n", + " dict(\n", + " selector=\"thead tr:last-child\", props=[(\"display\", \"None\")]\n", + " ), # Hides last row of header\n", + " dict(\n", + " selector=\".col_heading\",\n", + " props=[(\"text-align\", \"center\"), (\"vertical-align\", \"middle\")],\n", + " ),\n", + " dict(\n", + " selector=\"tbody tr\",\n", + " props=[\n", + " (\"background-color\", \"white\"),\n", + " ],\n", + " ),\n", + " dict(selector=\"tbody tr td\", props=[(\"text-align\", \"center\")]),\n", + " dict(\n", + " selector=\".row_heading\",\n", + " props=[\n", + " (\"text-align\", \"left\"),\n", + " (\"font-weight\", \"bold\"),\n", + " ],\n", + " ),\n", + "]\n", + "\n", + "\n", + "def make_borders(df):\n", + " return [\n", + " dict(\n", + " selector=f\"tbody tr:nth-child({i})\",\n", + " props=[(\"border-bottom\", \"1px solid black\")],\n", + " )\n", + " for i in df.index.get_level_values(0).value_counts().cumsum()\n", + " ]\n", + "\n", + "\n", + "df.style.set_table_styles(_table_styles + make_borders(df)).set_table_attributes(\n", + " 'style=\"border-top: 1.5pt solid black; border-bottom: 1.5pt solid black;\"'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "reliable-driving", + "metadata": {}, + "source": [ + "### The zen way: `df.zt.pretty()`" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "alert-combat", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.zen.pretty(font_size=12, font_family=\"Times New Roman\")" + ] + }, + { + "cell_type": "markdown", + "id": "aerial-castle", + "metadata": {}, + "source": [ + "### Creating frequency tables with percentages with `df.zen.freq_table()`" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "wired-netscape", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyTotal
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)1212 (23.3%)
East303 (27.2%)888 (28.4%)278 (29.2%)1469 (28.3%)
South180 (16.2%)505 (16.1%)153 (16.1%)838 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)1672 (32.2%)
Subtotal1113 (100.0%)3127 (100.0%)951 (100.0%)5191 (100.0%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)673 (22.3%)
East198 (30.7%)520 (28.6%)159 (28.7%)877 (29.0%)
South101 (15.6%)324 (17.8%)85 (15.3%)510 (16.9%)
West210 (32.5%)559 (30.7%)191 (34.5%)960 (31.8%)
Subtotal646 (100.0%)1820 (100.0%)554 (100.0%)3020 (100.0%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)438 (24.6%)
East100 (27.6%)304 (28.2%)98 (28.7%)502 (28.2%)
South51 (14.1%)166 (15.4%)55 (16.1%)272 (15.3%)
West122 (33.7%)343 (31.8%)106 (31.0%)571 (32.0%)
Subtotal362 (100.0%)1079 (100.0%)342 (100.0%)1783 (100.0%)
Total2121 (100.0%)6026 (100.0%)1847 (100.0%)9994 (100.0%)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "freq_table = demo_data.zen.freq_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Order ID\",\n", + " props=\"columns\",\n", + " totals=True,\n", + " subtotals=True,\n", + " digits=1,\n", + ")\n", + "freq_table.zen.pretty()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "6d77aa99-0133-4283-a711-32ecc7202565", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnology
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)
East303 (27.2%)888 (28.4%)278 (29.2%)
South180 (16.2%)505 (16.1%)153 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)
Subtotal1113 (100.0%)3127 (100.0%)951 (100.0%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)
East198 (30.7%)520 (28.6%)159 (28.7%)
South101 (15.6%)324 (17.8%)85 (15.3%)
West210 (32.5%)559 (30.7%)191 (34.5%)
Subtotal646 (100.0%)1820 (100.0%)554 (100.0%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)
East100 (27.6%)304 (28.2%)98 (28.7%)
South51 (14.1%)166 (15.4%)55 (16.1%)
West122 (33.7%)343 (31.8%)106 (31.0%)
Subtotal362 (100.0%)1079 (100.0%)342 (100.0%)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "freq_table = demo_data.zen.freq_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Order ID\",\n", + " props=\"columns\",\n", + " totals=False,\n", + " subtotals=True,\n", + " digits=1,\n", + ")\n", + "freq_table.zen.pretty()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "59ea1434-edf4-4a4c-b141-49f14d694f78", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyTotal
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)1212 (23.3%)
East303 (27.2%)888 (28.4%)278 (29.2%)1469 (28.3%)
South180 (16.2%)505 (16.1%)153 (16.1%)838 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)1672 (32.2%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)673 (22.3%)
East198 (30.7%)520 (28.6%)159 (28.7%)877 (29.0%)
South101 (15.6%)324 (17.8%)85 (15.3%)510 (16.9%)
West210 (32.5%)559 (30.7%)191 (34.5%)960 (31.8%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)438 (24.6%)
East100 (27.6%)304 (28.2%)98 (28.7%)502 (28.2%)
South51 (14.1%)166 (15.4%)55 (16.1%)272 (15.3%)
West122 (33.7%)343 (31.8%)106 (31.0%)571 (32.0%)
Total2121 (100.0%)6026 (100.0%)1847 (100.0%)9994 (100.0%)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "freq_table = demo_data.zen.freq_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Order ID\",\n", + " props=\"columns\",\n", + " totals=True,\n", + " subtotals=False,\n", + " digits=1,\n", + ")\n", + "freq_table.zen.pretty()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "50d08f60-15aa-46de-a710-79f4f2baa1d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnology
ConsumerCentral255 (22.9%)739 (23.6%)218 (22.9%)
East303 (27.2%)888 (28.4%)278 (29.2%)
South180 (16.2%)505 (16.1%)153 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)
CorporateCentral137 (21.2%)417 (22.9%)119 (21.5%)
East198 (30.7%)520 (28.6%)159 (28.7%)
South101 (15.6%)324 (17.8%)85 (15.3%)
West210 (32.5%)559 (30.7%)191 (34.5%)
Home OfficeCentral89 (24.6%)266 (24.7%)83 (24.3%)
East100 (27.6%)304 (28.2%)98 (28.7%)
South51 (14.1%)166 (15.4%)55 (16.1%)
West122 (33.7%)343 (31.8%)106 (31.0%)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "freq_table = demo_data.zen.freq_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Order ID\",\n", + " props=\"columns\",\n", + " totals=False,\n", + " subtotals=False,\n", + " digits=1,\n", + ")\n", + "freq_table.zen.pretty()" + ] + }, + { + "cell_type": "markdown", + "id": "c28f2d0f", + "metadata": {}, + "source": [ + "The `suppress` argument also allows for cell suppression below a certain threshold value (or `ceiling`). For specifics on how the suppression is applied, please refer to the following resource provided by the Conneticut Education Department:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2013baf5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyTotal
ConsumerCentral*739 (23.6%)*1212 (23.3%)
East*888 (28.4%)*1469 (28.3%)
South*505 (16.1%)*838 (16.1%)
West375 (33.7%)995 (31.8%)302 (31.8%)1672 (32.2%)
Subtotal1113 (100.0%)3127 (100.0%)951 (100.0%)5191 (100.0%)
CorporateCentral*417 (22.9%)*673 (22.3%)
East*520 (28.6%)*877 (29.0%)
South*324 (17.8%)*510 (16.9%)
West*559 (30.7%)*960 (31.8%)
Subtotal646 (100.0%)1820 (100.0%)554 (100.0%)3020 (100.0%)
Home OfficeCentral89 (24.6%)***
East*304 (28.2%)*502 (28.2%)
South51 (14.1%)*55 (16.1%)*
West*343 (31.8%)*571 (32.0%)
Subtotal362 (100.0%)1079 (100.0%)342 (100.0%)1783 (100.0%)
Total2121 (100.0%)6026 (100.0%)1847 (100.0%)9994 (100.0%)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "freq_table_suppressed = demo_data.zen.freq_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Order ID\",\n", + " props=\"columns\",\n", + " totals=True,\n", + " subtotals=True,\n", + " digits=1,\n", + " suppress=True,\n", + " low=100,\n", + " high=300,\n", + ")\n", + "freq_table_suppressed.zen.pretty()" + ] + }, + { + "cell_type": "markdown", + "id": "boxed-texture", + "metadata": {}, + "source": [ + "### Creating mean and standard deviation tables with `df.zen.mean_sd_table()`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4ac6e5ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategorySales
0Furniture261.960000
1Furniture731.940000
2Office Supplies14.620000
3Furniture957.577500
4Office Supplies22.368000
5Furniture48.860000
6Office Supplies7.280000
7Technology907.152000
8Office Supplies18.504000
9Office Supplies114.900000
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demo_data[[\"Category\", \"Sales\"]].iloc[:10, :].zen.pretty(row_borders=[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "alien-namibia", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
  nMean (SD)nMean (SD)nMean (SD)nMean (SD)
ConsumerCentral255338.15 (444.75)739126.00 (587.09)218333.44 (683.00)1212207.95 (587.91)
East303376.94 (628.48)888114.03 (333.98)278487.20 (1097.94)1469238.88 (633.37)
South180393.33 (547.50)505117.83 (364.98)153426.64 (903.27)838233.39 (559.35)
West375319.49 (461.58)995110.63 (353.49)302440.37 (955.83)1672217.03 (552.00)
All Regions1113351.35 (522.69)3127116.39 (417.46)951427.34 (938.72)5191223.73 (585.52)
CorporateCentral137380.19 (562.24)41798.65 (294.85)119544.31 (1721.04)673234.76 (818.95)
East198324.29 (469.16)520127.84 (305.96)159438.53 (941.39)877228.52 (530.00)
South101293.52 (398.97)324141.76 (391.90)85544.83 (1080.42)510238.99 (586.18)
West210395.62 (476.57)559137.99 (397.48)191343.67 (582.39)960235.27 (471.29)
All Regions646354.52 (483.44)1820126.75 (350.13)554444.86 (1089.17)3020233.82 (599.41)
Home OfficeCentral89286.32 (330.54)266123.22 (330.32)83397.02 (444.47)438208.25 (371.01)
East100298.70 (410.52)304124.30 (360.59)98610.28 (1391.77)502253.91 (722.78)
South51330.46 (581.77)166121.79 (251.03)55676.09 (3026.39)272273.00 (1404.80)
West122407.58 (559.87)34398.07 (311.89)106503.38 (820.98)571239.44 (529.24)
All Regions362336.83 (476.99)1079115.31 (322.51)342535.98 (1505.40)1783240.97 (755.52)
All2121349.83 (503.18)6026119.32 (382.18)1847452.71 (1108.66)9994229.86 (623.25)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mean_sd_table = demo_data.zen.mean_sd_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Sales\",\n", + " margins=True,\n", + " margins_name=\"All\",\n", + " submargins=True,\n", + " submargins_name=\"All Regions\",\n", + " digits=2,\n", + ")\n", + "mean_sd_table.zen.pretty()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "6907d4c8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
  nMean (SD)nMean (SD)nMean (SD)nMean (SD)
ConsumerCentral255.000000338.15 (444.75)739126.00 (587.09)218.000000333.44 (683.00)1212207.95 (587.91)
East303.000000376.94 (628.48)888114.03 (333.98)278.000000487.20 (1097.94)1469238.88 (633.37)
South180.000000393.33 (547.50)505117.83 (364.98)153.000000426.64 (903.27)838233.39 (559.35)
West375.000000319.49 (461.58)995110.63 (353.49)302.000000440.37 (955.83)1672217.03 (552.00)
All Regions1113.000000351.35 (522.69)3127116.39 (417.46)951.000000427.34 (938.72)5191223.73 (585.52)
CorporateCentral**41798.65 (294.85)**673234.76 (818.95)
East198.000000324.29 (469.16)520127.84 (305.96)159.000000438.53 (941.39)877228.52 (530.00)
South**324141.76 (391.90)**510238.99 (586.18)
West210.000000395.62 (476.57)559137.99 (397.48)191.000000343.67 (582.39)960235.27 (471.29)
All Regions646.000000354.52 (483.44)1820126.75 (350.13)554.000000444.86 (1089.17)3020233.82 (599.41)
Home OfficeCentral**266123.22 (330.32)**438208.25 (371.01)
East**304124.30 (360.59)**502253.91 (722.78)
South**166121.79 (251.03)**272273.00 (1404.80)
West122.000000407.58 (559.87)34398.07 (311.89)106.000000503.38 (820.98)571239.44 (529.24)
All Regions362.000000336.83 (476.99)1079115.31 (322.51)342.000000535.98 (1505.40)1783240.97 (755.52)
All2121.000000349.83 (503.18)6026119.32 (382.18)1847.000000452.71 (1108.66)9994229.86 (623.25)
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Can also create suppressed tables\n", + "mean_sd_table = demo_data.zen.mean_sd_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Sales\",\n", + " margins=True,\n", + " margins_name=\"All\",\n", + " submargins=True,\n", + " submargins_name=\"All Regions\",\n", + " digits=2,\n", + " suppress=True,\n", + " low=1,\n", + " high=100,\n", + ")\n", + "mean_sd_table.zen.pretty()" + ] + }, + { + "cell_type": "markdown", + "id": "controlling-advertising", + "metadata": {}, + "source": [ + "### Creating any pivot table with sub-tallies with `df.zen.pivot_table()`" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "acc41439-4d4f-427c-bfee-93460280b4af", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
  nMeanMediannMeanMediannMeanMediannMeanMedian
ConsumerCentral255338.2193.1739126.023.8218333.4150.21212207.946.1
East303376.9172.8888114.025.6278487.2140.21469238.951.6
South180393.3222.7505117.827.9153426.6146.4838233.458.2
West375319.5171.3995110.631.1302440.4201.61672217.059.5
All Regions1113351.3184.03127116.426.6951427.3160.05191223.753.7
CorporateCentral137380.2155.441798.723.5119544.3150.0673234.842.2
East198324.3185.0520127.832.0159438.5179.9877228.559.9
South101293.5132.2324141.831.085544.8178.4510239.049.6
West210395.6230.3559138.030.1191343.7160.0960235.369.5
All Regions646354.5190.81820126.728.8554444.9160.03020233.856.5
Home OfficeCentral89286.3212.1266123.226.583397.0258.7438208.250.9
East100298.7147.0304124.328.998610.3155.4502253.952.7
South51330.5109.8166121.829.955676.1188.0272273.055.8
West122407.6156.134398.129.6106503.4203.6571239.452.8
All Regions362336.8148.31079115.328.8342536.0200.01783241.052.4
All2121349.8182.26026119.327.41847452.7166.29994229.954.5
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mean_median_table = demo_data.zen.pivot_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Sales\",\n", + " aggfunc=[\"count\", \"mean\", \"median\"],\n", + " margins=True,\n", + " margins_name=\"All\",\n", + " submargins=True,\n", + " submargins_name=\"All Regions\",\n", + ").rename(\n", + " columns={\n", + " \"count\": \"n\",\n", + " \"mean\": \"Mean\",\n", + " \"median\": \"Median\",\n", + " }\n", + ")\n", + "mean_median_table.zen.pretty().format(precision=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "considerable-roberts", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
 CategoryFurnitureOffice SuppliesTechnologyAll
  nMeanMediannMeanMediannMeanMediannMeanMedian
ConsumerCentral255338.2193.1739126.023.8218333.4150.21212207.946.1
East303376.9172.8888114.025.6278487.2140.21469238.951.6
South180393.3222.7505117.827.9153426.6146.4838233.458.2
West375319.5171.3995110.631.1302440.4201.61672217.059.5
All Regions1113351.3184.03127116.426.6951427.3160.05191223.753.7
CorporateCentral137380.2155.441798.723.5119544.3150.0673234.842.2
East198324.3185.0520127.832.0159438.5179.9877228.559.9
South101293.5132.2324141.831.085544.8178.4510239.049.6
West210395.6230.3559138.030.1191343.7160.0960235.369.5
All Regions646354.5190.81820126.728.8554444.9160.03020233.856.5
Home OfficeCentral89286.3212.1266123.226.583397.0258.7438208.250.9
East100298.7147.0304124.328.998610.3155.4502253.952.7
South51330.5109.8166121.829.955676.1188.0272273.055.8
West122407.6156.134398.129.6106503.4203.6571239.452.8
All Regions362336.8148.31079115.328.8342536.0200.01783241.052.4
All2121349.8182.26026119.327.41847452.7166.29994229.954.5
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mean_median_table = demo_data.zen.pivot_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Sales\",\n", + " aggfunc=[\"count\", \"mean\", \"median\"],\n", + " margins=True,\n", + " margins_name=\"All\",\n", + " submargins=True,\n", + " submargins_name=\"All Regions\",\n", + ").rename(\n", + " columns={\n", + " \"count\": \"n\",\n", + " \"mean\": \"Mean\",\n", + " \"median\": \"Median\",\n", + " }\n", + ")\n", + "mean_median_table.zen.pretty().format(precision=1)" + ] + }, + { + "cell_type": "markdown", + "id": "violent-gathering", + "metadata": {}, + "source": [ + "### Compare with the original Python `pivot_table()`" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "split-toyota", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nMeanMedian
CategoryFurnitureOffice SuppliesTechnologyAllFurnitureOffice SuppliesTechnologyAllFurnitureOffice SuppliesTechnologyAll
SegmentRegion
ConsumerCentral2557392181212338.153800125.996589333.443743207.946728193.065623.832150.17746.060
East3038882781469376.936640114.026054487.198665238.875539172.764025.632140.21451.560
South180505153838393.334467117.830853426.641739233.390180222.680027.860146.45058.195
West3759953021672319.488232110.634111440.370020217.033955171.288031.104201.57659.520
CorporateCentral137417119673380.18687498.651561544.306807234.763466155.372023.520149.97042.240
East198520159877324.288111127.836029438.525572228.516929184.984032.040179.94059.900
South10132485510293.515163141.759784544.832129238.992025132.224031.047178.38449.640
West210559191960395.619555137.985431343.671791235.265911230.280030.144159.98069.468
Home OfficeCentral8926683438286.318461123.222688397.024892208.248046212.058026.540258.69650.935
East10030498502298.703560124.296658610.277408253.911805147.026028.850155.45052.715
South5116655272330.459775121.786518676.090745272.996329109.800029.920187.98055.785
West122343106571407.57827998.071292503.384660239.442692156.068529.600203.58052.760
All2121602618479994349.834887119.324101452.709276229.858001182.220027.418166.16054.490
\n", + "
" + ], + "text/plain": [ + " n Mean \n", + "Category Furniture Office Supplies Technology All Furniture \n", + "Segment Region \n", + "Consumer Central 255 739 218 1212 338.153800 \\\n", + " East 303 888 278 1469 376.936640 \n", + " South 180 505 153 838 393.334467 \n", + " West 375 995 302 1672 319.488232 \n", + "Corporate Central 137 417 119 673 380.186874 \n", + " East 198 520 159 877 324.288111 \n", + " South 101 324 85 510 293.515163 \n", + " West 210 559 191 960 395.619555 \n", + "Home Office Central 89 266 83 438 286.318461 \n", + " East 100 304 98 502 298.703560 \n", + " South 51 166 55 272 330.459775 \n", + " West 122 343 106 571 407.578279 \n", + "All 2121 6026 1847 9994 349.834887 \n", + "\n", + " Median \n", + "Category Office Supplies Technology All Furniture \n", + "Segment Region \n", + "Consumer Central 125.996589 333.443743 207.946728 193.0656 \\\n", + " East 114.026054 487.198665 238.875539 172.7640 \n", + " South 117.830853 426.641739 233.390180 222.6800 \n", + " West 110.634111 440.370020 217.033955 171.2880 \n", + "Corporate Central 98.651561 544.306807 234.763466 155.3720 \n", + " East 127.836029 438.525572 228.516929 184.9840 \n", + " South 141.759784 544.832129 238.992025 132.2240 \n", + " West 137.985431 343.671791 235.265911 230.2800 \n", + "Home Office Central 123.222688 397.024892 208.248046 212.0580 \n", + " East 124.296658 610.277408 253.911805 147.0260 \n", + " South 121.786518 676.090745 272.996329 109.8000 \n", + " West 98.071292 503.384660 239.442692 156.0685 \n", + "All 119.324101 452.709276 229.858001 182.2200 \n", + "\n", + " \n", + "Category Office Supplies Technology All \n", + "Segment Region \n", + "Consumer Central 23.832 150.177 46.060 \n", + " East 25.632 140.214 51.560 \n", + " South 27.860 146.450 58.195 \n", + " West 31.104 201.576 59.520 \n", + "Corporate Central 23.520 149.970 42.240 \n", + " East 32.040 179.940 59.900 \n", + " South 31.047 178.384 49.640 \n", + " West 30.144 159.980 69.468 \n", + "Home Office Central 26.540 258.696 50.935 \n", + " East 28.850 155.450 52.715 \n", + " South 29.920 187.980 55.785 \n", + " West 29.600 203.580 52.760 \n", + "All 27.418 166.160 54.490 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demo_data.pivot_table(\n", + " index=[\"Segment\", \"Region\"],\n", + " columns=[\"Category\"],\n", + " values=\"Sales\",\n", + " aggfunc=[\"count\", \"mean\", \"median\"],\n", + " margins=True,\n", + " margins_name=\"All\",\n", + ").rename(\n", + " columns={\n", + " \"count\": \"n\",\n", + " \"mean\": \"Mean\",\n", + " \"median\": \"Median\",\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f498376-da56-4fd0-a0b8-2b5c3719a6ed", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + }, + "toc-autonumbering": true, + "toc-showtags": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index 67d84af..97feebb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -171,6 +171,3 @@ python_version = "3.9" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" - -[tool.hatch.build] -sources = ["src/zentables"] diff --git a/src/notebooks/ZenTables Demo.ipynb b/src/notebooks/ZenTables Demo.ipynb deleted file mode 100644 index 62fa92a..0000000 --- a/src/notebooks/ZenTables Demo.ipynb +++ /dev/null @@ -1,1229 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "august-employee", - "metadata": {}, - "source": [ - "# `ZenTables` Demo\n", - "\n", - "## Installation:\n", - "\n", - "You can install this package with\n", - "\n", - "```sh\n", - "pip install zentables\n", - "```\n", - "\n", - "## How to Use `ZenTables` in Python" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "higher-trainer", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "import zentables as zen" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "liberal-spiritual", - "metadata": {}, - "outputs": [], - "source": [ - "# Uncomment this line to use global options\n", - "# zen.set_options(font_family=\"Times New Roman, serif\", font_size=12)" - ] - }, - { - "cell_type": "markdown", - "id": "afraid-value", - "metadata": {}, - "source": [ - "### Load some data" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "published-death", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Row IDOrder IDOrder DateShip DateShip ModeCustomer IDCustomer NameSegmentCountryCity...Postal CodeRegionProduct IDCategorySub-CategoryProduct NameSalesQuantityDiscountProfit
01CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-BO-10001798FurnitureBookcasesBush Somerset Collection Bookcase261.960020.0041.9136
12CA-2013-15215611/9/201311/12/2013Second ClassCG-12520Claire GuteConsumerUnited StatesHenderson...42420SouthFUR-CH-10000454FurnitureChairsHon Deluxe Fabric Upholstered Stacking Chairs,...731.940030.00219.5820
23CA-2013-1386886/13/20136/17/2013Second ClassDV-13045Darrin Van HuffCorporateUnited StatesLos Angeles...90036WestOFF-LA-10000240Office SuppliesLabelsSelf-Adhesive Address Labels for Typewriters b...14.620020.006.8714
34US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthFUR-TA-10000577FurnitureTablesBretford CR4500 Series Slim Rectangular Table957.577550.45-383.0310
45US-2012-10896610/11/201210/18/2012Standard ClassSO-20335Sean O'DonnellConsumerUnited StatesFort Lauderdale...33311SouthOFF-ST-10000760Office SuppliesStorageEldon Fold 'N Roll Cart System22.368020.202.5164
..................................................................
99899990CA-2011-1104221/22/20111/24/2011Second ClassTB-21400Tom BoeckenhauerConsumerUnited StatesMiami...33180SouthFUR-FU-10001889FurnitureFurnishingsUltra Door Pull Handle25.248030.204.1028
99909991CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestFUR-FU-10000747FurnitureFurnishingsTenex B1-RE Series Chair Mats for Low Pile Car...91.960020.0015.6332
99919992CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestTEC-PH-10003645TechnologyPhonesAastra 57i VoIP phone258.576020.2019.3932
99929993CA-2014-1212582/27/20143/4/2014Standard ClassDB-13060Dave BrooksConsumerUnited StatesCosta Mesa...92627WestOFF-PA-10004041Office SuppliesPaperIt's Hot Message Books with Stickers, 2 3/4\" x 5\"29.600040.0013.3200
99939994CA-2014-1199145/5/20145/10/2014Second ClassCC-12220Chris CortesConsumerUnited StatesWestminster...92683WestOFF-AP-10002684Office SuppliesAppliancesAcco 7-Outlet Masterpiece Power Center, Wihtou...243.160020.0072.9480
\n", - "

9994 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " Row ID Order ID Order Date Ship Date Ship Mode \n", - "0 1 CA-2013-152156 11/9/2013 11/12/2013 Second Class \\\n", - "1 2 CA-2013-152156 11/9/2013 11/12/2013 Second Class \n", - "2 3 CA-2013-138688 6/13/2013 6/17/2013 Second Class \n", - "3 4 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", - "4 5 US-2012-108966 10/11/2012 10/18/2012 Standard Class \n", - "... ... ... ... ... ... \n", - "9989 9990 CA-2011-110422 1/22/2011 1/24/2011 Second Class \n", - "9990 9991 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", - "9991 9992 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", - "9992 9993 CA-2014-121258 2/27/2014 3/4/2014 Standard Class \n", - "9993 9994 CA-2014-119914 5/5/2014 5/10/2014 Second Class \n", - "\n", - " Customer ID Customer Name Segment Country City \n", - "0 CG-12520 Claire Gute Consumer United States Henderson \\\n", - "1 CG-12520 Claire Gute Consumer United States Henderson \n", - "2 DV-13045 Darrin Van Huff Corporate United States Los Angeles \n", - "3 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", - "4 SO-20335 Sean O'Donnell Consumer United States Fort Lauderdale \n", - "... ... ... ... ... ... \n", - "9989 TB-21400 Tom Boeckenhauer Consumer United States Miami \n", - "9990 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", - "9991 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", - "9992 DB-13060 Dave Brooks Consumer United States Costa Mesa \n", - "9993 CC-12220 Chris Cortes Consumer United States Westminster \n", - "\n", - " ... Postal Code Region Product ID Category Sub-Category \n", - "0 ... 42420 South FUR-BO-10001798 Furniture Bookcases \\\n", - "1 ... 42420 South FUR-CH-10000454 Furniture Chairs \n", - "2 ... 90036 West OFF-LA-10000240 Office Supplies Labels \n", - "3 ... 33311 South FUR-TA-10000577 Furniture Tables \n", - "4 ... 33311 South OFF-ST-10000760 Office Supplies Storage \n", - "... ... ... ... ... ... ... \n", - "9989 ... 33180 South FUR-FU-10001889 Furniture Furnishings \n", - "9990 ... 92627 West FUR-FU-10000747 Furniture Furnishings \n", - "9991 ... 92627 West TEC-PH-10003645 Technology Phones \n", - "9992 ... 92627 West OFF-PA-10004041 Office Supplies Paper \n", - "9993 ... 92683 West OFF-AP-10002684 Office Supplies Appliances \n", - "\n", - " Product Name Sales Quantity \n", - "0 Bush Somerset Collection Bookcase 261.9600 2 \\\n", - "1 Hon Deluxe Fabric Upholstered Stacking Chairs,... 731.9400 3 \n", - "2 Self-Adhesive Address Labels for Typewriters b... 14.6200 2 \n", - "3 Bretford CR4500 Series Slim Rectangular Table 957.5775 5 \n", - "4 Eldon Fold 'N Roll Cart System 22.3680 2 \n", - "... ... ... ... \n", - "9989 Ultra Door Pull Handle 25.2480 3 \n", - "9990 Tenex B1-RE Series Chair Mats for Low Pile Car... 91.9600 2 \n", - "9991 Aastra 57i VoIP phone 258.5760 2 \n", - "9992 It's Hot Message Books with Stickers, 2 3/4\" x 5\" 29.6000 4 \n", - "9993 Acco 7-Outlet Masterpiece Power Center, Wihtou... 243.1600 2 \n", - "\n", - " Discount Profit \n", - "0 0.00 41.9136 \n", - "1 0.00 219.5820 \n", - "2 0.00 6.8714 \n", - "3 0.45 -383.0310 \n", - "4 0.20 2.5164 \n", - "... ... ... \n", - "9989 0.20 4.1028 \n", - "9990 0.00 15.6332 \n", - "9991 0.20 19.3932 \n", - "9992 0.00 13.3200 \n", - "9993 0.00 72.9480 \n", - "\n", - "[9994 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "demo_data = pd.read_csv(\"../../tests/fixtures/superstore.csv\")\n", - "demo_data" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "845697f3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Segment Region \n", - "Consumer West 1672\n", - " East 1469\n", - " Central 1212\n", - "Corporate West 960\n", - " East 877\n", - "Consumer South 838\n", - "Corporate Central 673\n", - "Home Office West 571\n", - "Corporate South 510\n", - "Home Office East 502\n", - " Central 438\n", - " South 272\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "demo_data[[\"Segment\", \"Region\"]].value_counts()" - ] - }, - { - "cell_type": "markdown", - "id": "ignored-church", - "metadata": {}, - "source": [ - "### The usual Python pivot table" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "caring-hacker", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n", - "
" - ], - "text/plain": [ - "Category Furniture Office Supplies Technology All\n", - "Segment Region \n", - "Consumer Central 255 739 218 1212\n", - " East 303 888 278 1469\n", - " South 180 505 153 838\n", - " West 375 995 302 1672\n", - "Corporate Central 137 417 119 673\n", - " East 198 520 159 877\n", - " South 101 324 85 510\n", - " West 210 559 191 960\n", - "Home Office Central 89 266 83 438\n", - " East 100 304 98 502\n", - " South 51 166 55 272\n", - " West 122 343 106 571\n", - "All 2121 6026 1847 9994" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = demo_data.pivot_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Order ID\",\n", - " aggfunc=\"count\",\n", - " margins=True,\n", - ")\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "sharp-thesis", - "metadata": {}, - "source": [ - "### You __can__ make it look good in pandas __with a lot of code__" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "increasing-guinea", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
 CategoryFurnitureOffice SuppliesTechnologyAll
SegmentRegion    
ConsumerCentral2557392181212
East3038882781469
South180505153838
West3759953021672
CorporateCentral137417119673
East198520159877
South10132485510
West210559191960
Home OfficeCentral8926683438
East10030498502
South5116655272
West122343106571
All2121602618479994
\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_table_styles = [\n", - " dict(selector=\"thead\", props=[(\"border-bottom\", \"1.5pt solid black\")]),\n", - " dict(\n", - " selector=\"thead tr:last-child\", props=[(\"display\", \"None\")]\n", - " ), # Hides last row of header\n", - " dict(\n", - " selector=\".col_heading\",\n", - " props=[(\"text-align\", \"center\"), (\"vertical-align\", \"middle\")],\n", - " ),\n", - " dict(\n", - " selector=\"tbody tr\",\n", - " props=[\n", - " (\"background-color\", \"white\"),\n", - " ],\n", - " ),\n", - " dict(selector=\"tbody tr td\", props=[(\"text-align\", \"center\")]),\n", - " dict(\n", - " selector=\".row_heading\",\n", - " props=[\n", - " (\"text-align\", \"left\"),\n", - " (\"font-weight\", \"bold\"),\n", - " ],\n", - " ),\n", - "]\n", - "\n", - "\n", - "def make_borders(df):\n", - " return [\n", - " dict(\n", - " selector=f\"tbody tr:nth-child({i})\",\n", - " props=[(\"border-bottom\", \"1px solid black\")],\n", - " )\n", - " for i in df.index.get_level_values(0).value_counts().cumsum()\n", - " ]\n", - "\n", - "\n", - "df.style.set_table_styles(_table_styles + make_borders(df)).set_table_attributes(\n", - " 'style=\"border-top: 1.5pt solid black; border-bottom: 1.5pt solid black;\"'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "reliable-driving", - "metadata": {}, - "source": [ - "### The zen way: `df.zt.pretty()`" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "alert-combat", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "to_html() missing 1 required positional argument: 'buf'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/Library/Application Support/hatch/env/virtual/zentables/hVYGP2CT/dev/lib/python3.9/site-packages/IPython/core/formatters.py:344\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 342\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 344\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 346\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "File \u001b[0;32m~/Library/Application Support/hatch/env/virtual/zentables/hVYGP2CT/dev/lib/python3.9/site-packages/pandas/io/formats/style.py:383\u001b[0m, in \u001b[0;36mStyler._repr_html_\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;124;03mHooks into Jupyter notebook rich display system, which calls _repr_html_ by\u001b[39;00m\n\u001b[1;32m 380\u001b[0m \u001b[38;5;124;03mdefault if an object is returned at the end of a cell.\u001b[39;00m\n\u001b[1;32m 381\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 382\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m get_option(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstyler.render.repr\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhtml\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m--> 383\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_html\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[0;31mTypeError\u001b[0m: to_html() missing 1 required positional argument: 'buf'" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.zen.pretty(font_size=12, font_family=\"Times New Roman\")" - ] - }, - { - "cell_type": "markdown", - "id": "aerial-castle", - "metadata": {}, - "source": [ - "### Creating frequency tables with percentages with `df.zen.freq_table()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "wired-netscape", - "metadata": {}, - "outputs": [], - "source": [ - "freq_table = demo_data.zen.freq_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Order ID\",\n", - " props=\"columns\",\n", - " totals=True,\n", - " subtotals=True,\n", - " digits=1,\n", - ")\n", - "freq_table.zen.pretty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6d77aa99-0133-4283-a711-32ecc7202565", - "metadata": {}, - "outputs": [], - "source": [ - "freq_table = demo_data.zen.freq_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Order ID\",\n", - " props=\"columns\",\n", - " totals=False,\n", - " subtotals=True,\n", - " digits=1,\n", - ")\n", - "freq_table.zen.pretty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59ea1434-edf4-4a4c-b141-49f14d694f78", - "metadata": {}, - "outputs": [], - "source": [ - "freq_table = demo_data.zen.freq_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Order ID\",\n", - " props=\"columns\",\n", - " totals=True,\n", - " subtotals=False,\n", - " digits=1,\n", - ")\n", - "freq_table.zen.pretty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "50d08f60-15aa-46de-a710-79f4f2baa1d7", - "metadata": {}, - "outputs": [], - "source": [ - "freq_table = demo_data.zen.freq_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Order ID\",\n", - " props=\"columns\",\n", - " totals=False,\n", - " subtotals=False,\n", - " digits=1,\n", - ")\n", - "freq_table.zen.pretty(row_borders=[1, 20])" - ] - }, - { - "cell_type": "markdown", - "id": "c28f2d0f", - "metadata": {}, - "source": [ - "The `suppress` argument also allows for cell suppression below a certain threshold value (or `ceiling`). For specifics on how the suppression is applied, please refer to the following resource provided by the Conneticut Education Department:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2013baf5", - "metadata": {}, - "outputs": [], - "source": [ - "freq_table_suppressed = demo_data.zen.freq_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Order ID\",\n", - " props=\"columns\",\n", - " totals=True,\n", - " subtotals=True,\n", - " digits=1,\n", - " suppress=True,\n", - " low=100,\n", - " high=300,\n", - ")\n", - "freq_table_suppressed.zen.pretty()" - ] - }, - { - "cell_type": "markdown", - "id": "boxed-texture", - "metadata": {}, - "source": [ - "### Creating mean and standard deviation tables with `df.zen.mean_sd_table()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4ac6e5ce", - "metadata": {}, - "outputs": [], - "source": [ - "demo_data[[\"Category\", \"Sales\"]].iloc[:10, :].zen.pretty(row_borders=[1])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "alien-namibia", - "metadata": {}, - "outputs": [], - "source": [ - "mean_sd_table = demo_data.zen.mean_sd_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Sales\",\n", - " margins=True,\n", - " margins_name=\"All\",\n", - " submargins=True,\n", - " submargins_name=\"All Regions\",\n", - " digits=2,\n", - ")\n", - "mean_sd_table.zen.pretty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6907d4c8", - "metadata": {}, - "outputs": [], - "source": [ - "# Can also create suppressed tables\n", - "mean_sd_table = demo_data.zen.mean_sd_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Sales\",\n", - " margins=True,\n", - " margins_name=\"All\",\n", - " submargins=True,\n", - " submargins_name=\"All Regions\",\n", - " digits=2,\n", - " suppress=True,\n", - " low=1,\n", - " high=100,\n", - ")\n", - "mean_sd_table.zen.pretty()" - ] - }, - { - "cell_type": "markdown", - "id": "controlling-advertising", - "metadata": {}, - "source": [ - "### Creating any pivot table with sub-tallies with `df.zen.pivot_table()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "acc41439-4d4f-427c-bfee-93460280b4af", - "metadata": {}, - "outputs": [], - "source": [ - "mean_median_table = demo_data.zen.pivot_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Sales\",\n", - " aggfunc=[\"count\", \"mean\", \"median\"],\n", - " margins=True,\n", - " margins_name=\"All\",\n", - " submargins=True,\n", - " submargins_name=\"All Regions\",\n", - ").rename(\n", - " columns={\n", - " \"count\": \"n\",\n", - " \"mean\": \"Mean\",\n", - " \"median\": \"Median\",\n", - " }\n", - ")\n", - "mean_median_table.zen.pretty().format(precision=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "considerable-roberts", - "metadata": {}, - "outputs": [], - "source": [ - "mean_median_table = demo_data.zen.pivot_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Sales\",\n", - " aggfunc=[\"count\", \"mean\", \"median\"],\n", - " margins=True,\n", - " margins_name=\"All\",\n", - " submargins=True,\n", - " submargins_name=\"All Regions\",\n", - ").rename(\n", - " columns={\n", - " \"count\": \"n\",\n", - " \"mean\": \"Mean\",\n", - " \"median\": \"Median\",\n", - " }\n", - ")\n", - "mean_median_table.zen.pretty().format(precision=1)" - ] - }, - { - "cell_type": "markdown", - "id": "violent-gathering", - "metadata": {}, - "source": [ - "### Compare with the original Python `pivot_table()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "split-toyota", - "metadata": {}, - "outputs": [], - "source": [ - "demo_data.pivot_table(\n", - " index=[\"Segment\", \"Region\"],\n", - " columns=[\"Category\"],\n", - " values=\"Sales\",\n", - " aggfunc=[\"count\", \"mean\", \"median\"],\n", - " margins=True,\n", - " margins_name=\"All\",\n", - ").rename(\n", - " columns={\n", - " \"count\": \"n\",\n", - " \"mean\": \"Mean\",\n", - " \"median\": \"Median\",\n", - " }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5f498376-da56-4fd0-a0b8-2b5c3719a6ed", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - }, - "toc-autonumbering": true, - "toc-showtags": false - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/zentables/options.py b/src/zentables/options.py index 1387285..9e3ff6b 100644 --- a/src/zentables/options.py +++ b/src/zentables/options.py @@ -11,8 +11,7 @@ class OptionsWrapper: font_size: str = "Arial, Helvetica, sans-serif" font_family: str = "11pt" - show_index_names: bool = False - show_column_names: bool = False + hide_index_names: bool = True show_copy_button: bool = True diff --git a/src/zentables/pretty_styler.py b/src/zentables/pretty_styler.py index 3df5758..146efd7 100644 --- a/src/zentables/pretty_styler.py +++ b/src/zentables/pretty_styler.py @@ -6,10 +6,10 @@ from __future__ import annotations +import copy from typing import TYPE_CHECKING, Any, Dict, Iterable, List import pandas as pd -import pandas.core.common as com from jinja2 import ChoiceLoader, Environment, PackageLoader from pandas.io.formats.style import Styler, save_to_buffer @@ -31,6 +31,17 @@ class PrettyStyler(Styler): # Load the Jinja2 templates. Note that the "prettystyle.tpl" extends the # original template so we have to use the original styler as well. + env = Environment( + loader=ChoiceLoader( + [ + PackageLoader("zentables", "templates"), + Styler.loader, # the default templates + ] + ) + ) + + template_html_table = env.get_template("prettyhtml.tpl") + def __init__( self, data: pd.DataFrame | pd.Series, @@ -47,11 +58,10 @@ def __init__( escape: str | None = None, font_family: str | None = None, font_size: str | int | None = None, - show_index_names: bool | None = None, - show_column_names: bool | None = None, + hide_index_names: bool | None = None, show_copy_button: bool | None = None, row_borders: List[int] | None = None, - ): + ) -> None: Styler.__init__( self, data=data, @@ -69,15 +79,10 @@ def __init__( ) self._table_local_styles = _get_font_style(font_size, font_family) - self._index_names = ( - show_index_names - if show_index_names is not None - else _options.show_index_names - ) - self._column_names = ( - show_column_names - if show_column_names is not None - else _options.show_column_names + self.hide_index_names = ( + hide_index_names + if hide_index_names is not None + else _options.hide_index_names ) self._copy_button = ( show_copy_button @@ -94,54 +99,7 @@ def __init__( self.row_borders = row_borders - env = Environment( - loader=ChoiceLoader( - [ - PackageLoader("zentables", "templates"), - Styler.loader, # the default templates - ] - ) - ) - - template_html_table = env.get_template("prettyhtml.tpl") - - def render( - self, - sparse_index: bool | None = None, - sparse_columns: bool | None = None, - **kwargs, - ) -> str: - """ - Overrides the `render` method for the Styler class. - """ - - if sparse_index is None: - sparse_index = pd.get_option("styler.sparse.index") - if sparse_columns is None: - sparse_columns = pd.get_option("styler.sparse.columns") - return self._render_html( - sparse_index, - sparse_columns, - table_local_styles=self._table_local_styles, - show_copy_button=self._copy_button, - **kwargs, - ) - - def show_index_names(self): - """ - Shows the names of the index - """ - self._index_names = True - return self - - def show_column_names(self): - """ - Shows the names of the columns - """ - self._column_names = True - return self - - def hide_copy_button(self): + def hide_copy_button(self) -> PrettyStyler: """ Shows a "Copy Table" button below the rendered table. """ @@ -149,7 +107,13 @@ def hide_copy_button(self): return self def _translate( - self, sparse_index: bool, sparse_cols: bool, blank: str = " ", **kwargs + self, + sparse_index: bool, + sparse_cols: bool, + max_rows: int | None = None, + max_cols: int | None = None, + blank: str = " ", + dxs: list[dict] | None = None, ) -> Dict[str, Any]: """ Overrides the pandas method to add options to @@ -163,26 +127,16 @@ def _translate( self, sparse_index=sparse_index, sparse_cols=sparse_cols, + max_rows=max_rows, + max_cols=max_cols, blank=blank, - **kwargs, + dxs=dxs, ) ### Wrangle the header head = result["head"] - if ( - self.data.index.names - and com.any_not_none(*self.data.index.names) - and not self.hide_index_ - and not self.hide_columns_ - # The previous 4 conditions ensure there is a row with index names - # If _index_names is false, - # Then we need to pop the last row of head - and not self._index_names - ): - head.pop() - for row in head: for cell in row: if cell.get("type") == "th": @@ -254,7 +208,7 @@ def _translate( _add_style_in_element(cell, "border-bottom: 1pt solid black") # If _column_names is false, remove column names - if not self._column_names and body: + if self.hide_column_names and body: max_th_count = 0 for cell in body[0]: if cell.get("type") == "th": @@ -272,13 +226,20 @@ def _translate( def to_html( self, - buf: FilePath | WriteBuffer[str], + buf: FilePath | WriteBuffer[str] | None = None, *, table_uuid: str | None = None, table_attributes: str | None = None, + sparse_index: bool | None = None, + sparse_columns: bool | None = None, + bold_headers: bool = False, + caption: str | None = None, + max_rows: int | None = None, + max_columns: int | None = None, encoding: str | None = None, doctype_html: bool = False, exclude_styles: bool = False, + **kwargs, ) -> None: """Overrides Styler class's to_html methods for compatibility. @@ -287,24 +248,115 @@ def to_html( Used source code from https://github.com/pandas-dev/pandas/blob/master/pandas/io/formats/style.py """ + + obj = self._copy(deepcopy=True) # manipulate table_styles on obj, not self + if table_uuid: - self.set_uuid(table_uuid) + obj.set_uuid(table_uuid) if table_attributes: - self.set_table_attributes(table_attributes) + obj.set_table_attributes(table_attributes) + + if sparse_index is None: + sparse_index = pd.get_option("styler.sparse.index") + if sparse_columns is None: + sparse_columns = pd.get_option("styler.sparse.columns") + + if bold_headers: + obj.set_table_styles( + [{"selector": "th", "props": "font-weight: bold;"}], overwrite=False + ) + + if caption is not None: + obj.set_caption(caption) # Build HTML string.. - html = self.render( + html = obj._render_html( # pylint: disable=W0212 + sparse_index=sparse_index, + sparse_columns=sparse_columns, + max_rows=max_rows, + max_cols=max_columns, exclude_styles=exclude_styles, - encoding=encoding if encoding else "utf-8", + encoding=encoding or pd.get_option("styler.render.encoding"), doctype_html=doctype_html, - show_copy_button=False, # this is the only difference + # The two lines below are the only differences + table_local_styles=self._table_local_styles, + show_copy_button=self._copy_button, + **kwargs, ) return save_to_buffer( html, buf=buf, encoding=(encoding if buf is not None else None) ) + def _copy(self, deepcopy: bool = False) -> PrettyStyler: + """ + Copies a Styler, allowing for deepcopy or shallow copy + Copying a Styler aims to recreate a new Styler object which contains the same + data and styles as the original. + Data dependent attributes [copied and NOT exported]: + - formatting (._display_funcs) + - hidden index values or column values (.hidden_rows, .hidden_columns) + - tooltips + - cell_context (cell css classes) + - ctx (cell css styles) + - caption + - concatenated stylers + Non-data dependent attributes [copied and exported]: + - css + - hidden index state and hidden columns state (.hide_index_, .hide_columns_) + - table_attributes + - table_styles + - applied styles (_todo) + """ + # GH 40675 + styler = PrettyStyler( + self.data, # populates attributes 'data', 'columns', 'index' as shallow + ) + shallow = [ # simple string or boolean immutables + "hide_index_", + "hide_columns_", + "hide_column_names", + "hide_index_names", + "table_attributes", + "cell_ids", + "caption", + "uuid", + "uuid_len", + "template_latex", # also copy templates if these have been customised + "template_html_style", + "template_html_table", + "template_html", + "_table_local_styles", + "_copy_button", + ] + deep = [ # nested lists or dicts + "css", + "concatenated", + "_display_funcs", + "_display_funcs_index", + "_display_funcs_columns", + "hidden_rows", + "hidden_columns", + "ctx", + "ctx_index", + "ctx_columns", + "cell_context", + "_todo", + "table_styles", + "tooltips", + "row_borders", + ] + + for attr in shallow: + setattr(styler, attr, getattr(self, attr)) + + for attr in deep: + val = getattr(self, attr) + setattr(styler, attr, copy.deepcopy(val) if deepcopy else val) + + return styler + ################################################# # Helper functions diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_suppression.py b/tests/test_suppression.py index 1546309..c1456e0 100644 --- a/tests/test_suppression.py +++ b/tests/test_suppression.py @@ -2,7 +2,7 @@ import pandas as pd import pytest -from zentables.zentables import _do_suppression +from zentables.accessor import _do_suppression @pytest.fixture(scope="function") @@ -59,7 +59,8 @@ def test_multiple_rows(): def test_random_seed_tie_breaker(): """ - If there are several choices, then suppression should be random (i.e change depending on seed) + If there are several choices, then suppression should be random (i.e change + depending on seed) """ input_array = [ [3, 3, 3, 3, 3, 3], @@ -80,9 +81,11 @@ def test_random_seed_tie_breaker(): def test_nan_values(): """ If there are NaN values in the DataFrame, effective suppression cannot happen. - The user should be aware of the dimensions of input array, or apply appropriate `fillna()` commands. + The user should be aware of the dimensions of input array, or apply appropriate + `fillna()` commands. """ - # When the input array has mismatching lengths, pd.DataFrame automatically assumes NaN values + # When the input array has mismatching lengths, pd.DataFrame automatically assumes + # NaN values input_array = [[1, 2, 3], [100, 200]] df = pd.DataFrame(input_array) with pytest.raises(ValueError): @@ -179,8 +182,8 @@ def test_nan_in_mean_sd_table(): # verify that the number of empty assert is_nan.sum().sum() == is_null.sum().sum() == number_of_empty_groupings - ## Realizing that further development is necessary to ensure that 0 is not suppressed - ## and if this should even always be true. - suppressed_outcome_df = df.zen.mean_sd_table( + ## Realizing that further development is necessary to ensure that 0 is not + ## suppressed and if this should even always be true. + df.zen.mean_sd_table( index=["cuisine", "who"], columns="city", values="price", suppress=True, high=2 ) diff --git a/tests/test_zentables.py b/tests/test_zentables.py index 3b6a26e..6cb8fad 100644 --- a/tests/test_zentables.py +++ b/tests/test_zentables.py @@ -3,7 +3,9 @@ import pandas as pd import pytest -from zentables import zentables +from zentables.accessor import _convert_names, _swap_column_levels +from zentables.options import OptionsWrapper, _options, set_options +from zentables.pretty_styler import _get_font_style file_path = Path(__file__).parent / "fixtures" / "superstore.csv" df = pd.read_csv(file_path) @@ -26,53 +28,49 @@ def pivot(): def test__get_font_style(): + global_font_size = _options.font_size + global_font_family = _options.font_family - global_font_size = zentables._options.font_size - global_font_family = zentables._options.font_family + assert _get_font_style() == _get_font_style(global_font_size, global_font_family) - assert zentables._get_font_style() == zentables._get_font_style( - global_font_size, global_font_family - ) - - font_size_processed, font_family_processed = zentables._get_font_style() + font_size_processed, font_family_processed = _get_font_style() - assert zentables._get_font_style(font_family="Arial") == [ + assert _get_font_style(font_family="Arial") == [ font_size_processed, "font-family: Arial", ] - assert zentables._get_font_style(font_size=11) == [ + assert _get_font_style(font_size=11) == [ "font-size: 11pt", font_family_processed, ] - assert zentables._get_font_style(font_size=11, font_family="Arial") == [ + assert _get_font_style(font_size=11, font_family="Arial") == [ "font-size: 11pt", "font-family: Arial", ] - assert zentables._get_font_style(font_size="11em", font_family="Arial") == [ + assert _get_font_style(font_size="11em", font_family="Arial") == [ "font-size: 11em", "font-family: Arial", ] def test__convert_names(): - l = ["str1", "str2"] + test_list = ["str1", "str2"] - assert zentables._convert_names("str") == ["str"] - assert zentables._convert_names(l) == l - assert zentables._convert_names(pd.Series(l)) == l + assert _convert_names("str") == ["str"] + assert _convert_names(test_list) == test_list + assert _convert_names(pd.Series(test_list)) == test_list with pytest.raises(ValueError): - zentables._convert_names(l, 1) + _convert_names(test_list, 1) with pytest.raises(ValueError): - zentables._convert_names(l, 1, "Error!") + _convert_names(test_list, 1, "Error!") def test__swap_column_levels(pivot): - - pivot_swapped = zentables._swap_column_levels(pivot) + pivot_swapped = _swap_column_levels(pivot) col_levels = pivot_swapped.columns.nlevels assert col_levels == pivot.columns.nlevels @@ -92,10 +90,10 @@ def test__swap_column_levels(pivot): def test_global_set_options(monkeypatch): # Monkey patch in a new OptionsWrapper object just for this test - monkeypatch.setattr(zentables, "_options", zentables.OptionsWrapper()) + monkeypatch.setattr(_options, OptionsWrapper()) - zentables.set_options(font_size="11pt") - assert zentables._options.font_size == "11pt" + set_options(font_size="11pt") + assert _options.font_size == "11pt" with pytest.raises(KeyError): - zentables.set_options(foobar=12) + set_options(foobar=12) From 4595502c87643e7470d2c8fb37c3fe3a297b471d Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 15:58:25 -0400 Subject: [PATCH 4/9] fixed errors --- src/zentables/options.py | 4 ++-- tests/test_zentables.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/zentables/options.py b/src/zentables/options.py index 9e3ff6b..c36a2ac 100644 --- a/src/zentables/options.py +++ b/src/zentables/options.py @@ -9,8 +9,8 @@ class OptionsWrapper: """A wrapper class around a dict to provide global options functionalities.""" - font_size: str = "Arial, Helvetica, sans-serif" - font_family: str = "11pt" + font_family: str = "Arial, Helvetica, sans-serif" + font_size: str = "11pt" hide_index_names: bool = True show_copy_button: bool = True diff --git a/tests/test_zentables.py b/tests/test_zentables.py index 6cb8fad..429cd94 100644 --- a/tests/test_zentables.py +++ b/tests/test_zentables.py @@ -3,6 +3,7 @@ import pandas as pd import pytest +import zentables.options from zentables.accessor import _convert_names, _swap_column_levels from zentables.options import OptionsWrapper, _options, set_options from zentables.pretty_styler import _get_font_style @@ -90,7 +91,7 @@ def test__swap_column_levels(pivot): def test_global_set_options(monkeypatch): # Monkey patch in a new OptionsWrapper object just for this test - monkeypatch.setattr(_options, OptionsWrapper()) + monkeypatch.setattr(zentables.options, "_options", OptionsWrapper()) set_options(font_size="11pt") assert _options.font_size == "11pt" From 3c3c45a7c616de1b63087b7fd6d2fb41330c7bee Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 16:05:14 -0400 Subject: [PATCH 5/9] update github actions --- .github/workflows/run_tests.yml | 2 +- pyproject.toml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 6c68027..b3520c9 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -31,4 +31,4 @@ jobs: run: hatch run dev:black . - name: Run tests - run: poetry run py.test + run: hatch run dev:test diff --git a/pyproject.toml b/pyproject.toml index 97feebb..1befe90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,9 @@ dev = [ python = "3.9" features = ["dev"] +[tool.hatch.envs.dev.scripts] +test = "pytest" + [tool.black] target-version = ['py39'] required-version = '23.3.0' From 87346e3c10fd8ddd5d3db8aa565b046137888e79 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 16:06:43 -0400 Subject: [PATCH 6/9] added tests for python 3.10 and up --- .github/workflows/run_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index b3520c9..246bebd 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: true matrix: - python-version: [3.9, 3.10, 3.11] + python-version: [3.9, "3.10", 3.11] steps: - uses: actions/checkout@v3 From 7dfc0afc5825c526013212253e9d80c496586a35 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 16:40:38 -0400 Subject: [PATCH 7/9] add coverage test --- .github/workflows/run_tests.yml | 7 +------ pyproject.toml | 7 ++++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 246bebd..ff4e354 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -8,18 +8,13 @@ jobs: run_tests: runs-on: ubuntu-20.04 - strategy: - fail-fast: true - matrix: - python-version: [3.9, "3.10", 3.11] - steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: - python-version: ${{ matrix.python-version }} + python-version: "3.10" - name: Install hatch run: pip install --upgrade hatch diff --git a/pyproject.toml b/pyproject.toml index 1befe90..d338fec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ authors = [ { name = "The Policy Lab", email = "thepolicylab@brown.edu" }, ] maintainers = [{ name = "Paul Xu", email = "yang_xu@brown.edu" }] -requires-python = ">=3.9" +requires-python = ">3.8" readme = "README.md" keywords = ["pandas", "tables", "display", "styler"] classifiers = [ @@ -41,12 +41,14 @@ dev = [ ] [tool.hatch.envs.dev] -python = "3.9" features = ["dev"] [tool.hatch.envs.dev.scripts] test = "pytest" +[[tool.hatch.envs.dev.matrix]] +python = ["3.9", "3.10", "3.11"] + [tool.black] target-version = ['py39'] required-version = '23.3.0' @@ -169,7 +171,6 @@ exclude = [".github", "docs", "src/notebook"] [tool.mypy] ignore_missing_imports = true -python_version = "3.9" [build-system] requires = ["hatchling"] From 3556da3d485ea34345762c730ff134e7d2f2f357 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 16:43:00 -0400 Subject: [PATCH 8/9] add coverage test --- .github/workflows/run_tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index ff4e354..28a592b 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -8,13 +8,18 @@ jobs: run_tests: runs-on: ubuntu-20.04 + strategy: + fail-fast: true + matrix: + python-version: ["3.9", "3.10", "3.11"] + steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: ${{ matrix.python-version }} - name: Install hatch run: pip install --upgrade hatch From b98dfe6a9e7f2db8ac4a518e25b2a6fcf64d5b08 Mon Sep 17 00:00:00 2001 From: Paul Xu Date: Sat, 1 Apr 2023 20:37:15 -0400 Subject: [PATCH 9/9] added autofix to ruff precommit --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e12726b..946f744 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,6 +27,7 @@ repos: rev: "v0.0.257" hooks: - id: ruff + args: [--fix, --exit-non-zero-on-fix] - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.910 # Use the sha / tag you want to point at hooks: