2018-08-09

PyPI に登録したパッケージのDL数を調べてみるお

PyPI に登録したパッケージのダウンロード情報は Google BigQuery に登録されています。

今回はこれを使ってダウンロード数を調べてみようと思います。

偉そうなこと言ってますが Analyzing PyPI package downloads に全部書いてあります。

In order to use 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

というわけで、1TB/月 までは無料で使えるそうです。思う存分エゴサーチしましょう。

クエリ

GCPの利用登録が終わったら BigQuery に移動し、例にあるように pytest のDL数を調べてみましょう。

(プロジェクト名は気にしないでね)

クエリ

#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())

結果

info
  • 先頭行の #standardSQL はコメントではなく、 標準SQL の使用を宣言するために必要です。

ダウンロード情報は日毎にテーブルが分割されているみたいなので横断してクエリするために ワイルドカード テーブル を使います。

これを使うために標準SQLを使う必要があります。 レガシーSQLだとワイルドカード関数というのを使うそうですがよくわからないので今回はやらない。

ちなみにレガシーSQLで上記SQLを実行しようとすると [Error: Encountered "<INTEGER_LITERAL> "30 "" at line 10, column 53. Was expecting: ")" ... [Try using standard SQL (https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql)] というエラーが発生しました。

参照可能なフィールドはこんな感じです

フィールド名必須か説明 (わかる範囲で)
timestamp TIMESTAMP REQUIREDDL時刻
country_code STRING NULLABLEDL元の国かな?
url STRING REQUIRED
file RECORD REQUIRED
file.filename STRING REQUIRED
file.project STRING REQUIREDパッケージ名
file.version STRING REQUIREDパッケージのバージョン, e.g. 1.0.2
file.type STRING REQUIRED
details RECORD NULLABLE
details.installer RECORD NULLABLE
details.installer.name STRING NULLABLE
details.installer.version STRING NULLABLE
details.python STRING NULLABLE
details.implementation RECORD NULLABLE
details.implementation.name STRING NULLABLE
details.implementation.version STRING NULLABLE
details.distro RECORD NULLABLE
details.distro.name STRING NULLABLE
details.distro.version STRING NULLABLE
details.distro.id STRING NULLABLE
details.distro.libc RECORD NULLABLE
details.distro.libc.lib STRING NULLABLE
details.distro.libc.version STRING NULLABLE
details.system RECORD NULLABLE
details.system.name STRING NULLABLE
details.system.release STRING NULLABLE
details.cpu STRING NULLABLE
details.openssl_version STRING NULLABLE
details.setuptools_version STRING NULLABLE
tls_protocol STRING NULLABLE
tls_cipher STRING NULLABLE

続いて 【Djangoから】変換ライブラリ d2a のご紹介【SQLAlchemyへ】 で登録した d2a を調べてみます。

同じクエリでは面白くないので日毎のDL数を見てみましょう。

クエリ

#standardSQL SELECT DATE(timestamp) AS dt, COUNT(*) AS num_downloads FROM `the-psf.pypi.downloads*` WHERE file.project = 'd2a' -- 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()) GROUP BY dt ORDER BY dt ;
------------------------------------------------------------------------ Row dt num_downloads -------------- ---------------------------- ---------------------------- 1 2018-07-10 18 2 2018-07-11 2 3 2018-07-12 3 4 2018-07-13 7 5 2018-07-14 29 6 2018-07-15 10 7 2018-07-19 1 8 2018-07-20 1 9 2018-07-21 25 10 2018-07-22 2 11 2018-07-25 1 12 2018-07-27 22 13 2018-07-28 41 14 2018-07-29 19 15 2018-07-30 18 16 2018-07-31 39 17 2018-08-01 21 18 2018-08-02 48 19 2018-08-03 45 20 2018-08-04 17 21 2018-08-05 9 22 2018-08-06 27 23 2018-08-07 55 24 2018-08-08 54 25 2018-08-09 19 ------------------------------------------------------------------------

すくな! みんなもっと使って!