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
- Navigate to the BigQuery web UI.
- Create a new project.
- Enable the BigQuery API.
というわけで、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 | REQUIRED | DL時刻 |
country_code | STRING | NULLABLE | DL元の国かな? |
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 ------------------------------------------------------------------------
すくな! みんなもっと使って!