pypiの特定のpython packageを利用しているversionの割合を見てみる方法について
python2.xのサポートが2020-01-01T00:00:00でおわるということで、最近は drop python2
というようなissueも増えてきています(node-gypはどうするんでしょうね..)。
そのようなissueの中で、使われているversionの情報を調べて共有しくれたりする人がだいたいどこかに居るのですが、その人たちがどのようにしてそれを調べているのか気になったので手順などを調べることにしてみました。
pypistats
一番手軽に行えるのはpypistatsを見ることかもしれません。
こちらはウェブのインターフェイスもあるようです。例えばflaskを例に調べてみると以下の様なページが見つかります。
時系列的な遷移を知りたい場合にはグラフの方がありがたいですが、直近1ヶ月のサマリー程度が見えれば十分ですよね。issueの上で議論する上では。
そういうときにはCLIでテキトーに調べるのが楽です。このpypistatsのCLIを作ってくれている人もいてこちらを使うのが手軽です。
先程のとおりにflaskを、そして直近一ヶ月という期間で調べるには以下の様なコマンドを実行すれば良いようです。formatも指定できるので更に他のコマンドで整形したい場合などはjsonで、issueなどで共有したい場合にはmarkdownで(defaultはmarkdownです)出力してあげれば良さそうです。
$ pip install pypistats $ pypistats python_minor --last-month flask | category | percent | downloads | |----------|--------:|----------:| | 3.6 | 50.00% | 4,135,489 | | 2.7 | 27.50% | 2,274,964 | | 3.5 | 10.88% | 899,583 | | 3.7 | 9.52% | 787,076 | | 3.4 | 1.46% | 120,625 | | null | 0.54% | 44,777 | | 2.6 | 0.06% | 5,287 | | 3.8 | 0.04% | 3,190 | | 3.3 | 0.01% | 723 | | 3.2 | 0.00% | 23 | | Total | | 8,271,737 |
つまりこういう形で共有できるわけです。
category | percent | downloads |
---|---|---|
3.6 | 50.00% | 4,135,489 |
2.7 | 27.50% | 2,274,964 |
3.5 | 10.88% | 899,583 |
3.7 | 9.52% | 787,076 |
3.4 | 1.46% | 120,625 |
null | 0.54% | 44,777 |
2.6 | 0.06% | 5,287 |
3.8 | 0.04% | 3,190 |
3.3 | 0.01% | 723 |
3.2 | 0.00% | 23 |
Total | 8,271,737 |
python_minor以外にも幾つかのsub commandが用意されています。
$ pypistats -h usage: pypistats [-h] [-V] {recent,overall,python_major,python_minor,system} ... positional arguments: {recent,overall,python_major,python_minor,system} ...
データの在り処
数値だけが分かってもデータの在り処がはっきりしていないとスッキリしないですよね。実はFAQに書いてあります。
https://pypistats.org/faqs#what-is-the-source-of-the-download-data
What is the source of the download data?
PyPI provides download records as a publicly available dataset on Google's BigQuery. You can access the data with a Google Cloud account here.
そんなわけでpypi自身がbigquery上にデータセットを公開してくれていたりしています。これを使っていたようです。ここです。
https://bigquery.cloud.google.com/table/the-psf:pypi.downloads
そしてデイリーでバッチを起動して集めているようです。そのあたりのこともFAQに書いてあります。
pypinfo
似たようなコマンドでpypinfoというコマンドを使っているひともいました。こちらは自分自身でbigqueryにアクセスしてデータを取ってくるようです。
ちなみにbigqueryへのアクセスの仕方がすごく丁寧にreadmeに書いてあるので親切です。
$ pip install pypinfo $ pypinfo --auth=<path/to/your_credentials.json> # or GOOGLE_APPLICATION_CREDENTIALS=<path/to/your_credentials.json> $ pypistats python_minor flask --last-month | category | percent | downloads | |----------|--------:|----------:| | 3.6 | 50.00% | 4,135,489 | | 2.7 | 27.50% | 2,274,964 | | 3.5 | 10.88% | 899,583 | | 3.7 | 9.52% | 787,076 | | 3.4 | 1.46% | 120,625 | | null | 0.54% | 44,777 | | 2.6 | 0.06% | 5,287 | | 3.8 | 0.04% | 3,190 | | 3.3 | 0.01% | 723 | | 3.2 | 0.00% | 23 | | Total | | 8,271,737 |
同じようにmarkdownで出力してくれます。
category | percent | downloads |
---|---|---|
3.6 | 50.00% | 4,135,489 |
2.7 | 27.50% | 2,274,964 |
3.5 | 10.88% | 899,583 |
3.7 | 9.52% | 787,076 |
3.4 | 1.46% | 120,625 |
null | 0.54% | 44,777 |
2.6 | 0.06% | 5,287 |
3.8 | 0.04% | 3,190 |
3.3 | 0.01% | 723 |
3.2 | 0.00% | 23 |
Total | 8,271,737 |
pypistatsの方が手軽なので日常的にはpypistatsで済ませることが多いかもしれません。そしてもう少し細かく気にしたくなったら自分でbigqueryを叩きに行くかpypinfoを使う感じになりそうです。
おまけ
ちなみにflaskとdjangoの比較
flaskの方がdjangoの4倍くらいdownloadされている?(2019-04月のデータ)
flaskとdjango
category | percent | downloads | category | percent | downloads |
---|---|---|---|---|---|
3.6 | 50.00% | 4,135,489 | 3.6 | 38.86% | 1,078,975 |
2.7 | 27.50% | 2,274,964 | 2.7 | 27.45% | 762,206 |
3.5 | 10.88% | 899,583 | 3.7 | 21.43% | 595,086 |
3.7 | 9.52% | 787,076 | 3.5 | 9.01% | 250,227 |
3.4 | 1.46% | 120,625 | 3.4 | 2.03% | 56,461 |
null | 0.54% | 44,777 | null | 1.09% | 30,137 |
2.6 | 0.06% | 5,287 | 3.8 | 0.06% | 1,764 |
3.8 | 0.04% | 3,190 | 2.6 | 0.05% | 1,320 |
3.3 | 0.01% | 723 | 3.3 | 0.01% | 381 |
3.2 | 0.00% | 23 | 3.2 | 0.00% | 24 |
Total | 8,271,737 | Total | 2,776,581 |
code
# ちょっと手抜きだけれど。。 $ pypistats python_minor --month 2019-04 -f markdown flask > flask.md $ pypistats python_minor --month 2019-04 -f markdown django > django.md $ paste flask.md django.md | sed 's/|[ \t]|/|/g' > diff.md
ちなみにautopep8とyapfとblack
今度はformatter
autopep8とyapfとblack
category | percent | downloads | category | percent | downloads | category | percent | downloads |
---|---|---|---|---|---|---|---|---|
2.7 | 45.09% | 383,360 | 3.6 | 38.69% | 165,974 | 3.6 | 56.17% | 258,994 |
3.6 | 29.36% | 249,583 | 2.7 | 32.29% | 138,492 | 3.7 | 40.72% | 187,724 |
3.7 | 14.17% | 120,421 | 3.7 | 16.93% | 72,631 | null | 2.86% | 13,187 |
3.5 | 5.88% | 49,984 | 3.5 | 7.88% | 33,783 | 3.8 | 0.14% | 659 |
3.4 | 5.05% | 42,938 | null | 3.50% | 15,021 | 2.7 | 0.06% | 255 |
null | 0.35% | 2,956 | 3.4 | 0.65% | 2,794 | 3.5 | 0.05% | 216 |
2.6 | 0.08% | 678 | 3.8 | 0.06% | 252 | 3.4 | 0.00% | 15 |
3.8 | 0.02% | 178 | 3.3 | 0.00% | 8 | 3.3 | 0.00% | 8 |
3.3 | 0.00% | 24 | 2.6 | 0.00% | 6 | 2.6 | 0.00% | 6 |
3.2 | 0.00% | 2 | Total | 428,961 | Total | 461,064 | ||
Total | 850,124 |
code
$ pypistats python_minor --month 2019-04 -f markdown autopep8 > autopep8.md $ pypistats python_minor --month 2019-04 -f markdown yapf > yapf.md $ pypistats python_minor --month 2019-04 -f markdown black > black.md $ paste autopep8.md yapf.md black.md | sed 's/|[ \t]|/|/g' > diff2.md
まじめに取り扱える便利ななにかがほしいかも(pandasを取り出す気力がなかった)