# pypistats
[](https://pypi.org/project/pypistats/)
[](https://pypi.org/project/pypistats/)
[](https://pypistats.org/packages/pypistats)
[](https://dev.azure.com/hugovk/hugovk/_build?definitionId=1)
[](https://github.com/hugovk/pypistats/actions)
[](https://codecov.io/gh/hugovk/pypistats)
[](LICENSE.txt)
[](https://zenodo.org/badge/latestdoi/149862343)
[](https://github.com/psf/black)
Python interface to [PyPI Stats API](https://pypistats.org/api) to get aggregate
download statistics on Python packages on the Python Package Index without having to
execute queries directly against Google BigQuery.
Data is available for the [last 180 days](https://pypistats.org/about#data). (For longer
time periods, [pypinfo](https://github.com/ofek/pypinfo) can help, you'll need an API
key and get free quota.)
## Installation
### From PyPI
```bash
python3 -m pip install --upgrade pypistats
```
### From source
```bash
git clone https://github.com/hugovk/pypistats
cd pypistats
python3 -m pip install .
```
## Example command-line use
Run `pypistats` with a subcommand (corresponding to
[PyPI Stats endpoints](https://pypistats.org/api/#endpoints)), then options for that
subcommand.
Top-level help:
<!-- [[[cog
from scripts.run_command import run
run("pypistats --help")
]]] -->
```console
$ pypistats --help
usage: pypistats [-h] [-V] {recent,overall,python_major,python_minor,system} ...
positional arguments:
{recent,overall,python_major,python_minor,system}
options:
-h, --help show this help message and exit
-V, --version show program's version number and exit
```
<!-- [[[end]]] -->
Help for a subcommand:
<!-- [[[cog run("pypistats recent --help") ]]] -->
```console
$ pypistats recent --help
usage: pypistats recent [-h] [-p {day,week,month}]
[-f {html,json,pretty,md,markdown,rst,tsv}] [-j] [-v]
package
Retrieve the aggregate download quantities for the last 1/7/30 days,
excluding downloads from mirrors
positional arguments:
package
options:
-h, --help show this help message and exit
-p, --period {day,week,month}
-f, --format {html,json,pretty,md,markdown,rst,tsv}
The format of output (default: pretty)
-j, --json Shortcut for "-f json" (default: False)
-v, --verbose Print debug messages to stderr (default: False)
```
<!-- [[[end]]] -->
Get recent downloads:
<!-- [[[cog run("pypistats recent pillow") ]]] -->
```console
$ pypistats recent pillow
┌───────────┬─────────────┬────────────┐
│ last_day │ last_month │ last_week │
├───────────┼─────────────┼────────────┤
│ 5,142,717 │ 125,777,276 │ 30,415,118 │
└───────────┴─────────────┴────────────┘
```
<!-- [[[end]]] -->
Help for another subcommand:
<!-- [[[cog run("pypistats python_minor --help") ]]] -->
```console
$ pypistats python_minor --help
usage: pypistats python_minor [-h] [-V VERSION]
[-f {html,json,pretty,md,markdown,rst,tsv}] [-j]
[-sd yyyy-mm[-dd]|name] [-ed yyyy-mm[-dd]|name]
[-m yyyy-mm|name] [-l] [-t] [-d] [--monthly]
[-c {yes,no,auto}] [-v]
package
Retrieve the aggregate daily download time series by Python minor version number
positional arguments:
package
options:
-h, --help show this help message and exit
-V, --version VERSION
eg. 2.7 or 3.6 (default: None)
-f, --format {html,json,pretty,md,markdown,rst,tsv}
The format of output (default: pretty)
-j, --json Shortcut for "-f json" (default: False)
-sd, --start-date yyyy-mm[-dd]|name
Start date (default: None)
-ed, --end-date yyyy-mm[-dd]|name
End date (default: None)
-m, --month yyyy-mm|name
Shortcut for -sd & -ed for a single month (default: None)
-l, --last-month Shortcut for -sd & -ed for last month (default: False)
-t, --this-month Shortcut for -sd for this month (default: False)
-d, --daily Show daily downloads (default: False)
--monthly Show monthly downloads (default: False)
-c, --color {yes,no,auto}
Color terminal output (default: auto)
-v, --verbose Print debug messages to stderr (default: False)
```
<!-- [[[end]]] -->
Get version downloads:
<!-- [[[cog run("pypistats python_minor pillow --last-month") ]]] -->
```console
$ pypistats python_minor pillow --last-month
┌──────────┬─────────┬─────────────┐
│ category │ percent │ downloads │
├──────────┼─────────┼─────────────┤
│ 3.10 │ 19.31% │ 24,065,642 │
│ 3.11 │ 17.45% │ 21,749,566 │
│ 3.12 │ 15.68% │ 19,541,358 │
│ 3.9 │ 13.93% │ 17,370,148 │
│ 3.7 │ 12.86% │ 16,034,418 │
│ 3.8 │ 9.69% │ 12,077,524 │
│ null │ 5.89% │ 7,341,287 │
│ 3.13 │ 2.99% │ 3,728,426 │
│ 3.6 │ 1.81% │ 2,255,947 │
│ 2.7 │ 0.38% │ 468,671 │
│ 3.5 │ 0.01% │ 15,575 │
│ 3.14 │ 0.00% │ 5,804 │
│ 3.4 │ 0.00% │ 907 │
│ 3.1 │ 0.00% │ 37 │
│ 3.3 │ 0.00% │ 16 │
│ 3.2 │ 0.00% │ 6 │
│ 3.99 │ 0.00% │ 1 │
│ Total │ │ 124,655,333 │
└──────────┴─────────┴─────────────┘
Date range: 2025-01-01 - 2025-01-31
```
<!-- [[[end]]] -->
You can format in Markdown, ready for pasting in GitHub issues and PRs:
<!-- [[[cog run("pypistats python_minor pillow --last-month --format md", with_console=False) ]]] -->
| category | percent | downloads |
| :------- | ------: | ----------: |
| 3.10 | 19.31% | 24,065,642 |
| 3.11 | 17.45% | 21,749,566 |
| 3.12 | 15.68% | 19,541,358 |
| 3.9 | 13.93% | 17,370,148 |
| 3.7 | 12.86% | 16,034,418 |
| 3.8 | 9.69% | 12,077,524 |
| null | 5.89% | 7,341,287 |
| 3.13 | 2.99% | 3,728,426 |
| 3.6 | 1.81% | 2,255,947 |
| 2.7 | 0.38% | 468,671 |
| 3.5 | 0.01% | 15,575 |
| 3.14 | 0.00% | 5,804 |
| 3.4 | 0.00% | 907 |
| 3.1 | 0.00% | 37 |
| 3.3 | 0.00% | 16 |
| 3.2 | 0.00% | 6 |
| 3.99 | 0.00% | 1 |
| Total | | 124,655,333 |
Date range: 2025-01-01 - 2025-01-31
<!-- [[[end]]] -->
These are equivalent (in May 2019):
```sh
pypistats python_major pip --last-month
pypistats python_major pip --month april
pypistats python_major pip --month apr
pypistats python_major pip --month 2019-04
```
And:
```sh
pypistats python_major pip --start-date december --end-date january
pypistats python_major pip --start-date dec --end-date jan
pypistats python_major pip --start-date 2018-12 --end-date 2019-01
```
## Example programmatic use
Return values are from the JSON responses documented in the API:
https://pypistats.org/api/
```python
import pypistats
from pprint import pprint
# Call the API
print(pypistats.recent("pillow"))
print(pypistats.recent("pillow", "day", format="markdown"))
print(pypistats.recent("pillow", "week", format="rst"))
print(pypistats.recent("pillow", "month", format="html"))
pprint(pypistats.recent("pillow", "week", format="json"))
print(pypistats.recent("pillow", "day"))
print(pypistats.overall("pillow"))
print(pypistats.overall("pillow", mirrors=True, format="markdown"))
print(pypistats.overall("pillow", mirrors=False, format="rst"))
print(pypistats.overall("pillow", mirrors=True, format="html"))
pprint(pypistats.overall("pillow", mirrors=False, format="json"))
print(pypistats.python_major("pillow"))
print(pypistats.python_major("pillow", version=2, format="markdown"))
print(pypistats.python_major("pillow", version=3, format="rst"))
print(pypistats.python_major("pillow", version="2", format="html"))
pprint(pypistats.python_major("pillow", version="3", format="json"))
print(pypistats.python_minor("pillow"))
print(pypistats.python_minor("pillow", version=2.7, format="markdown"))
print(pypistats.python_minor("pillow", version="2.7", format="rst"))
print(pypistats.python_minor("pillow", version=3.7, format="html"))
pprint(pypistats.python_minor("pillow", version="3.7", format="json"))
print(pypistats.system("pillow"))
print(pypistats.system("pillow", os="darwin", format="markdown"))
print(pypistats.system("pillow", os="linux", format="rst"))
print(pypistats.system("pillow", os="darwin", format="html"))
pprint(pypistats.system("pillow", os="linux", format="json"))
```
### NumPy and pandas
To use with either NumPy or pandas, make sure they are first installed, or:
```bash
pip install --upgrade "pypistats[numpy]"
pip install --upgrade "pypistats[pandas]"
pip install --upgrade "pypistats[numpy,pandas]"
```
Return data in a NumPy array for further processing:
```python
import pypistats
numpy_array = pypistats.overall("pyvista", total=True, format="numpy")
print(type(numpy_array))
# <class 'numpy.ndarray'>
print(numpy_array)
# [['with_mirrors' '2019-09-20' '2.23%' 1204]
# ['without_mirrors' '2019-09-20' '2.08%' 1122]
# ['with_mirrors' '2019-09-19' '0.92%' 496]
# ...
# ['with_mirrors' '2019-10-26' '0.02%' 13]
# ['without_mirrors' '2019-10-26' '0.02%' 12]
# ['Total' None None 54041]]
```
Or in a pandas DataFrame:
```python
import pypistats
pandas_dataframe = pypistats.overall("pyvista", total=True, format="pandas")
print(type(pandas_dataframe))
# <class 'pandas.core.frame.DataFrame'>
print(pandas_dataframe)
# category date percent downloads
# 0 with_mirrors 2019-09-20 2.23% 1204
# 1 without_mirrors 2019-09-20 2.08% 1122
# 2 with_mirrors 2019-09-19 0.92% 496
# 3 with_mirrors 2019-08-22 0.90% 489
# 4 without_mirrors 2019-09-19 0.86% 466
# .. ... ... ... ...
# 354 without_mirrors 2019-11-03 0.03% 15
# 355 without_mirrors 2019-11-16 0.03% 15
# 356 with_mirrors 2019-10-26 0.02% 13
# 357 without_mirrors 2019-10-26 0.02% 12
# 358 Total None None 54041
#
# [359 rows x 4 columns]
```
For example, create charts with pandas:
```python
# Show overall downloads over time, excluding mirrors
import pypistats
data = pypistats.overall("pillow", total=True, format="pandas")
data = data.groupby("category").get_group("without_mirrors").sort_values("date")
chart = data.plot(x="date", y="downloads", figsize=(10, 2))
chart.figure.show()
chart.figure.savefig("overall.png") # alternatively
```

```python
# Show Python 3 downloads over time
import pypistats
data = pypistats.python_major("pillow", total=True, format="pandas")
data = data.groupby("category").get_group(3).sort_values("date")
chart = data.plot(x="date", y="downloads", figsize=(10, 2))
chart.figure.show()
chart.figure.savefig("python3.png") # alternatively
```

## See also
Related projects
- https://github.com/ofek/pypinfo
- https://github.com/scivision/pypistats-plots
Raw data
{
"_id": null,
"home_page": null,
"name": "pypistats",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "BigQuery, PyPI, downloads, statistics, stats",
"author": "Hugo van Kemenade",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/76/2f/7aca1ee742027ba29ba784fdb64056dbd9b487eaf90aeb63164f3fc8a07e/pypistats-1.9.0.tar.gz",
"platform": null,
"description": "# pypistats\n\n[](https://pypi.org/project/pypistats/)\n[](https://pypi.org/project/pypistats/)\n[](https://pypistats.org/packages/pypistats)\n[](https://dev.azure.com/hugovk/hugovk/_build?definitionId=1)\n[](https://github.com/hugovk/pypistats/actions)\n[](https://codecov.io/gh/hugovk/pypistats)\n[](LICENSE.txt)\n[](https://zenodo.org/badge/latestdoi/149862343)\n[](https://github.com/psf/black)\n\nPython interface to [PyPI Stats API](https://pypistats.org/api) to get aggregate\ndownload statistics on Python packages on the Python Package Index without having to\nexecute queries directly against Google BigQuery.\n\nData is available for the [last 180 days](https://pypistats.org/about#data). (For longer\ntime periods, [pypinfo](https://github.com/ofek/pypinfo) can help, you'll need an API\nkey and get free quota.)\n\n## Installation\n\n### From PyPI\n\n```bash\npython3 -m pip install --upgrade pypistats\n```\n\n### From source\n\n```bash\ngit clone https://github.com/hugovk/pypistats\ncd pypistats\npython3 -m pip install .\n```\n\n## Example command-line use\n\nRun `pypistats` with a subcommand (corresponding to\n[PyPI Stats endpoints](https://pypistats.org/api/#endpoints)), then options for that\nsubcommand.\n\nTop-level help:\n\n<!-- [[[cog\nfrom scripts.run_command import run\nrun(\"pypistats --help\")\n]]] -->\n\n```console\n$ pypistats --help\nusage: pypistats [-h] [-V] {recent,overall,python_major,python_minor,system} ...\n\npositional arguments:\n {recent,overall,python_major,python_minor,system}\n\noptions:\n -h, --help show this help message and exit\n -V, --version show program's version number and exit\n```\n\n<!-- [[[end]]] -->\n\nHelp for a subcommand:\n\n<!-- [[[cog run(\"pypistats recent --help\") ]]] -->\n\n```console\n$ pypistats recent --help\nusage: pypistats recent [-h] [-p {day,week,month}]\n [-f {html,json,pretty,md,markdown,rst,tsv}] [-j] [-v]\n package\n\nRetrieve the aggregate download quantities for the last 1/7/30 days,\nexcluding downloads from mirrors\n\npositional arguments:\n package\n\noptions:\n -h, --help show this help message and exit\n -p, --period {day,week,month}\n -f, --format {html,json,pretty,md,markdown,rst,tsv}\n The format of output (default: pretty)\n -j, --json Shortcut for \"-f json\" (default: False)\n -v, --verbose Print debug messages to stderr (default: False)\n```\n\n<!-- [[[end]]] -->\n\nGet recent downloads:\n\n<!-- [[[cog run(\"pypistats recent pillow\") ]]] -->\n\n```console\n$ pypistats recent pillow\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 last_day \u2502 last_month \u2502 last_week \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 5,142,717 \u2502 125,777,276 \u2502 30,415,118 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n<!-- [[[end]]] -->\n\nHelp for another subcommand:\n\n<!-- [[[cog run(\"pypistats python_minor --help\") ]]] -->\n\n```console\n$ pypistats python_minor --help\nusage: pypistats python_minor [-h] [-V VERSION]\n [-f {html,json,pretty,md,markdown,rst,tsv}] [-j]\n [-sd yyyy-mm[-dd]|name] [-ed yyyy-mm[-dd]|name]\n [-m yyyy-mm|name] [-l] [-t] [-d] [--monthly]\n [-c {yes,no,auto}] [-v]\n package\n\nRetrieve the aggregate daily download time series by Python minor version number\n\npositional arguments:\n package\n\noptions:\n -h, --help show this help message and exit\n -V, --version VERSION\n eg. 2.7 or 3.6 (default: None)\n -f, --format {html,json,pretty,md,markdown,rst,tsv}\n The format of output (default: pretty)\n -j, --json Shortcut for \"-f json\" (default: False)\n -sd, --start-date yyyy-mm[-dd]|name\n Start date (default: None)\n -ed, --end-date yyyy-mm[-dd]|name\n End date (default: None)\n -m, --month yyyy-mm|name\n Shortcut for -sd & -ed for a single month (default: None)\n -l, --last-month Shortcut for -sd & -ed for last month (default: False)\n -t, --this-month Shortcut for -sd for this month (default: False)\n -d, --daily Show daily downloads (default: False)\n --monthly Show monthly downloads (default: False)\n -c, --color {yes,no,auto}\n Color terminal output (default: auto)\n -v, --verbose Print debug messages to stderr (default: False)\n```\n\n<!-- [[[end]]] -->\n\nGet version downloads:\n\n<!-- [[[cog run(\"pypistats python_minor pillow --last-month\") ]]] -->\n\n```console\n$ pypistats python_minor pillow --last-month\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 category \u2502 percent \u2502 downloads \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 3.10 \u2502 19.31% \u2502 24,065,642 \u2502\n\u2502 3.11 \u2502 17.45% \u2502 21,749,566 \u2502\n\u2502 3.12 \u2502 15.68% \u2502 19,541,358 \u2502\n\u2502 3.9 \u2502 13.93% \u2502 17,370,148 \u2502\n\u2502 3.7 \u2502 12.86% \u2502 16,034,418 \u2502\n\u2502 3.8 \u2502 9.69% \u2502 12,077,524 \u2502\n\u2502 null \u2502 5.89% \u2502 7,341,287 \u2502\n\u2502 3.13 \u2502 2.99% \u2502 3,728,426 \u2502\n\u2502 3.6 \u2502 1.81% \u2502 2,255,947 \u2502\n\u2502 2.7 \u2502 0.38% \u2502 468,671 \u2502\n\u2502 3.5 \u2502 0.01% \u2502 15,575 \u2502\n\u2502 3.14 \u2502 0.00% \u2502 5,804 \u2502\n\u2502 3.4 \u2502 0.00% \u2502 907 \u2502\n\u2502 3.1 \u2502 0.00% \u2502 37 \u2502\n\u2502 3.3 \u2502 0.00% \u2502 16 \u2502\n\u2502 3.2 \u2502 0.00% \u2502 6 \u2502\n\u2502 3.99 \u2502 0.00% \u2502 1 \u2502\n\u2502 Total \u2502 \u2502 124,655,333 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\nDate range: 2025-01-01 - 2025-01-31\n```\n\n<!-- [[[end]]] -->\n\nYou can format in Markdown, ready for pasting in GitHub issues and PRs:\n\n<!-- [[[cog run(\"pypistats python_minor pillow --last-month --format md\", with_console=False) ]]] -->\n\n| category | percent | downloads |\n| :------- | ------: | ----------: |\n| 3.10 | 19.31% | 24,065,642 |\n| 3.11 | 17.45% | 21,749,566 |\n| 3.12 | 15.68% | 19,541,358 |\n| 3.9 | 13.93% | 17,370,148 |\n| 3.7 | 12.86% | 16,034,418 |\n| 3.8 | 9.69% | 12,077,524 |\n| null | 5.89% | 7,341,287 |\n| 3.13 | 2.99% | 3,728,426 |\n| 3.6 | 1.81% | 2,255,947 |\n| 2.7 | 0.38% | 468,671 |\n| 3.5 | 0.01% | 15,575 |\n| 3.14 | 0.00% | 5,804 |\n| 3.4 | 0.00% | 907 |\n| 3.1 | 0.00% | 37 |\n| 3.3 | 0.00% | 16 |\n| 3.2 | 0.00% | 6 |\n| 3.99 | 0.00% | 1 |\n| Total | | 124,655,333 |\n\nDate range: 2025-01-01 - 2025-01-31\n\n<!-- [[[end]]] -->\n\nThese are equivalent (in May 2019):\n\n```sh\npypistats python_major pip --last-month\npypistats python_major pip --month april\npypistats python_major pip --month apr\npypistats python_major pip --month 2019-04\n```\n\nAnd:\n\n```sh\npypistats python_major pip --start-date december --end-date january\npypistats python_major pip --start-date dec --end-date jan\npypistats python_major pip --start-date 2018-12 --end-date 2019-01\n```\n\n## Example programmatic use\n\nReturn values are from the JSON responses documented in the API:\nhttps://pypistats.org/api/\n\n```python\nimport pypistats\nfrom pprint import pprint\n\n# Call the API\nprint(pypistats.recent(\"pillow\"))\nprint(pypistats.recent(\"pillow\", \"day\", format=\"markdown\"))\nprint(pypistats.recent(\"pillow\", \"week\", format=\"rst\"))\nprint(pypistats.recent(\"pillow\", \"month\", format=\"html\"))\npprint(pypistats.recent(\"pillow\", \"week\", format=\"json\"))\nprint(pypistats.recent(\"pillow\", \"day\"))\n\nprint(pypistats.overall(\"pillow\"))\nprint(pypistats.overall(\"pillow\", mirrors=True, format=\"markdown\"))\nprint(pypistats.overall(\"pillow\", mirrors=False, format=\"rst\"))\nprint(pypistats.overall(\"pillow\", mirrors=True, format=\"html\"))\npprint(pypistats.overall(\"pillow\", mirrors=False, format=\"json\"))\n\nprint(pypistats.python_major(\"pillow\"))\nprint(pypistats.python_major(\"pillow\", version=2, format=\"markdown\"))\nprint(pypistats.python_major(\"pillow\", version=3, format=\"rst\"))\nprint(pypistats.python_major(\"pillow\", version=\"2\", format=\"html\"))\npprint(pypistats.python_major(\"pillow\", version=\"3\", format=\"json\"))\n\nprint(pypistats.python_minor(\"pillow\"))\nprint(pypistats.python_minor(\"pillow\", version=2.7, format=\"markdown\"))\nprint(pypistats.python_minor(\"pillow\", version=\"2.7\", format=\"rst\"))\nprint(pypistats.python_minor(\"pillow\", version=3.7, format=\"html\"))\npprint(pypistats.python_minor(\"pillow\", version=\"3.7\", format=\"json\"))\n\nprint(pypistats.system(\"pillow\"))\nprint(pypistats.system(\"pillow\", os=\"darwin\", format=\"markdown\"))\nprint(pypistats.system(\"pillow\", os=\"linux\", format=\"rst\"))\nprint(pypistats.system(\"pillow\", os=\"darwin\", format=\"html\"))\npprint(pypistats.system(\"pillow\", os=\"linux\", format=\"json\"))\n```\n\n### NumPy and pandas\n\nTo use with either NumPy or pandas, make sure they are first installed, or:\n\n```bash\npip install --upgrade \"pypistats[numpy]\"\npip install --upgrade \"pypistats[pandas]\"\npip install --upgrade \"pypistats[numpy,pandas]\"\n```\n\nReturn data in a NumPy array for further processing:\n\n```python\nimport pypistats\nnumpy_array = pypistats.overall(\"pyvista\", total=True, format=\"numpy\")\nprint(type(numpy_array))\n# <class 'numpy.ndarray'>\nprint(numpy_array)\n# [['with_mirrors' '2019-09-20' '2.23%' 1204]\n# ['without_mirrors' '2019-09-20' '2.08%' 1122]\n# ['with_mirrors' '2019-09-19' '0.92%' 496]\n# ...\n# ['with_mirrors' '2019-10-26' '0.02%' 13]\n# ['without_mirrors' '2019-10-26' '0.02%' 12]\n# ['Total' None None 54041]]\n```\n\nOr in a pandas DataFrame:\n\n```python\nimport pypistats\npandas_dataframe = pypistats.overall(\"pyvista\", total=True, format=\"pandas\")\nprint(type(pandas_dataframe))\n# <class 'pandas.core.frame.DataFrame'>\nprint(pandas_dataframe)\n# category date percent downloads\n# 0 with_mirrors 2019-09-20 2.23% 1204\n# 1 without_mirrors 2019-09-20 2.08% 1122\n# 2 with_mirrors 2019-09-19 0.92% 496\n# 3 with_mirrors 2019-08-22 0.90% 489\n# 4 without_mirrors 2019-09-19 0.86% 466\n# .. ... ... ... ...\n# 354 without_mirrors 2019-11-03 0.03% 15\n# 355 without_mirrors 2019-11-16 0.03% 15\n# 356 with_mirrors 2019-10-26 0.02% 13\n# 357 without_mirrors 2019-10-26 0.02% 12\n# 358 Total None None 54041\n#\n# [359 rows x 4 columns]\n```\n\nFor example, create charts with pandas:\n\n```python\n# Show overall downloads over time, excluding mirrors\nimport pypistats\ndata = pypistats.overall(\"pillow\", total=True, format=\"pandas\")\ndata = data.groupby(\"category\").get_group(\"without_mirrors\").sort_values(\"date\")\n\nchart = data.plot(x=\"date\", y=\"downloads\", figsize=(10, 2))\nchart.figure.show()\nchart.figure.savefig(\"overall.png\") # alternatively\n```\n\n\n\n```python\n# Show Python 3 downloads over time\nimport pypistats\ndata = pypistats.python_major(\"pillow\", total=True, format=\"pandas\")\ndata = data.groupby(\"category\").get_group(3).sort_values(\"date\")\n\nchart = data.plot(x=\"date\", y=\"downloads\", figsize=(10, 2))\nchart.figure.show()\nchart.figure.savefig(\"python3.png\") # alternatively\n```\n\n\n\n## See also\n\nRelated projects\n\n- https://github.com/ofek/pypinfo\n- https://github.com/scivision/pypistats-plots\n",
"bugtrack_url": null,
"license": null,
"summary": "Python interface to PyPI Stats API https://pypistats.org/api",
"version": "1.9.0",
"project_urls": {
"Changelog": "https://github.com/hugovk/pypistats/releases",
"Homepage": "https://github.com/hugovk/pypistats",
"Source": "https://github.com/hugovk/pypistats"
},
"split_keywords": [
"bigquery",
" pypi",
" downloads",
" statistics",
" stats"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "3fd40895f0d365bf76e027f5ff3e8df8dca68c533225911bcb7659f95bccf268",
"md5": "9588dba73abc3f1daee2358e22107648",
"sha256": "74a3ad60714513ea381db286108160b82bfe6f99c042c02db14c6eb4070f953d"
},
"downloads": -1,
"filename": "pypistats-1.9.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9588dba73abc3f1daee2358e22107648",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 13517,
"upload_time": "2025-03-21T15:30:46",
"upload_time_iso_8601": "2025-03-21T15:30:46.136215Z",
"url": "https://files.pythonhosted.org/packages/3f/d4/0895f0d365bf76e027f5ff3e8df8dca68c533225911bcb7659f95bccf268/pypistats-1.9.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "762f7aca1ee742027ba29ba784fdb64056dbd9b487eaf90aeb63164f3fc8a07e",
"md5": "0976326447a4fe15b27517948a892a21",
"sha256": "5587c07445c227f19afdf09f9d1a3ab79ed04fcf4d47b468c780d15e4f394140"
},
"downloads": -1,
"filename": "pypistats-1.9.0.tar.gz",
"has_sig": false,
"md5_digest": "0976326447a4fe15b27517948a892a21",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 122912,
"upload_time": "2025-03-21T15:30:47",
"upload_time_iso_8601": "2025-03-21T15:30:47.424842Z",
"url": "https://files.pythonhosted.org/packages/76/2f/7aca1ee742027ba29ba784fdb64056dbd9b487eaf90aeb63164f3fc8a07e/pypistats-1.9.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-03-21 15:30:47",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "hugovk",
"github_project": "pypistats",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [
{
"name": "freezegun",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.28.1"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"2.2.3"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"2.2.3"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.6"
]
]
},
{
"name": "prettytable",
"specs": [
[
"==",
"3.15.1"
]
]
},
{
"name": "pytablewriter",
"specs": [
[
"==",
"1.2.1"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.3.4"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "python-slugify",
"specs": [
[
"==",
"8.0.4"
]
]
},
{
"name": "respx",
"specs": [
[
"==",
"0.22.0"
]
]
},
{
"name": "termcolor",
"specs": [
[
"==",
"2.5.0"
]
]
}
],
"tox": true,
"lcname": "pypistats"
}