statmoments


Namestatmoments JSON
Version 1.1.1 PyPI version JSON
download
home_pageNone
SummaryStreaming statistical moments
upload_time2025-02-05 08:40:34
maintainerNone
docs_urlNone
authorAnton Kochepasov
requires_python>=3.6
licenseMIT License Copyright (c) 2022 Anton Kochepasov 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 data-science univariate bivariate statistics streaming numpy vectorization
VCS
bugtrack_url
requirements h5py numpy scipy psutil cython
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # statmoments

Fast streaming univariate and bivariate moments and t-statistics.

statmoments is a high-performance library for computing univariate and bivariate statistical moments in a single pass over large waveform datasets with thousands of sample points. It can produce Welch's t-test statistics for hypothesis testing on arbitrary data partitions.

## Features

- Streaming processing for both univariate and bivariate analysis
- Efficient memory usage through dense matrix representation
- High numerical accuracy
- Command-line interface for analysis of existing datasets

## How is it different?

When input data differences are subtle, millions of waveforms may have to be processed to find the statistically significant difference, requiring efficient algorithms. In addition to that, the high-order moment computation need multiple passes and may require starting over once new data appear. With thousands of sample points per waveform, the problem becomes more complex.

A streaming algorithm processes sequences of inputs in a single pass as they are collected. When fast enough, it's suitable for real-time sources like oscilloscopes, sensors, and financial markets, as well as for large datasets that don't fit in memory. The dense matrix representation of an intermediate accumulator reduces memory requirements. The accumulator can be converted to co-moments and Welch's t-test statistics on demand. Data batches can be iteratively processed to increase precision and then discarded. The library handles significant input streams, processing hundreds of megabytes per second.

Yet another dimension can be added when the data split is unknown. In other words, which bucket the input waveform belongs to. This library solves this with given pre-classification of the input data and computing moments for all the requested data splits.

Some of the benefits of streaming computation include:

- Real-time insights for trend identification and anomaly detection
- Reduced data processing latency, crucial for time-sensitive applications
- Scalability to handle large data volumes, essential for data-intensive research in fields like astrophysics and financial analysis

## Numeric accuracy

The numeric accuracy of results depends on the coefficient of variation (COV) of a sample point in the input waveforms. With a COV of about 5%, the computed (co-)kurtosis has about 10 correct significant digits for 10,000 waveforms, sufficient for Welch's t-test. Increasing data by 100x loses one more significant digit.

## Examples

### Performing univariate data analysis

```python
  # Input data parameters
  tr_count = 100   # M input waveforms
  tr_len   = 5     # N features or points in the input waveforms
  cl_len   = 2     # L hypotheses how to split input waveforms

  # Create engine, which can compute up to kurtosis
  uveng = statmoments.Univar(tr_len, cl_len, moment=4)

  # Process input data and split hypotheses
  uveng.update(wforms1, classification1)

  # Process more input data and split hypotheses
  uveng.update(wforms2, classification2)

  # Get statistical moments
  mean       = [cm.copy() for cm in uveng.moments(moments=1)]  # E(X)
  skeweness  = [cm.copy() for cm in uveng.moments(moments=3)]  # E(X^3)

  # Detect statistical differences in the first-order t-test
  for i, tt in enumerate(statmoments.stattests.ttests(uveng, moment=1)):
    if np.any(np.abs(tt) > 5):
      print(f"Data split {i} has different means")

  # Process more input data and split hypotheses
  uveng.update(wforms3, classification3)

  # Get updated statistical moments and t-tests
  # with statmoments.stattests.ttests(uveng, moment=1)
```

### Performing bivariate data analysis

```python
  # Input data parameters
  tr_count = 100   # M input waveforms
  tr_len = 5       # N features or points in the input waveforms
  cl_len = 2       # L hypotheses how to split input waveforms

  # Create bivariate engine, which can compute up to co-kurtosis
  bveng = statmoments.Bivar(tr_len, cl_len, moment=4)

  # Process input data and split hypotheses
  bveng.update(wforms1, classification1)

  # Process more input data and split hypotheses
  bveng.update(wforms2, classification2)

  # Get bivariate moments
  covariance    = [cm.copy() for cm in bveng.comoments(moments=(1, 1))]  # E(X Y)
  cokurtosis22  = [cm.copy() for cm in bveng.comoments(moments=(2, 2))]  # E(X^2 Y^2)
  cokurtosis13  = [cm.copy() for cm in bveng.comoments(moments=(1, 3))]  # E(X^1 Y^3)

  # univariate statistical moments are also can be obtained
  variance   = [cm.copy() for cm in bveng.moments(moments=2)]  # E(X^2)

  # Detect statistical differences in the second order t-test (covariances)
  for i, tt in enumerate(statmoments.stattests.ttests(bveng, moment=(1,1))):
    if np.any(np.abs(tt) > 5):
      print(f"Found stat diff in the split {i}")

  # Process more input data and split hypotheses
  bveng.update(wforms3, classification3)

  # Get updated statistical moments and t-tests
  # with statmoments.stattests.ttests(bveng, moment=(1,1))
```

### Performing data analysis from the command line

```shell
# Find univariate t-test statistics of skeweness for the first
# 5000 waveform sample points, stored in a HDF5 dataset
python -m statmoments.univar -i data.h5 -m 3 -r 0:5000

# Find bivariate t-test statistics of covariance for the first
# 1000 waveform sample points, stored in a HDF5 dataset
python -m statmoments.bivar -i data.h5 -r 0:1000
```

More examples can be found in the examples and tests directories.

## Implementation Notes

statmoments uses top BLAS implementations, including GPU based on [nvmath-python](https://github.com/NVIDIA/nvmath-python) if available, for the best peformance on Windows, Linux and Macs,to maximize computational efficiency.

Due to RAM limits, results are produced one at a time for each input classifier as the set of statistical moments. Each classifier's output moment has dimensions 2 x M x L, where M is an index of the requested classifier and L is the region length.

The bivariate  results, co-moments and t-tests, are represented by the **upper triangle** of the symmetric matrix as 1D array for each classifier.

## Installation

```shell
pip install statmoments
```

## References

Anton Kochepasov, Ilya Stupakov, "An Efficient Single-pass Online Computation of Higher-Order Bivariate Statistics", 2024 IEEE International Conference on Big Data (BigData), 2024, pp. 123-129, [IEEE Xplore](https://ieeexplore.ieee.org/abstract/document/10825659).

```bibtex
@INPROCEEDINGS{10825659,
  author={Stupakov, Ilya and Kochepasov, Anton},
  booktitle={2024 IEEE International Conference on Big Data (BigData)},
  title={An Efficient Single-pass Online Computation of Higher-Order Bivariate Statistics},
  year={2024},
  pages={123-129},
  doi={10.1109/BigData62323.2024.10825659}
}
```

[![PyPi Version](https://img.shields.io/pypi/v/statmoments.svg?style=flat-square)](https://pypi.org/project/statmoments/)
[![PyPI pyversions](https://img.shields.io/pypi/pyversions/statmoments.svg?style=flat-square)](https://pypi.org/project/statmoments/)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "statmoments",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "data-science, univariate, bivariate, statistics, streaming, numpy, vectorization",
    "author": "Anton Kochepasov",
    "author_email": "akss@me.com",
    "download_url": "https://files.pythonhosted.org/packages/59/01/29c771732831a26d6a9f501a8e3e46ec65b0a26292e5b5434abf140c475d/statmoments-1.1.1.tar.gz",
    "platform": "any",
    "description": "# statmoments\n\nFast streaming univariate and bivariate moments and t-statistics.\n\nstatmoments is a high-performance library for computing univariate and bivariate statistical moments in a single pass over large waveform datasets with thousands of sample points. It can produce Welch's t-test statistics for hypothesis testing on arbitrary data partitions.\n\n## Features\n\n- Streaming processing for both univariate and bivariate analysis\n- Efficient memory usage through dense matrix representation\n- High numerical accuracy\n- Command-line interface for analysis of existing datasets\n\n## How is it different?\n\nWhen input data differences are subtle, millions of waveforms may have to be processed to find the statistically significant difference, requiring efficient algorithms. In addition to that, the high-order moment computation need multiple passes and may require starting over once new data appear. With thousands of sample points per waveform, the problem becomes more complex.\n\nA streaming algorithm processes sequences of inputs in a single pass as they are collected. When fast enough, it's suitable for real-time sources like oscilloscopes, sensors, and financial markets, as well as for large datasets that don't fit in memory. The dense matrix representation of an intermediate accumulator reduces memory requirements. The accumulator can be converted to co-moments and Welch's t-test statistics on demand. Data batches can be iteratively processed to increase precision and then discarded. The library handles significant input streams, processing hundreds of megabytes per second.\n\nYet another dimension can be added when the data split is unknown. In other words, which bucket the input waveform belongs to. This library solves this with given pre-classification of the input data and computing moments for all the requested data splits.\n\nSome of the benefits of streaming computation include:\n\n- Real-time insights for trend identification and anomaly detection\n- Reduced data processing latency, crucial for time-sensitive applications\n- Scalability to handle large data volumes, essential for data-intensive research in fields like astrophysics and financial analysis\n\n## Numeric accuracy\n\nThe numeric accuracy of results depends on the coefficient of variation (COV) of a sample point in the input waveforms. With a COV of about 5%, the computed (co-)kurtosis has about 10 correct significant digits for 10,000 waveforms, sufficient for Welch's t-test. Increasing data by 100x loses one more significant digit.\n\n## Examples\n\n### Performing univariate data analysis\n\n```python\n  # Input data parameters\n  tr_count = 100   # M input waveforms\n  tr_len   = 5     # N features or points in the input waveforms\n  cl_len   = 2     # L hypotheses how to split input waveforms\n\n  # Create engine, which can compute up to kurtosis\n  uveng = statmoments.Univar(tr_len, cl_len, moment=4)\n\n  # Process input data and split hypotheses\n  uveng.update(wforms1, classification1)\n\n  # Process more input data and split hypotheses\n  uveng.update(wforms2, classification2)\n\n  # Get statistical moments\n  mean       = [cm.copy() for cm in uveng.moments(moments=1)]  # E(X)\n  skeweness  = [cm.copy() for cm in uveng.moments(moments=3)]  # E(X^3)\n\n  # Detect statistical differences in the first-order t-test\n  for i, tt in enumerate(statmoments.stattests.ttests(uveng, moment=1)):\n    if np.any(np.abs(tt) > 5):\n      print(f\"Data split {i} has different means\")\n\n  # Process more input data and split hypotheses\n  uveng.update(wforms3, classification3)\n\n  # Get updated statistical moments and t-tests\n  # with statmoments.stattests.ttests(uveng, moment=1)\n```\n\n### Performing bivariate data analysis\n\n```python\n  # Input data parameters\n  tr_count = 100   # M input waveforms\n  tr_len = 5       # N features or points in the input waveforms\n  cl_len = 2       # L hypotheses how to split input waveforms\n\n  # Create bivariate engine, which can compute up to co-kurtosis\n  bveng = statmoments.Bivar(tr_len, cl_len, moment=4)\n\n  # Process input data and split hypotheses\n  bveng.update(wforms1, classification1)\n\n  # Process more input data and split hypotheses\n  bveng.update(wforms2, classification2)\n\n  # Get bivariate moments\n  covariance    = [cm.copy() for cm in bveng.comoments(moments=(1, 1))]  # E(X Y)\n  cokurtosis22  = [cm.copy() for cm in bveng.comoments(moments=(2, 2))]  # E(X^2 Y^2)\n  cokurtosis13  = [cm.copy() for cm in bveng.comoments(moments=(1, 3))]  # E(X^1 Y^3)\n\n  # univariate statistical moments are also can be obtained\n  variance   = [cm.copy() for cm in bveng.moments(moments=2)]  # E(X^2)\n\n  # Detect statistical differences in the second order t-test (covariances)\n  for i, tt in enumerate(statmoments.stattests.ttests(bveng, moment=(1,1))):\n    if np.any(np.abs(tt) > 5):\n      print(f\"Found stat diff in the split {i}\")\n\n  # Process more input data and split hypotheses\n  bveng.update(wforms3, classification3)\n\n  # Get updated statistical moments and t-tests\n  # with statmoments.stattests.ttests(bveng, moment=(1,1))\n```\n\n### Performing data analysis from the command line\n\n```shell\n# Find univariate t-test statistics of skeweness for the first\n# 5000 waveform sample points, stored in a HDF5 dataset\npython -m statmoments.univar -i data.h5 -m 3 -r 0:5000\n\n# Find bivariate t-test statistics of covariance for the first\n# 1000 waveform sample points, stored in a HDF5 dataset\npython -m statmoments.bivar -i data.h5 -r 0:1000\n```\n\nMore examples can be found in the examples and tests directories.\n\n## Implementation Notes\n\nstatmoments uses top BLAS implementations, including GPU based on [nvmath-python](https://github.com/NVIDIA/nvmath-python) if available, for the best peformance on Windows, Linux and Macs,to maximize computational efficiency.\n\nDue to RAM limits, results are produced one at a time for each input classifier as the set of statistical moments. Each classifier's output moment has dimensions 2 x M x L, where M is an index of the requested classifier and L is the region length.\n\nThe bivariate  results, co-moments and t-tests, are represented by the **upper triangle** of the symmetric matrix as 1D array for each classifier.\n\n## Installation\n\n```shell\npip install statmoments\n```\n\n## References\n\nAnton Kochepasov, Ilya Stupakov, \"An Efficient Single-pass Online Computation of Higher-Order Bivariate Statistics\", 2024 IEEE International Conference on Big Data (BigData), 2024, pp. 123-129, [IEEE Xplore](https://ieeexplore.ieee.org/abstract/document/10825659).\n\n```bibtex\n@INPROCEEDINGS{10825659,\n  author={Stupakov, Ilya and Kochepasov, Anton},\n  booktitle={2024 IEEE International Conference on Big Data (BigData)},\n  title={An Efficient Single-pass Online Computation of Higher-Order Bivariate Statistics},\n  year={2024},\n  pages={123-129},\n  doi={10.1109/BigData62323.2024.10825659}\n}\n```\n\n[![PyPi Version](https://img.shields.io/pypi/v/statmoments.svg?style=flat-square)](https://pypi.org/project/statmoments/)\n[![PyPI pyversions](https://img.shields.io/pypi/pyversions/statmoments.svg?style=flat-square)](https://pypi.org/project/statmoments/)\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2022 Anton Kochepasov\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.\n        ",
    "summary": "Streaming statistical moments",
    "version": "1.1.1",
    "project_urls": {
        "Issues": "https://github.com/akochepasov/statmoments/issues",
        "Source Code": "https://github.com/akochepasov/statmoments/"
    },
    "split_keywords": [
        "data-science",
        " univariate",
        " bivariate",
        " statistics",
        " streaming",
        " numpy",
        " vectorization"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "54dd483398f526c44e3bb61769814ebfee7c1b9543f3f5db13c066aa7e48c747",
                "md5": "c7b0ffedcd522c9961ec9883ad4caa69",
                "sha256": "7003367abf7d6a5de76c41680b1eb61eb56c7863f1b0137d58369820bbb4fa5a"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1-cp310-cp310-macosx_13_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c7b0ffedcd522c9961ec9883ad4caa69",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 806231,
            "upload_time": "2025-02-05T08:40:24",
            "upload_time_iso_8601": "2025-02-05T08:40:24.850115Z",
            "url": "https://files.pythonhosted.org/packages/54/dd/483398f526c44e3bb61769814ebfee7c1b9543f3f5db13c066aa7e48c747/statmoments-1.1.1-cp310-cp310-macosx_13_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bf28a43ef2443235329414542a6d7fdffc22c3bce3c34bd5cd3b6c376c9e82ed",
                "md5": "c62c0c25e1b8c57b7d15062e29f37919",
                "sha256": "2ace3d0bcee395aa2c45776b6ba3f305cf416483f6f02c384eb68d49fc3c23ea"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c62c0c25e1b8c57b7d15062e29f37919",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 725372,
            "upload_time": "2025-02-05T08:40:26",
            "upload_time_iso_8601": "2025-02-05T08:40:26.271963Z",
            "url": "https://files.pythonhosted.org/packages/bf/28/a43ef2443235329414542a6d7fdffc22c3bce3c34bd5cd3b6c376c9e82ed/statmoments-1.1.1-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3bcb9325f682b8e638ccd01378bd817811855e4e75f2bbbb9a7e06d95febba90",
                "md5": "d4242baf1aa7686c51aaf7d4f289f1f4",
                "sha256": "7790523b1b2dac3e2c3b10648a11895a3593262e426d6d9a8f2747a1c6824d57"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1-cp312-cp312-macosx_10_13_universal2.whl",
            "has_sig": false,
            "md5_digest": "d4242baf1aa7686c51aaf7d4f289f1f4",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.6",
            "size": 1155330,
            "upload_time": "2025-02-05T08:40:28",
            "upload_time_iso_8601": "2025-02-05T08:40:28.395881Z",
            "url": "https://files.pythonhosted.org/packages/3b/cb/9325f682b8e638ccd01378bd817811855e4e75f2bbbb9a7e06d95febba90/statmoments-1.1.1-cp312-cp312-macosx_10_13_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0efa17124208ddb467a93b80225e5b5dc9237855c15fe9ef042c7a8229674ca8",
                "md5": "500b0ea1a108856fa475679abd335d67",
                "sha256": "0517465c442fbadd1b3aa1182672929bff51e6959c1b749c67a9de14a3ddce22"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "500b0ea1a108856fa475679abd335d67",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.6",
            "size": 720219,
            "upload_time": "2025-02-05T08:40:29",
            "upload_time_iso_8601": "2025-02-05T08:40:29.771189Z",
            "url": "https://files.pythonhosted.org/packages/0e/fa/17124208ddb467a93b80225e5b5dc9237855c15fe9ef042c7a8229674ca8/statmoments-1.1.1-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dbdd8779ddb3bd7325612c98bf692a5d71fe803001244edc94cc80e0c9ae0388",
                "md5": "42aad7523e7f1cdc0070952e17fd7f2b",
                "sha256": "7d54f388b09f17ecf6a52fb510c0095930a518d0562dae6db68607e82afd8c13"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1-cp36-cp36m-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "42aad7523e7f1cdc0070952e17fd7f2b",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 376032,
            "upload_time": "2025-02-05T08:40:31",
            "upload_time_iso_8601": "2025-02-05T08:40:31.749706Z",
            "url": "https://files.pythonhosted.org/packages/db/dd/8779ddb3bd7325612c98bf692a5d71fe803001244edc94cc80e0c9ae0388/statmoments-1.1.1-cp36-cp36m-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "193042ae3d36f918ac895a74c72e09ab90f7a4e458f44ef17d229a802a7d9b6b",
                "md5": "c83b3a2a93ac977c6fc582d1409ddbe7",
                "sha256": "9274f1663304702e64be63a42dbc9f446c1a98053c3dbb7019e8fae5897b74cd"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1-cp36-cp36m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c83b3a2a93ac977c6fc582d1409ddbe7",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 327754,
            "upload_time": "2025-02-05T08:40:32",
            "upload_time_iso_8601": "2025-02-05T08:40:32.871597Z",
            "url": "https://files.pythonhosted.org/packages/19/30/42ae3d36f918ac895a74c72e09ab90f7a4e458f44ef17d229a802a7d9b6b/statmoments-1.1.1-cp36-cp36m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "590129c771732831a26d6a9f501a8e3e46ec65b0a26292e5b5434abf140c475d",
                "md5": "8a86137cf9ce1943f9277c9dc9a669a4",
                "sha256": "487ac038b69ae841323fb7c40d6bc96d5771a73dbc7cce05d44d4fa23414578b"
            },
            "downloads": -1,
            "filename": "statmoments-1.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "8a86137cf9ce1943f9277c9dc9a669a4",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 410090,
            "upload_time": "2025-02-05T08:40:34",
            "upload_time_iso_8601": "2025-02-05T08:40:34.326716Z",
            "url": "https://files.pythonhosted.org/packages/59/01/29c771732831a26d6a9f501a8e3e46ec65b0a26292e5b5434abf140c475d/statmoments-1.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-05 08:40:34",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "akochepasov",
    "github_project": "statmoments",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "h5py",
            "specs": []
        },
        {
            "name": "numpy",
            "specs": []
        },
        {
            "name": "scipy",
            "specs": []
        },
        {
            "name": "psutil",
            "specs": []
        },
        {
            "name": "cython",
            "specs": []
        }
    ],
    "lcname": "statmoments"
}
        
Elapsed time: 1.08677s