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

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の利用登録が終わったら https://bigquery.cloud.google.com/table/the-psf:pypi.downloads に移動し、例にあるように pytest のDL数を調べてみましょう。

bigquery_pytest.png

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

クエリ
#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
4611189

備考

先頭行の #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

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