shin


Nameshin JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryPython implementation of Shin's method for calculating implied probabilities from bookmaker odds
upload_time2024-04-27 06:54:40
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # shin

A Python implementation of Shin's method [[1](#1), [2](#2)] for calculating implied probabilities from bookmaker odds.

Probabilities calculated in this way have been shown to be more accurate than those obtained by the standard approach
of dividing the inverse odds by the booksum [[3](#3)].

# Installation

Requires Python 3.9 or above.

```
pip install shin
```

# Usage

```python
import shin

shin.calculate_implied_probabilities([2.6, 2.4, 4.3])
```

```
[0.37299406033208965, 0.4047794109200184, 0.2222265287474275]
```

Shin's method assumes there is some unknown proportion of bettors that are insiders, `z`, and this proportion along with
the implied probabilities can be estimated using an iterative procedure described in [[4](#4)].

Diagnostic information from the iterative procedure can be obtained by setting the `full_output` argument to `True`:

```python
import shin

shin.calculate_implied_probabilities([2.6, 2.4, 4.3], full_output=True)
```

```
ShinOptimisationDetails(
    implied_probabilities=[0.37299406033208965, 0.4047794109200184, 0.2222265287474275],
    iterations=426,
    delta=9.667822098435863e-13,
    z=0.01694251276407055
)
```

The returned object contains the following fields:

* `implied_probablities`
* `iterations` - compare this value to the `max_iterations` argument (default = `1000`) to check for failed convergence
* `delta` - the final change in `z` for the final iteration. Compare with the `convergence_threshold` argument
  (default = `1e-12`) to assess convergence
* `z` - the estimated proportion of theoretical betting volume coming from insider traders

When there are only two outcomes, `z` can be calculated analytically [[3](#3)]. In this case, the `iterations` and
`delta` fields of the returned `dict` are `0` to reflect this:

```python
import shin

shin.calculate_implied_probabilities([1.5, 2.74], full_output=True)
```

```
ShinOptimisationDetails(
    implied_probabilities=[0.6508515815085157, 0.3491484184914841],
    iterations=0.0,
    delta=0.0,
    z=0.03172728540646625
)
```

Note that with two outcomes, Shin's method is equivalent to the Additive Method of [[5](#5)].

# What's New in Version 0.2.0?

The latest version improves support for static typing and includes a breaking change.

## Breaking Change To `calculate_implied_probabilities()` Signature

All arguments to `calculate_implied_probabilities()` other than `odds` are now keyword only arguments. This change
simplified declaration of overloads to support typing the function's return value and will allow for more flexibility
in the API.

```py
from shin import calculate_implied_probabilities

# still works
calculate_implied_probabilities([2.0, 2.0])
calculate_implied_probabilities(odds=[2.0, 2.0])
calculate_implied_probabilities([2.0, 2.0], full_output=True)
## also any other combination of passing arguments as keyword args remains the same

# passing any arg other than `odds` as positional is now an error
calculate_implied_probabilibies([2.0, 2.0], 1000)  # Error
calculate_implied_probabilities([2.0, 2.0], max_iterations=1000)  # OK


calculate_impolied_probabilities([2.0, 2.0], 1000, 1e-12, True) # Error
calculate_implied_probabilities([2.0, 2.0], max_iterations=1000, convergence_threshold=1e-12, full_output=True)  # OK
```

See [this commit](https://github.com/mberk/shin/commit/06a4ce90fc9bb047cef4e70d8a429b69a6cfd181) for more details.

## Full Output Type

The `full_output` argument now returns a `ShinOptimisationDetails` object instead of a `dict`. This object is a
`dataclass` with the same fields as the `dict` that was previously returned.

For the read-only case, the `ShinOptimisationDetails` object can be used as a drop-in replacement for the `dict` that
was previously returned as it supports `__getitem__()`.

This change was introduced to support generic typing of the `implied_probabilities`, currently not supported by
`TypedDict` in versions of Python < 3.11.

See [this](https://github.com/mberk/shin/commit/467d88954d5ca958b6a1b73c9c4af412725b4d4a) and
[this](https://github.com/mberk/shin/commit/c9b6e42b9d791fa4e4219a993f0dd2524ceaa1b5) for more details.

# What's New in Version 0.1.0?

The latest version introduces some substantial changes and breaking API changes.

## Default Return Value Behaviour

Previously `shin.calculate_implied_probabilities` would return a `dict` that contained convergence details of the
iterative fitting procedure along with the implied probabilities:

```python
import shin

shin.calculate_implied_probabilities([2.6, 2.4, 4.3])
```

```
{'implied_probabilities': [0.37299406033208965,
  0.4047794109200184,
  0.2222265287474275],
 'iterations': 425,
 'delta': 9.667822098435863e-13,
 'z': 0.01694251276407055}
```

The default behaviour now is for the function to only return the implied probabilities:

```python
import shin

shin.calculate_implied_probabilities([2.6, 2.4, 4.3])
```

```
[0.37299406033208965, 0.4047794109200184, 0.2222265287474275]
```

The full output can still be had by setting the `full_output` argument to `True`:

```python
import shin

shin.calculate_implied_probabilities([2.6, 2.4, 4.3], full_output=True)
```

```
{'implied_probabilities': [0.37299406033208965,
  0.4047794109200184,
  0.2222265287474275],
 'iterations': 425,
 'delta': 9.667822098435863e-13,
 'z': 0.01694251276407055}
```

## Passing Mappings

A common scenario is to have a mapping between some selection identifiers and their odds. You can now pass such
mappings to `shin.calculate_implied_probabilities` and have a new `dict` mapping between the selection identifiers and
their probabilities returned:

```python
import shin

shin.calculate_implied_probabilities({"HOME": 2.6, "AWAY": 2.4, "DRAW": 4.3})
```

```
{'HOME': 0.37299406033208965,
 'AWAY': 0.4047794109200184,
 'DRAW': 0.2222265287474275}
```

This also works when asking for the full output to be returned:

```python
import shin

shin.calculate_implied_probabilities({"HOME": 2.6, "AWAY": 2.4, "DRAW": 4.3}, full_output=True)
```

```
{'implied_probabilities': {'HOME': 0.37299406033208965,
  'AWAY': 0.4047794109200184,
  'DRAW': 0.2222265287474275},
 'iterations': 426,
 'delta': 9.667822098435863e-13,
 'z': 0.01694251276407055}
```

## Controlling the Optimiser

Starting in version 0.1.0, the iterative procedure is implemented in Rust which provides a  considerable performance
boost. If you would like to use the old Python based optimiser use the `force_python_optimiser` argument:

```python
import timeit
timeit.timeit(
    "shin.calculate_implied_probabilities([2.6, 2.4, 4.3], force_python_optimiser=True)",
    setup="import shin",
    number=10000
)
```

```
3.9101167659973726
```

```python
import timeit
timeit.timeit(
    "shin.calculate_implied_probabilities([2.6, 2.4, 4.3])",
    setup="import shin",
    number=10000
)
```

```
0.14442387002054602
```

# References

<a id="1">[1]</a> 
[H. S. Shin, “Prices of State Contingent Claims with Insider
traders, and the Favorite-Longshot Bias”. The Economic
Journal, 1992, 102, pp. 426-435.](https://doi.org/10.2307/2234526)

<a id="2">[2]</a> 
[H. S. Shin, “Measuring the Incidence of Insider Trading in a
Market for State-Contingent Claims”. The Economic Journal,
1993, 103(420), pp. 1141-1153.](https://doi.org/10.2307/2234240)

<a id="3">[3]</a>
[E. Štrumbelj, "On determining probability forecasts from betting odds".
International Journal of Forecasting, 2014, Volume 30, Issue 4,
pp. 934-943.](https://doi.org/10.1016/j.ijforecast.2014.02.008)

<a id="4">[4]</a>
[B. Jullien and B. Salanié, "Measuring the Incidence of Insider Trading: A Comment on Shin".
The Economic Journal, 1994, 104(427), pp. 1418–1419](https://doi.org/10.2307/2235458)

<a id="5">[5]</a>
[S. Clarke, S. Kovalchik, M. Ingram, "Adjusting bookmaker’s odds to allow for
overround". American Journal of Sports Science, 2017, Volume 5, Issue 6,
pp. 45-49.](https://doi.org/10.11648/j.ajss.20170506.12)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "shin",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/0d/37/af5790f175120593f0ea36b06000f04bec7ec984b8127ea02df8d24a253b/shin-0.2.0.tar.gz",
    "platform": null,
    "description": "# shin\n\nA Python implementation of Shin's method [[1](#1), [2](#2)] for calculating implied probabilities from bookmaker odds.\n\nProbabilities calculated in this way have been shown to be more accurate than those obtained by the standard approach\nof dividing the inverse odds by the booksum [[3](#3)].\n\n# Installation\n\nRequires Python 3.9 or above.\n\n```\npip install shin\n```\n\n# Usage\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities([2.6, 2.4, 4.3])\n```\n\n```\n[0.37299406033208965, 0.4047794109200184, 0.2222265287474275]\n```\n\nShin's method assumes there is some unknown proportion of bettors that are insiders, `z`, and this proportion along with\nthe implied probabilities can be estimated using an iterative procedure described in [[4](#4)].\n\nDiagnostic information from the iterative procedure can be obtained by setting the `full_output` argument to `True`:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities([2.6, 2.4, 4.3], full_output=True)\n```\n\n```\nShinOptimisationDetails(\n    implied_probabilities=[0.37299406033208965, 0.4047794109200184, 0.2222265287474275],\n    iterations=426,\n    delta=9.667822098435863e-13,\n    z=0.01694251276407055\n)\n```\n\nThe returned object contains the following fields:\n\n* `implied_probablities`\n* `iterations` - compare this value to the `max_iterations` argument (default = `1000`) to check for failed convergence\n* `delta` - the final change in `z` for the final iteration. Compare with the `convergence_threshold` argument\n  (default = `1e-12`) to assess convergence\n* `z` - the estimated proportion of theoretical betting volume coming from insider traders\n\nWhen there are only two outcomes, `z` can be calculated analytically [[3](#3)]. In this case, the `iterations` and\n`delta` fields of the returned `dict` are `0` to reflect this:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities([1.5, 2.74], full_output=True)\n```\n\n```\nShinOptimisationDetails(\n    implied_probabilities=[0.6508515815085157, 0.3491484184914841],\n    iterations=0.0,\n    delta=0.0,\n    z=0.03172728540646625\n)\n```\n\nNote that with two outcomes, Shin's method is equivalent to the Additive Method of [[5](#5)].\n\n# What's New in Version 0.2.0?\n\nThe latest version improves support for static typing and includes a breaking change.\n\n## Breaking Change To `calculate_implied_probabilities()` Signature\n\nAll arguments to `calculate_implied_probabilities()` other than `odds` are now keyword only arguments. This change\nsimplified declaration of overloads to support typing the function's return value and will allow for more flexibility\nin the API.\n\n```py\nfrom shin import calculate_implied_probabilities\n\n# still works\ncalculate_implied_probabilities([2.0, 2.0])\ncalculate_implied_probabilities(odds=[2.0, 2.0])\ncalculate_implied_probabilities([2.0, 2.0], full_output=True)\n## also any other combination of passing arguments as keyword args remains the same\n\n# passing any arg other than `odds` as positional is now an error\ncalculate_implied_probabilibies([2.0, 2.0], 1000)  # Error\ncalculate_implied_probabilities([2.0, 2.0], max_iterations=1000)  # OK\n\n\ncalculate_impolied_probabilities([2.0, 2.0], 1000, 1e-12, True) # Error\ncalculate_implied_probabilities([2.0, 2.0], max_iterations=1000, convergence_threshold=1e-12, full_output=True)  # OK\n```\n\nSee [this commit](https://github.com/mberk/shin/commit/06a4ce90fc9bb047cef4e70d8a429b69a6cfd181) for more details.\n\n## Full Output Type\n\nThe `full_output` argument now returns a `ShinOptimisationDetails` object instead of a `dict`. This object is a\n`dataclass` with the same fields as the `dict` that was previously returned.\n\nFor the read-only case, the `ShinOptimisationDetails` object can be used as a drop-in replacement for the `dict` that\nwas previously returned as it supports `__getitem__()`.\n\nThis change was introduced to support generic typing of the `implied_probabilities`, currently not supported by\n`TypedDict` in versions of Python < 3.11.\n\nSee [this](https://github.com/mberk/shin/commit/467d88954d5ca958b6a1b73c9c4af412725b4d4a) and\n[this](https://github.com/mberk/shin/commit/c9b6e42b9d791fa4e4219a993f0dd2524ceaa1b5) for more details.\n\n# What's New in Version 0.1.0?\n\nThe latest version introduces some substantial changes and breaking API changes.\n\n## Default Return Value Behaviour\n\nPreviously `shin.calculate_implied_probabilities` would return a `dict` that contained convergence details of the\niterative fitting procedure along with the implied probabilities:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities([2.6, 2.4, 4.3])\n```\n\n```\n{'implied_probabilities': [0.37299406033208965,\n  0.4047794109200184,\n  0.2222265287474275],\n 'iterations': 425,\n 'delta': 9.667822098435863e-13,\n 'z': 0.01694251276407055}\n```\n\nThe default behaviour now is for the function to only return the implied probabilities:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities([2.6, 2.4, 4.3])\n```\n\n```\n[0.37299406033208965, 0.4047794109200184, 0.2222265287474275]\n```\n\nThe full output can still be had by setting the `full_output` argument to `True`:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities([2.6, 2.4, 4.3], full_output=True)\n```\n\n```\n{'implied_probabilities': [0.37299406033208965,\n  0.4047794109200184,\n  0.2222265287474275],\n 'iterations': 425,\n 'delta': 9.667822098435863e-13,\n 'z': 0.01694251276407055}\n```\n\n## Passing Mappings\n\nA common scenario is to have a mapping between some selection identifiers and their odds. You can now pass such\nmappings to `shin.calculate_implied_probabilities` and have a new `dict` mapping between the selection identifiers and\ntheir probabilities returned:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities({\"HOME\": 2.6, \"AWAY\": 2.4, \"DRAW\": 4.3})\n```\n\n```\n{'HOME': 0.37299406033208965,\n 'AWAY': 0.4047794109200184,\n 'DRAW': 0.2222265287474275}\n```\n\nThis also works when asking for the full output to be returned:\n\n```python\nimport shin\n\nshin.calculate_implied_probabilities({\"HOME\": 2.6, \"AWAY\": 2.4, \"DRAW\": 4.3}, full_output=True)\n```\n\n```\n{'implied_probabilities': {'HOME': 0.37299406033208965,\n  'AWAY': 0.4047794109200184,\n  'DRAW': 0.2222265287474275},\n 'iterations': 426,\n 'delta': 9.667822098435863e-13,\n 'z': 0.01694251276407055}\n```\n\n## Controlling the Optimiser\n\nStarting in version 0.1.0, the iterative procedure is implemented in Rust which provides a  considerable performance\nboost. If you would like to use the old Python based optimiser use the `force_python_optimiser` argument:\n\n```python\nimport timeit\ntimeit.timeit(\n    \"shin.calculate_implied_probabilities([2.6, 2.4, 4.3], force_python_optimiser=True)\",\n    setup=\"import shin\",\n    number=10000\n)\n```\n\n```\n3.9101167659973726\n```\n\n```python\nimport timeit\ntimeit.timeit(\n    \"shin.calculate_implied_probabilities([2.6, 2.4, 4.3])\",\n    setup=\"import shin\",\n    number=10000\n)\n```\n\n```\n0.14442387002054602\n```\n\n# References\n\n<a id=\"1\">[1]</a> \n[H. S. Shin, \u201cPrices of State Contingent Claims with Insider\ntraders, and the Favorite-Longshot Bias\u201d. The Economic\nJournal, 1992, 102, pp. 426-435.](https://doi.org/10.2307/2234526)\n\n<a id=\"2\">[2]</a> \n[H. S. Shin, \u201cMeasuring the Incidence of Insider Trading in a\nMarket for State-Contingent Claims\u201d. The Economic Journal,\n1993, 103(420), pp. 1141-1153.](https://doi.org/10.2307/2234240)\n\n<a id=\"3\">[3]</a>\n[E. \u0160trumbelj, \"On determining probability forecasts from betting odds\".\nInternational Journal of Forecasting, 2014, Volume 30, Issue 4,\npp. 934-943.](https://doi.org/10.1016/j.ijforecast.2014.02.008)\n\n<a id=\"4\">[4]</a>\n[B. Jullien and B. Salani\u00e9, \"Measuring the Incidence of Insider Trading: A Comment on Shin\".\nThe Economic Journal, 1994, 104(427), pp. 1418\u20131419](https://doi.org/10.2307/2235458)\n\n<a id=\"5\">[5]</a>\n[S. Clarke, S. Kovalchik, M. Ingram, \"Adjusting bookmaker\u2019s odds to allow for\noverround\". American Journal of Sports Science, 2017, Volume 5, Issue 6,\npp. 45-49.](https://doi.org/10.11648/j.ajss.20170506.12)\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python implementation of Shin's method for calculating implied probabilities from bookmaker odds",
    "version": "0.2.0",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0b3005d748005df087aa435347cb0344f052be1b9be3ff26474b3eeee0c72a17",
                "md5": "feddf5c74642b33ecc3c96a755bc6488",
                "sha256": "1335e53c68cbd7eed02a6686e0c312ceb26bee757a05548e6028ab003738317a"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "feddf5c74642b33ecc3c96a755bc6488",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 978720,
            "upload_time": "2024-04-27T06:54:06",
            "upload_time_iso_8601": "2024-04-27T06:54:06.439935Z",
            "url": "https://files.pythonhosted.org/packages/0b/30/05d748005df087aa435347cb0344f052be1b9be3ff26474b3eeee0c72a17/shin-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c5c7530002637a63d3ca0d0cedf8e5a2dc40edefc6275b9dbd38df4b250c0596",
                "md5": "72ba85ce6cab3143c8362fa32c4a1b6f",
                "sha256": "f8689cefb6fd95cc9fe839f715b005d33a93a0f770cc16fd4697c34263b3b913"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "72ba85ce6cab3143c8362fa32c4a1b6f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 990029,
            "upload_time": "2024-04-27T06:54:09",
            "upload_time_iso_8601": "2024-04-27T06:54:09.679470Z",
            "url": "https://files.pythonhosted.org/packages/c5/c7/530002637a63d3ca0d0cedf8e5a2dc40edefc6275b9dbd38df4b250c0596/shin-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4a2696f604b269de8902ed46fd65814ebcb8d68a98d438762293bf5185a3abc3",
                "md5": "49b15398ebb5e854134a20156ad74acb",
                "sha256": "dd17c13cd58e5c6ad101841448678200c1a70b8065ce6911fe51e05ecef1f673"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "49b15398ebb5e854134a20156ad74acb",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 108005,
            "upload_time": "2024-04-27T06:54:11",
            "upload_time_iso_8601": "2024-04-27T06:54:11.859987Z",
            "url": "https://files.pythonhosted.org/packages/4a/26/96f604b269de8902ed46fd65814ebcb8d68a98d438762293bf5185a3abc3/shin-0.2.0-cp310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3d106e17749fa8289b57418ea902380d938c965137a7531024ecbdbb318ffb31",
                "md5": "c9c533003d609b9a5a1a03834bc20ba7",
                "sha256": "61ad8fa2064b03d3d70f80d9819c4f46375a899633f78e68825fbea919dadec0"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "c9c533003d609b9a5a1a03834bc20ba7",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 416762,
            "upload_time": "2024-04-27T06:54:13",
            "upload_time_iso_8601": "2024-04-27T06:54:13.979813Z",
            "url": "https://files.pythonhosted.org/packages/3d/10/6e17749fa8289b57418ea902380d938c965137a7531024ecbdbb318ffb31/shin-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f637f9c7c920c1ce9078d4db915d39ea5423b4b853bda0a68a003a6909623b20",
                "md5": "f0f2705648c48f7665586c68f42349f1",
                "sha256": "6cb28d4dfe7f01cbade32b72c6eb82e1b8a419e7f8836ed0c1fedf63fd6df329"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "f0f2705648c48f7665586c68f42349f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 978720,
            "upload_time": "2024-04-27T06:54:16",
            "upload_time_iso_8601": "2024-04-27T06:54:16.234414Z",
            "url": "https://files.pythonhosted.org/packages/f6/37/f9c7c920c1ce9078d4db915d39ea5423b4b853bda0a68a003a6909623b20/shin-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "96e8f9a7d1713b00f226a97a992acb824107a539c196b10cd83e9506fc92f55b",
                "md5": "1ed1dbd2635be6f25d9ca18236071e8a",
                "sha256": "6cf67fd0ca062039b4c2723cc826b0d9ce7e78ea31b7c71543941233b9e093e9"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1ed1dbd2635be6f25d9ca18236071e8a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 990028,
            "upload_time": "2024-04-27T06:54:18",
            "upload_time_iso_8601": "2024-04-27T06:54:18.234047Z",
            "url": "https://files.pythonhosted.org/packages/96/e8/f9a7d1713b00f226a97a992acb824107a539c196b10cd83e9506fc92f55b/shin-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f6a1f02b15e2f134bd399d40bcb52ec905687b2f554b798f32ca14cd30441b33",
                "md5": "044413032bbac568f59c139f0be9c7e3",
                "sha256": "44b74066c9e8d5b729e50dad59648721ec5e0a81706b14014a1873807e77b63d"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "044413032bbac568f59c139f0be9c7e3",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 108008,
            "upload_time": "2024-04-27T06:54:20",
            "upload_time_iso_8601": "2024-04-27T06:54:20.281611Z",
            "url": "https://files.pythonhosted.org/packages/f6/a1/f02b15e2f134bd399d40bcb52ec905687b2f554b798f32ca14cd30441b33/shin-0.2.0-cp311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b5c4080e004dc8dfb6dda5205c0c8410f01513abe0aaa183afd9b993d2e0db1e",
                "md5": "1f7f30eb96bdb033e3aa03587da9c710",
                "sha256": "9cbb3ff3109582e699c16bc600fcf5c6bc847b9978db98c7dd257a6b05a4c23d"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp312-cp312-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "1f7f30eb96bdb033e3aa03587da9c710",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 416754,
            "upload_time": "2024-04-27T06:54:22",
            "upload_time_iso_8601": "2024-04-27T06:54:22.473780Z",
            "url": "https://files.pythonhosted.org/packages/b5/c4/080e004dc8dfb6dda5205c0c8410f01513abe0aaa183afd9b993d2e0db1e/shin-0.2.0-cp312-cp312-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "68350e443f24ef7acacbeb524d27118d3e907f69a8d8c587018c22cfc78296c4",
                "md5": "60c63eda3a0f8ee01679c7688dc13394",
                "sha256": "af4bce8f65c79055049199471df2cc8489b9c60a27798a40106704658e13cb8d"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "60c63eda3a0f8ee01679c7688dc13394",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 990083,
            "upload_time": "2024-04-27T06:54:24",
            "upload_time_iso_8601": "2024-04-27T06:54:24.167661Z",
            "url": "https://files.pythonhosted.org/packages/68/35/0e443f24ef7acacbeb524d27118d3e907f69a8d8c587018c22cfc78296c4/shin-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1579d3d9c8b64d9bad798b908ff18575e4d96e9e956de16d77dd63f069140773",
                "md5": "6dfb7014b3d674d0fd8b5ee482585e8a",
                "sha256": "fe047c8803d0569c8f4ddbac96965d7970547d704ca3be45c14cf64111a0a2e8"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp312-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "6dfb7014b3d674d0fd8b5ee482585e8a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 108023,
            "upload_time": "2024-04-27T06:54:25",
            "upload_time_iso_8601": "2024-04-27T06:54:25.882948Z",
            "url": "https://files.pythonhosted.org/packages/15/79/d3d9c8b64d9bad798b908ff18575e4d96e9e956de16d77dd63f069140773/shin-0.2.0-cp312-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b4d15fbcf97c198cb175650b3c7837bdf166605645087a2abaef297c1392d1fe",
                "md5": "dff62875c598daa8911117d2b9622d13",
                "sha256": "d63ee4f2cddd543b14f86a85d6932ad8d7a5d1839139b165531a2e885a52a28f"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "dff62875c598daa8911117d2b9622d13",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 978534,
            "upload_time": "2024-04-27T06:54:27",
            "upload_time_iso_8601": "2024-04-27T06:54:27.492267Z",
            "url": "https://files.pythonhosted.org/packages/b4/d1/5fbcf97c198cb175650b3c7837bdf166605645087a2abaef297c1392d1fe/shin-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "158757e32c27263c64ea5bb48959737fb8468f769320dea9f54a83a94348a579",
                "md5": "1c11df00d59d0b6f6a491ff9c2dd7067",
                "sha256": "3d796c3470e80b547eb1dda90f3a4991363d8879ed4f92e48fb9228d52571af3"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1c11df00d59d0b6f6a491ff9c2dd7067",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 989753,
            "upload_time": "2024-04-27T06:54:29",
            "upload_time_iso_8601": "2024-04-27T06:54:29.873744Z",
            "url": "https://files.pythonhosted.org/packages/15/87/57e32c27263c64ea5bb48959737fb8468f769320dea9f54a83a94348a579/shin-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2b0be6efcffeeaeee472af585f6912f07100f1f9893aef0226789d79906cb860",
                "md5": "6fa58f2e2de8ff6e6f10eeab1e172c7e",
                "sha256": "7f604062b3d425789dec536ea5de0e2d67e9939d715fd0b42795a5266175315a"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "6fa58f2e2de8ff6e6f10eeab1e172c7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 107971,
            "upload_time": "2024-04-27T06:54:31",
            "upload_time_iso_8601": "2024-04-27T06:54:31.292545Z",
            "url": "https://files.pythonhosted.org/packages/2b/0b/e6efcffeeaeee472af585f6912f07100f1f9893aef0226789d79906cb860/shin-0.2.0-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4c07e9d578cc2de819a01af54354ca2d13683192d46c37b0e0c237add4a198e4",
                "md5": "0ee164e41540a025bb43d8d0a92836df",
                "sha256": "5f23175ed33042e474d928c3908159ab040183061ae7bc1885364815d68cd114"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0ee164e41540a025bb43d8d0a92836df",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.9",
            "size": 989827,
            "upload_time": "2024-04-27T06:54:33",
            "upload_time_iso_8601": "2024-04-27T06:54:33.586851Z",
            "url": "https://files.pythonhosted.org/packages/4c/07/e9d578cc2de819a01af54354ca2d13683192d46c37b0e0c237add4a198e4/shin-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f0ade49e94924fb784657196aca0911054e3c928b9c77f253774c36a25464c6b",
                "md5": "c6074494b54fb5acf2803c6861a8bc76",
                "sha256": "f6da0b02b02940f201a58ed51b9a5b0c231a0298e5e6f33839af40757defa5c2"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "c6074494b54fb5acf2803c6861a8bc76",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.9",
            "size": 978798,
            "upload_time": "2024-04-27T06:54:35",
            "upload_time_iso_8601": "2024-04-27T06:54:35.905751Z",
            "url": "https://files.pythonhosted.org/packages/f0/ad/e49e94924fb784657196aca0911054e3c928b9c77f253774c36a25464c6b/shin-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "87fe5c5b75229010a36f236443c2dc83018b85480ad80a0544e09f41c4dd2dd0",
                "md5": "8148a35f1ce617a752c83d647e2af774",
                "sha256": "680d29084d2f1f04c3fcaa56066cd8cf773c5152fcb8afcf04bd09a961ba179e"
            },
            "downloads": -1,
            "filename": "shin-0.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8148a35f1ce617a752c83d647e2af774",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.9",
            "size": 989825,
            "upload_time": "2024-04-27T06:54:38",
            "upload_time_iso_8601": "2024-04-27T06:54:38.475625Z",
            "url": "https://files.pythonhosted.org/packages/87/fe/5c5b75229010a36f236443c2dc83018b85480ad80a0544e09f41c4dd2dd0/shin-0.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0d37af5790f175120593f0ea36b06000f04bec7ec984b8127ea02df8d24a253b",
                "md5": "6cd3e5296a5d3852846729d2c4c77020",
                "sha256": "6d9c935c65ce873a40f88a45308b7074c62155424b72a51e8183d0258623b294"
            },
            "downloads": -1,
            "filename": "shin-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6cd3e5296a5d3852846729d2c4c77020",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 13070,
            "upload_time": "2024-04-27T06:54:40",
            "upload_time_iso_8601": "2024-04-27T06:54:40.487218Z",
            "url": "https://files.pythonhosted.org/packages/0d/37/af5790f175120593f0ea36b06000f04bec7ec984b8127ea02df8d24a253b/shin-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-27 06:54:40",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "shin"
}
        
Elapsed time: 0.25395s