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

Note

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

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