分析pypi包下载

本节介绍如何使用 PyPI package dataset 要了解有关在Pypi上托管的包(或包)的下载的更多信息。例如,您可以使用它来发现用于下载包的Python版本的分布情况。

背景

Pypi不显示下载统计信息,因为它们很难准确地收集和显示。原因包括在 announcement email

原因很多 [下载计数] 去除/去除其中一些是:

  • 技术上很难与新的cdn合作

    • cdn被捐赠给psf,捐赠层不提供任何形式的日志访问。

    • 没有日志访问的解决方案将大大降低cdn的实用性。

  • 高度不准确
    • 有许多事情阻止下载计数不准确,其中一些包括:

      • PIP下载缓存

      • 内部或非官方镜子

      • 不在Pypi上承载的包(为了比较)

      • 镜像或非官方的抓取脚本导致计数膨胀(上一次我看了25%的下载来自已知的镜像脚本)。

  • 不是特别有用

    • 仅仅因为一个项目被下载了很多并不意味着它是好的

    • 同样,仅仅因为一个项目没有被大量下载并不意味着它是坏的。

简言之,由于各种原因,它的价值都很低,而使其发挥作用所需的折衷是很高的,因此它并没有有效地利用资源。

作为替代方案, Linehaul project 流下载日志到 Google BigQuery 1. Linehaul writes an entry in a the-psf.pypi.downloadsYYYYMMDD table for each download. The table contains information about what file was downloaded and how it was downloaded. Some useful columns from the table schema 包括:

描述

实例

file.project

项目名称

pipenv, nose

file.version

程序包版本

0.1.6, 1.4.2

details.installer.name

安装程序

匹普 bandersnatch

details.python

python版本

2.7.12, 3.6.4

1

PyPI BigQuery dataset announcement email

设置

为了使用 Google BigQuery to query the PyPI package dataset, you'll need a Google account and to enable the BigQuery API on a Google Cloud Platform project. You can run the up to 1TB of queries per month using the BigQuery free tier without a credit card

有关如何开始使用BigQuery的详细说明,请参阅 BigQuery quickstart guide .

有用的查询

在中运行查询 BigQuery web UI 单击“撰写查询”按钮。

请注意,这些行每天存储在单独的表中,这有助于限制查询成本。这些示例查询通过使用 wildcard tables 选择所有表,然后按筛选 _TABLE_SUFFIX .

计算包下载数

以下查询统计项目“pytest”的下载总数。

#standardSQL
SELECT COUNT(*) AS num_downloads
FROM `the-psf.pypi.downloads*`
WHERE file.project = 'pytest'
  -- Only query the last 30 days of history
  AND _TABLE_SUFFIX
    BETWEEN FORMAT_DATE(
      '%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())

num_downloads

2117807

若要仅统计来自PIP的下载,请筛选 details.installer.name 列。

#standardSQL
SELECT COUNT(*) AS num_downloads
FROM `the-psf.pypi.downloads*`
WHERE file.project = 'pytest'
  AND details.installer.name = 'pip'
  -- Only query the last 30 days of history
  AND _TABLE_SUFFIX
    BETWEEN FORMAT_DATE(
      '%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())

num_downloads

1829322

随时间推移的程序包下载

要按每月下载分组,请使用 _TABLE_SUFFIX 伪列。还可以使用伪列来限制查询的表和相应的成本。

#standardSQL
SELECT
  COUNT(*) AS num_downloads,
  SUBSTR(_TABLE_SUFFIX, 1, 6) AS `month`
FROM `the-psf.pypi.downloads*`
WHERE
  file.project = 'pytest'
  -- Only query the last 6 months of history
  AND _TABLE_SUFFIX
    BETWEEN FORMAT_DATE(
      '%Y%m01', DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY `month`
ORDER BY `month` DESC

num_downloads

1956741

201801

2344692

201712

1730398

201711

2047310

201710

1744443

201709

1916952

201708

其他工具

您还可以访问 PyPI package dataset 通过BigQuery API编程。

皮皮诺

pypinfo 是一个命令行工具,它提供对数据集的访问,并可以生成多个有用的查询。例如,可以使用命令查询包的下载总数 pypinfo package_name .

$ pypinfo requests
Served from cache: False
Data processed: 6.87 GiB
Data billed: 6.87 GiB
Estimated cost: $0.04

| download_count |
| -------------- |
|      9,316,415 |

安装 pypinfo 使用PIP。

pip install pypinfo

其他类库