データ分析しようと思ったらデファクトスタンダードになっているのがPython。 実際、データ分析に使えるライブラリも充実しているし、Jupyterという使い勝手のいい環境もある。 言語自体も(洗練されてはいないけど)シンプルで、流行っているので本やWeb上にも情報がたくさんあり、プログラミング自体にはあまり興味がない人にはかなり取っ付きやすい。
一方で、変化が激しかったり、流行って多くの人が使うせいか、情報が玉石混交であったり、似たような仕組みがいろいろ乱立していたりと、その理念(1つのことはただ1つのやり方でだけできる、誰が書いても同じようになる)に反して、こういうときはどうすべきなんだろうと迷うことが多い。
それに関して、実際に仕事で使っている中で「こうすべき」というのが見えてきたので、まとめておきたい。
結論
とりあえず、結論だけ。
- どのPythonを使うべき?
- Python3系を使う
- 公式のPythonを使う
- パッケージ管理や仮想環境はどうすべき?
- 公式のvenvを使う
- Jupyterを動かす汎用の仮想環境と、各プロジェクト用の仮想環境を用意する
- 開発環境は何を使うべき?
- プロジェクトの構成はどうすべき?
- pyproject.toml, setup.py, setup.cfgを置いてビルド可能にする
- requirements.txtを使わない
- パッケージ名のフォルダ、使用例を置く
examples/
、単体テストを置くtests/
を用意する - formatter, linterとしてpysenを使う
- コードはどう書くべき?
- たくさんありすぎるので今回はスコープ外
ただ、いろいろ書いたけど、一番のベストプラクティスは「Pythonを使わなくて済むなら使わない」だと思う。 Pythonは設計が悪すぎて、使えば使うほどストレスが溜まっていくので。。。
どのPythonを使うべき?
さて、まずは「そもそもどのPythonを使うべき?」という問題。
正直、この疑問がまずついて回る時点で、もうすでに異常。 これだけでPythonを使うべきではないとなってもおかしくない。
背景を説明しておくと、Pythonには2系と3系があり、2系から3系にバージョンアップしたときに互換性が切れる変更が入ったため、そのときすでにコード資産の溜まっていた2系を使い続けるのか、労力を割いて3系に対応するのかという話があった。
幸い、10年強(!)かけて3系への移行が世界的に進み、2020年になってようやく2系が正式に廃止へ。 なので、今は迷わず3系を使えばいい。
ただ、2系か3系かで話が終わればよかったものの、残念ながらまだ問題がある。 それはどのディストリビューション(配布)を使うのかという問題。
Pythonには公式が配布しているものの他に、Anacondaという有名な配布がある。 この配布にはデータ分析に使うパッケージが最初から入っているので、パッケージのインストールでつまずくことないというメリットがあった(昔はインストールでコケることが多かった)。 また、仮想環境を作って管理したり、condaと呼ばれる独自のパッケージ管理システムがあったりといった特徴があった。 なので、データ分析するならAnacondaを入れておけばいいという風潮があったりした。
けれど、それも昔の話。 今となってはAnacondaを使う理由はほとんどなく、むしろ害悪とも言える。
- ほぼすべてのパッケージはpipで問題なくインストールできる
- 仮想環境は公式のvenvで十分
- condaとpipの両方があると紛らわしくて管理が難しくなる
- ライセンスの関係でフリーで使える人は限られる
ライセンスは本当に注意が必要で、自分も勉強会で初めて知った。 気にしてなかった人は確認した方がいい。
ちなみに、他にも配布はあり、自分が見たツイート(現在では削除されてた)では次のようなものも:
今年の新人ちゃんが「Homebrewで入れたModellerが動かない😢」と報告してきてくれたのですが、チャットで全然解決できないので最終手段で新人氏のマシンを遠隔操作させてもらって画面を見たところ、そこにはAnacondaとPyenvとHomebrewとpkg版Pythonの4つが混在する魔境になっていたことがわかった。
これは酷い。。。
こうならないためにも、公式で配布しているものをインストールするのが一番安全だし、分かりやすい。
まとめると、以下:
- Python3系を使う
- Python2系は使わない
- 公式のPythonを使う
- Anacondaや他の配布は使わない
もちろん、このように書くと「じゃあPython3.7と3.8を使いたい場合、どうするの?」とかも出てくると思う。 それについてはまた次回。
今日はここまで!