Name | narwhals JSON |
Version |
1.18.4
JSON |
| download |
home_page | None |
Summary | Extremely lightweight compatibility layer between dataframe libraries |
upload_time | 2024-12-15 17:26:12 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | None |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Narwhals
<h1 align="center">
<img
width="400"
alt="narwhals_small"
src="https://github.com/narwhals-dev/narwhals/assets/33491632/26be901e-5383-49f2-9fbd-5c97b7696f27">
</h1>
[![PyPI version](https://badge.fury.io/py/narwhals.svg)](https://badge.fury.io/py/narwhals)
[![Downloads](https://static.pepy.tech/badge/narwhals/month)](https://pepy.tech/project/narwhals)
[![Trusted publishing](https://img.shields.io/badge/Trusted_publishing-Provides_attestations-bright_green)](https://peps.python.org/pep-0740/)
Extremely lightweight and extensible compatibility layer between dataframe libraries!
- **Full API support**: cuDF, Modin, pandas, Polars, PyArrow
- **Lazy-only support**: Dask
- **Interchange-level support**: DuckDB, Ibis, Vaex, anything which implements the DataFrame Interchange Protocol
Seamlessly support all, without depending on any!
- ✅ **Just use** [a subset of **the Polars API**](https://narwhals-dev.github.io/narwhals/api-reference/), no need to learn anything new
- ✅ **Zero dependencies**, Narwhals only uses what
the user passes in so your library can stay lightweight
- ✅ Separate **lazy** and eager APIs, use **expressions**
- ✅ Support pandas' complicated type system and index, without
either getting in the way
- ✅ **100% branch coverage**, tested against pandas and Polars nightly builds
- ✅ **Negligible overhead**, see [overhead](https://narwhals-dev.github.io/narwhals/overhead/)
- ✅ Let your IDE help you thanks to **full static typing**, see [typing](https://narwhals-dev.github.io/narwhals/api-reference/typing/)
- ✅ **Perfect backwards compatibility policy**,
see [stable api](https://narwhals-dev.github.io/narwhals/backcompat/) for how to opt-in
Get started!
- [Read the documentation](https://narwhals-dev.github.io/narwhals/)
- [Chat with us on Discord!](https://discord.gg/V3PqtB4VA4)
- [Join our community call](https://calendar.google.com/calendar/embed?src=27ff6dc5f598c1d94c1f6e627a1aaae680e2fac88f848bda1f2c7946ae74d5ab%40group.calendar.google.com)
- [Read the contributing guide](https://github.com/narwhals-dev/narwhals/blob/main/CONTRIBUTING.md)
<details>
<summary>Table of contents</summary>
- [Narwhals](#narwhals)
- [Installation](#installation)
- [Usage](#usage)
- [Example](#example)
- [Scope](#scope)
- [Roadmap](#roadmap)
- [Used by](#used-by)
- [Sponsors and institutional partners](#sponsors-and-institutional-partners)
- [Appears on](#appears-on)
- [Why "Narwhals"?](#why-narwhals)
</details>
## Installation
- pip (recommended, as it's the most up-to-date)
```
pip install narwhals
```
- conda-forge (also fine, but the latest version may take longer to appear)
```
conda install -c conda-forge narwhals
```
## Usage
There are three steps to writing dataframe-agnostic code using Narwhals:
1. use `narwhals.from_native` to wrap a pandas/Polars/Modin/cuDF/PyArrow
DataFrame/LazyFrame in a Narwhals class
2. use the [subset of the Polars API supported by Narwhals](https://narwhals-dev.github.io/narwhals/api-reference/)
3. use `narwhals.to_native` to return an object to the user in its original
dataframe flavour. For example:
- if you started with pandas, you'll get pandas back
- if you started with Polars, you'll get Polars back
- if you started with Modin, you'll get Modin back (and compute will be distributed)
- if you started with cuDF, you'll get cuDF back (and compute will happen on GPU)
- if you started with PyArrow, you'll get PyArrow back
<h1 align="left">
<img
width="600"
alt="narwhals_gif"
src="https://github.com/user-attachments/assets/88292d3c-6359-4155-973d-d0f8e3fbf5ac">
</h1>
## Example
See the [tutorial](https://narwhals-dev.github.io/narwhals/basics/dataframe/) for several examples!
## Scope
- Do you maintain a dataframe-consuming library?
- Do you have a specific Polars function in mind that you would like Narwhals to have in order to make your work easier?
If you said yes to both, we'd love to hear from you!
## Roadmap
See [roadmap discussion on GitHub](https://github.com/narwhals-dev/narwhals/discussions/1370)
for an up-to-date plan of future work.
## Used by
Join the party!
- [altair](https://github.com/vega/altair/)
- [hierarchicalforecast](https://github.com/Nixtla/hierarchicalforecast)
- [marimo](https://github.com/marimo-team/marimo)
- [panel-graphic-walker](https://github.com/panel-extensions/panel-graphic-walker)
- [plotly](https://plotly.com)
- [pymarginaleffects](https://github.com/vincentarelbundock/pymarginaleffects)
- [py-shiny](https://github.com/posit-dev/py-shiny)
- [rio](https://github.com/rio-labs/rio)
- [scikit-lego](https://github.com/koaning/scikit-lego)
- [scikit-playtime](https://github.com/koaning/scikit-playtime)
- [tabmat](https://github.com/Quantco/tabmat)
- [tea-tasting](https://github.com/e10v/tea-tasting)
- [timebasedcv](https://github.com/FBruzzesi/timebasedcv)
- [tubular](https://github.com/lvgig/tubular)
- [vegafusion](https://github.com/vega/vegafusion)
- [wimsey](https://github.com/benrutter/wimsey)
Feel free to add your project to the list if it's missing, and/or
[chat with us on Discord](https://discord.gg/V3PqtB4VA4) if you'd like any support.
## Sponsors and institutional partners
Narwhals is 100% independent, community-driven, and community-owned.
We are extremely grateful to the following organisations for having
provided some funding / development time:
- [Quansight Labs](https://labs.quansight.org)
- [Quansight Futures](https://www.qi.ventures)
- [OpenTeams](https://www.openteams.com)
- [POSSEE initiative](https://possee.org)
- [BYU-Idaho](https://www.byui.edu)
If you contribute to Narwhals on your organization's time, please let us know. We'd be happy to add your employer
to this list!
## Appears on
Narwhals has been featured in several talks, podcasts, and blog posts:
- [Talk Python to me Podcast](https://youtu.be/FSH7BZ0tuE0)
Ahoy, Narwhals are bridging the data science APIs
- [Python Bytes Podcast](https://www.youtube.com/live/N7w_ESVW40I?si=y-wN1uCsAuJOKlOT&t=382)
Episode 402, topic #2
- [Super Data Science: ML & AI Podcast](https://www.youtube.com/watch?v=TeG4U8R0U8U)
Narwhals: For Pandas-to-Polars DataFrame Compatibility
- [Sample Space Podcast | probabl](https://youtu.be/8hYdq4sWbbQ?si=WG0QP1CZ6gkFf18b)
How Narwhals has many end users ... that never use it directly. - Marco Gorelli
- [The Real Python Podcast](https://www.youtube.com/watch?v=w5DFZbFYzCM)
Narwhals: Expanding DataFrame Compatibility Between Libraries
- [Pycon Lithuania](https://www.youtube.com/watch?v=-mdx7Cn6_6E)
Marco Gorelli - DataFrame interoperatiblity - what's been achieved, and what comes next?
- [Pycon Italy](https://www.youtube.com/watch?v=3IqUli9XsmQ)
How you can write a dataframe-agnostic library - Marco Gorelli
- [Polars Blog Post](https://pola.rs/posts/lightweight_plotting/)
Polars has a new lightweight plotting backend
- [Quansight Labs blog post (w/ Scikit-Lego)](https://labs.quansight.org/blog/scikit-lego-narwhals)
How Narwhals and scikit-lego came together to achieve dataframe-agnosticism
## Why "Narwhals"?
[Coz they are so awesome](https://youtu.be/ykwqXuMPsoc?si=A-i8LdR38teYsos4).
Thanks to [Olha Urdeichuk](https://www.fiverr.com/olhaurdeichuk) for the illustration!
Raw data
{
"_id": null,
"home_page": null,
"name": "narwhals",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": null,
"author": null,
"author_email": "Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/fa/cf/f428738e49584498d3ea8765b3d5a068827955c0d8d704c259b03e8c635f/narwhals-1.18.4.tar.gz",
"platform": null,
"description": "# Narwhals\n\n<h1 align=\"center\">\n\t<img\n\t\twidth=\"400\"\n\t\talt=\"narwhals_small\"\n\t\tsrc=\"https://github.com/narwhals-dev/narwhals/assets/33491632/26be901e-5383-49f2-9fbd-5c97b7696f27\">\n</h1>\n\n[![PyPI version](https://badge.fury.io/py/narwhals.svg)](https://badge.fury.io/py/narwhals)\n[![Downloads](https://static.pepy.tech/badge/narwhals/month)](https://pepy.tech/project/narwhals)\n[![Trusted publishing](https://img.shields.io/badge/Trusted_publishing-Provides_attestations-bright_green)](https://peps.python.org/pep-0740/)\n\nExtremely lightweight and extensible compatibility layer between dataframe libraries!\n\n- **Full API support**: cuDF, Modin, pandas, Polars, PyArrow\n- **Lazy-only support**: Dask\n- **Interchange-level support**: DuckDB, Ibis, Vaex, anything which implements the DataFrame Interchange Protocol\n\nSeamlessly support all, without depending on any!\n\n- \u2705 **Just use** [a subset of **the Polars API**](https://narwhals-dev.github.io/narwhals/api-reference/), no need to learn anything new\n- \u2705 **Zero dependencies**, Narwhals only uses what\n the user passes in so your library can stay lightweight\n- \u2705 Separate **lazy** and eager APIs, use **expressions**\n- \u2705 Support pandas' complicated type system and index, without\n either getting in the way\n- \u2705 **100% branch coverage**, tested against pandas and Polars nightly builds\n- \u2705 **Negligible overhead**, see [overhead](https://narwhals-dev.github.io/narwhals/overhead/)\n- \u2705 Let your IDE help you thanks to **full static typing**, see [typing](https://narwhals-dev.github.io/narwhals/api-reference/typing/)\n- \u2705 **Perfect backwards compatibility policy**,\n see [stable api](https://narwhals-dev.github.io/narwhals/backcompat/) for how to opt-in\n\nGet started!\n\n- [Read the documentation](https://narwhals-dev.github.io/narwhals/)\n- [Chat with us on Discord!](https://discord.gg/V3PqtB4VA4)\n- [Join our community call](https://calendar.google.com/calendar/embed?src=27ff6dc5f598c1d94c1f6e627a1aaae680e2fac88f848bda1f2c7946ae74d5ab%40group.calendar.google.com)\n- [Read the contributing guide](https://github.com/narwhals-dev/narwhals/blob/main/CONTRIBUTING.md)\n\n<details>\n<summary>Table of contents</summary>\n\n- [Narwhals](#narwhals)\n - [Installation](#installation)\n - [Usage](#usage)\n - [Example](#example)\n - [Scope](#scope)\n - [Roadmap](#roadmap)\n - [Used by](#used-by)\n - [Sponsors and institutional partners](#sponsors-and-institutional-partners)\n - [Appears on](#appears-on)\n - [Why \"Narwhals\"?](#why-narwhals)\n\n</details>\n\n## Installation\n\n- pip (recommended, as it's the most up-to-date)\n ```\n pip install narwhals\n ```\n- conda-forge (also fine, but the latest version may take longer to appear)\n ```\n conda install -c conda-forge narwhals\n ```\n\n## Usage\n\nThere are three steps to writing dataframe-agnostic code using Narwhals:\n\n1. use `narwhals.from_native` to wrap a pandas/Polars/Modin/cuDF/PyArrow\n DataFrame/LazyFrame in a Narwhals class\n2. use the [subset of the Polars API supported by Narwhals](https://narwhals-dev.github.io/narwhals/api-reference/)\n3. use `narwhals.to_native` to return an object to the user in its original\n dataframe flavour. For example:\n\n - if you started with pandas, you'll get pandas back\n - if you started with Polars, you'll get Polars back\n - if you started with Modin, you'll get Modin back (and compute will be distributed)\n - if you started with cuDF, you'll get cuDF back (and compute will happen on GPU)\n - if you started with PyArrow, you'll get PyArrow back\n\n<h1 align=\"left\">\n\t<img\n\t\twidth=\"600\"\n\t\talt=\"narwhals_gif\"\n\t\tsrc=\"https://github.com/user-attachments/assets/88292d3c-6359-4155-973d-d0f8e3fbf5ac\">\n\n</h1>\n\n## Example\n\nSee the [tutorial](https://narwhals-dev.github.io/narwhals/basics/dataframe/) for several examples!\n\n## Scope\n\n- Do you maintain a dataframe-consuming library?\n- Do you have a specific Polars function in mind that you would like Narwhals to have in order to make your work easier?\n\nIf you said yes to both, we'd love to hear from you!\n\n## Roadmap\n\nSee [roadmap discussion on GitHub](https://github.com/narwhals-dev/narwhals/discussions/1370)\nfor an up-to-date plan of future work.\n\n## Used by\n\nJoin the party!\n\n- [altair](https://github.com/vega/altair/)\n- [hierarchicalforecast](https://github.com/Nixtla/hierarchicalforecast)\n- [marimo](https://github.com/marimo-team/marimo)\n- [panel-graphic-walker](https://github.com/panel-extensions/panel-graphic-walker)\n- [plotly](https://plotly.com)\n- [pymarginaleffects](https://github.com/vincentarelbundock/pymarginaleffects)\n- [py-shiny](https://github.com/posit-dev/py-shiny)\n- [rio](https://github.com/rio-labs/rio)\n- [scikit-lego](https://github.com/koaning/scikit-lego)\n- [scikit-playtime](https://github.com/koaning/scikit-playtime)\n- [tabmat](https://github.com/Quantco/tabmat)\n- [tea-tasting](https://github.com/e10v/tea-tasting)\n- [timebasedcv](https://github.com/FBruzzesi/timebasedcv)\n- [tubular](https://github.com/lvgig/tubular)\n- [vegafusion](https://github.com/vega/vegafusion)\n- [wimsey](https://github.com/benrutter/wimsey)\n\nFeel free to add your project to the list if it's missing, and/or\n[chat with us on Discord](https://discord.gg/V3PqtB4VA4) if you'd like any support.\n\n## Sponsors and institutional partners\n\nNarwhals is 100% independent, community-driven, and community-owned.\nWe are extremely grateful to the following organisations for having\nprovided some funding / development time:\n\n- [Quansight Labs](https://labs.quansight.org)\n- [Quansight Futures](https://www.qi.ventures)\n- [OpenTeams](https://www.openteams.com)\n- [POSSEE initiative](https://possee.org)\n- [BYU-Idaho](https://www.byui.edu)\n\nIf you contribute to Narwhals on your organization's time, please let us know. We'd be happy to add your employer\nto this list!\n\n## Appears on\n\nNarwhals has been featured in several talks, podcasts, and blog posts:\n\n- [Talk Python to me Podcast](https://youtu.be/FSH7BZ0tuE0)\n Ahoy, Narwhals are bridging the data science APIs\n\n- [Python Bytes Podcast](https://www.youtube.com/live/N7w_ESVW40I?si=y-wN1uCsAuJOKlOT&t=382)\n Episode 402, topic #2\n\n- [Super Data Science: ML & AI Podcast](https://www.youtube.com/watch?v=TeG4U8R0U8U) \n Narwhals: For Pandas-to-Polars DataFrame Compatibility\n\n- [Sample Space Podcast | probabl](https://youtu.be/8hYdq4sWbbQ?si=WG0QP1CZ6gkFf18b) \n How Narwhals has many end users ... that never use it directly. - Marco Gorelli\n\n- [The Real Python Podcast](https://www.youtube.com/watch?v=w5DFZbFYzCM)\n Narwhals: Expanding DataFrame Compatibility Between Libraries\n\n- [Pycon Lithuania](https://www.youtube.com/watch?v=-mdx7Cn6_6E) \n Marco Gorelli - DataFrame interoperatiblity - what's been achieved, and what comes next?\n\n- [Pycon Italy](https://www.youtube.com/watch?v=3IqUli9XsmQ) \n How you can write a dataframe-agnostic library - Marco Gorelli\n\n- [Polars Blog Post](https://pola.rs/posts/lightweight_plotting/) \n Polars has a new lightweight plotting backend\n\n- [Quansight Labs blog post (w/ Scikit-Lego)](https://labs.quansight.org/blog/scikit-lego-narwhals) \n How Narwhals and scikit-lego came together to achieve dataframe-agnosticism\n\n## Why \"Narwhals\"?\n\n[Coz they are so awesome](https://youtu.be/ykwqXuMPsoc?si=A-i8LdR38teYsos4).\n\nThanks to [Olha Urdeichuk](https://www.fiverr.com/olhaurdeichuk) for the illustration!\n",
"bugtrack_url": null,
"license": null,
"summary": "Extremely lightweight compatibility layer between dataframe libraries",
"version": "1.18.4",
"project_urls": {
"Bug Tracker": "https://github.com/narwhals-dev/narwhals",
"Homepage": "https://github.com/narwhals-dev/narwhals"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "fdae23fffe1efc750298e5e568cede71a9979c68ae8dcf08bf6d8ecd177a7bde",
"md5": "fb63678c64e8dc6999eae2c9c60cb4f2",
"sha256": "c6bb6b6fba59caeab28a7d6ec1e79ab0040c75baef2e4152199ad1a9c266ef96"
},
"downloads": -1,
"filename": "narwhals-1.18.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "fb63678c64e8dc6999eae2c9c60cb4f2",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 251273,
"upload_time": "2024-12-15T17:26:10",
"upload_time_iso_8601": "2024-12-15T17:26:10.587707Z",
"url": "https://files.pythonhosted.org/packages/fd/ae/23fffe1efc750298e5e568cede71a9979c68ae8dcf08bf6d8ecd177a7bde/narwhals-1.18.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "facff428738e49584498d3ea8765b3d5a068827955c0d8d704c259b03e8c635f",
"md5": "ef212bf0907e85d0ba6385ac87ed2b1f",
"sha256": "b1da4e2e4ab185824781760319ac1ec8ee2944a929795064c3a64ffff16b00c4"
},
"downloads": -1,
"filename": "narwhals-1.18.4.tar.gz",
"has_sig": false,
"md5_digest": "ef212bf0907e85d0ba6385ac87ed2b1f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 213705,
"upload_time": "2024-12-15T17:26:12",
"upload_time_iso_8601": "2024-12-15T17:26:12.383024Z",
"url": "https://files.pythonhosted.org/packages/fa/cf/f428738e49584498d3ea8765b3d5a068827955c0d8d704c259b03e8c635f/narwhals-1.18.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-15 17:26:12",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "narwhals-dev",
"github_project": "narwhals",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "narwhals"
}