PyPI の統計情報を BigQuery で集計する

Python のパッケージインデックス PyPI における,パッケージのダウンロード数等のデータは BigQuery で公開されています.このデータを利用するとパッケージのダウンロード数を集計したり,よく使われている処理系のバージョンなどを簡単に知ることが出来ます.

データセット

PyPI の統計情報のデータセットは the-psd:pypi で公開されています.日ごとにテーブルが作成されており,downloadsYYYYMMDD のようなテーブル名になっています.1ダウンロードごとに1行のデータになっており,以下のような様々な情報が記録されています.

  • タイムスタンプ
  • 国コード
  • プロジェクト名 (パッケージ名)
  • バージョン
  • 形式 (sdist・bdist_wheel など)
  • OS の情報
  • 処理系の情報
  • TLS 関係の情報

データを集計する

例えばある日のすべてのパッケージのダウンロード数の合計は次のようにして集計できます.

SELECT
  COUNT(*) AS download_count,
FROM
  [the-psf:pypi.downloads20170529]
ORDER BY
  download_count DESC

結果は以下のようになります.約2,257万回もパッケージがダウンロードされているようです.

[
  {
    "download_count": "22573815"
  }
]

有名なパッケージである requests のダウンロード数を集計すると,以下のようになります.

SELECT
  COUNT(*) AS download_count,
FROM
  [the-psf:pypi.downloads20170529]
WHERE
  file.project = "requests"
ORDER BY
  download_count DESC

約44万回ダウンロードされているようです.

[
  {
    "download_count": "445065"
  }
]

(ダウンロードに使用された) Python のバージョン毎の,パッケージのダウンロード数も集計できます.

SELECT
  REGEXP_EXTRACT(details.python, r"^([^\.]+\.[^\.]+)") as python_version,
  COUNT(*) as download_count,
FROM
  [the-psf:pypi.downloads20170529]
GROUP BY
  python_version,
ORDER BY
  download_count DESC

結果は以下のようになります.

[
  {
    "python_version": "2.7",
    "download_count": "16162589"
  },
  {
    "python_version": "3.5",
    "download_count": "2249664"
  },
  {
    "python_version": null,
    "download_count": "1770785"
  },
  {
    "python_version": "3.4",
    "download_count": "897013"
  },
  {
    "python_version": "3.6",
    "download_count": "888574"
  },
  {
    "python_version": "2.6",
    "download_count": "527765"
  },
  {
    "python_version": "3.3",
    "download_count": "58497"
  },
  {
    "python_version": "3.7",
    "download_count": "11959"
  },
  {
    "python_version": "3.2",
    "download_count": "5401"
  },
  {
    "python_version": "1.17",
    "download_count": "1369"
  },
  {
    "python_version": "2.4",
    "download_count": "121"
  },
  {
    "python_version": "2.5",
    "download_count": "76"
  }
]

約1600万で,Python 2.7 が圧倒的な優勝です😭😭😭.Python 3.5 は 約224万で2位になっています.

Python 3.x 系はマイナーバージョンで票が割れているのであまりフェアな比較ではないかもしれません.ちなみに,Python 3.x の結果を足しあわすと約410万になるので,Python 2 と 3 の比率は 4:1 くらいになります.

pypinfo でより簡単に集計する

実は上に挙げたクエリは,pypinfo というツールを使って作ったものを修正したものです.pypinfo を使うと CLI から簡単に集計を行ったり,クエリを生成したりすることが出来ます.詳細は pypinfo の README を参照して下さい.例:

$ pypinfo requests
download_count
--------------
11033343

まとめ

BigQuery を使うと,PyPI の統計情報を簡単に集計することが出来,自分の作ったパッケージのダウンロード数なども簡単に調べることが出来ます.また,pypinfo を使うとより簡単に集計を行うことが可能です.

テーブルのサイズが非常に大きいので,課金に注意しましょう.(毎月1TBまでのデータのクエリは無料です.) 例えば 2017/5/28 のテーブルのサイズは約5GBあります.必要なカラムのデータのみを取得するようにすれば1回のクエリ実行で読み込むデータは数百MB程度になるはずです.