├── .dockerignore ├── src └── medium_data_bakeoff │ ├── __init__.py │ ├── ingredients │ ├── __init__.py │ ├── vaex.py │ ├── polars.py │ ├── duckdb.py │ ├── spark.py │ ├── dask.py │ └── dask_sql.py │ ├── __main__.py │ ├── cli.py │ ├── data.py │ └── bakeoff.py ├── results ├── benchmark.png └── results.csv ├── .pre-commit-config.yaml ├── Dockerfile ├── pyproject.toml ├── LICENSE ├── .gitignore ├── README.md └── poetry.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | data/ 2 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/__main__.py: -------------------------------------------------------------------------------- 1 | from medium_data_bakeoff.cli import app 2 | 3 | app() 4 | -------------------------------------------------------------------------------- /results/benchmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/medium-data-bakeoff/main/results/benchmark.png -------------------------------------------------------------------------------- /results/results.csv: -------------------------------------------------------------------------------- 1 | Library,Time (s),multiple 2 | dask_sql,16.342824935913086,7.483061721623998 3 | duckdb,2.1839756965637207,1.0 4 | polars,3.514622211456299,1.6092771622808004 5 | spark,33.62325477600098,15.39543449540395 6 | vaex,23.067123651504517,10.561987337037888 7 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/vaex.py: -------------------------------------------------------------------------------- 1 | import glob 2 | import time 3 | 4 | import vaex 5 | 6 | 7 | def bake(dataset: str) -> float: 8 | start = time.time() 9 | df = vaex.open(dataset) 10 | res = df.groupby( 11 | by=df["station_id"], agg=[vaex.agg.mean("num_bikes_available")] 12 | ).to_pandas_df() 13 | stop = time.time() 14 | return stop - start 15 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/polars.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import polars as pl 4 | 5 | 6 | def bake(dataset: str) -> float: 7 | start = time.time() 8 | res = ( 9 | pl.scan_parquet(dataset) 10 | .groupby("station_id") 11 | .agg(pl.avg("num_bikes_available")) 12 | .collect() 13 | ) 14 | stop = time.time() 15 | return stop - start 16 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v2.3.0 4 | hooks: 5 | - id: check-yaml 6 | - id: end-of-file-fixer 7 | - id: trailing-whitespace 8 | - repo: https://github.com/psf/black 9 | rev: 22.10.0 10 | hooks: 11 | - id: black 12 | - repo: https://github.com/pycqa/isort 13 | rev: 5.10.1 14 | hooks: 15 | - id: isort 16 | args: ["--profile", "black", "--filter-files"] 17 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/duckdb.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import duckdb 4 | 5 | 6 | def bake(dataset: str) -> float: 7 | conn = duckdb.connect(":memory:") 8 | start = time.time() 9 | query = f""" 10 | SELECT 11 | station_id 12 | , AVG(num_bikes_available) 13 | FROM read_parquet('{dataset}') 14 | GROUP BY 1 15 | """ 16 | conn.execute(query) 17 | res = conn.fetchall() 18 | stop = time.time() 19 | return stop - start 20 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/spark.py: -------------------------------------------------------------------------------- 1 | import glob 2 | import time 3 | 4 | from pyspark.sql import SparkSession 5 | 6 | 7 | def bake(dataset: str) -> float: 8 | spark = SparkSession.builder.master("local").getOrCreate() 9 | paths = glob.glob(dataset) 10 | start = time.time() 11 | df = spark.read.parquet(*paths) 12 | res = df.groupBy("station_id").agg({"num_bikes_available": "avg"}).collect() 13 | stop = time.time() 14 | spark.stop() 15 | return stop - start 16 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/dask.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import dask.dataframe as dd 4 | from dask.diagnostics import ProgressBar 5 | from dask.distributed import Client, LocalCluster 6 | 7 | 8 | def bake(dataset: str) -> float: 9 | with LocalCluster() as cluster: 10 | client = Client(cluster) 11 | ProgressBar().register() 12 | start = time.time() 13 | df = dd.read_parquet(dataset, index=False) 14 | df.groupby("station_id")["num_bikes_available"].mean().compute() 15 | stop = time.time() 16 | client.close() 17 | return stop - start 18 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9-slim-buster 2 | 3 | ENV PIP_NO_CACHE_DIR=on \ 4 | PIP_DISABLE_PIP_VERSION_CHECK=on \ 5 | PIP_DEFAULT_TIMEOUT=100 \ 6 | POETRY_VIRTUALENVS_CREATE=false \ 7 | POETRY_VERSION=1.2.2 8 | 9 | WORKDIR /app 10 | 11 | RUN python -m pip install poetry==$POETRY_VERSION 12 | 13 | COPY pyproject.toml poetry.lock ./ 14 | RUN poetry export --without-hashes -f requirements.txt -o requirements.txt && \ 15 | python -m pip install -r requirements.txt 16 | 17 | COPY src ./src 18 | COPY kaggle.json /root/.kaggle/kaggle.json 19 | 20 | RUN poetry install --no-interaction --no-ansi --only-root 21 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "medium-data-bakeoff" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Ethan Rosenthal "] 6 | packages = [ 7 | { include = "medium_data_bakeoff", from = "src" }, 8 | ] 9 | 10 | [tool.poetry.dependencies] 11 | python = "3.9.*" 12 | pyspark = {version = "3.3.*", extras = ["sql"]} 13 | dask = {version = "2022.10.*", extras = ["complete"]} 14 | vaex = "4.14.*" 15 | polars = "0.14.28" 16 | duckdb = "0.5.1" 17 | kaggle = "1.5.*" 18 | loguru = "^0.6.0" 19 | dask-sql = "2022.10.*" 20 | typer = "0.7.*" 21 | 22 | [tool.poetry.dev-dependencies] 23 | black = "^22.10.0" 24 | pre-commit = "^2.20.0" 25 | 26 | [build-system] 27 | requires = ["poetry-core>=1.0.0"] 28 | build-backend = "poetry.core.masonry.api" 29 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/ingredients/dask_sql.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import dask.dataframe as dd 4 | from dask.distributed import Client, LocalCluster 5 | from dask_sql import Context 6 | 7 | 8 | def bake(dataset: str) -> float: 9 | with LocalCluster() as cluster: 10 | client = Client(cluster) 11 | context = Context() 12 | start = time.time() 13 | df = dd.read_parquet(dataset, index=False) 14 | context.create_table("bike_availability", df) 15 | res = context.sql( 16 | """ 17 | SELECT 18 | station_id 19 | , AVG(num_bikes_available) 20 | FROM bike_availability 21 | GROUP BY 1 22 | """ 23 | ) 24 | res = res.compute() 25 | client.close() 26 | stop = time.time() 27 | return stop - start 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ethan Rosenthal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/cli.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import typer 4 | 5 | app = typer.Typer(name="Medium Data Bakeoff", chain=True) 6 | 7 | DEFAULT_ROOT = Path(__file__).parent.parent.parent / "data" 8 | 9 | 10 | @app.command(help="Make the dataset for the bakeoff.") 11 | def make_dataset( 12 | root: Path = typer.Option(DEFAULT_ROOT, help="The root path to place all files."), 13 | kaggle_dataset: str = typer.Option( 14 | "rosenthal/citi-bike-stations", 15 | help="The name of the Kaggle dataset to use for benchmarking.", 16 | ), 17 | ) -> None: 18 | from medium_data_bakeoff.data import construct_dataset 19 | 20 | construct_dataset(root, kaggle_dataset) 21 | 22 | 23 | @app.command(help="Run the benchmark on the bakeoff dataset.") 24 | def bakeoff( 25 | dataset: str = typer.Option( 26 | (DEFAULT_ROOT / "parquet" / "*.parquet").as_posix(), 27 | help="The name of the dataset. Can be a wildcard string for globbing.", 28 | ), 29 | results: str = typer.Option( 30 | (DEFAULT_ROOT / "results.csv"), 31 | help="The name of the file to store the bakeoff results.", 32 | ), 33 | ) -> None: 34 | from medium_data_bakeoff.bakeoff import bakeoff 35 | 36 | bakeoff(dataset, results) 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | # PyCharm 132 | .idea/ 133 | 134 | # Mac stuff 135 | .DS_Store 136 | 137 | # Default data dir 138 | data/ 139 | 140 | # Kaggle credentials 141 | kaggle.json 142 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/data.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | import duckdb 5 | import kaggle 6 | from loguru import logger 7 | from tqdm import tqdm 8 | 9 | 10 | def csv_to_parquet(infile: str, outfile: str, sample_size=512_000) -> None: 11 | conn = duckdb.connect(":memory:") 12 | # We cannot autodetect columns due to some messiness in the data. For example, 13 | # station_id is mostly an integer except for some weird stations that have a long 14 | # UUID-esque ID. These types of stations do not appear in every file. 15 | columns = { 16 | "station_id": "VARCHAR", 17 | "num_bikes_available": "INTEGER", 18 | "num_ebikes_available": "VARCHAR", 19 | "num_bikes_disabled": "VARCHAR", 20 | "num_docks_available": "INTEGER", 21 | "num_docks_disabled": "VARCHAR", 22 | "is_installed": "VARCHAR", 23 | "is_renting": "VARCHAR", 24 | "is_returning": "VARCHAR", 25 | "station_status_last_reported": "INTEGER", 26 | "station_name": "VARCHAR", 27 | "lat": "VARCHAR", 28 | "lon": "VARCHAR", 29 | "region_id": "VARCHAR", 30 | "capacity": "VARCHAR", 31 | "has_kiosk": "VARCHAR", 32 | "station_information_last_updated": "VARCHAR", 33 | "missing_station_information": "BOOLEAN", 34 | } 35 | # Format columns correctly for the duckdb query. 36 | # Replace double-quotes with single-quotes. 37 | columns = json.dumps(columns, indent=2).replace('"', "'") 38 | query = f""" 39 | COPY ( 40 | SELECT * 41 | FROM read_csv( 42 | '{infile}', 43 | columns={columns}, 44 | sample_size={sample_size}, 45 | header=True, 46 | auto_detect=False 47 | ) 48 | ) 49 | TO '{outfile}' 50 | (FORMAT 'PARQUET'); 51 | """ 52 | conn.execute(query) 53 | 54 | 55 | def construct_dataset(root: Path, kaggle_dataset_name: str) -> None: 56 | # Download the dataset from Kaggle 57 | logger.info("Downloading {!r} dataset from kaggle.", kaggle_dataset_name) 58 | download_path = root / "csv" 59 | download_path.mkdir(parents=True, exist_ok=True) 60 | kaggle.api.dataset_download_files(kaggle_dataset_name, download_path, unzip=True) 61 | 62 | logger.info("Converting dataset from CSV to parquet.") 63 | # Convert the dataset to parquet 64 | parquet_path = root / "parquet" 65 | parquet_path.mkdir(parents=True, exist_ok=True) 66 | csvs = list(download_path.iterdir()) 67 | for csv in tqdm(csvs): 68 | outfile = parquet_path / csv.with_suffix(".parquet").name 69 | csv_to_parquet(csv.as_posix(), outfile.as_posix()) 70 | -------------------------------------------------------------------------------- /src/medium_data_bakeoff/bakeoff.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import matplotlib.pyplot as plt 4 | import pandas as pd 5 | from loguru import logger 6 | 7 | from medium_data_bakeoff.ingredients.dask import bake as bake_dask 8 | from medium_data_bakeoff.ingredients.dask_sql import bake as bake_dask_sql 9 | from medium_data_bakeoff.ingredients.duckdb import bake as bake_duckdb 10 | from medium_data_bakeoff.ingredients.polars import bake as bake_polars 11 | from medium_data_bakeoff.ingredients.spark import bake as bake_spark 12 | from medium_data_bakeoff.ingredients.vaex import bake as bake_vaex 13 | 14 | 15 | def plot_results(results: pd.DataFrame, plot_filename: str) -> None: 16 | results = results.set_index("Library").sort_values("Time (s)", ascending=False) 17 | 18 | # Make bar plot 19 | fig, ax = plt.subplots() 20 | results["Time (s)"].plot.barh(ax=ax) 21 | ax.set_title("Benchmark") 22 | ax.set_ylabel("Library") 23 | ax.set_xlabel("Time (s)") 24 | # Despine 25 | ax.spines["right"].set_visible(False) 26 | ax.spines["top"].set_visible(False) 27 | 28 | # Add multiple labels to bar plot. 29 | labels = [f"{m:.1f}X" for m in results["multiple"].tolist()] 30 | for rect, label in zip(ax.patches, labels): 31 | width = rect.get_width() 32 | ax.text( 33 | # 34 | width + 4, 35 | rect.get_y() + rect.get_height() / 2, 36 | label, 37 | ha="left", 38 | va="center", 39 | ) 40 | xmin, xmax = ax.get_xlim() 41 | # 42 | # (The label gets cut off by the axis.) 43 | ax.set_xlim(xmin, xmax + 20) 44 | fig.tight_layout() 45 | 46 | fig.savefig(plot_filename) 47 | 48 | 49 | def bakeoff(dataset: str, results_filename: str) -> None: 50 | 51 | bakeoff = {} 52 | 53 | recipe = [ 54 | # Dask was working on 2022.10.2. It got downgraded to 2022.10.0 after 55 | # installing dask-sql, and the benchmark no longer works on my machine. I think 56 | # it's running out of memory. 57 | # ("dask", bake_dask), 58 | ("dask_sql", bake_dask_sql), 59 | ("duckdb", bake_duckdb), 60 | ("polars", bake_polars), 61 | ("spark", bake_spark), 62 | ("vaex", bake_vaex), 63 | ] 64 | 65 | for name, func in recipe: 66 | logger.info("Baking {}", name) 67 | bakeoff[name] = func(dataset) 68 | logger.info( 69 | "{name} took {duration:.3f} seconds to bake.", 70 | name=name, 71 | duration=bakeoff[name], 72 | ) 73 | 74 | results = pd.DataFrame(bakeoff.items(), columns=["Library", "Time (s)"]) 75 | results["multiple"] = results["Time (s)"] / results["Time (s)"].min() 76 | results.to_csv(results_filename, index=False) 77 | print(results.sort_values("Time (s)")) 78 | 79 | plot_results(results, (Path(results_filename).parent / "benchmark.png").as_posix()) 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Medium Data Bakeoff 2 | 3 | A simple benchmark for python-based data processing libraries. 4 | 5 | Guiding Principles: 6 | 7 | - Python Only: I have no intention of using another language to process data. That said, non-Python implementations with Python bindings are perfectly fine (e.g. Polars). 8 | - Single Node: I'm not interested in benchmarking performance on clusters of multiple machines. 9 | - Simple Implementation: I'm not interested in heavily optimizing the benchmarking implementations. My target user is myself: somebody who largely uses pandas but would like to either speed up their computations or work with larger datasets than fit in memory on their machine. 10 | 11 | 12 | Libraries: 13 | 14 | - ~~[Dask](https://www.dask.org/)~~ Not currently working on my machine (OOM) 15 | - [dask-sql](https://dask-sql.readthedocs.io/en/latest/) 16 | - [DuckDB](https://duckdb.org/) 17 | - [Polars](https://www.pola.rs/) 18 | - [Spark](https://spark.apache.org/docs/latest/api/python/) 19 | - [Vaex](https://vaex.io/) 20 | 21 | Results: 22 | 23 | The following results are from running the benchmark locally on my desktop that has: 24 | - Intel Core i7-7820X 3.6 GHz 8-core Processor (16 virtual cores, I think) 25 | - 32 GB DDR4-3200 RAM. 26 | - Ubuntu 16.04 😱 27 | 28 | ![results/benchmark.png](results/benchmark.png) 29 | 30 | # The Bakeoff 31 | 32 | ## Dataset 33 | 34 | The New York City bikeshare, [Citi Bike](https://citibikenyc.com/homepage), has a real time, [public API](https://ride.citibikenyc.com/system-data). This API conforms to the [General Bikeshare Feed Specification](https://github.com/NABSA/gbfs/blob/master/gbfs.md). As such, this API contains information about the number of bikes and docks available at every station in NYC. 35 | 36 | Since 2016, I have been pinging the public API every 2 minutes and storing the results. The benchmark dataset contains all of these results, from 8/15/2016 - 12/8/2021. The dataset consists of a collection of 50 CSVs stored [here](https://www.kaggle.com/datasets/rosenthal/citi-bike-stations) on Kaggle. The CSVs total almost 27 GB in size. The files are partitioned by station. 37 | 38 | For the benchmark, I first convert the CSVs to snappy-compressed parquet files. This reduces the dataset down to ~4GB in size on disk. 39 | 40 | # Computation 41 | 42 | To start, the bakeoff computation is extremely simple. It's almost "word count". I calculate the average number of bikes available at each station across the full time period of the dataset. In SQL, this is basically 43 | 44 | ```mysql 45 | SELECT 46 | station_id 47 | , AVG(num_bikes_available) 48 | FROM citi_bike_dataset 49 | GROUP BY 1 50 | ``` 51 | 52 | Since the files are partitioned by station, predicate pushdown likely plays a large benefit for this computation. 53 | 54 | # Setup 55 | 56 | ## Kaggle 57 | 58 | The benchmark data is stored [here](https://www.kaggle.com/datasets/rosenthal/citi-bike-stations) in Kaggle. In order to access this data, you must create a Kaggle account and obtain an API key. You can obtain a key by clicking on your icon on the upper right of the homepage, clicking Account, and then clicking to create a new API token. This will allow you to download a `kaggle.json` credentials file which contains the API key. 59 | 60 | ## Local Setup 61 | 62 | Move the `kaggle.json` file that you downloaded during the Kaggle setup to `~/.kaggle/kaggle.json`. 63 | 64 | Install poetry, and then use poetry to install the `medium-data-bakeoff` library: 65 | 66 | ```commandline 67 | poetry install 68 | ``` 69 | 70 | `medium-data-bakeoff` comes with a CLI that you can explore. Run the following for more info about the CLI. 71 | 72 | ```commandline 73 | python -m medium_data_bakeoff --help 74 | ``` 75 | 76 | Run the following to run the full benchmark: 77 | 78 | ```commandline 79 | python -m medium_data_bakeoff make-dataset bakeoff 80 | ``` 81 | 82 | ## Docker setup 83 | 84 | _Note: I haven't fully tested this!_ 85 | 86 | Copy your `kaggle.json` file that you created during the Kaggle setup to the root directory of this repo. 87 | 88 | Build the docker container and then run the benchmark: 89 | 90 | ```commandline 91 | docker build -t medium-data-bakeoff . 92 | docker run -t medium-data-bakeoff python -m medium_data_bakeoff bakeoff 93 | ``` 94 | 95 | Copy the results out of the container 96 | 97 | ```commandline 98 | docker cp medium-data-bakeoff:/app/data/results.* . 99 | ``` 100 | 101 | # TODO: 102 | 103 | - Run benchmarks on AWS for reproducibility. 104 | - Run benchmarks as a function of number of CPUs. 105 | - Run benchmarks as a function of number of parquet files. 106 | - Add some harder benchmark computations. 107 | - Add more libraries (e.g. `cudf`). 108 | - Benchmark memory usage. 109 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "anyio" 3 | version = "3.6.2" 4 | description = "High level compatibility layer for multiple asynchronous event loop implementations" 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.6.2" 8 | 9 | [package.dependencies] 10 | idna = ">=2.8" 11 | sniffio = ">=1.1" 12 | 13 | [package.extras] 14 | doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] 15 | test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] 16 | trio = ["trio (>=0.16,<0.22)"] 17 | 18 | [[package]] 19 | name = "aplus" 20 | version = "0.11.0" 21 | description = "UNKNOWN" 22 | category = "main" 23 | optional = false 24 | python-versions = "*" 25 | 26 | [[package]] 27 | name = "appnope" 28 | version = "0.1.3" 29 | description = "Disable App Nap on macOS >= 10.9" 30 | category = "main" 31 | optional = false 32 | python-versions = "*" 33 | 34 | [[package]] 35 | name = "astropy" 36 | version = "5.1.1" 37 | description = "Astronomy and astrophysics core library" 38 | category = "main" 39 | optional = false 40 | python-versions = ">=3.8" 41 | 42 | [package.dependencies] 43 | numpy = ">=1.18" 44 | packaging = ">=19.0" 45 | pyerfa = ">=2.0" 46 | PyYAML = ">=3.13" 47 | 48 | [package.extras] 49 | all = ["scipy (>=1.3)", "matplotlib (>=3.1,!=3.4.0,!=3.5.2)", "certifi", "dask", "h5py", "pyarrow (>=5.0.0)", "beautifulsoup4", "html5lib", "bleach", "pandas", "sortedcontainers", "pytz", "jplephem", "mpmath", "asdf (>=2.10.0)", "bottleneck", "ipython (>=4.2)", "pytest (>=7.0)", "typing-extensions (>=3.10.0.1)"] 50 | docs = ["sphinx (<4)", "sphinx-astropy (>=1.6)", "pytest (>=7.0)", "scipy (>=1.3)", "matplotlib (>=3.1,!=3.4.0,!=3.5.2)", "sphinx-changelog (>=1.2.0)", "Jinja2 (<3.1)"] 51 | recommended = ["scipy (>=1.3)", "matplotlib (>=3.1,!=3.4.0,!=3.5.2)"] 52 | test = ["pytest (>=7.0)", "pytest-doctestplus (>=0.12)", "pytest-astropy-header (>=0.2.1)", "pytest-astropy (>=0.10)", "pytest-xdist"] 53 | test_all = ["pytest (>=7.0)", "pytest-doctestplus (>=0.12)", "pytest-astropy-header (>=0.2.1)", "pytest-astropy (>=0.10)", "pytest-xdist", "objgraph", "ipython (>=4.2)", "coverage", "skyfield (>=1.20)", "sgp4 (>=2.3)", "pooch"] 54 | 55 | [[package]] 56 | name = "asttokens" 57 | version = "2.1.0" 58 | description = "Annotate AST trees with source code positions" 59 | category = "main" 60 | optional = false 61 | python-versions = "*" 62 | 63 | [package.dependencies] 64 | six = "*" 65 | 66 | [package.extras] 67 | test = ["astroid (<=2.5.3)", "pytest"] 68 | 69 | [[package]] 70 | name = "backcall" 71 | version = "0.2.0" 72 | description = "Specifications for callback functions passed in to an API" 73 | category = "main" 74 | optional = false 75 | python-versions = "*" 76 | 77 | [[package]] 78 | name = "black" 79 | version = "22.10.0" 80 | description = "The uncompromising code formatter." 81 | category = "dev" 82 | optional = false 83 | python-versions = ">=3.7" 84 | 85 | [package.dependencies] 86 | click = ">=8.0.0" 87 | mypy-extensions = ">=0.4.3" 88 | pathspec = ">=0.9.0" 89 | platformdirs = ">=2" 90 | tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} 91 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} 92 | 93 | [package.extras] 94 | colorama = ["colorama (>=0.4.3)"] 95 | d = ["aiohttp (>=3.7.4)"] 96 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 97 | uvloop = ["uvloop (>=0.15.2)"] 98 | 99 | [[package]] 100 | name = "blake3" 101 | version = "0.3.1" 102 | description = "Python bindings for the Rust blake3 crate" 103 | category = "main" 104 | optional = false 105 | python-versions = "*" 106 | 107 | [[package]] 108 | name = "bokeh" 109 | version = "3.0.1" 110 | description = "Interactive plots and applications in the browser from Python" 111 | category = "main" 112 | optional = false 113 | python-versions = ">=3.8" 114 | 115 | [package.dependencies] 116 | contourpy = ">=1" 117 | Jinja2 = ">=2.9" 118 | numpy = ">=1.11.3" 119 | packaging = ">=16.8" 120 | pandas = ">=1.2" 121 | pillow = ">=7.1.0" 122 | PyYAML = ">=3.10" 123 | tornado = ">=5.1" 124 | xyzservices = ">=2021.09.1" 125 | 126 | [[package]] 127 | name = "bqplot" 128 | version = "0.12.36" 129 | description = "Interactive plotting for the Jupyter notebook, using d3.js and ipywidgets." 130 | category = "main" 131 | optional = false 132 | python-versions = ">=3.6" 133 | 134 | [package.dependencies] 135 | ipywidgets = ">=7.5.0,<9" 136 | numpy = ">=1.10.4,<2.0.0" 137 | pandas = ">=1.0.0,<2.0.0" 138 | traitlets = ">=4.3.0" 139 | traittypes = ">=0.0.6" 140 | 141 | [[package]] 142 | name = "branca" 143 | version = "0.6.0" 144 | description = "Generate complex HTML+JS pages with Python" 145 | category = "main" 146 | optional = false 147 | python-versions = ">=3.7" 148 | 149 | [package.dependencies] 150 | jinja2 = "*" 151 | 152 | [[package]] 153 | name = "cachetools" 154 | version = "5.2.0" 155 | description = "Extensible memoizing collections and decorators" 156 | category = "main" 157 | optional = false 158 | python-versions = "~=3.7" 159 | 160 | [[package]] 161 | name = "certifi" 162 | version = "2022.9.24" 163 | description = "Python package for providing Mozilla's CA Bundle." 164 | category = "main" 165 | optional = false 166 | python-versions = ">=3.6" 167 | 168 | [[package]] 169 | name = "cffi" 170 | version = "1.15.1" 171 | description = "Foreign Function Interface for Python calling C code." 172 | category = "main" 173 | optional = false 174 | python-versions = "*" 175 | 176 | [package.dependencies] 177 | pycparser = "*" 178 | 179 | [[package]] 180 | name = "cfgv" 181 | version = "3.3.1" 182 | description = "Validate configuration and produce human readable error messages." 183 | category = "dev" 184 | optional = false 185 | python-versions = ">=3.6.1" 186 | 187 | [[package]] 188 | name = "charset-normalizer" 189 | version = "2.1.1" 190 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 191 | category = "main" 192 | optional = false 193 | python-versions = ">=3.6.0" 194 | 195 | [package.extras] 196 | unicode_backport = ["unicodedata2"] 197 | 198 | [[package]] 199 | name = "click" 200 | version = "8.1.3" 201 | description = "Composable command line interface toolkit" 202 | category = "main" 203 | optional = false 204 | python-versions = ">=3.7" 205 | 206 | [package.dependencies] 207 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 208 | 209 | [[package]] 210 | name = "cloudpickle" 211 | version = "2.2.0" 212 | description = "Extended pickling support for Python objects" 213 | category = "main" 214 | optional = false 215 | python-versions = ">=3.6" 216 | 217 | [[package]] 218 | name = "colorama" 219 | version = "0.4.6" 220 | description = "Cross-platform colored terminal text." 221 | category = "main" 222 | optional = false 223 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 224 | 225 | [[package]] 226 | name = "commonmark" 227 | version = "0.9.1" 228 | description = "Python parser for the CommonMark Markdown spec" 229 | category = "main" 230 | optional = false 231 | python-versions = "*" 232 | 233 | [package.extras] 234 | test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] 235 | 236 | [[package]] 237 | name = "contourpy" 238 | version = "1.0.6" 239 | description = "Python library for calculating contours of 2D quadrilateral grids" 240 | category = "main" 241 | optional = false 242 | python-versions = ">=3.7" 243 | 244 | [package.dependencies] 245 | numpy = ">=1.16" 246 | 247 | [package.extras] 248 | bokeh = ["bokeh", "selenium"] 249 | docs = ["docutils (<0.18)", "sphinx (<=5.2.0)", "sphinx-rtd-theme"] 250 | test = ["pytest", "matplotlib", "pillow", "flake8", "isort"] 251 | test-minimal = ["pytest"] 252 | test-no-codebase = ["pytest", "matplotlib", "pillow"] 253 | 254 | [[package]] 255 | name = "cycler" 256 | version = "0.11.0" 257 | description = "Composable style cycles" 258 | category = "main" 259 | optional = false 260 | python-versions = ">=3.6" 261 | 262 | [[package]] 263 | name = "dask" 264 | version = "2022.10.0" 265 | description = "Parallel PyData with Task Scheduling" 266 | category = "main" 267 | optional = false 268 | python-versions = ">=3.8" 269 | 270 | [package.dependencies] 271 | bokeh = {version = ">=2.4.2", optional = true, markers = "extra == \"complete\""} 272 | cloudpickle = ">=1.1.1" 273 | distributed = {version = "2022.10.0", optional = true, markers = "extra == \"complete\""} 274 | fsspec = ">=0.6.0" 275 | jinja2 = {version = "*", optional = true, markers = "extra == \"complete\""} 276 | numpy = {version = ">=1.18", optional = true, markers = "extra == \"complete\""} 277 | packaging = ">=20.0" 278 | pandas = {version = ">=1.0", optional = true, markers = "extra == \"complete\""} 279 | partd = ">=0.3.10" 280 | pyyaml = ">=5.3.1" 281 | toolz = ">=0.8.2" 282 | 283 | [package.extras] 284 | array = ["numpy (>=1.18)"] 285 | complete = ["bokeh (>=2.4.2)", "distributed (==2022.10.0)", "jinja2", "numpy (>=1.18)", "pandas (>=1.0)"] 286 | dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"] 287 | diagnostics = ["bokeh (>=2.4.2)", "jinja2"] 288 | distributed = ["distributed (==2022.10.0)"] 289 | test = ["pandas", "pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"] 290 | 291 | [[package]] 292 | name = "dask-sql" 293 | version = "2022.10.1" 294 | description = "SQL query layer for Dask" 295 | category = "main" 296 | optional = false 297 | python-versions = ">=3.8" 298 | 299 | [package.dependencies] 300 | dask = {version = ">=2022.3.0,<=2022.10.0", extras = ["dataframe", "distributed"]} 301 | fastapi = ">=0.69.0" 302 | nest-asyncio = "*" 303 | pandas = ">=1.4.0" 304 | prompt-toolkit = ">=3.0.8" 305 | pygments = ">=2.7.1" 306 | tabulate = "*" 307 | tzlocal = ">=2.1" 308 | uvicorn = ">=0.13.4" 309 | 310 | [package.extras] 311 | dev = ["pytest (>=6.0.1)", "pytest-cov (>=2.10.1)", "mock (>=4.0.3)", "sphinx (>=3.2.1)", "pyarrow (>=6.0.1)", "dask-ml (>=2022.1.22)", "scikit-learn (>=1.0.0)", "intake (>=0.6.0)", "pre-commit", "black (==22.3.0)", "isort (==5.7.0)"] 312 | fugue = ["fugue (>=0.7.0)"] 313 | 314 | [[package]] 315 | name = "debugpy" 316 | version = "1.6.3" 317 | description = "An implementation of the Debug Adapter Protocol for Python" 318 | category = "main" 319 | optional = false 320 | python-versions = ">=3.7" 321 | 322 | [[package]] 323 | name = "decorator" 324 | version = "5.1.1" 325 | description = "Decorators for Humans" 326 | category = "main" 327 | optional = false 328 | python-versions = ">=3.5" 329 | 330 | [[package]] 331 | name = "distlib" 332 | version = "0.3.6" 333 | description = "Distribution utilities" 334 | category = "dev" 335 | optional = false 336 | python-versions = "*" 337 | 338 | [[package]] 339 | name = "distributed" 340 | version = "2022.10.0" 341 | description = "Distributed scheduler for Dask" 342 | category = "main" 343 | optional = false 344 | python-versions = ">=3.8" 345 | 346 | [package.dependencies] 347 | click = ">=6.6" 348 | cloudpickle = ">=1.5.0" 349 | dask = "2022.10.0" 350 | jinja2 = "*" 351 | locket = ">=1.0.0" 352 | msgpack = ">=0.6.0" 353 | packaging = ">=20.0" 354 | psutil = ">=5.0" 355 | pyyaml = "*" 356 | sortedcontainers = "<2.0.0 || >2.0.0,<2.0.1 || >2.0.1" 357 | tblib = ">=1.6.0" 358 | toolz = ">=0.8.2" 359 | tornado = ">=6.0.3,<6.2" 360 | urllib3 = "*" 361 | zict = ">=0.1.3" 362 | 363 | [[package]] 364 | name = "duckdb" 365 | version = "0.5.1" 366 | description = "DuckDB embedded database" 367 | category = "main" 368 | optional = false 369 | python-versions = "*" 370 | 371 | [package.dependencies] 372 | numpy = ">=1.14" 373 | 374 | [[package]] 375 | name = "entrypoints" 376 | version = "0.4" 377 | description = "Discover and load entry points from installed packages." 378 | category = "main" 379 | optional = false 380 | python-versions = ">=3.6" 381 | 382 | [[package]] 383 | name = "executing" 384 | version = "1.2.0" 385 | description = "Get the currently executing AST node of a frame, and other information" 386 | category = "main" 387 | optional = false 388 | python-versions = "*" 389 | 390 | [package.extras] 391 | tests = ["asttokens", "pytest", "littleutils", "rich"] 392 | 393 | [[package]] 394 | name = "fastapi" 395 | version = "0.86.0" 396 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 397 | category = "main" 398 | optional = false 399 | python-versions = ">=3.7" 400 | 401 | [package.dependencies] 402 | pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" 403 | starlette = "0.20.4" 404 | 405 | [package.extras] 406 | all = ["email-validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.19.0)"] 407 | dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "uvicorn[standard] (>=0.12.0,<0.19.0)"] 408 | doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.7.0)"] 409 | test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.8.0)", "coverage[toml] (>=6.5.0,<7.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<=1.4.41)", "types-orjson (==3.6.2)", "types-ujson (==5.5.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] 410 | 411 | [[package]] 412 | name = "filelock" 413 | version = "3.8.0" 414 | description = "A platform independent file lock." 415 | category = "main" 416 | optional = false 417 | python-versions = ">=3.7" 418 | 419 | [package.extras] 420 | docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"] 421 | testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"] 422 | 423 | [[package]] 424 | name = "fonttools" 425 | version = "4.38.0" 426 | description = "Tools to manipulate font files" 427 | category = "main" 428 | optional = false 429 | python-versions = ">=3.7" 430 | 431 | [package.extras] 432 | all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "uharfbuzz (>=0.23.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=14.0.0)", "xattr"] 433 | graphite = ["lz4 (>=1.7.4.2)"] 434 | interpolatable = ["scipy", "munkres"] 435 | lxml = ["lxml (>=4.0,<5)"] 436 | pathops = ["skia-pathops (>=0.5.0)"] 437 | plot = ["matplotlib"] 438 | repacker = ["uharfbuzz (>=0.23.0)"] 439 | symfont = ["sympy"] 440 | type1 = ["xattr"] 441 | ufo = ["fs (>=2.2.0,<3)"] 442 | unicode = ["unicodedata2 (>=14.0.0)"] 443 | woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] 444 | 445 | [[package]] 446 | name = "frozendict" 447 | version = "2.3.4" 448 | description = "A simple immutable dictionary" 449 | category = "main" 450 | optional = false 451 | python-versions = ">=3.6" 452 | 453 | [[package]] 454 | name = "fsspec" 455 | version = "2022.11.0" 456 | description = "File-system specification" 457 | category = "main" 458 | optional = false 459 | python-versions = ">=3.7" 460 | 461 | [package.extras] 462 | abfs = ["adlfs"] 463 | adl = ["adlfs"] 464 | arrow = ["pyarrow (>=1)"] 465 | dask = ["dask", "distributed"] 466 | dropbox = ["dropboxdrivefs", "requests", "dropbox"] 467 | entrypoints = ["importlib-metadata"] 468 | fuse = ["fusepy"] 469 | gcs = ["gcsfs"] 470 | git = ["pygit2"] 471 | github = ["requests"] 472 | gs = ["gcsfs"] 473 | gui = ["panel"] 474 | hdfs = ["pyarrow (>=1)"] 475 | http = ["requests", "aiohttp (!=4.0.0a0,!=4.0.0a1)"] 476 | libarchive = ["libarchive-c"] 477 | oci = ["ocifs"] 478 | s3 = ["s3fs"] 479 | sftp = ["paramiko"] 480 | smb = ["smbprotocol"] 481 | ssh = ["paramiko"] 482 | tqdm = ["tqdm"] 483 | 484 | [[package]] 485 | name = "future" 486 | version = "0.18.2" 487 | description = "Clean single-source support for Python 3 and 2" 488 | category = "main" 489 | optional = false 490 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 491 | 492 | [[package]] 493 | name = "h11" 494 | version = "0.14.0" 495 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 496 | category = "main" 497 | optional = false 498 | python-versions = ">=3.7" 499 | 500 | [[package]] 501 | name = "h5py" 502 | version = "3.7.0" 503 | description = "Read and write HDF5 files from Python" 504 | category = "main" 505 | optional = false 506 | python-versions = ">=3.7" 507 | 508 | [package.dependencies] 509 | numpy = ">=1.14.5" 510 | 511 | [[package]] 512 | name = "heapdict" 513 | version = "1.0.1" 514 | description = "a heap with decrease-key and increase-key operations" 515 | category = "main" 516 | optional = false 517 | python-versions = "*" 518 | 519 | [[package]] 520 | name = "httptools" 521 | version = "0.5.0" 522 | description = "A collection of framework independent HTTP protocol utils." 523 | category = "main" 524 | optional = false 525 | python-versions = ">=3.5.0" 526 | 527 | [package.extras] 528 | test = ["Cython (>=0.29.24,<0.30.0)"] 529 | 530 | [[package]] 531 | name = "identify" 532 | version = "2.5.8" 533 | description = "File identification library for Python" 534 | category = "dev" 535 | optional = false 536 | python-versions = ">=3.7" 537 | 538 | [package.extras] 539 | license = ["ukkonen"] 540 | 541 | [[package]] 542 | name = "idna" 543 | version = "3.4" 544 | description = "Internationalized Domain Names in Applications (IDNA)" 545 | category = "main" 546 | optional = false 547 | python-versions = ">=3.5" 548 | 549 | [[package]] 550 | name = "ipydatawidgets" 551 | version = "4.3.2" 552 | description = "A set of widgets to help facilitate reuse of large datasets across widgets" 553 | category = "main" 554 | optional = false 555 | python-versions = ">=3.7" 556 | 557 | [package.dependencies] 558 | ipywidgets = ">=7.0.0" 559 | numpy = "*" 560 | traittypes = ">=0.2.0" 561 | 562 | [package.extras] 563 | docs = ["sphinx", "recommonmark", "sphinx-rtd-theme"] 564 | test = ["pytest (>=4)", "pytest-cov", "nbval (>=0.9.2)"] 565 | 566 | [[package]] 567 | name = "ipykernel" 568 | version = "6.17.1" 569 | description = "IPython Kernel for Jupyter" 570 | category = "main" 571 | optional = false 572 | python-versions = ">=3.8" 573 | 574 | [package.dependencies] 575 | appnope = {version = "*", markers = "platform_system == \"Darwin\""} 576 | debugpy = ">=1.0" 577 | ipython = ">=7.23.1" 578 | jupyter-client = ">=6.1.12" 579 | matplotlib-inline = ">=0.1" 580 | nest-asyncio = "*" 581 | packaging = "*" 582 | psutil = "*" 583 | pyzmq = ">=17" 584 | tornado = ">=6.1" 585 | traitlets = ">=5.1.0" 586 | 587 | [package.extras] 588 | docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt"] 589 | test = ["flaky", "ipyparallel", "pre-commit", "pytest-cov", "pytest-timeout", "pytest (>=7.0)"] 590 | 591 | [[package]] 592 | name = "ipyleaflet" 593 | version = "0.17.2" 594 | description = "A Jupyter widget for dynamic Leaflet maps" 595 | category = "main" 596 | optional = false 597 | python-versions = ">=3.7" 598 | 599 | [package.dependencies] 600 | branca = ">=0.5.0" 601 | ipywidgets = ">=7.6.0,<9" 602 | traittypes = ">=0.2.1,<3" 603 | xyzservices = ">=2021.8.1" 604 | 605 | [[package]] 606 | name = "ipympl" 607 | version = "0.9.2" 608 | description = "Matplotlib Jupyter Extension" 609 | category = "main" 610 | optional = false 611 | python-versions = "*" 612 | 613 | [package.dependencies] 614 | ipython = "<9" 615 | ipython-genutils = "*" 616 | ipywidgets = ">=7.6.0,<9" 617 | matplotlib = ">=3.4.0,<4" 618 | numpy = "*" 619 | pillow = "*" 620 | traitlets = "<6" 621 | 622 | [package.extras] 623 | docs = ["myst-nb", "Sphinx (>=1.5)", "sphinx-copybutton", "sphinx-thebe", "sphinx-togglebutton", "sphinx-book-theme"] 624 | 625 | [[package]] 626 | name = "ipython" 627 | version = "8.6.0" 628 | description = "IPython: Productive Interactive Computing" 629 | category = "main" 630 | optional = false 631 | python-versions = ">=3.8" 632 | 633 | [package.dependencies] 634 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 635 | backcall = "*" 636 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 637 | decorator = "*" 638 | jedi = ">=0.16" 639 | matplotlib-inline = "*" 640 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 641 | pickleshare = "*" 642 | prompt-toolkit = ">3.0.1,<3.1.0" 643 | pygments = ">=2.4.0" 644 | stack-data = "*" 645 | traitlets = ">=5" 646 | 647 | [package.extras] 648 | all = ["black", "ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.20)", "pandas", "trio"] 649 | black = ["black"] 650 | doc = ["ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath"] 651 | kernel = ["ipykernel"] 652 | nbconvert = ["nbconvert"] 653 | nbformat = ["nbformat"] 654 | notebook = ["ipywidgets", "notebook"] 655 | parallel = ["ipyparallel"] 656 | qtconsole = ["qtconsole"] 657 | test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] 658 | test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.20)", "pandas", "trio"] 659 | 660 | [[package]] 661 | name = "ipython-genutils" 662 | version = "0.2.0" 663 | description = "Vestigial utilities from IPython" 664 | category = "main" 665 | optional = false 666 | python-versions = "*" 667 | 668 | [[package]] 669 | name = "ipyvolume" 670 | version = "0.5.2" 671 | description = "IPython widget for rendering 3d volumes" 672 | category = "main" 673 | optional = false 674 | python-versions = "*" 675 | 676 | [package.dependencies] 677 | ipywebrtc = "*" 678 | ipywidgets = ">=7.5" 679 | numpy = "*" 680 | Pillow = "*" 681 | pythreejs = ">=1.0.0" 682 | requests = "*" 683 | traitlets = "*" 684 | traittypes = "*" 685 | 686 | [[package]] 687 | name = "ipyvue" 688 | version = "1.8.0" 689 | description = "Jupyter widgets base for Vue libraries" 690 | category = "main" 691 | optional = false 692 | python-versions = "*" 693 | 694 | [package.dependencies] 695 | ipywidgets = ">=7.0.0" 696 | 697 | [package.extras] 698 | dev = ["pre-commit"] 699 | 700 | [[package]] 701 | name = "ipyvuetify" 702 | version = "1.8.4" 703 | description = "Jupyter widgets based on vuetify UI components" 704 | category = "main" 705 | optional = false 706 | python-versions = "*" 707 | 708 | [package.dependencies] 709 | ipyvue = ">=1.5,<2" 710 | 711 | [[package]] 712 | name = "ipywebrtc" 713 | version = "0.6.0" 714 | description = "WebRTC for Jupyter notebook/lab" 715 | category = "main" 716 | optional = false 717 | python-versions = "*" 718 | 719 | [[package]] 720 | name = "ipywidgets" 721 | version = "8.0.2" 722 | description = "Jupyter interactive widgets" 723 | category = "main" 724 | optional = false 725 | python-versions = ">=3.7" 726 | 727 | [package.dependencies] 728 | ipykernel = ">=4.5.1" 729 | ipython = ">=6.1.0" 730 | jupyterlab-widgets = ">=3.0,<4.0" 731 | traitlets = ">=4.3.1" 732 | widgetsnbextension = ">=4.0,<5.0" 733 | 734 | [package.extras] 735 | test = ["jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] 736 | 737 | [[package]] 738 | name = "jedi" 739 | version = "0.18.1" 740 | description = "An autocompletion tool for Python that can be used for text editors." 741 | category = "main" 742 | optional = false 743 | python-versions = ">=3.6" 744 | 745 | [package.dependencies] 746 | parso = ">=0.8.0,<0.9.0" 747 | 748 | [package.extras] 749 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 750 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] 751 | 752 | [[package]] 753 | name = "jinja2" 754 | version = "3.1.2" 755 | description = "A very fast and expressive template engine." 756 | category = "main" 757 | optional = false 758 | python-versions = ">=3.7" 759 | 760 | [package.dependencies] 761 | MarkupSafe = ">=2.0" 762 | 763 | [package.extras] 764 | i18n = ["Babel (>=2.7)"] 765 | 766 | [[package]] 767 | name = "jupyter-client" 768 | version = "7.3.4" 769 | description = "Jupyter protocol implementation and client libraries" 770 | category = "main" 771 | optional = false 772 | python-versions = ">=3.7" 773 | 774 | [package.dependencies] 775 | entrypoints = "*" 776 | jupyter-core = ">=4.9.2" 777 | nest-asyncio = ">=1.5.4" 778 | python-dateutil = ">=2.8.2" 779 | pyzmq = ">=23.0" 780 | tornado = ">=6.0" 781 | traitlets = "*" 782 | 783 | [package.extras] 784 | doc = ["ipykernel", "myst-parser", "sphinx-rtd-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt"] 785 | test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] 786 | 787 | [[package]] 788 | name = "jupyter-core" 789 | version = "5.0.0" 790 | description = "Jupyter core package. A base package on which Jupyter projects rely." 791 | category = "main" 792 | optional = false 793 | python-versions = ">=3.8" 794 | 795 | [package.dependencies] 796 | platformdirs = "*" 797 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} 798 | traitlets = "*" 799 | 800 | [package.extras] 801 | test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] 802 | 803 | [[package]] 804 | name = "jupyterlab-widgets" 805 | version = "3.0.3" 806 | description = "Jupyter interactive widgets for JupyterLab" 807 | category = "main" 808 | optional = false 809 | python-versions = ">=3.7" 810 | 811 | [[package]] 812 | name = "kaggle" 813 | version = "1.5.12" 814 | description = "Kaggle API" 815 | category = "main" 816 | optional = false 817 | python-versions = "*" 818 | 819 | [package.dependencies] 820 | certifi = "*" 821 | python-dateutil = "*" 822 | python-slugify = "*" 823 | requests = "*" 824 | six = ">=1.10" 825 | tqdm = "*" 826 | urllib3 = "*" 827 | 828 | [[package]] 829 | name = "kiwisolver" 830 | version = "1.4.4" 831 | description = "A fast implementation of the Cassowary constraint solver" 832 | category = "main" 833 | optional = false 834 | python-versions = ">=3.7" 835 | 836 | [[package]] 837 | name = "llvmlite" 838 | version = "0.39.1" 839 | description = "lightweight wrapper around basic LLVM functionality" 840 | category = "main" 841 | optional = false 842 | python-versions = ">=3.7" 843 | 844 | [[package]] 845 | name = "locket" 846 | version = "1.0.0" 847 | description = "File-based locks for Python on Linux and Windows" 848 | category = "main" 849 | optional = false 850 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 851 | 852 | [[package]] 853 | name = "loguru" 854 | version = "0.6.0" 855 | description = "Python logging made (stupidly) simple" 856 | category = "main" 857 | optional = false 858 | python-versions = ">=3.5" 859 | 860 | [package.dependencies] 861 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} 862 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} 863 | 864 | [package.extras] 865 | dev = ["colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "black (>=19.10b0)", "isort (>=5.1.1)", "Sphinx (>=4.1.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)"] 866 | 867 | [[package]] 868 | name = "markupsafe" 869 | version = "2.1.1" 870 | description = "Safely add untrusted strings to HTML/XML markup." 871 | category = "main" 872 | optional = false 873 | python-versions = ">=3.7" 874 | 875 | [[package]] 876 | name = "matplotlib" 877 | version = "3.6.2" 878 | description = "Python plotting package" 879 | category = "main" 880 | optional = false 881 | python-versions = ">=3.8" 882 | 883 | [package.dependencies] 884 | contourpy = ">=1.0.1" 885 | cycler = ">=0.10" 886 | fonttools = ">=4.22.0" 887 | kiwisolver = ">=1.0.1" 888 | numpy = ">=1.19" 889 | packaging = ">=20.0" 890 | pillow = ">=6.2.0" 891 | pyparsing = ">=2.2.1" 892 | python-dateutil = ">=2.7" 893 | setuptools_scm = ">=7" 894 | 895 | [[package]] 896 | name = "matplotlib-inline" 897 | version = "0.1.6" 898 | description = "Inline Matplotlib backend for Jupyter" 899 | category = "main" 900 | optional = false 901 | python-versions = ">=3.5" 902 | 903 | [package.dependencies] 904 | traitlets = "*" 905 | 906 | [[package]] 907 | name = "msgpack" 908 | version = "1.0.4" 909 | description = "MessagePack serializer" 910 | category = "main" 911 | optional = false 912 | python-versions = "*" 913 | 914 | [[package]] 915 | name = "mypy-extensions" 916 | version = "0.4.3" 917 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 918 | category = "dev" 919 | optional = false 920 | python-versions = "*" 921 | 922 | [[package]] 923 | name = "nest-asyncio" 924 | version = "1.5.6" 925 | description = "Patch asyncio to allow nested event loops" 926 | category = "main" 927 | optional = false 928 | python-versions = ">=3.5" 929 | 930 | [[package]] 931 | name = "nodeenv" 932 | version = "1.7.0" 933 | description = "Node.js virtual environment builder" 934 | category = "dev" 935 | optional = false 936 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" 937 | 938 | [[package]] 939 | name = "numba" 940 | version = "0.56.4" 941 | description = "compiling Python code using LLVM" 942 | category = "main" 943 | optional = false 944 | python-versions = ">=3.7" 945 | 946 | [package.dependencies] 947 | llvmlite = ">=0.39.0dev0,<0.40" 948 | numpy = ">=1.18,<1.24" 949 | 950 | [[package]] 951 | name = "numpy" 952 | version = "1.23.4" 953 | description = "NumPy is the fundamental package for array computing with Python." 954 | category = "main" 955 | optional = false 956 | python-versions = ">=3.8" 957 | 958 | [[package]] 959 | name = "packaging" 960 | version = "21.3" 961 | description = "Core utilities for Python packages" 962 | category = "main" 963 | optional = false 964 | python-versions = ">=3.6" 965 | 966 | [package.dependencies] 967 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 968 | 969 | [[package]] 970 | name = "pandas" 971 | version = "1.5.1" 972 | description = "Powerful data structures for data analysis, time series, and statistics" 973 | category = "main" 974 | optional = false 975 | python-versions = ">=3.8" 976 | 977 | [package.dependencies] 978 | numpy = {version = ">=1.20.3", markers = "python_version < \"3.10\""} 979 | python-dateutil = ">=2.8.1" 980 | pytz = ">=2020.1" 981 | 982 | [package.extras] 983 | test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] 984 | 985 | [[package]] 986 | name = "parso" 987 | version = "0.8.3" 988 | description = "A Python Parser" 989 | category = "main" 990 | optional = false 991 | python-versions = ">=3.6" 992 | 993 | [package.extras] 994 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 995 | testing = ["docopt", "pytest (<6.0.0)"] 996 | 997 | [[package]] 998 | name = "partd" 999 | version = "1.3.0" 1000 | description = "Appendable key-value storage" 1001 | category = "main" 1002 | optional = false 1003 | python-versions = ">=3.7" 1004 | 1005 | [package.dependencies] 1006 | locket = "*" 1007 | toolz = "*" 1008 | 1009 | [package.extras] 1010 | complete = ["numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq", "blosc"] 1011 | 1012 | [[package]] 1013 | name = "pathspec" 1014 | version = "0.10.2" 1015 | description = "Utility library for gitignore style pattern matching of file paths." 1016 | category = "dev" 1017 | optional = false 1018 | python-versions = ">=3.7" 1019 | 1020 | [[package]] 1021 | name = "pexpect" 1022 | version = "4.8.0" 1023 | description = "Pexpect allows easy control of interactive console applications." 1024 | category = "main" 1025 | optional = false 1026 | python-versions = "*" 1027 | 1028 | [package.dependencies] 1029 | ptyprocess = ">=0.5" 1030 | 1031 | [[package]] 1032 | name = "pickleshare" 1033 | version = "0.7.5" 1034 | description = "Tiny 'shelve'-like database with concurrency support" 1035 | category = "main" 1036 | optional = false 1037 | python-versions = "*" 1038 | 1039 | [[package]] 1040 | name = "pillow" 1041 | version = "9.3.0" 1042 | description = "Python Imaging Library (Fork)" 1043 | category = "main" 1044 | optional = false 1045 | python-versions = ">=3.7" 1046 | 1047 | [package.extras] 1048 | docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] 1049 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 1050 | 1051 | [[package]] 1052 | name = "platformdirs" 1053 | version = "2.5.4" 1054 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 1055 | category = "main" 1056 | optional = false 1057 | python-versions = ">=3.7" 1058 | 1059 | [package.extras] 1060 | docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.19.4)", "sphinx (>=5.3)"] 1061 | test = ["appdirs (==1.4.4)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2)"] 1062 | 1063 | [[package]] 1064 | name = "polars" 1065 | version = "0.14.28" 1066 | description = "Blazingly fast DataFrame library" 1067 | category = "main" 1068 | optional = false 1069 | python-versions = ">=3.7" 1070 | 1071 | [package.dependencies] 1072 | typing_extensions = {version = ">=4.0.0", markers = "python_version < \"3.10\""} 1073 | 1074 | [package.extras] 1075 | xlsx2csv = ["xlsx2csv (>=0.8.0)"] 1076 | numpy = ["numpy (>=1.16.0)"] 1077 | fsspec = ["fsspec"] 1078 | connectorx = ["connectorx"] 1079 | pyarrow = ["pyarrow (>=4.0.0)"] 1080 | timezone = ["backports.zoneinfo", "tzdata"] 1081 | all = ["polars"] 1082 | pandas = ["pyarrow (>=4.0.0)", "pandas"] 1083 | matplotlib = ["matplotlib"] 1084 | 1085 | [[package]] 1086 | name = "pre-commit" 1087 | version = "2.20.0" 1088 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 1089 | category = "dev" 1090 | optional = false 1091 | python-versions = ">=3.7" 1092 | 1093 | [package.dependencies] 1094 | cfgv = ">=2.0.0" 1095 | identify = ">=1.0.0" 1096 | nodeenv = ">=0.11.1" 1097 | pyyaml = ">=5.1" 1098 | toml = "*" 1099 | virtualenv = ">=20.0.8" 1100 | 1101 | [[package]] 1102 | name = "progressbar2" 1103 | version = "4.2.0" 1104 | description = "A Python Progressbar library to provide visual (yet text based) progress to long running operations." 1105 | category = "main" 1106 | optional = false 1107 | python-versions = ">=3.7.0" 1108 | 1109 | [package.dependencies] 1110 | python-utils = ">=3.0.0" 1111 | 1112 | [package.extras] 1113 | docs = ["sphinx (>=1.8.5)"] 1114 | tests = ["flake8 (>=3.7.7)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "pytest-mypy", "freezegun (>=0.3.11)", "sphinx (>=1.8.5)"] 1115 | 1116 | [[package]] 1117 | name = "prompt-toolkit" 1118 | version = "3.0.32" 1119 | description = "Library for building powerful interactive command lines in Python" 1120 | category = "main" 1121 | optional = false 1122 | python-versions = ">=3.6.2" 1123 | 1124 | [package.dependencies] 1125 | wcwidth = "*" 1126 | 1127 | [[package]] 1128 | name = "psutil" 1129 | version = "5.9.4" 1130 | description = "Cross-platform lib for process and system monitoring in Python." 1131 | category = "main" 1132 | optional = false 1133 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1134 | 1135 | [package.extras] 1136 | test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] 1137 | 1138 | [[package]] 1139 | name = "ptyprocess" 1140 | version = "0.7.0" 1141 | description = "Run a subprocess in a pseudo terminal" 1142 | category = "main" 1143 | optional = false 1144 | python-versions = "*" 1145 | 1146 | [[package]] 1147 | name = "pure-eval" 1148 | version = "0.2.2" 1149 | description = "Safely evaluate AST nodes without side effects" 1150 | category = "main" 1151 | optional = false 1152 | python-versions = "*" 1153 | 1154 | [package.extras] 1155 | tests = ["pytest"] 1156 | 1157 | [[package]] 1158 | name = "py" 1159 | version = "1.11.0" 1160 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 1161 | category = "main" 1162 | optional = false 1163 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 1164 | 1165 | [[package]] 1166 | name = "py4j" 1167 | version = "0.10.9.5" 1168 | description = "Enables Python programs to dynamically access arbitrary Java objects" 1169 | category = "main" 1170 | optional = false 1171 | python-versions = "*" 1172 | 1173 | [[package]] 1174 | name = "pyarrow" 1175 | version = "10.0.0" 1176 | description = "Python library for Apache Arrow" 1177 | category = "main" 1178 | optional = false 1179 | python-versions = ">=3.7" 1180 | 1181 | [package.dependencies] 1182 | numpy = ">=1.16.6" 1183 | 1184 | [[package]] 1185 | name = "pycparser" 1186 | version = "2.21" 1187 | description = "C parser in Python" 1188 | category = "main" 1189 | optional = false 1190 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1191 | 1192 | [[package]] 1193 | name = "pydantic" 1194 | version = "1.10.2" 1195 | description = "Data validation and settings management using python type hints" 1196 | category = "main" 1197 | optional = false 1198 | python-versions = ">=3.7" 1199 | 1200 | [package.dependencies] 1201 | typing-extensions = ">=4.1.0" 1202 | 1203 | [package.extras] 1204 | dotenv = ["python-dotenv (>=0.10.4)"] 1205 | email = ["email-validator (>=1.0.3)"] 1206 | 1207 | [[package]] 1208 | name = "pyerfa" 1209 | version = "2.0.0.1" 1210 | description = "Python bindings for ERFA" 1211 | category = "main" 1212 | optional = false 1213 | python-versions = ">=3.7" 1214 | 1215 | [package.dependencies] 1216 | numpy = ">=1.17" 1217 | 1218 | [package.extras] 1219 | docs = ["sphinx-astropy (>=1.3)"] 1220 | test = ["pytest", "pytest-doctestplus (>=0.7)"] 1221 | 1222 | [[package]] 1223 | name = "pygments" 1224 | version = "2.13.0" 1225 | description = "Pygments is a syntax highlighting package written in Python." 1226 | category = "main" 1227 | optional = false 1228 | python-versions = ">=3.6" 1229 | 1230 | [package.extras] 1231 | plugins = ["importlib-metadata"] 1232 | 1233 | [[package]] 1234 | name = "pyparsing" 1235 | version = "3.0.9" 1236 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 1237 | category = "main" 1238 | optional = false 1239 | python-versions = ">=3.6.8" 1240 | 1241 | [package.extras] 1242 | diagrams = ["railroad-diagrams", "jinja2"] 1243 | 1244 | [[package]] 1245 | name = "pyspark" 1246 | version = "3.3.1" 1247 | description = "Apache Spark Python API" 1248 | category = "main" 1249 | optional = false 1250 | python-versions = ">=3.7" 1251 | 1252 | [package.dependencies] 1253 | pandas = {version = ">=1.0.5", optional = true, markers = "extra == \"sql\""} 1254 | py4j = "0.10.9.5" 1255 | pyarrow = {version = ">=1.0.0", optional = true, markers = "extra == \"sql\""} 1256 | 1257 | [package.extras] 1258 | ml = ["numpy (>=1.15)"] 1259 | mllib = ["numpy (>=1.15)"] 1260 | pandas_on_spark = ["numpy (>=1.15)", "pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] 1261 | sql = ["pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] 1262 | 1263 | [[package]] 1264 | name = "python-dateutil" 1265 | version = "2.8.2" 1266 | description = "Extensions to the standard Python datetime module" 1267 | category = "main" 1268 | optional = false 1269 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 1270 | 1271 | [package.dependencies] 1272 | six = ">=1.5" 1273 | 1274 | [[package]] 1275 | name = "python-dotenv" 1276 | version = "0.21.0" 1277 | description = "Read key-value pairs from a .env file and set them as environment variables" 1278 | category = "main" 1279 | optional = false 1280 | python-versions = ">=3.7" 1281 | 1282 | [package.extras] 1283 | cli = ["click (>=5.0)"] 1284 | 1285 | [[package]] 1286 | name = "python-slugify" 1287 | version = "6.1.2" 1288 | description = "A Python slugify application that also handles Unicode" 1289 | category = "main" 1290 | optional = false 1291 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 1292 | 1293 | [package.dependencies] 1294 | text-unidecode = ">=1.3" 1295 | 1296 | [package.extras] 1297 | unidecode = ["Unidecode (>=1.1.1)"] 1298 | 1299 | [[package]] 1300 | name = "python-utils" 1301 | version = "3.4.5" 1302 | description = "Python Utils is a module with some convenient utilities not included with the standard Python install" 1303 | category = "main" 1304 | optional = false 1305 | python-versions = ">3.6.0" 1306 | 1307 | [package.extras] 1308 | docs = ["mock", "sphinx", "python-utils"] 1309 | loguru = ["loguru"] 1310 | tests = ["flake8", "pytest", "pytest-cov", "pytest-mypy", "pytest-asyncio", "sphinx", "types-setuptools", "loguru"] 1311 | 1312 | [[package]] 1313 | name = "pythreejs" 1314 | version = "2.4.1" 1315 | description = "Interactive 3D graphics for the Jupyter Notebook and JupyterLab, using Three.js and Jupyter Widgets." 1316 | category = "main" 1317 | optional = false 1318 | python-versions = ">=3.7" 1319 | 1320 | [package.dependencies] 1321 | ipydatawidgets = ">=1.1.1" 1322 | ipywidgets = ">=7.2.1" 1323 | numpy = "*" 1324 | traitlets = "*" 1325 | 1326 | [package.extras] 1327 | docs = ["sphinx (>=1.5)", "nbsphinx (>=0.2.13)", "nbsphinx-link", "sphinx-rtd-theme"] 1328 | examples = ["scipy", "matplotlib", "scikit-image", "ipywebrtc"] 1329 | test = ["nbval", "pytest-check-links", "numpy (>=1.14)"] 1330 | 1331 | [[package]] 1332 | name = "pytz" 1333 | version = "2022.6" 1334 | description = "World timezone definitions, modern and historical" 1335 | category = "main" 1336 | optional = false 1337 | python-versions = "*" 1338 | 1339 | [[package]] 1340 | name = "pytz-deprecation-shim" 1341 | version = "0.1.0.post0" 1342 | description = "Shims to make deprecation of pytz easier" 1343 | category = "main" 1344 | optional = false 1345 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1346 | 1347 | [package.dependencies] 1348 | tzdata = {version = "*", markers = "python_version >= \"3.6\""} 1349 | 1350 | [[package]] 1351 | name = "pywin32" 1352 | version = "305" 1353 | description = "Python for Window Extensions" 1354 | category = "main" 1355 | optional = false 1356 | python-versions = "*" 1357 | 1358 | [[package]] 1359 | name = "pyyaml" 1360 | version = "6.0" 1361 | description = "YAML parser and emitter for Python" 1362 | category = "main" 1363 | optional = false 1364 | python-versions = ">=3.6" 1365 | 1366 | [[package]] 1367 | name = "pyzmq" 1368 | version = "24.0.1" 1369 | description = "Python bindings for 0MQ" 1370 | category = "main" 1371 | optional = false 1372 | python-versions = ">=3.6" 1373 | 1374 | [package.dependencies] 1375 | cffi = {version = "*", markers = "implementation_name == \"pypy\""} 1376 | py = {version = "*", markers = "implementation_name == \"pypy\""} 1377 | 1378 | [[package]] 1379 | name = "requests" 1380 | version = "2.28.1" 1381 | description = "Python HTTP for Humans." 1382 | category = "main" 1383 | optional = false 1384 | python-versions = ">=3.7, <4" 1385 | 1386 | [package.dependencies] 1387 | certifi = ">=2017.4.17" 1388 | charset-normalizer = ">=2,<3" 1389 | idna = ">=2.5,<4" 1390 | urllib3 = ">=1.21.1,<1.27" 1391 | 1392 | [package.extras] 1393 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1394 | use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] 1395 | 1396 | [[package]] 1397 | name = "rich" 1398 | version = "12.6.0" 1399 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1400 | category = "main" 1401 | optional = false 1402 | python-versions = ">=3.6.3,<4.0.0" 1403 | 1404 | [package.dependencies] 1405 | commonmark = ">=0.9.0,<0.10.0" 1406 | pygments = ">=2.6.0,<3.0.0" 1407 | 1408 | [package.extras] 1409 | jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] 1410 | 1411 | [[package]] 1412 | name = "setuptools-scm" 1413 | version = "7.0.5" 1414 | description = "the blessed package to manage your versions by scm tags" 1415 | category = "main" 1416 | optional = false 1417 | python-versions = ">=3.7" 1418 | 1419 | [package.dependencies] 1420 | packaging = ">=20.0" 1421 | tomli = ">=1.0.0" 1422 | typing-extensions = "*" 1423 | 1424 | [package.extras] 1425 | test = ["pytest (>=6.2)", "virtualenv (>20)"] 1426 | toml = ["setuptools (>=42)"] 1427 | 1428 | [[package]] 1429 | name = "six" 1430 | version = "1.16.0" 1431 | description = "Python 2 and 3 compatibility utilities" 1432 | category = "main" 1433 | optional = false 1434 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1435 | 1436 | [[package]] 1437 | name = "sniffio" 1438 | version = "1.3.0" 1439 | description = "Sniff out which async library your code is running under" 1440 | category = "main" 1441 | optional = false 1442 | python-versions = ">=3.7" 1443 | 1444 | [[package]] 1445 | name = "sortedcontainers" 1446 | version = "2.4.0" 1447 | description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" 1448 | category = "main" 1449 | optional = false 1450 | python-versions = "*" 1451 | 1452 | [[package]] 1453 | name = "stack-data" 1454 | version = "0.6.1" 1455 | description = "Extract data from python stack frames and tracebacks for informative displays" 1456 | category = "main" 1457 | optional = false 1458 | python-versions = "*" 1459 | 1460 | [package.dependencies] 1461 | asttokens = ">=2.1.0" 1462 | executing = ">=1.2.0" 1463 | pure-eval = "*" 1464 | 1465 | [package.extras] 1466 | tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] 1467 | 1468 | [[package]] 1469 | name = "starlette" 1470 | version = "0.20.4" 1471 | description = "The little ASGI library that shines." 1472 | category = "main" 1473 | optional = false 1474 | python-versions = ">=3.7" 1475 | 1476 | [package.dependencies] 1477 | anyio = ">=3.4.0,<5" 1478 | typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} 1479 | 1480 | [package.extras] 1481 | full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] 1482 | 1483 | [[package]] 1484 | name = "tabulate" 1485 | version = "0.9.0" 1486 | description = "Pretty-print tabular data" 1487 | category = "main" 1488 | optional = false 1489 | python-versions = ">=3.7" 1490 | 1491 | [package.extras] 1492 | widechars = ["wcwidth"] 1493 | 1494 | [[package]] 1495 | name = "tblib" 1496 | version = "1.7.0" 1497 | description = "Traceback serialization library." 1498 | category = "main" 1499 | optional = false 1500 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 1501 | 1502 | [[package]] 1503 | name = "text-unidecode" 1504 | version = "1.3" 1505 | description = "The most basic Text::Unidecode port" 1506 | category = "main" 1507 | optional = false 1508 | python-versions = "*" 1509 | 1510 | [[package]] 1511 | name = "toml" 1512 | version = "0.10.2" 1513 | description = "Python Library for Tom's Obvious, Minimal Language" 1514 | category = "dev" 1515 | optional = false 1516 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 1517 | 1518 | [[package]] 1519 | name = "tomli" 1520 | version = "2.0.1" 1521 | description = "A lil' TOML parser" 1522 | category = "main" 1523 | optional = false 1524 | python-versions = ">=3.7" 1525 | 1526 | [[package]] 1527 | name = "toolz" 1528 | version = "0.12.0" 1529 | description = "List processing tools and functional utilities" 1530 | category = "main" 1531 | optional = false 1532 | python-versions = ">=3.5" 1533 | 1534 | [[package]] 1535 | name = "tornado" 1536 | version = "6.1" 1537 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 1538 | category = "main" 1539 | optional = false 1540 | python-versions = ">= 3.5" 1541 | 1542 | [[package]] 1543 | name = "tqdm" 1544 | version = "4.64.1" 1545 | description = "Fast, Extensible Progress Meter" 1546 | category = "main" 1547 | optional = false 1548 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 1549 | 1550 | [package.dependencies] 1551 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 1552 | 1553 | [package.extras] 1554 | dev = ["py-make (>=0.1.0)", "twine", "wheel"] 1555 | notebook = ["ipywidgets (>=6)"] 1556 | slack = ["slack-sdk"] 1557 | telegram = ["requests"] 1558 | 1559 | [[package]] 1560 | name = "traitlets" 1561 | version = "5.5.0" 1562 | description = "" 1563 | category = "main" 1564 | optional = false 1565 | python-versions = ">=3.7" 1566 | 1567 | [package.extras] 1568 | docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] 1569 | test = ["pre-commit", "pytest"] 1570 | 1571 | [[package]] 1572 | name = "traittypes" 1573 | version = "0.2.1" 1574 | description = "Scipy trait types" 1575 | category = "main" 1576 | optional = false 1577 | python-versions = "*" 1578 | 1579 | [package.dependencies] 1580 | traitlets = ">=4.2.2" 1581 | 1582 | [package.extras] 1583 | test = ["numpy", "pandas", "xarray", "pytest"] 1584 | 1585 | [[package]] 1586 | name = "typer" 1587 | version = "0.7.0" 1588 | description = "Typer, build great CLIs. Easy to code. Based on Python type hints." 1589 | category = "main" 1590 | optional = false 1591 | python-versions = ">=3.6" 1592 | 1593 | [package.dependencies] 1594 | click = ">=7.1.1,<9.0.0" 1595 | 1596 | [package.extras] 1597 | all = ["colorama (>=0.4.3,<0.5.0)", "shellingham (>=1.3.0,<2.0.0)", "rich (>=10.11.0,<13.0.0)"] 1598 | dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] 1599 | doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "pillow (>=9.3.0,<10.0.0)", "cairosvg (>=2.5.2,<3.0.0)"] 1600 | test = ["shellingham (>=1.3.0,<2.0.0)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "coverage (>=6.2,<7.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "mypy (==0.910)", "black (>=22.3.0,<23.0.0)", "isort (>=5.0.6,<6.0.0)", "rich (>=10.11.0,<13.0.0)"] 1601 | 1602 | [[package]] 1603 | name = "typing-extensions" 1604 | version = "4.4.0" 1605 | description = "Backported and Experimental Type Hints for Python 3.7+" 1606 | category = "main" 1607 | optional = false 1608 | python-versions = ">=3.7" 1609 | 1610 | [[package]] 1611 | name = "tzdata" 1612 | version = "2022.6" 1613 | description = "Provider of IANA time zone data" 1614 | category = "main" 1615 | optional = false 1616 | python-versions = ">=2" 1617 | 1618 | [[package]] 1619 | name = "tzlocal" 1620 | version = "4.2" 1621 | description = "tzinfo object for the local timezone" 1622 | category = "main" 1623 | optional = false 1624 | python-versions = ">=3.6" 1625 | 1626 | [package.dependencies] 1627 | pytz-deprecation-shim = "*" 1628 | tzdata = {version = "*", markers = "platform_system == \"Windows\""} 1629 | 1630 | [package.extras] 1631 | devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"] 1632 | test = ["pytest-mock (>=3.3)", "pytest (>=4.3)"] 1633 | 1634 | [[package]] 1635 | name = "urllib3" 1636 | version = "1.26.12" 1637 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1638 | category = "main" 1639 | optional = false 1640 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" 1641 | 1642 | [package.extras] 1643 | brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] 1644 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] 1645 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1646 | 1647 | [[package]] 1648 | name = "uvicorn" 1649 | version = "0.19.0" 1650 | description = "The lightning-fast ASGI server." 1651 | category = "main" 1652 | optional = false 1653 | python-versions = ">=3.7" 1654 | 1655 | [package.dependencies] 1656 | click = ">=7.0" 1657 | colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} 1658 | h11 = ">=0.8" 1659 | httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} 1660 | python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} 1661 | pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} 1662 | uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} 1663 | watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} 1664 | websockets = {version = ">=10.0", optional = true, markers = "extra == \"standard\""} 1665 | 1666 | [package.extras] 1667 | standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] 1668 | 1669 | [[package]] 1670 | name = "uvloop" 1671 | version = "0.17.0" 1672 | description = "Fast implementation of asyncio event loop on top of libuv" 1673 | category = "main" 1674 | optional = false 1675 | python-versions = ">=3.7" 1676 | 1677 | [package.extras] 1678 | dev = ["Cython (>=0.29.32,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=22.0.0,<22.1.0)", "mypy (>=0.800)", "aiohttp"] 1679 | docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] 1680 | test = ["flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=22.0.0,<22.1.0)", "mypy (>=0.800)", "Cython (>=0.29.32,<0.30.0)", "aiohttp"] 1681 | 1682 | [[package]] 1683 | name = "vaex" 1684 | version = "4.14.0" 1685 | description = "Out-of-Core DataFrames to visualize and explore big tabular datasets" 1686 | category = "main" 1687 | optional = false 1688 | python-versions = "*" 1689 | 1690 | [package.dependencies] 1691 | vaex-astro = ">=0.9.2,<0.10" 1692 | vaex-core = ">=4.14.0,<4.15" 1693 | vaex-hdf5 = ">=0.13.0,<0.14" 1694 | vaex-jupyter = ">=0.8.0,<0.9" 1695 | vaex-ml = ">=0.18.0,<0.19" 1696 | vaex-server = ">=0.8.1,<0.9" 1697 | vaex-viz = ">=0.5.4,<0.6" 1698 | 1699 | [[package]] 1700 | name = "vaex-astro" 1701 | version = "0.9.2" 1702 | description = "Astronomy related transformations and FITS file support" 1703 | category = "main" 1704 | optional = false 1705 | python-versions = "*" 1706 | 1707 | [package.dependencies] 1708 | astropy = "*" 1709 | vaex-core = ">=4.5.0,<5" 1710 | 1711 | [[package]] 1712 | name = "vaex-core" 1713 | version = "4.14.0" 1714 | description = "Core of vaex" 1715 | category = "main" 1716 | optional = false 1717 | python-versions = "*" 1718 | 1719 | [package.dependencies] 1720 | aplus = "*" 1721 | blake3 = "*" 1722 | cloudpickle = "*" 1723 | dask = "!=2022.4.0" 1724 | filelock = "*" 1725 | frozendict = "!=2.2.0" 1726 | future = ">=0.15.2" 1727 | nest-asyncio = ">=1.3.3" 1728 | numpy = ">=1.16" 1729 | pandas = "*" 1730 | progressbar2 = "*" 1731 | pyarrow = ">=5.0.0" 1732 | pydantic = ">=1.8.0" 1733 | pyyaml = "*" 1734 | requests = "*" 1735 | rich = "*" 1736 | six = "*" 1737 | tabulate = ">=0.8.3" 1738 | 1739 | [package.extras] 1740 | all = ["gcsfs (>=0.6.2)", "s3fs"] 1741 | 1742 | [[package]] 1743 | name = "vaex-hdf5" 1744 | version = "0.13.0" 1745 | description = "hdf5 file support for vaex" 1746 | category = "main" 1747 | optional = false 1748 | python-versions = "*" 1749 | 1750 | [package.dependencies] 1751 | h5py = ">=2.9" 1752 | vaex-core = ">=4.0.0,<5" 1753 | 1754 | [[package]] 1755 | name = "vaex-jupyter" 1756 | version = "0.8.0" 1757 | description = "Jupyter notebook and Jupyter lab support for vaex" 1758 | category = "main" 1759 | optional = false 1760 | python-versions = "*" 1761 | 1762 | [package.dependencies] 1763 | bqplot = ">=0.10.1" 1764 | ipyleaflet = "*" 1765 | ipympl = "*" 1766 | ipyvolume = ">=0.4" 1767 | ipyvuetify = ">=1.2.2,<2" 1768 | vaex-core = ">=4.7.0,<5" 1769 | vaex-viz = "*" 1770 | xarray = "*" 1771 | 1772 | [[package]] 1773 | name = "vaex-ml" 1774 | version = "0.18.0" 1775 | description = "Machine learning support for vaex" 1776 | category = "main" 1777 | optional = false 1778 | python-versions = "*" 1779 | 1780 | [package.dependencies] 1781 | jinja2 = "*" 1782 | numba = "*" 1783 | traitlets = "*" 1784 | vaex-core = ">=4.8.0,<5" 1785 | 1786 | [package.extras] 1787 | all = ["tensorflow (>=2.1.0)", "tensorflow-io (>=0.12.0)"] 1788 | 1789 | [[package]] 1790 | name = "vaex-server" 1791 | version = "0.8.1" 1792 | description = "Webserver and client for vaex for a remote dataset" 1793 | category = "main" 1794 | optional = false 1795 | python-versions = "*" 1796 | 1797 | [package.dependencies] 1798 | cachetools = "*" 1799 | fastapi = "*" 1800 | tornado = ">4.1" 1801 | uvicorn = {version = "*", extras = ["standard"]} 1802 | vaex-core = ">=4.7.0,<5" 1803 | 1804 | [[package]] 1805 | name = "vaex-viz" 1806 | version = "0.5.4" 1807 | description = "Visualization for vaex" 1808 | category = "main" 1809 | optional = false 1810 | python-versions = "*" 1811 | 1812 | [package.dependencies] 1813 | matplotlib = ">=1.3.1" 1814 | pillow = "*" 1815 | vaex-core = ">=4.0.0,<5" 1816 | 1817 | [[package]] 1818 | name = "virtualenv" 1819 | version = "20.16.7" 1820 | description = "Virtual Python Environment builder" 1821 | category = "dev" 1822 | optional = false 1823 | python-versions = ">=3.6" 1824 | 1825 | [package.dependencies] 1826 | distlib = ">=0.3.6,<1" 1827 | filelock = ">=3.4.1,<4" 1828 | platformdirs = ">=2.4,<3" 1829 | 1830 | [package.extras] 1831 | docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] 1832 | testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] 1833 | 1834 | [[package]] 1835 | name = "watchfiles" 1836 | version = "0.18.1" 1837 | description = "Simple, modern and high performance file watching and code reload in python." 1838 | category = "main" 1839 | optional = false 1840 | python-versions = ">=3.7" 1841 | 1842 | [package.dependencies] 1843 | anyio = ">=3.0.0" 1844 | 1845 | [[package]] 1846 | name = "wcwidth" 1847 | version = "0.2.5" 1848 | description = "Measures the displayed width of unicode strings in a terminal" 1849 | category = "main" 1850 | optional = false 1851 | python-versions = "*" 1852 | 1853 | [[package]] 1854 | name = "websockets" 1855 | version = "10.4" 1856 | description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" 1857 | category = "main" 1858 | optional = false 1859 | python-versions = ">=3.7" 1860 | 1861 | [[package]] 1862 | name = "widgetsnbextension" 1863 | version = "4.0.3" 1864 | description = "Jupyter interactive widgets for Jupyter Notebook" 1865 | category = "main" 1866 | optional = false 1867 | python-versions = ">=3.7" 1868 | 1869 | [[package]] 1870 | name = "win32-setctime" 1871 | version = "1.1.0" 1872 | description = "A small Python utility to set file creation time on Windows" 1873 | category = "main" 1874 | optional = false 1875 | python-versions = ">=3.5" 1876 | 1877 | [package.extras] 1878 | dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] 1879 | 1880 | [[package]] 1881 | name = "xarray" 1882 | version = "2022.11.0" 1883 | description = "N-D labeled arrays and datasets in Python" 1884 | category = "main" 1885 | optional = false 1886 | python-versions = ">=3.8" 1887 | 1888 | [package.dependencies] 1889 | numpy = ">=1.20" 1890 | packaging = ">=21.0" 1891 | pandas = ">=1.3" 1892 | 1893 | [package.extras] 1894 | accel = ["scipy", "bottleneck", "numbagg", "flox"] 1895 | complete = ["netcdf4", "h5netcdf", "scipy", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "bottleneck", "numbagg", "flox", "dask", "matplotlib", "seaborn", "nc-time-axis", "pydap"] 1896 | docs = ["netcdf4", "h5netcdf", "scipy", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "bottleneck", "numbagg", "flox", "dask", "matplotlib", "seaborn", "nc-time-axis", "sphinx-autosummary-accessors", "sphinx-rtd-theme", "ipython", "ipykernel", "jupyter-client", "nbsphinx", "scanpydoc", "pydap"] 1897 | io = ["netcdf4", "h5netcdf", "scipy", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "pydap"] 1898 | parallel = ["dask"] 1899 | viz = ["matplotlib", "seaborn", "nc-time-axis"] 1900 | 1901 | [[package]] 1902 | name = "xyzservices" 1903 | version = "2022.9.0" 1904 | description = "Source of XYZ tiles providers" 1905 | category = "main" 1906 | optional = false 1907 | python-versions = ">=3.7" 1908 | 1909 | [[package]] 1910 | name = "zict" 1911 | version = "2.2.0" 1912 | description = "Mutable mapping tools" 1913 | category = "main" 1914 | optional = false 1915 | python-versions = ">=3.7" 1916 | 1917 | [package.dependencies] 1918 | heapdict = "*" 1919 | 1920 | [metadata] 1921 | lock-version = "1.1" 1922 | python-versions = "3.9.*" 1923 | content-hash = "9af4f1f778b3bd3142ed501ec49514380fcc98d6c95b7362999e3f07f0fe5586" 1924 | 1925 | [metadata.files] 1926 | anyio = [] 1927 | aplus = [] 1928 | appnope = [ 1929 | {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, 1930 | {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, 1931 | ] 1932 | astropy = [] 1933 | asttokens = [] 1934 | backcall = [ 1935 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 1936 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 1937 | ] 1938 | black = [] 1939 | blake3 = [] 1940 | bokeh = [] 1941 | bqplot = [] 1942 | branca = [] 1943 | cachetools = [] 1944 | certifi = [] 1945 | cffi = [] 1946 | cfgv = [ 1947 | {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, 1948 | {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, 1949 | ] 1950 | charset-normalizer = [] 1951 | click = [ 1952 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 1953 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 1954 | ] 1955 | cloudpickle = [] 1956 | colorama = [] 1957 | commonmark = [ 1958 | {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, 1959 | {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, 1960 | ] 1961 | contourpy = [] 1962 | cycler = [ 1963 | {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, 1964 | {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, 1965 | ] 1966 | dask = [] 1967 | dask-sql = [] 1968 | debugpy = [] 1969 | decorator = [ 1970 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 1971 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 1972 | ] 1973 | distlib = [] 1974 | distributed = [] 1975 | duckdb = [] 1976 | entrypoints = [ 1977 | {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, 1978 | {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, 1979 | ] 1980 | executing = [] 1981 | fastapi = [] 1982 | filelock = [] 1983 | fonttools = [] 1984 | frozendict = [] 1985 | fsspec = [] 1986 | future = [ 1987 | {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, 1988 | ] 1989 | h11 = [] 1990 | h5py = [] 1991 | heapdict = [ 1992 | {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, 1993 | {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, 1994 | ] 1995 | httptools = [] 1996 | identify = [] 1997 | idna = [] 1998 | ipydatawidgets = [] 1999 | ipykernel = [] 2000 | ipyleaflet = [] 2001 | ipympl = [] 2002 | ipython = [] 2003 | ipython-genutils = [ 2004 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, 2005 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, 2006 | ] 2007 | ipyvolume = [] 2008 | ipyvue = [] 2009 | ipyvuetify = [] 2010 | ipywebrtc = [] 2011 | ipywidgets = [] 2012 | jedi = [ 2013 | {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, 2014 | {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, 2015 | ] 2016 | jinja2 = [] 2017 | jupyter-client = [] 2018 | jupyter-core = [] 2019 | jupyterlab-widgets = [] 2020 | kaggle = [] 2021 | kiwisolver = [] 2022 | llvmlite = [] 2023 | locket = [] 2024 | loguru = [] 2025 | markupsafe = [] 2026 | matplotlib = [] 2027 | matplotlib-inline = [] 2028 | msgpack = [] 2029 | mypy-extensions = [ 2030 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 2031 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 2032 | ] 2033 | nest-asyncio = [] 2034 | nodeenv = [] 2035 | numba = [] 2036 | numpy = [] 2037 | packaging = [ 2038 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 2039 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 2040 | ] 2041 | pandas = [] 2042 | parso = [ 2043 | {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, 2044 | {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, 2045 | ] 2046 | partd = [] 2047 | pathspec = [] 2048 | pexpect = [ 2049 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 2050 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 2051 | ] 2052 | pickleshare = [ 2053 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 2054 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 2055 | ] 2056 | pillow = [] 2057 | platformdirs = [] 2058 | polars = [] 2059 | pre-commit = [] 2060 | progressbar2 = [] 2061 | prompt-toolkit = [] 2062 | psutil = [] 2063 | ptyprocess = [ 2064 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 2065 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 2066 | ] 2067 | pure-eval = [ 2068 | {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, 2069 | {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, 2070 | ] 2071 | py = [ 2072 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 2073 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 2074 | ] 2075 | py4j = [] 2076 | pyarrow = [] 2077 | pycparser = [ 2078 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 2079 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 2080 | ] 2081 | pydantic = [] 2082 | pyerfa = [] 2083 | pygments = [] 2084 | pyparsing = [] 2085 | pyspark = [] 2086 | python-dateutil = [ 2087 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 2088 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 2089 | ] 2090 | python-dotenv = [] 2091 | python-slugify = [] 2092 | python-utils = [] 2093 | pythreejs = [] 2094 | pytz = [] 2095 | pytz-deprecation-shim = [] 2096 | pywin32 = [] 2097 | pyyaml = [ 2098 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 2099 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 2100 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 2101 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 2102 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 2103 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 2104 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 2105 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 2106 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 2107 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 2108 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 2109 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 2110 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 2111 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 2112 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 2113 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 2114 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 2115 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 2116 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 2117 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 2118 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 2119 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 2120 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 2121 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 2122 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 2123 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 2124 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 2125 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 2126 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 2127 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 2128 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 2129 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 2130 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 2131 | ] 2132 | pyzmq = [] 2133 | requests = [] 2134 | rich = [] 2135 | setuptools-scm = [] 2136 | six = [ 2137 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 2138 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 2139 | ] 2140 | sniffio = [] 2141 | sortedcontainers = [ 2142 | {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, 2143 | {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, 2144 | ] 2145 | stack-data = [] 2146 | starlette = [] 2147 | tabulate = [] 2148 | tblib = [ 2149 | {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, 2150 | {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, 2151 | ] 2152 | text-unidecode = [ 2153 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 2154 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 2155 | ] 2156 | toml = [ 2157 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 2158 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 2159 | ] 2160 | tomli = [ 2161 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 2162 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 2163 | ] 2164 | toolz = [] 2165 | tornado = [ 2166 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, 2167 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, 2168 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, 2169 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, 2170 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, 2171 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, 2172 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, 2173 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, 2174 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, 2175 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, 2176 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, 2177 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, 2178 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, 2179 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, 2180 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, 2181 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, 2182 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, 2183 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, 2184 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, 2185 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, 2186 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, 2187 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, 2188 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, 2189 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, 2190 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, 2191 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, 2192 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, 2193 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, 2194 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, 2195 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, 2196 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, 2197 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, 2198 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, 2199 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, 2200 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, 2201 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, 2202 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, 2203 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, 2204 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, 2205 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, 2206 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, 2207 | ] 2208 | tqdm = [] 2209 | traitlets = [] 2210 | traittypes = [] 2211 | typer = [] 2212 | typing-extensions = [] 2213 | tzdata = [] 2214 | tzlocal = [] 2215 | urllib3 = [] 2216 | uvicorn = [] 2217 | uvloop = [] 2218 | vaex = [] 2219 | vaex-astro = [] 2220 | vaex-core = [] 2221 | vaex-hdf5 = [] 2222 | vaex-jupyter = [] 2223 | vaex-ml = [] 2224 | vaex-server = [] 2225 | vaex-viz = [] 2226 | virtualenv = [] 2227 | watchfiles = [] 2228 | wcwidth = [ 2229 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 2230 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 2231 | ] 2232 | websockets = [] 2233 | widgetsnbextension = [] 2234 | win32-setctime = [] 2235 | xarray = [] 2236 | xyzservices = [] 2237 | zict = [] 2238 | --------------------------------------------------------------------------------