【抄訳／感想】PyCoder's Weekly #348 - 2018/12/25

Qiita よりも翻訳記事を掲載するのに適した媒体があれば移行するかもしれません。また、このような記事が Qiita の利用規約や法律に抵触する場合は取り下げますのでご指摘いただけると助かります (無知ですみません)。

# 免責
- 素人の翻訳です。正しさは保証しません。 **というかあまり訳す気がなく、ほぼ感想です**
    - しかも本文の翻訳と私の感想を区別する気があまりありません。どの部分が感想なのかは文脈から汲み取ってください・・・
- 抄訳です。自分が気になった記事だけを抜粋していますのでご注意ください
    - 選んだ記事の中でも更に抜粋があります
- 気が乗ったら毎回やりますが負担が大きいのでサボることが多いと思う

# PyCoder's Weekly とは
いくつかある Python 関連の週次ニュースレターのひとつ。
公式サイトと購読はこちら：https://pycoders.com/
<img width="927" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/62450/e4e02e47-f2b7-2afd-9ac7-321cef2a4c8e.png">

今週の記事は2018/12/25付、第348号です。

# [Python Insider: Python 3.7.2 and 3.6.8 are now available](https://blog.python.org/2018/12/python-372-and-368-are-now-available.html)
- Python 3.7.2 と 3.6.8 がリリース

# [Python Pandas: Tricks &amp; Features You May Not Know – Real Python](https://realpython.com/python-pandas-tricks/)
- 8. Pandas の論理演算の扱いを理解しよう

```py
>>> s = pd.Series(range(10))
>>> s % 2 == 0 & s > 3
ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool(), a.item(), a.any() or a.all().
```
これ、よくやってしまいます。端的に言えば `&` が `==` よりも演算子として優先度が高いことが原因です。 https://docs.python.org/ja/3/reference/expressions.html#operator-precedence
普段の Python では論理演算に優先度が低めの `and` を使うため、NumPy/Pandas チックな論理演算をしようとして `&` を使うといつもこのエラーを見ます。ちゃんとカッコをつけましょうという話でした。

```py
>>> (s % 2 == 0) & (s > 3)
0    False
1    False
2    False
3    False
4     True
5    False
6     True
7    False
8     True
9    False
dtype: bool
```
    
# [Why you should be using pathlib - Trey Hunner](http://treyhunner.com/2018/12/why-you-should-be-using-pathlib)
- `pathlib` はいいぞという話
    - やはりまだどうしても `os.path` を使うクセが抜けないが、今後は `pathlib` に移行していきたい
        - あと `pathlib.Path` が (意図的に) 文字列のサブクラスではないから、パスを文字列として期待しているライブラリがまだ沢山あるし今後も沢山生まれるだろうことを考えるとちょっと使いにくいということはある
            - Python3.6 から `os.path` モジュールが `pathlib.Path` オブジェクトを扱えるようになったが、それでも `+` でパス文字列を結合しているケースは互換性がないからカバー率はまだまだ低いんじゃない？と思う。横着せずにちゃんと `os.path.join` を使っておきなさい💢
- パスを文字列として捉える `os.path` だと、文字列を入力して文字列を出力するような構造になる：

```py
from os.path import abspath, dirname, join as joinpath

BASE_DIR = dirname(dirname(abspath(__file__)))
TEMPLATES_DIR = joinpath(BASE_DIR, 'templates')
```

- オブジェクト化してメソッドチェーンできる `pathlib` は読みやすくてオサレ：

```py
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATES_DIR = BASE_DIR.joinpath('templates')
```

- `os` モジュールよりも `pathlib` モジュールのほうが役割が明確で名前空間が小さくて良いという話
    - あと `glob` も内包されてるのが良い

# [How to update your scikit-learn code for 2018](https://www.dataschool.io/how-to-update-your-scikit-learn-code-for-2018/)
- Python 2.7 と scikit-learn 0.16 で書いた [Introduction to machine learning in Python with scikit-learn](https://www.dataschool.io/machine-learning-with-scikit-learn/) を Python 3.6 + scikit-learn 0.19.1 に書き直すにあたってメモした変更点のまとめ
- モデル評価に関連する機能が `model_selection` という新しいモジュールに引っ越した。

Before:

```py
from sklearn.cross_validation import train_test_split  
from sklearn.cross_validation import cross_val_score  
from sklearn.grid_search import GridSearchCV  
from sklearn.grid_search import RandomizedSearchCV
```

After:

```py
from sklearn.model_selection import train_test_split  
from sklearn.model_selection import cross_val_score  
from sklearn.model_selection import GridSearchCV  
from sklearn.model_selection import RandomizedSearchCV
```

- Grid/Random search の結果の格納方法の形式が変わった (`grid.grid_scores_` -> `grid.cv_results_`)
- lower is better なスコアリング関数の指定に明示的に `neg_` の接頭辞がつくようになった
    - `mean_squared_error` -> `neg_mean_squared_error`、 `log_loss` -> `neg_log_loss` など
- モデルに 1D データを渡せず、2Dデータのみを受け付けるようになった
    - 1D データはサンプルと特徴量の次元が必ずしも自明ではないため

# [Simple Logging — Simple Logging 0.9.0 documentation](https://simplelogging.readthedocs.io/en/latest/readme.html)
- お手軽 logging ツール
    - Python の logging はちゃんと使おうとするまでに道のりが長すぎる気がする。デバッグ用途で使おうとして debug ログレベルをコンソールに吐くまでにどんだけコード書かせる気だ
        - あれ覚えててリファレンスなしで設定できる人おるんかな
        - しかもすぐに logging 警察飛んできて怖いし

# [Anaconda Distribution 2018.12 Released - Anaconda](https://www.anaconda.com/blog/developer-blog/anaconda-distribution-2018-12-released/)
- Anaconda distribution の命名方法を year.month 方式にした
    - Conda はこれまで通り major/minor 方式