Skip to content

Instantly share code, notes, and snippets.

@WilliamBergamin
Created January 13, 2025 21:15
Show Gist options
  • Save WilliamBergamin/15a0605627731e9b7960595c5b266f59 to your computer and use it in GitHub Desktop.
Save WilliamBergamin/15a0605627731e9b7960595c5b266f59 to your computer and use it in GitHub Desktop.
Python package download statistics
import requests
import sys
from typing import Dict, TypedDict
relevant_python_versions = ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
allowed_pkg_names = ["slack_sdk", "slack_bolt", "slack_cli_hooks"]
pkg_name = allowed_pkg_names[0]
if len(sys.argv) >= 2:
if sys.argv[1] not in allowed_pkg_names:
sys.stderr.write(f"Allowed packaged: {allowed_pkg_names}")
sys.exit()
pkg_name = sys.argv[1]
print(
"Display the last 180 days package download statistics\n"
"Source: https://pypistats.org/\n"
)
class PypiStatsItem(TypedDict):
category: str
date: str
downloads: int
class PypiStatsObject(TypedDict):
data: list[PypiStatsItem]
package: str
type: str
def get_downloads(pkg_name: str, version: str) -> int:
response = requests.get(
f"https://pypistats.org/api/packages/{pkg_name}/python_minor?version={version}"
)
json: PypiStatsObject = response.json()
return sum([item["downloads"] for item in json["data"]])
version_downloads: Dict[str, int] = {}
total_downloads = 0
for version in relevant_python_versions:
downloads = get_downloads(pkg_name=pkg_name, version=version)
total_downloads += downloads
version_downloads[version] = downloads
columns = ["Version", "Downloads", "Percentage"]
row_formatter = "{:<13}" * (len(columns))
print(row_formatter.format(*columns))
for version, downloads in version_downloads.items():
percentage = round(downloads / total_downloads * 100, 2)
print(row_formatter.format(version, downloads, f"{percentage}%"))
print(row_formatter.format("Total", total_downloads, "n/a"), end="\n\n")
@WilliamBergamin
Copy link
Author

Steps to use

  1. pip install requirements.txt
  2. python downloads.py slack_sdk

Example output

Display the last 180 days package download statistics
Source: https://pypistats.org/

Version      Downloads    Percentage   
3.6          1764484      1.05%        
3.7          9474831      5.64%        
3.8          19346104     11.52%       
3.9          19927347     11.86%       
3.10         48664136     28.97%       
3.11         59355900     35.33%       
3.12         8967379      5.34%        
3.13         496392       0.3%         
Total        167996573    n/a          

@WilliamBergamin
Copy link
Author

Update

Display the last 180 days package download statistics
Source: https://pypistats.org/

Version      Downloads    Percentage
3.6          1408825      0.77%
3.7          9504005      5.17%
3.8          14336318     7.79%
3.9          21507299     11.69%
3.10         51856996     28.18%
3.11         72020487     39.14%
3.12         11983618     6.51%
3.13         1376848      0.75%
Total        183994396    n/a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment