cubedpandas


Namecubedpandas JSON
Version 0.2.37 PyPI version JSON
download
home_pagehttps://github.com/Zeutschler/cubedpandas
SummaryFilter faster, analyze smarter – your DataFrames deserve it!
upload_time2024-09-23 12:42:22
maintainerNone
docs_urlNone
authorThomas Zeutschler
requires_python>=3.10
licenseMIT License Copyright (c) 2024, Thomas Zeutschler Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords pandas analysis database olap planning reporting forecasting multidimensional cube data dataframe pivot table
VCS
bugtrack_url
requirements numpy pandas python-dateutil datespan matplotlib scipy scikit-learn fastapi uvicorn build wheel twine setuptools pytest mkdocs mkdocs-material mkdocs-exclude mkdocstrings mkdocstrings-python mike cubedpandas joblib
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # CubedPandas 

## Filter faster, analyze smarter – your DataFrames deserve it!

![GitHub license](https://img.shields.io/github/license/Zeutschler/cubedpandas?color=A1C547)
![PyPI version](https://img.shields.io/pypi/v/cubedpandas?logo=pypi&logoColor=979DA4&color=A1C547)
![Python versions](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2FZeutschler%2Fcubedpandas%2Fmaster%2Fpyproject.toml&query=%24%5B'project'%5D%5B'requires-python'%5D&color=A1C547)
![PyPI Downloads](https://img.shields.io/pypi/dm/cubedpandas.svg?logo=pypi&logoColor=979DA4&label=PyPI%20downloads&color=A1C547)
![GitHub last commit](https://img.shields.io/github/last-commit/Zeutschler/cubedpandas?logo=github&logoColor=979DA4&color=A1C547)
![unit tests](https://img.shields.io/github/actions/workflow/status/zeutschler/cubedpandas/python-package.yml?logo=GitHub&logoColor=979DA4&label=unit%20tests&color=A1C547)
![build](https://img.shields.io/github/actions/workflow/status/zeutschler/cubedpandas/python-package.yml?logo=GitHub&logoColor=979DA4&color=A1C547)
![documentation](https://img.shields.io/github/actions/workflow/status/zeutschler/cubedpandas/static-site-upload.yml?logo=GitHub&logoColor=979DA4&label=docs&color=A1C547&link=https%3A%2F%2Fzeutschler.github.io%2Fcubedpandas%2F)
![codecov](https://codecov.io/github/Zeutschler/cubedpandas/graph/badge.svg?token=B12O0B6F10)


-----------------

CubedPandas offer a new ***easy, fast & fun approach to filter, navigate and analyze Pandas dataframes***.
CubedPandas is inspired by the concept of [OLAP databases](https://en.wikipedia.org/wiki/Online_analytical_processing)
and aims to bring add comfort and power to Pandas dataframe handling.

For novice users, CubedPandas can be a great help to get started with Pandas, as it hides
the complexity and verbosity of Pandas dataframes. For experienced users, CubedPandas
can be a productivity booster, as it allows you to write more compact, explicit, readable and
maintainable code, e.g. this Pandas code:

```python
# Pandas: calculate the total revenue of all hybrid Audi cars in September 2024
value = df.loc[
    (df['make'] == 'Audi') &
    (df['engine'] == 'hybrid') &
    (df['date'] >= '2024-09-01') & (df['date'] <= '2024-09-30'),
    'revenue'
].sum()
```

can turn into this equivalent CubedPandas code:

```python
# with CubedPandas:
value = df.cubed.make.Audi.engine.hybrid.date.september_2024.revenue

# or maybe even shorter:
value = df.cubed.Audi.hybrid.sep_2024

# filtering dataframes is as easy as this: just add '.df' at the end
df = df.cubed.make.Audi.engine.hybrid.df
```

CubedPandas offers a fluent interface based on the data available in the underlying DataFrame.
So, filtering, navigation and analysis of Pandas dataframes becomes more intuitive, more readable and more fun.

CubedPandas neither duplicates data nor modifies the underlying DataFrame, and it introduces
no performance penalty. In fact, it can sometimes significantly speed up your data processing.

[Jupyter notebooks](https://jupyter.org) is the perfect habitat for CubedPandas. For further information,
please visit the [CubedPandas Documentation](https://zeutschler.github.io/cubedpandas/)
or try some of the included samples.

### Getting Started

CubedPandas is available on pypi.org (https://pypi.org/project/cubedpandas/) and can be installed by

```console
pip install cubedpandas
```

Using CubedPandas is as simple as wrapping any Pandas dataframe into a cube like this:

```python
import pandas as pd
from cubedpandas import cubed

# Create a dataframe with some sales data
df = pd.DataFrame({"product":  ["Apple",  "Pear",   "Banana", "Apple",  "Pear",   "Banana"],
                   "channel":  ["Online", "Online", "Online", "Retail", "Retail", "Retail"],
                   "customer": ["Peter",  "Peter",  "Paul",   "Paul",   "Mary",   "Mary"  ],
                   "mailing":  [True,     False,    True,     False,    True,     False   ],
                   "revenue":  [100,      150,      300,      200,      250,      350     ],
                   "cost":     [50,       90,       150,      100,      150,      175     ]})

cdf = cubed(df)  # Wrapp your dataframe into a cube and start using it!
```

CubedPandas **automatically infers a multi-dimensional schema** from your Pandas dataframe which 
defines a virtual **Cube** over the dataframe. By default, numeric columns of the dataframe 
are considered as **Measures** - *the numeric values to analyse & aggregate* - all other columns are 
considered as **Dimensions** - *to filter, navigate and view the data*. The individual values in a 
dimension column are called the **Members** of the dimension. In the example above, column `channel`
becomes a dimension with the two members `Online` and `Retail`, `revenue` and `cost` are our measures.

Although rarely required, you can also define your own schema. Schemas are quite powerful and flexible, 
as they will allow you to define dimensions and measures, aliases and (planned for upcoming releases)
also custom aggregations, business logic, number formating, linked cubes (star-schemas) and much more.

### Context please, so I will give you data!
One key feature of CubePandas is an easy & intuitive access to individual **Data Cells** in
multi-dimensional data space. To do so, you'll need to define a multi-dimensional **Context** so
CubedPandas will evaluate, aggregate (`sum` by default) and return the requested value from 
the underlying dataframe.

**Context objects behave like normal numbers** (float, int), so you can use them directly in arithmetic
operations. In the following examples, all addresses will refer to the exactly same rows from the dataframe
and thereby all return the same value of `100`. 

```python
# Let Pandas set the scene...
a = df.loc[(df["product"] == "Apple") & (df["channel"] == "Online") & (df["customer"] == "Peter"), "revenue"].sum()

# Can we do better with CubedPandas? 
b = cdf["product:Apple", "channel:Online", "customer:Peter"].revenue  # explicit, readable, flexible and fast  
c = cdf.product["Apple"].channel["Online"].customer[
    "Peter"].revenue  # ...better, if column names are Python-compliant  
d = cdf.product.Apple.channel.Online.customer.Peter.revenue  # ...even better, if member names are Python-compliant

# If there are no ambiguities in your dataframe - what can be easily checked - then you can use this shorthand forms:
e = cdf["Online", "Apple", "Peter", "revenue"]
f = cdf.Online.Apple.Peter.revenue
g = cdf.Online.Apple.Peter  # as 'revenue' is the default (first) measure of the cube, it can be omitted

assert a == b == c == d == e == f == g == 100
```

Context objects also act as **filters on the underlying dataframe**. So you can use also CubedPandas for
fast and easy filtering only, e.g. like this:

```python   
df = df.cubed.product["Apple"].channel["Online"].df
df = df.cubed.Apple.Online.df  # short form, if column names are Python-compliant and there are no ambiguities
```

### Pivot, Drill-Down, Slice & Dice

The Pandas pivot table is a very powerful tool. Unfortunately, it is quite verbose and very hard to master.
CubedPandas offers the `slice` method to create pivot tables in a more intuitive and easy way, e.g. by default

```python   
# Let's create a simple pivot table with the revenue for dimensions products and channels
cdf.slice(rows="product", columns="channel", measures="revenue")
```

For further information, samples and a complete feature list as well as valuable tips and tricks,
please visit the [CubedPandas Documentation](https://zeutschler.github.io/cubedpandas/).


### Your feedback, ideas and support are very welcome!
Please help improve and extend CubedPandas with **your feedback & ideas** and use the 
[CubedPandas GitHub Issues](https://github.com/Zeutschler/cubedpandas/issues) to request new features and report bugs. 
For general questions, discussions and feedback, please use the 
[CubedPandas GitHub Discussions](https://github.com/Zeutschler/cubedpandas/discussions).

If you have fallen in love with CubedPandas or find it otherwise valuable, 
please consider to [become a sponsor of the CubedPandas project](https://github.com/sponsors/Zeutschler) so we 
can push the project forward faster and make CubePandas even more awesome.

*...happy cubing!*

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Zeutschler/cubedpandas",
    "name": "cubedpandas",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "CubedPandas Developers <cubedpandas@gmail.com>",
    "keywords": "pandas, analysis, database, olap, planning, reporting, forecasting, multidimensional, cube, data, dataframe, pivot, table",
    "author": "Thomas Zeutschler",
    "author_email": "cubedpandas@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/1c/24/37f40a1964f72860dc1bb66df2a50373d46679f7b9914d30cbaca8056222/cubedpandas-0.2.37.tar.gz",
    "platform": "any",
    "description": "# CubedPandas \n\n## Filter faster, analyze smarter \u2013 your DataFrames deserve it!\n\n![GitHub license](https://img.shields.io/github/license/Zeutschler/cubedpandas?color=A1C547)\n![PyPI version](https://img.shields.io/pypi/v/cubedpandas?logo=pypi&logoColor=979DA4&color=A1C547)\n![Python versions](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2FZeutschler%2Fcubedpandas%2Fmaster%2Fpyproject.toml&query=%24%5B'project'%5D%5B'requires-python'%5D&color=A1C547)\n![PyPI Downloads](https://img.shields.io/pypi/dm/cubedpandas.svg?logo=pypi&logoColor=979DA4&label=PyPI%20downloads&color=A1C547)\n![GitHub last commit](https://img.shields.io/github/last-commit/Zeutschler/cubedpandas?logo=github&logoColor=979DA4&color=A1C547)\n![unit tests](https://img.shields.io/github/actions/workflow/status/zeutschler/cubedpandas/python-package.yml?logo=GitHub&logoColor=979DA4&label=unit%20tests&color=A1C547)\n![build](https://img.shields.io/github/actions/workflow/status/zeutschler/cubedpandas/python-package.yml?logo=GitHub&logoColor=979DA4&color=A1C547)\n![documentation](https://img.shields.io/github/actions/workflow/status/zeutschler/cubedpandas/static-site-upload.yml?logo=GitHub&logoColor=979DA4&label=docs&color=A1C547&link=https%3A%2F%2Fzeutschler.github.io%2Fcubedpandas%2F)\n![codecov](https://codecov.io/github/Zeutschler/cubedpandas/graph/badge.svg?token=B12O0B6F10)\n\n\n-----------------\n\nCubedPandas offer a new ***easy, fast & fun approach to filter, navigate and analyze Pandas dataframes***.\nCubedPandas is inspired by the concept of [OLAP databases](https://en.wikipedia.org/wiki/Online_analytical_processing)\nand aims to bring add comfort and power to Pandas dataframe handling.\n\nFor novice users, CubedPandas can be a great help to get started with Pandas, as it hides\nthe complexity and verbosity of Pandas dataframes. For experienced users, CubedPandas\ncan be a productivity booster, as it allows you to write more compact, explicit, readable and\nmaintainable code, e.g. this Pandas code:\n\n```python\n# Pandas: calculate the total revenue of all hybrid Audi cars in September 2024\nvalue = df.loc[\n    (df['make'] == 'Audi') &\n    (df['engine'] == 'hybrid') &\n    (df['date'] >= '2024-09-01') & (df['date'] <= '2024-09-30'),\n    'revenue'\n].sum()\n```\n\ncan turn into this equivalent CubedPandas code:\n\n```python\n# with CubedPandas:\nvalue = df.cubed.make.Audi.engine.hybrid.date.september_2024.revenue\n\n# or maybe even shorter:\nvalue = df.cubed.Audi.hybrid.sep_2024\n\n# filtering dataframes is as easy as this: just add '.df' at the end\ndf = df.cubed.make.Audi.engine.hybrid.df\n```\n\nCubedPandas offers a fluent interface based on the data available in the underlying DataFrame.\nSo, filtering, navigation and analysis of Pandas dataframes becomes more intuitive, more readable and more fun.\n\nCubedPandas neither duplicates data nor modifies the underlying DataFrame, and it introduces\nno performance penalty. In fact, it can sometimes significantly speed up your data processing.\n\n[Jupyter notebooks](https://jupyter.org) is the perfect habitat for CubedPandas. For further information,\nplease visit the [CubedPandas Documentation](https://zeutschler.github.io/cubedpandas/)\nor try some of the included samples.\n\n### Getting Started\n\nCubedPandas is available on pypi.org (https://pypi.org/project/cubedpandas/) and can be installed by\n\n```console\npip install cubedpandas\n```\n\nUsing CubedPandas is as simple as wrapping any Pandas dataframe into a cube like this:\n\n```python\nimport pandas as pd\nfrom cubedpandas import cubed\n\n# Create a dataframe with some sales data\ndf = pd.DataFrame({\"product\":  [\"Apple\",  \"Pear\",   \"Banana\", \"Apple\",  \"Pear\",   \"Banana\"],\n                   \"channel\":  [\"Online\", \"Online\", \"Online\", \"Retail\", \"Retail\", \"Retail\"],\n                   \"customer\": [\"Peter\",  \"Peter\",  \"Paul\",   \"Paul\",   \"Mary\",   \"Mary\"  ],\n                   \"mailing\":  [True,     False,    True,     False,    True,     False   ],\n                   \"revenue\":  [100,      150,      300,      200,      250,      350     ],\n                   \"cost\":     [50,       90,       150,      100,      150,      175     ]})\n\ncdf = cubed(df)  # Wrapp your dataframe into a cube and start using it!\n```\n\nCubedPandas **automatically infers a multi-dimensional schema** from your Pandas dataframe which \ndefines a virtual **Cube** over the dataframe. By default, numeric columns of the dataframe \nare considered as **Measures** - *the numeric values to analyse & aggregate* - all other columns are \nconsidered as **Dimensions** - *to filter, navigate and view the data*. The individual values in a \ndimension column are called the **Members** of the dimension. In the example above, column `channel`\nbecomes a dimension with the two members `Online` and `Retail`, `revenue` and `cost` are our measures.\n\nAlthough rarely required, you can also define your own schema. Schemas are quite powerful and flexible, \nas they will allow you to define dimensions and measures, aliases and (planned for upcoming releases)\nalso custom aggregations, business logic, number formating, linked cubes (star-schemas) and much more.\n\n### Context please, so I will give you data!\nOne key feature of CubePandas is an easy & intuitive access to individual **Data Cells** in\nmulti-dimensional data space. To do so, you'll need to define a multi-dimensional **Context** so\nCubedPandas will evaluate, aggregate (`sum` by default) and return the requested value from \nthe underlying dataframe.\n\n**Context objects behave like normal numbers** (float, int), so you can use them directly in arithmetic\noperations. In the following examples, all addresses will refer to the exactly same rows from the dataframe\nand thereby all return the same value of `100`. \n\n```python\n# Let Pandas set the scene...\na = df.loc[(df[\"product\"] == \"Apple\") & (df[\"channel\"] == \"Online\") & (df[\"customer\"] == \"Peter\"), \"revenue\"].sum()\n\n# Can we do better with CubedPandas? \nb = cdf[\"product:Apple\", \"channel:Online\", \"customer:Peter\"].revenue  # explicit, readable, flexible and fast  \nc = cdf.product[\"Apple\"].channel[\"Online\"].customer[\n    \"Peter\"].revenue  # ...better, if column names are Python-compliant  \nd = cdf.product.Apple.channel.Online.customer.Peter.revenue  # ...even better, if member names are Python-compliant\n\n# If there are no ambiguities in your dataframe - what can be easily checked - then you can use this shorthand forms:\ne = cdf[\"Online\", \"Apple\", \"Peter\", \"revenue\"]\nf = cdf.Online.Apple.Peter.revenue\ng = cdf.Online.Apple.Peter  # as 'revenue' is the default (first) measure of the cube, it can be omitted\n\nassert a == b == c == d == e == f == g == 100\n```\n\nContext objects also act as **filters on the underlying dataframe**. So you can use also CubedPandas for\nfast and easy filtering only, e.g. like this:\n\n```python   \ndf = df.cubed.product[\"Apple\"].channel[\"Online\"].df\ndf = df.cubed.Apple.Online.df  # short form, if column names are Python-compliant and there are no ambiguities\n```\n\n### Pivot, Drill-Down, Slice & Dice\n\nThe Pandas pivot table is a very powerful tool. Unfortunately, it is quite verbose and very hard to master.\nCubedPandas offers the `slice` method to create pivot tables in a more intuitive and easy way, e.g. by default\n\n```python   \n# Let's create a simple pivot table with the revenue for dimensions products and channels\ncdf.slice(rows=\"product\", columns=\"channel\", measures=\"revenue\")\n```\n\nFor further information, samples and a complete feature list as well as valuable tips and tricks,\nplease visit the [CubedPandas Documentation](https://zeutschler.github.io/cubedpandas/).\n\n\n### Your feedback, ideas and support are very welcome!\nPlease help improve and extend CubedPandas with **your feedback & ideas** and use the \n[CubedPandas GitHub Issues](https://github.com/Zeutschler/cubedpandas/issues) to request new features and report bugs. \nFor general questions, discussions and feedback, please use the \n[CubedPandas GitHub Discussions](https://github.com/Zeutschler/cubedpandas/discussions).\n\nIf you have fallen in love with CubedPandas or find it otherwise valuable, \nplease consider to [become a sponsor of the CubedPandas project](https://github.com/sponsors/Zeutschler) so we \ncan push the project forward faster and make CubePandas even more awesome.\n\n*...happy cubing!*\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2024, Thomas Zeutschler  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "Filter faster, analyze smarter \u2013 your DataFrames deserve it!",
    "version": "0.2.37",
    "project_urls": {
        "Changelog": "https://github.com/me/spam/blob/master/CHANGELOG.md",
        "Documentation": "https://zeutschler.github.io/cubedpandas/",
        "Homepage": "https://zeutschler.github.io/cubedpandas/",
        "Issues": "https://github.com/Zeutschler/cubedpandas/issues",
        "Repository": "https://github.com/Zeutschler/cubedpandas.git",
        "pypi": "https://pypi.org/project/cubedpandas/"
    },
    "split_keywords": [
        "pandas",
        " analysis",
        " database",
        " olap",
        " planning",
        " reporting",
        " forecasting",
        " multidimensional",
        " cube",
        " data",
        " dataframe",
        " pivot",
        " table"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd118f77f9fae0c77d3949cc0ea3ed4e371f552b4be7a154861601876e4b4f9c",
                "md5": "9927e27a5a84cb889c32ba232939d51c",
                "sha256": "a017dbf532722117135175578a74deaca9e2920d0640227bcc5e45b2cc58016a"
            },
            "downloads": -1,
            "filename": "cubedpandas-0.2.37-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9927e27a5a84cb889c32ba232939d51c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 67677,
            "upload_time": "2024-09-23T12:42:21",
            "upload_time_iso_8601": "2024-09-23T12:42:21.447187Z",
            "url": "https://files.pythonhosted.org/packages/bd/11/8f77f9fae0c77d3949cc0ea3ed4e371f552b4be7a154861601876e4b4f9c/cubedpandas-0.2.37-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1c2437f40a1964f72860dc1bb66df2a50373d46679f7b9914d30cbaca8056222",
                "md5": "86616dee23ad0536452d714a308aad9a",
                "sha256": "5f5cf789b43147e3bb5da1d98d35f154e8bc5752114a60ab7ce848dc42ff539a"
            },
            "downloads": -1,
            "filename": "cubedpandas-0.2.37.tar.gz",
            "has_sig": false,
            "md5_digest": "86616dee23ad0536452d714a308aad9a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 57127,
            "upload_time": "2024-09-23T12:42:22",
            "upload_time_iso_8601": "2024-09-23T12:42:22.721922Z",
            "url": "https://files.pythonhosted.org/packages/1c/24/37f40a1964f72860dc1bb66df2a50373d46679f7b9914d30cbaca8056222/cubedpandas-0.2.37.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-23 12:42:22",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Zeutschler",
    "github_project": "cubedpandas",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "numpy",
            "specs": [
                [
                    ">=",
                    "1.26.1"
                ]
            ]
        },
        {
            "name": "pandas",
            "specs": [
                [
                    ">=",
                    "1.5.2"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    ">=",
                    "2.8.2"
                ]
            ]
        },
        {
            "name": "datespan",
            "specs": [
                [
                    ">=",
                    "0.2.8"
                ]
            ]
        },
        {
            "name": "matplotlib",
            "specs": []
        },
        {
            "name": "scipy",
            "specs": []
        },
        {
            "name": "scikit-learn",
            "specs": []
        },
        {
            "name": "fastapi",
            "specs": [
                [
                    ">=",
                    "0.109.1"
                ]
            ]
        },
        {
            "name": "uvicorn",
            "specs": [
                [
                    ">=",
                    "0.20.0"
                ]
            ]
        },
        {
            "name": "build",
            "specs": []
        },
        {
            "name": "wheel",
            "specs": []
        },
        {
            "name": "twine",
            "specs": []
        },
        {
            "name": "setuptools",
            "specs": [
                [
                    ">",
                    "65.5.0"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": []
        },
        {
            "name": "mkdocs",
            "specs": []
        },
        {
            "name": "mkdocs-material",
            "specs": []
        },
        {
            "name": "mkdocs-exclude",
            "specs": []
        },
        {
            "name": "mkdocstrings",
            "specs": []
        },
        {
            "name": "mkdocstrings-python",
            "specs": []
        },
        {
            "name": "mike",
            "specs": []
        },
        {
            "name": "cubedpandas",
            "specs": [
                [
                    "~=",
                    "0.2.19"
                ]
            ]
        },
        {
            "name": "joblib",
            "specs": [
                [
                    "~=",
                    "1.4.2"
                ]
            ]
        }
    ],
    "lcname": "cubedpandas"
}
        
Elapsed time: 0.36785s