Python

Python: tenacityでリトライを実装する

信頼できない環境で稼働するアプリケーションには、リトライ処理が不可欠です。 難しくはないので自前で実装してしまうのですが、特定の例外のみリトライしたい・リトライ間隔を指数関数的に増やしたい・リトライ時はログ出力したいなどの細かなリクエストを…

Python: pre-commitでコミット前にチェックする

Pythonで安全にコーディングしようとすると、リンタ (ex. flake8) やフォーマッタ (ex. black) 、型チェッカ (ex. mypy) など、コミット前に実行するコマンドが増えていきます。 今回は、コミット時にコマンドを自動的にフックするPythonのツールとしてpre-c…

mypyで静的型チェックを導入する

仕事で既存のコードへmypyの導入を試みる機会がありましたので、使い方とtipsの備忘録としてまとめます。 mypyとは インストール 型チェックの実行 Tips: 型チェック対象を限定する 設定 Tips: スタブが無いパッケージのエラーは無視させる コードの修正 Tip…

sqlparseを使って簡単にSQLをパースする

大量のSQLのリストやログから特定テーブルへのUPDATEを行うクエリだけを抽出したいといったケースが、しばしばあります。1つのアプリケーションからアクセスされるDBであればコードを追っていくことでどうにかなるのですが、異なる言語やORMで構成された複数…

panderaでDataFrameをバリデーションする

pandasのDataFrameは柔軟なテーブル構造を提供してくれますが、時に柔軟すぎて困ることもしばしばです。本番運用するアプリケーションですとなおさらこの欠点が目立ちます。 入力データに依存して意図しない型に変わってしまったり... ex. [1, 2, 3]だとint6…

Python: Parquetフォーマットファイルを入出力する (Pandasとpyarrow)

今回はテーブルデータをParquetファイルで扱う方法について2つ紹介します。 Apache Parquet サポートされるデータ型 Pandas DataFrameを用いたParquetファイルの変換 Apache Arrow pyarrowを用いたParquetファイルの変換 まとめ コードは以下の環境で動作確…

Python: poetryでパッケージの依存管理

私はこれまでPythonのパッケージ管理として pyenv + pipenv を主に使ってきました。が、最近はpipenvは色々あって使いづらさを感じていました。 pipenv lockやpipenv syncが遅い (気がする) pipenv自体の更新が怪しかった (参考、今年に入って4月と6月にリリ…

Python: 安全・手軽に一時ファイル・一時ディレクトリを作る (tempfile)

一時的に使うファイルやディレクトリを作成して、処理が終わったら削除する、という手続きを実装する機会はしばしばあると思います。 簡単なことではあるのですが、処理の例外ハンドラで削除の実装を忘れてゴミファイルができてしまったり、並列実行したとき…

Optunaでハイパパラメータチューニング

今回はハイパパラメータチューニングを自動化するOptunaを触りながら紹介していきます。 Optuna BayesianOptimizationのかゆいところ Optunaを用いた実装 1変数関数の最適化 分散最適化 scikit-learnの最適化 まとめ Optuna 勾配ブースティング木やニューラ…

Python: HDF5ファイルの作成と読み込み (h5py)

お仕事で触れる機会が増えてきたHDF5について調べて整理します。また、h5pyを使ってWFLWデータセットをHDF5へ変換してみました。 HDF5 HDF (Hierarchical Data Format) は大量のデータを格納するファイルフォーマットで、The HDF Groupによって開発・メンテ…

yacsで実験パラメータを設定する

今回はyacsを用いたパラメータ管理について整理します。 yacs yacsはPythonコード + YAMLファイルで実験条件などのパラメータを管理できるようにするPythonライブラリです。 Pythonでyamlの設定ファイルを読み込むようなライブラリとしてはPyYAMLやruamel.ya…

Python: motoでS3・DynamoDB・SQSのモックを作る

AWSで稼働するアプリケーションのユニットテストを作るときに厄介なのが、依存しているマネージドサービスのモックをどうやって整えるかです。無しというわけにはいかないですが、unittest.Mockなどで自作するのもかなり大変です。 こうしたモックを簡単に作…

Python: サクッとカウンタを実装する (collections.Counter)

文字列のリストから単語の出現頻度をカウントする、といったケースはしばしばあるかと思います。 dictやdefaultdictで実装すると初期値0の設定が必要だったりしてちょっとめんどくさいです。 words = ["dog", "cat", "dog", "dog", "mouse", "cat"] # dictの…

Pythonの列挙型 (enum)

これまで定数クラスを作ってやり過ごすことが多かったのですが、enumが比較的使いやすかったので、 enum enumはPython 3.4から標準ライブラリに追加されたモジュールで、列挙型をサポートするものです。 docs.python.org 実装 最初にenumをインポートしてお…

pandas小技: 複数の文字列のいずれかを含む (OR + 部分一致) 検索したい

例えば↓のテーブルから 東京都または千葉県 を含む値だけをフィルタする場合に、pandasではどう書くかです。 name 0 東京都葛飾区 1 神奈川県川崎市 2 埼玉県蕨市 3 千葉県蘇我市 pandasのstr.containsは正規表現パターンを含めることができます。 そのため…

Python: データ保持用のクラスを定義する (dataclasses)

DBのエンティティクラスを定義するときなど、データを持つことに特化した構造体のようなクラスが必要なケースがよくあります。 かつてはdict + typeやnamedtupleなどで用をなしてましたが、そういったクラスを簡単に定義できる標準ライブラリとして、Python …

Python: バイナリデータを入出力したい (struct)

お仕事でバイナリのセンサデータをPythonで入出力する必要がありましたので、標準ライブラリ struct について整理します。 struct structは、Pythonの値 (int, double, charなど) とCの構造体 (Pythonではbytesオブジェクト) を相互変換するためのモジュール…

RustモジュールをPythonから実行する (PyO3)

最近少しずつRustに手を出し始めています。 CPUバウンドとなっている重い処理をPythonから切り出してコンバートするユースケースを考えたときに、PythonからRustを呼び出すための仕組みが必要となります。 今回はPythonからRustバイナリを実行する (あるいは…

Python: 抽象クラスを実装する (abc)

お仕事のPythonコードを読んでいて、抽象基底クラス (abstract base class: ABC) で実装されているクラスがありました。そういえば使ったことがなかったので、この機に整理しましたのでその覚書です。 $ python --version Python 3.6.8 Pythonでは抽象基底ク…

Python: 辞書の値を属性参照する (AttrDict)

辞書の値を属性参照 (dic["key"] ではなく dic.keyでアクセスする) したいケースがしばしばあります。JSON形式の設定ファイルを読み込んで、オブジェクトの初期化に使うなどです。 そんなときに便利なAttrDictを紹介します。 typeを使えば良いのでは? 組み…

Python: subprocessでOSコマンドを実行する

ちょっとしたツールのためにPythonからGitやDockerなどのコマンドを実行してゴニョゴニョする、ということはよくあるかと思います。 OSコマンドを手軽に実行するPython標準ライブラリ subprocess で頻用する機能について使い方を整理します。 docs.python.or…

SQSを永遠にポーリングするPythonパッケージ sqs-polling を作りました

タイトルの通りで、SQSを永遠にポーリングするPythonパッケージを作ってPyPiに公開しました。 pypi.org GitHubはこちら。 github.com 使い方 pip install sqs-pollingでインストール。あとは以下のように記述すると、延々とSQSからメッセージを取り出し、コ…

Python: unittest.mockでモックを作ってテストする

Python (3.3以降) でユニットテストのモックを楽に作れるunittest.mockが標準ライブラリとして提供されてます。今回はその紹介を行います。 外部モジュールに依存した実装をテストする難しさ ユニットテストの実現において、DBやWeb APIなどのアプリケーショ…

AWS SQSのメッセージをPythonで送受信する

AWSのキューメッセージサービスSQSのメッセージを、Boto3を使ってPythonで送受信する方法の備忘録です。 Boto3のインストール、AWSの設定、および、SQSの作成は完了している前提です。 $ pip install boto3 $ aws configure AWS Access Key ID [************…

Python: ファイルパスをオブジェクトっぽく操作するpathlib

Pythonでのファイル操作は os + glob の組み合わせなどでどうにかすることが多いですが、標準モジュールのpathlibを使うとサクッと実装できることもあります。 pathlib --- オブジェクト指向のファイルシステムパス — Python 3.7.5rc1 ドキュメント osモジュ…

Python: requestsでBasic認証

Basic認証がかけられたエンドポイントへ、requestsを使ってリクエストする方法です。 $ pip install requests ID/PWでrequests.auth.HTTPBasicAuthを生成し、requestsのメソッド (ここではpost) の auth へ渡してあげるのがポイントです。 HTTPDigestAuthやH…

OpenCV: ラベリング

今回はOpenCVを使って画像のラベリングを行います。いらすとやさんの画像を使わせていただきました。 ラベリングは画像を連続する領域ごとにラベルを付けることです。上の画像であれば、左の棒人形と右の棒人形が分離しているので、別々のラベルになります。…

Python: プログレスバーを表示する (tqdm)

tqdmを使ってプログレスバーを表示する方法について紹介します。 Kerasなどのフレームワークは良い感じにビジュアライズしてくれるのですが、自前の前処理などで進捗表示したい場合に便利です。 $ pip install tqdm github.com 基本的にはシーケンスやイテレ…

Python: ファイルを移動する (shutil.move)

ファイルのETLを実装しているとLinuxのmvコマンド相当のことをよくやるのですが、Pythonではshutil.moveを使うと便利です。 https://docs.python.org/ja/3/library/shutil.html#shutil.move 例としてこのようなディレクトリ構造を仮定します。 % tree . ├── …

Python: リストのリスト・辞書のリストを展開 (flat) するワンライナー

[[...], [...], [...]] -> [..., ..., ...] としたいケースです。 内包表記は多重ループ可能なので、ワンラインで展開できます。 list_in_list = [[0, 1, 2], [3, 4], [5, 6, 7, 8]] flatten_list = [v for child_list in list_in_list for v in child_list]…