Python
信頼できない環境で稼働するアプリケーションには、リトライ処理が不可欠です。 難しくはないので自前で実装してしまうのですが、特定の例外のみリトライしたい・リトライ間隔を指数関数的に増やしたい・リトライ時はログ出力したいなどの細かなリクエストを…
Pythonで安全にコーディングしようとすると、リンタ (ex. flake8) やフォーマッタ (ex. black) 、型チェッカ (ex. mypy) など、コミット前に実行するコマンドが増えていきます。 今回は、コミット時にコマンドを自動的にフックするPythonのツールとしてpre-c…
仕事で既存のコードへmypyの導入を試みる機会がありましたので、使い方とtipsの備忘録としてまとめます。 mypyとは インストール 型チェックの実行 Tips: 型チェック対象を限定する 設定 Tips: スタブが無いパッケージのエラーは無視させる コードの修正 Tip…
大量のSQLのリストやログから特定テーブルへのUPDATEを行うクエリだけを抽出したいといったケースが、しばしばあります。1つのアプリケーションからアクセスされるDBであればコードを追っていくことでどうにかなるのですが、異なる言語やORMで構成された複数…
pandasのDataFrameは柔軟なテーブル構造を提供してくれますが、時に柔軟すぎて困ることもしばしばです。本番運用するアプリケーションですとなおさらこの欠点が目立ちます。 入力データに依存して意図しない型に変わってしまったり... ex. [1, 2, 3]だとint6…
今回はテーブルデータをParquetファイルで扱う方法について2つ紹介します。 Apache Parquet サポートされるデータ型 Pandas DataFrameを用いたParquetファイルの変換 Apache Arrow pyarrowを用いたParquetファイルの変換 まとめ コードは以下の環境で動作確…
私はこれまでPythonのパッケージ管理として pyenv + pipenv を主に使ってきました。が、最近はpipenvは色々あって使いづらさを感じていました。 pipenv lockやpipenv syncが遅い (気がする) pipenv自体の更新が怪しかった (参考、今年に入って4月と6月にリリ…
一時的に使うファイルやディレクトリを作成して、処理が終わったら削除する、という手続きを実装する機会はしばしばあると思います。 簡単なことではあるのですが、処理の例外ハンドラで削除の実装を忘れてゴミファイルができてしまったり、並列実行したとき…
今回はハイパパラメータチューニングを自動化するOptunaを触りながら紹介していきます。 Optuna BayesianOptimizationのかゆいところ Optunaを用いた実装 1変数関数の最適化 分散最適化 scikit-learnの最適化 まとめ Optuna 勾配ブースティング木やニューラ…
お仕事で触れる機会が増えてきたHDF5について調べて整理します。また、h5pyを使ってWFLWデータセットをHDF5へ変換してみました。 HDF5 HDF (Hierarchical Data Format) は大量のデータを格納するファイルフォーマットで、The HDF Groupによって開発・メンテ…
今回はyacsを用いたパラメータ管理について整理します。 yacs yacsはPythonコード + YAMLファイルで実験条件などのパラメータを管理できるようにするPythonライブラリです。 Pythonでyamlの設定ファイルを読み込むようなライブラリとしてはPyYAMLやruamel.ya…
AWSで稼働するアプリケーションのユニットテストを作るときに厄介なのが、依存しているマネージドサービスのモックをどうやって整えるかです。無しというわけにはいかないですが、unittest.Mockなどで自作するのもかなり大変です。 こうしたモックを簡単に作…
文字列のリストから単語の出現頻度をカウントする、といったケースはしばしばあるかと思います。 dictやdefaultdictで実装すると初期値0の設定が必要だったりしてちょっとめんどくさいです。 words = ["dog", "cat", "dog", "dog", "mouse", "cat"] # dictの…
これまで定数クラスを作ってやり過ごすことが多かったのですが、enumが比較的使いやすかったので、 enum enumはPython 3.4から標準ライブラリに追加されたモジュールで、列挙型をサポートするものです。 docs.python.org 実装 最初にenumをインポートしてお…
例えば↓のテーブルから 東京都または千葉県 を含む値だけをフィルタする場合に、pandasではどう書くかです。 name 0 東京都葛飾区 1 神奈川県川崎市 2 埼玉県蕨市 3 千葉県蘇我市 pandasのstr.containsは正規表現パターンを含めることができます。 そのため…
DBのエンティティクラスを定義するときなど、データを持つことに特化した構造体のようなクラスが必要なケースがよくあります。 かつてはdict + typeやnamedtupleなどで用をなしてましたが、そういったクラスを簡単に定義できる標準ライブラリとして、Python …
お仕事でバイナリのセンサデータをPythonで入出力する必要がありましたので、標準ライブラリ struct について整理します。 struct structは、Pythonの値 (int, double, charなど) とCの構造体 (Pythonではbytesオブジェクト) を相互変換するためのモジュール…
最近少しずつRustに手を出し始めています。 CPUバウンドとなっている重い処理をPythonから切り出してコンバートするユースケースを考えたときに、PythonからRustを呼び出すための仕組みが必要となります。 今回はPythonからRustバイナリを実行する (あるいは…
お仕事のPythonコードを読んでいて、抽象基底クラス (abstract base class: ABC) で実装されているクラスがありました。そういえば使ったことがなかったので、この機に整理しましたのでその覚書です。 $ python --version Python 3.6.8 Pythonでは抽象基底ク…
辞書の値を属性参照 (dic["key"] ではなく dic.keyでアクセスする) したいケースがしばしばあります。JSON形式の設定ファイルを読み込んで、オブジェクトの初期化に使うなどです。 そんなときに便利なAttrDictを紹介します。 typeを使えば良いのでは? 組み…
ちょっとしたツールのためにPythonからGitやDockerなどのコマンドを実行してゴニョゴニョする、ということはよくあるかと思います。 OSコマンドを手軽に実行するPython標準ライブラリ subprocess で頻用する機能について使い方を整理します。 docs.python.or…
タイトルの通りで、SQSを永遠にポーリングするPythonパッケージを作ってPyPiに公開しました。 pypi.org GitHubはこちら。 github.com 使い方 pip install sqs-pollingでインストール。あとは以下のように記述すると、延々とSQSからメッセージを取り出し、コ…
Python (3.3以降) でユニットテストのモックを楽に作れるunittest.mockが標準ライブラリとして提供されてます。今回はその紹介を行います。 外部モジュールに依存した実装をテストする難しさ ユニットテストの実現において、DBやWeb APIなどのアプリケーショ…
AWSのキューメッセージサービスSQSのメッセージを、Boto3を使ってPythonで送受信する方法の備忘録です。 Boto3のインストール、AWSの設定、および、SQSの作成は完了している前提です。 $ pip install boto3 $ aws configure AWS Access Key ID [************…
Pythonでのファイル操作は os + glob の組み合わせなどでどうにかすることが多いですが、標準モジュールのpathlibを使うとサクッと実装できることもあります。 pathlib --- オブジェクト指向のファイルシステムパス — Python 3.7.5rc1 ドキュメント osモジュ…
Basic認証がかけられたエンドポイントへ、requestsを使ってリクエストする方法です。 $ pip install requests ID/PWでrequests.auth.HTTPBasicAuthを生成し、requestsのメソッド (ここではpost) の auth へ渡してあげるのがポイントです。 HTTPDigestAuthやH…
今回はOpenCVを使って画像のラベリングを行います。いらすとやさんの画像を使わせていただきました。 ラベリングは画像を連続する領域ごとにラベルを付けることです。上の画像であれば、左の棒人形と右の棒人形が分離しているので、別々のラベルになります。…
tqdmを使ってプログレスバーを表示する方法について紹介します。 Kerasなどのフレームワークは良い感じにビジュアライズしてくれるのですが、自前の前処理などで進捗表示したい場合に便利です。 $ pip install tqdm github.com 基本的にはシーケンスやイテレ…
ファイルのETLを実装しているとLinuxのmvコマンド相当のことをよくやるのですが、Pythonではshutil.moveを使うと便利です。 https://docs.python.org/ja/3/library/shutil.html#shutil.move 例としてこのようなディレクトリ構造を仮定します。 % tree . ├── …
[[...], [...], [...]] -> [..., ..., ...] としたいケースです。 内包表記は多重ループ可能なので、ワンラインで展開できます。 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]…