{"id":25028752,"url":"https://github.com/numbagg/numbagg","last_synced_at":"2025-05-15T09:07:16.441Z","repository":{"id":22169855,"uuid":"25501620","full_name":"numbagg/numbagg","owner":"numbagg","description":"Fast N-dimensional aggregation functions with Numba","archived":false,"fork":false,"pushed_at":"2025-05-06T04:38:24.000Z","size":496,"stargazers_count":218,"open_issues_count":11,"forks_count":16,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-06T05:29:55.585Z","etag":null,"topics":["numba","numpy","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/numbagg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-10-21T04:10:26.000Z","updated_at":"2025-05-06T04:38:27.000Z","dependencies_parsed_at":"2023-10-05T00:00:29.000Z","dependency_job_id":"9240e746-efd5-4417-be2e-2d441b68b2df","html_url":"https://github.com/numbagg/numbagg","commit_stats":{"total_commits":105,"total_committers":9,"mean_commits":"11.666666666666666","dds":0.6761904761904762,"last_synced_commit":"2f7b3a8b517395e13165d5a58d58c6c45eef5536"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numbagg%2Fnumbagg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numbagg%2Fnumbagg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numbagg%2Fnumbagg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numbagg%2Fnumbagg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/numbagg","download_url":"https://codeload.github.com/numbagg/numbagg/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252630697,"owners_count":21779414,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["numba","numpy","python"],"created_at":"2025-02-05T20:43:00.280Z","updated_at":"2025-05-15T09:07:16.389Z","avatar_url":"https://github.com/numbagg.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Numbagg: Fast N-dimensional aggregation functions with Numba\n\n[![GitHub Workflow CI Status](https://img.shields.io/github/actions/workflow/status/numbagg/numbagg/test.yaml?branch=main\u0026logo=github\u0026style=for-the-badge)](https://github.com/numbagg/numbagg/actions/workflows/test.yaml)\n[![PyPI Version](https://img.shields.io/pypi/v/numbagg?style=for-the-badge)](https://pypi.python.org/pypi/numbagg/)\n\nFast, flexible N-dimensional array functions written with\n[Numba](https://github.com/numba/numba) and NumPy's [generalized\nufuncs](http://docs.scipy.org/doc/numpy/reference/c-api.generalized-ufuncs.html).\n\n## Why use numbagg?\n\n### Performance\n\n- Outperforms pandas\n  - On a single core, 2-10x faster for moving window functions, 1-2x faster for\n    aggregation and grouping functions\n  - When parallelizing with multiple cores, 4-30x faster\n- Outperforms bottleneck on multiple cores\n  - On a single core, matches bottleneck\n  - When parallelizing with multiple cores, 3-7x faster\n- Outperforms numpy on multiple cores\n  - On a single core, matches numpy\n  - When parallelizing with multiple cores, 5-15x faster\n- ...though numbagg's functions are JIT compiled, so the first run is much slower\n\n### Versatility\n\n- More functions (though bottleneck has some functions we don't have, and pandas' functions\n  have many more parameters)\n- Functions work for \u003e3 dimensions. All functions take an arbitrary axis or\n  tuple of axes to calculate over\n- Written in numba — way less code, simple to inspect, simple to improve\n\n## Functions \u0026 benchmarks\n\n### Summary benchmark\n\nTwo benchmarks summarize numbagg's performance — the first with a 1D array of 10M elements without\nparallelization, and a second with a 2D array of 100x10K elements with parallelization. Numbagg's relative\nperformance is much higher where parallelization is possible. A wider range of arrays is\nlisted in the full set of benchmarks below.\n\nThe values in the table are numbagg's performance as a multiple of other libraries for a\ngiven shaped array calculated over the final axis. (so 1.00x means numbagg is equal,\nhigher means numbagg is faster.)\n\n| func                      | 1D\u003cbr\u003epandas | 1D\u003cbr\u003ebottleneck | 1D\u003cbr\u003enumpy | 2D\u003cbr\u003epandas | 2D\u003cbr\u003ebottleneck | 2D\u003cbr\u003enumpy |\n| :------------------------ | -----------: | ---------------: | ----------: | -----------: | ---------------: | ----------: |\n| `bfill`                   |        1.06x |            1.13x |         n/a |       11.11x |            5.04x |         n/a |\n| `ffill`                   |        1.12x |            0.99x |         n/a |       11.50x |            4.25x |         n/a |\n| `group_nanall`            |        1.38x |              n/a |         n/a |        7.77x |              n/a |         n/a |\n| `group_nanany`            |        1.12x |              n/a |         n/a |        6.21x |              n/a |         n/a |\n| `group_nanargmax`         |        1.16x |              n/a |         n/a |        6.81x |              n/a |         n/a |\n| `group_nanargmin`         |        1.17x |              n/a |         n/a |        6.48x |              n/a |         n/a |\n| `group_nancount`          |        1.05x |              n/a |         n/a |        4.94x |              n/a |         n/a |\n| `group_nanfirst`          |        1.52x |              n/a |         n/a |       11.13x |              n/a |         n/a |\n| `group_nanlast`           |        1.12x |              n/a |         n/a |        5.56x |              n/a |         n/a |\n| `group_nanmax`            |        1.13x |              n/a |         n/a |        5.13x |              n/a |         n/a |\n| `group_nanmean`           |        1.14x |              n/a |         n/a |        5.61x |              n/a |         n/a |\n| `group_nanmin`            |        1.12x |              n/a |         n/a |        5.75x |              n/a |         n/a |\n| `group_nanprod`           |        1.15x |              n/a |         n/a |        5.25x |              n/a |         n/a |\n| `group_nanstd`            |        1.14x |              n/a |         n/a |        5.41x |              n/a |         n/a |\n| `group_nansum_of_squares` |        1.33x |              n/a |         n/a |        8.00x |              n/a |         n/a |\n| `group_nansum`            |        1.18x |              n/a |         n/a |        5.63x |              n/a |         n/a |\n| `group_nanvar`            |        1.13x |              n/a |         n/a |        4.88x |              n/a |         n/a |\n| `move_corr`               |       16.42x |              n/a |         n/a |      115.76x |              n/a |         n/a |\n| `move_cov`                |       12.30x |              n/a |         n/a |       86.56x |              n/a |         n/a |\n| `move_exp_nancorr`        |        6.65x |              n/a |         n/a |       46.98x |              n/a |         n/a |\n| `move_exp_nancount`       |        1.88x |              n/a |         n/a |        9.95x |              n/a |         n/a |\n| `move_exp_nancov`         |        6.53x |              n/a |         n/a |       43.63x |              n/a |         n/a |\n| `move_exp_nanmean`        |        1.61x |              n/a |         n/a |       10.65x |              n/a |         n/a |\n| `move_exp_nanstd`         |        1.76x |              n/a |         n/a |       12.40x |              n/a |         n/a |\n| `move_exp_nansum`         |        1.09x |              n/a |         n/a |        9.01x |              n/a |         n/a |\n| `move_exp_nanvar`         |        1.77x |              n/a |         n/a |       11.41x |              n/a |         n/a |\n| `move_mean`               |        6.03x |            1.34x |         n/a |       26.60x |            6.25x |         n/a |\n| `move_std`                |        4.76x |            0.89x |         n/a |       29.09x |            6.24x |         n/a |\n| `move_sum`                |        5.16x |            1.13x |         n/a |       24.02x |            6.10x |         n/a |\n| `move_var`                |        5.45x |            1.05x |         n/a |       29.54x |            6.05x |         n/a |\n| `nanargmax`[^5]           |        2.40x |            0.53x |         n/a |        2.32x |            0.93x |         n/a |\n| `nanargmin`[^5]           |        2.35x |            0.50x |         n/a |        2.53x |            1.00x |         n/a |\n| `nancount`                |        2.01x |              n/a |       1.59x |       12.26x |              n/a |       3.96x |\n| `nanmax`[^5]              |        3.15x |            0.50x |       0.09x |        3.59x |            3.24x |       0.09x |\n| `nanmean`                 |        3.00x |            1.01x |       3.82x |       18.98x |            5.04x |      19.33x |\n| `nanmin`[^5]              |        3.07x |            0.50x |       0.09x |        3.39x |            3.03x |       0.09x |\n| `nanquantile`             |        0.69x |              n/a |       0.53x |        4.94x |              n/a |       4.33x |\n| `nanstd`                  |        1.63x |            1.61x |       3.39x |       12.39x |           10.18x |      22.03x |\n| `nansum`                  |        2.48x |            0.94x |       3.31x |       20.47x |            4.65x |      17.90x |\n| `nanvar`                  |        1.61x |            1.65x |       3.40x |       12.62x |           10.49x |      22.13x |\n\n### Full benchmarks\n\n\u003cdetails\u003e\n\n| func                      |                  shape |      size | ndim | pandas | bottleneck |  numpy | numbagg | pandas_ratio | bottleneck_ratio | numpy_ratio | numbagg_ratio |\n| :------------------------ | ---------------------: | --------: | ---: | -----: | ---------: | -----: | ------: | -----------: | ---------------: | ----------: | ------------: |\n| `bfill`                   |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |        0.38x |            0.01x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   15ms |       16ms |    n/a |    14ms |        1.06x |            1.13x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   37ms |       17ms |    n/a |     3ms |       11.11x |            5.04x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       18ms |    n/a |     3ms |          n/a |            6.13x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      199ms |    n/a |    31ms |          n/a |            6.44x |         n/a |         1.00x |\n| `ffill`                   |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |        0.37x |            0.01x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   15ms |       14ms |    n/a |    14ms |        1.12x |            0.99x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   37ms |       14ms |    n/a |     3ms |       11.50x |            4.25x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       14ms |    n/a |     3ms |          n/a |            4.64x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      176ms |    n/a |    31ms |          n/a |            5.72x |         n/a |         1.00x |\n| `group_nanall`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.72x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   48ms |        n/a |    n/a |    35ms |        1.38x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   18ms |        n/a |    n/a |     2ms |        7.77x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     1ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanany`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.70x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   49ms |        n/a |    n/a |    44ms |        1.12x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   18ms |        n/a |    n/a |     3ms |        6.21x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanargmax`         |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        1.07x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   49ms |        n/a |    n/a |    42ms |        1.16x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   17ms |        n/a |    n/a |     3ms |        6.81x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanargmin`         |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        1.06x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   49ms |        n/a |    n/a |    42ms |        1.17x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   17ms |        n/a |    n/a |     3ms |        6.48x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nancount`          |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.66x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   44ms |        n/a |    n/a |    42ms |        1.05x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   13ms |        n/a |    n/a |     3ms |        4.94x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     1ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanfirst`          |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.73x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   52ms |        n/a |    n/a |    34ms |        1.52x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   16ms |        n/a |    n/a |     1ms |       11.13x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     1ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanlast`           |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.72x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   47ms |        n/a |    n/a |    42ms |        1.12x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   14ms |        n/a |    n/a |     2ms |        5.56x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     1ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanmax`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.71x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   48ms |        n/a |    n/a |    43ms |        1.13x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   14ms |        n/a |    n/a |     3ms |        5.13x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanmean`           |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.72x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   50ms |        n/a |    n/a |    44ms |        1.14x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   16ms |        n/a |    n/a |     3ms |        5.61x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanmin`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.73x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   48ms |        n/a |    n/a |    43ms |        1.12x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   14ms |        n/a |    n/a |     2ms |        5.75x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanprod`           |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.70x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   48ms |        n/a |    n/a |    42ms |        1.15x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   14ms |        n/a |    n/a |     3ms |        5.25x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     1ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanstd`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.71x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   51ms |        n/a |    n/a |    45ms |        1.14x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   17ms |        n/a |    n/a |     3ms |        5.41x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nansum`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.74x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   51ms |        n/a |    n/a |    43ms |        1.18x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   16ms |        n/a |    n/a |     3ms |        5.63x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nanvar`            |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.70x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   51ms |        n/a |    n/a |    45ms |        1.13x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   16ms |        n/a |    n/a |     3ms |        4.88x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     2ms |          n/a |              n/a |         n/a |         1.00x |\n| `group_nansum_of_squares` |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.88x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   57ms |        n/a |    n/a |    43ms |        1.33x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   22ms |        n/a |    n/a |     3ms |        8.00x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     1ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_corr`               |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        2.68x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  710ms |        n/a |    n/a |    43ms |       16.42x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  683ms |        n/a |    n/a |     6ms |      115.76x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     5ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    49ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_cov`                |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        2.43x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  490ms |        n/a |    n/a |    40ms |       12.30x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  460ms |        n/a |    n/a |     5ms |       86.56x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     4ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    44ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_mean`               |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |        0.46x |            0.01x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   92ms |       21ms |    n/a |    15ms |        6.03x |            1.34x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   88ms |       21ms |    n/a |     3ms |       26.60x |            6.25x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       20ms |    n/a |     3ms |          n/a |            6.66x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      228ms |    n/a |    32ms |          n/a |            7.12x |         n/a |         1.00x |\n| `move_std`                |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |        0.53x |            0.02x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  141ms |       26ms |    n/a |    30ms |        4.76x |            0.89x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  123ms |       26ms |    n/a |     4ms |       29.09x |            6.24x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       26ms |    n/a |     4ms |          n/a |            7.37x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      291ms |    n/a |    37ms |          n/a |            7.82x |         n/a |         1.00x |\n| `move_sum`                |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |        0.46x |            0.01x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   95ms |       21ms |    n/a |    18ms |        5.16x |            1.13x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   83ms |       21ms |    n/a |     3ms |       24.02x |            6.10x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       21ms |    n/a |     3ms |          n/a |            6.79x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      227ms |    n/a |    31ms |          n/a |            7.29x |         n/a |         1.00x |\n| `move_var`                |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |        0.50x |            0.02x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  131ms |       25ms |    n/a |    24ms |        5.45x |            1.05x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  122ms |       25ms |    n/a |     4ms |       29.54x |            6.05x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       25ms |    n/a |     4ms |          n/a |            7.12x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      275ms |    n/a |    36ms |          n/a |            7.69x |         n/a |         1.00x |\n| `move_exp_nancorr`        |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        2.33x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  344ms |        n/a |    n/a |    52ms |        6.65x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  338ms |        n/a |    n/a |     7ms |       46.98x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     6ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    55ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_exp_nancount`       |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.57x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   51ms |        n/a |    n/a |    27ms |        1.88x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   47ms |        n/a |    n/a |     5ms |        9.95x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     4ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    40ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_exp_nancov`         |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        2.19x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  215ms |        n/a |    n/a |    33ms |        6.53x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  234ms |        n/a |    n/a |     5ms |       43.63x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     5ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    43ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_exp_nanmean`        |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.39x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   47ms |        n/a |    n/a |    30ms |        1.61x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   52ms |        n/a |    n/a |     5ms |       10.65x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     4ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    43ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_exp_nanstd`         |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.68x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   64ms |        n/a |    n/a |    36ms |        1.76x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   74ms |        n/a |    n/a |     6ms |       12.40x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     5ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    44ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_exp_nansum`         |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.38x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   36ms |        n/a |    n/a |    33ms |        1.09x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   43ms |        n/a |    n/a |     5ms |        9.01x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     4ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    42ms |          n/a |              n/a |         n/a |         1.00x |\n| `move_exp_nanvar`         |                (1000,) |      1000 |    1 |    0ms |        n/a |    n/a |     0ms |        0.40x |              n/a |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   56ms |        n/a |    n/a |    32ms |        1.77x |              n/a |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   64ms |        n/a |    n/a |     6ms |       11.41x |              n/a |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    n/a |     4ms |          n/a |              n/a |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |    n/a |    46ms |          n/a |              n/a |         n/a |         1.00x |\n| `nanargmax`[^5]           |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |       17.65x |            0.17x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   24ms |        5ms |    n/a |    10ms |        2.40x |            0.53x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   25ms |       10ms |    n/a |    11ms |        2.32x |            0.93x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       11ms |    n/a |    11ms |          n/a |            1.00x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      107ms |    n/a |   108ms |          n/a |            0.99x |         n/a |         1.00x |\n| `nanargmin`[^5]           |                (1000,) |      1000 |    1 |    0ms |        0ms |    n/a |     0ms |       17.72x |            0.17x |         n/a |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   25ms |        5ms |    n/a |    11ms |        2.35x |            0.50x |         n/a |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   25ms |       10ms |    n/a |    10ms |        2.53x |            1.00x |         n/a |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       11ms |    n/a |    11ms |          n/a |            1.00x |         n/a |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      108ms |    n/a |   108ms |          n/a |            1.00x |         n/a |         1.00x |\n| `nancount`                |                (1000,) |      1000 |    1 |    0ms |        n/a |    0ms |     0ms |        0.77x |              n/a |       0.02x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |    3ms |        n/a |    3ms |     2ms |        2.01x |              n/a |       1.59x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |    8ms |        n/a |    3ms |     1ms |       12.26x |              n/a |       3.96x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |    3ms |     1ms |          n/a |              n/a |       3.97x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a |   33ms |     7ms |          n/a |              n/a |       5.07x |         1.00x |\n| `nanmax`[^5]              |                (1000,) |      1000 |    1 |    0ms |        0ms |    0ms |     0ms |       11.07x |            0.17x |       0.55x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   32ms |        5ms |    1ms |    10ms |        3.15x |            0.50x |       0.09x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   36ms |       33ms |    1ms |    10ms |        3.59x |            3.24x |       0.09x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       32ms |    1ms |    10ms |          n/a |            3.24x |       0.10x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      320ms |   11ms |    98ms |          n/a |            3.26x |       0.11x |         1.00x |\n| `nanmean`                 |                (1000,) |      1000 |    1 |    0ms |        0ms |    0ms |     0ms |        0.39x |            0.00x |       0.05x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   17ms |        6ms |   21ms |     6ms |        3.00x |            1.01x |       3.82x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   21ms |        5ms |   21ms |     1ms |       18.98x |            5.04x |      19.33x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        5ms |   21ms |     1ms |          n/a |            6.10x |      23.77x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |       54ms |  258ms |     8ms |          n/a |            7.00x |      33.59x |         1.00x |\n| `nanmin`[^5]              |                (1000,) |      1000 |    1 |    0ms |        0ms |    0ms |     0ms |       10.86x |            0.17x |       0.55x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   33ms |        5ms |    1ms |    11ms |        3.07x |            0.50x |       0.09x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   36ms |       32ms |    1ms |    11ms |        3.39x |            3.03x |       0.09x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       32ms |    1ms |    10ms |          n/a |            3.12x |       0.10x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      320ms |   11ms |   102ms |          n/a |            3.12x |       0.11x |         1.00x |\n| `nanquantile`             |                (1000,) |      1000 |    1 |    0ms |        n/a |    0ms |     0ms |        0.56x |              n/a |       0.21x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |  114ms |        n/a |   87ms |   164ms |        0.69x |              n/a |       0.53x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |  131ms |        n/a |  115ms |    27ms |        4.94x |              n/a |       4.33x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        n/a |  315ms |    19ms |          n/a |              n/a |      16.51x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |        n/a | 3118ms |   165ms |          n/a |              n/a |      18.88x |         1.00x |\n| `nanstd`                  |                (1000,) |      1000 |    1 |    0ms |        0ms |    0ms |     0ms |        0.31x |            0.02x |       0.14x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   21ms |       20ms |   43ms |    13ms |        1.63x |            1.61x |       3.39x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   24ms |       20ms |   43ms |     2ms |       12.39x |           10.18x |      22.03x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       20ms |   46ms |     1ms |          n/a |           14.17x |      32.66x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      202ms |  513ms |    13ms |          n/a |           16.08x |      40.78x |         1.00x |\n| `nansum`                  |                (1000,) |      1000 |    1 |    0ms |        0ms |    0ms |     0ms |        0.46x |            0.01x |       0.03x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   14ms |        5ms |   19ms |     6ms |        2.48x |            0.94x |       3.31x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   22ms |        5ms |   19ms |     1ms |       20.47x |            4.65x |      17.90x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |        5ms |   20ms |     1ms |          n/a |            6.21x |      22.95x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |       53ms |  226ms |     8ms |          n/a |            6.98x |      29.90x |         1.00x |\n| `nanvar`                  |                (1000,) |      1000 |    1 |    0ms |        0ms |    0ms |     0ms |        0.32x |            0.02x |       0.13x |         1.00x |\n|                           |            (10000000,) |  10000000 |    1 |   21ms |       21ms |   44ms |    13ms |        1.61x |            1.65x |       3.40x |         1.00x |\n|                           |          (100, 100000) |  10000000 |    2 |   25ms |       21ms |   43ms |     2ms |       12.62x |           10.49x |      22.13x |         1.00x |\n|                           | (10, 10, 10, 10, 1000) |  10000000 |    5 |    n/a |       20ms |   46ms |     1ms |          n/a |           14.02x |      32.28x |         1.00x |\n|                           |      (100, 1000, 1000) | 100000000 |    3 |    n/a |      202ms |  503ms |    13ms |          n/a |           15.68x |      38.98x |         1.00x |\n\n\u003c/details\u003e\n\n[^1][^2][^3][^4]\n\n[^1]:\n    Benchmarks were run on a Mac M3 Max laptop in September 2024 on numbagg's HEAD,\n    pandas 2.2.2, bottleneck 1.4.0 numpy 2.0.1, with `python\nnumbagg/test/run_benchmarks.py -- --benchmark-max-time=10`. They run in CI,\n    though GHA's low CPU count means we don't see the full benefits of\n    parallelization.\n\n[^2]:\n    While we separate the setup and the running of the functions, pandas still\n    needs to do some work to create its result dataframe, and numbagg does some\n    checks in python which bottleneck does in C or doesn't do. So use benchmarks\n    on larger arrays for our summary so we can focus on the computational speed,\n    which doesn't asymptote away. Any contributions to improve the benchmarks are\n    welcome.\n\n[^3]:\n    In some instances, a library won't have the exact function — for example,\n    pandas doesn't have an equivalent `move_exp_nancount` function, so we use\n    its `sum` function on an array of `1`s. Similarly for\n    `group_nansum_of_squares`, we use two separate operations.\n\n[^4]:\n    `anynan` \u0026 `allnan` are also functions in numbagg, but not listed here as they\n    require a different benchmark setup.\n\n[^5]:\n    This function is not currently parallelized, so exhibits worse performance\n    on parallelizable arrays.\n\n## Example implementation\n\nNumbagg makes it easy to write, in pure Python/NumPy, flexible aggregation\nfunctions accelerated by Numba. All the hard work is done by Numba's JIT\ncompiler and NumPy's gufunc machinery (as wrapped by Numba).\n\nFor example, here is how we wrote `nansum`:\n\n```python\nimport numpy as np\nfrom numbagg.decorators import ndreduce\n\n@ndreduce.wrap()\ndef nansum(a):\n    asum = 0.0\n    for ai in a.flat:\n        if not np.isnan(ai):\n            asum += ai\n    return asum\n```\n\n## Implementation details\n\nNumbagg includes somewhat awkward workarounds for features missing from\nNumPy/Numba:\n\n- It implements its own cache for functions wrapped by Numba's\n  `guvectorize`, because that decorator is rather slow.\n- It does its [own handling of array\n  transposes](https://github.com/numbagg/numbagg/blob/e166adae94b3be35497dcdc22772026df75af253/numbagg/decorators.py#L170-L181)\n  to handle the `axis` argument in reduction functions.\n- It [rewrites plain functions into\n  gufuncs](https://github.com/numbagg/numbagg/blob/e166adae94b3be35497dcdc22772026df75af253/numbagg/transform.py),\n  to allow writing a traditional function while retaining the multidimensional advantages of\n  gufuncs.\n\nAlready some of the ideas here have flowed upstream to numba (for example, [an\naxis parameter](https://github.com/numpy/numpy/issues/5197)), and we hope\nthat others will follow.\n\n## License\n\n3-clause BSD. Includes portions of Bottleneck, which is distributed under a\nSimplified BSD license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumbagg%2Fnumbagg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnumbagg%2Fnumbagg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumbagg%2Fnumbagg/lists"}