日々精進

新しく学んだことを書き留めていきます

AI

PyCharmでコードブロックを折りたたむ

AI

以下のようにregionコメントを入れるとPyCharmのエディタ上でコードを折りたためる。 #region ~をするコード ... #endregion ホントはコードが長くなってきたら別モジュールに分けた方が良いんだろうけど、この方法でもコードを見やすくできる。 参考: [htt…

PyCharmで別プロジェクトをattachすると「The project at … uses a non-standard layout and cannot be attached to this project」エラー

AI

原因は不明だが、以下で直った。 ※「The project at … uses a non-standard layout and cannot be attached to this project」というメッセージがダイアログに表示されたら、一度Yesを選択し、 その後attachするとAttachできる。それでもだめな場合はPyCharm…

pythonプログラム起動時に「ValueError: Unable to configure handler 'fileHandler'」エラー

AI

原因はloggerの設定でfileHandlerを定義していたが、ログファイルの出力先フォルダが存在しないこと。 以下のように設定している場合、/home/ec2-user/m5/logフォルダがないとエラーになる。もっと原因がわかりやすいエラーメッセージにしてほしい。。 handl…

集計はlong formatよりwide formatの方が速い

AI

long formatとwide formatについては以下参照。 www.theanalysisfactor.com long formatのDataFrameに対して以下のように商品毎の日別売上合計を集計したところ、53秒かかった。 sums: DataFrame = train.groupby(["item_id", "date"])[SALES_COUNT].sum() …

Pandasで最頻値を計算する処理は非常に重い

AI

以下のように、移動平均などを計算しようとしたらすごく時間がかかっていたので速くしようとした時の話。 agg = sales[SALES_COUNT].astype("float32").shift(shift).rolling(window) \ .agg(["mean", "max", "min", "std", lambda x: x.mode()[0]]) \ .rese…

DataFrame.groupbyでcategory型の列を指定すると、データの中に存在しないカテゴリの集計結果も出力される

AI

状況は以下。 df = df.query("store_id == 'CA_1') # store_id はCA_1, CA_2などがある df.groupby('CA_1').sum() #=> dfにはCA_1しかないのにCA_2の集計結果の行もできてしまう 以下のようにobserved=Trueオプションを指定すると直る。この挙動をデフォルト…

pandasでmulti indexになっているときにindexの列で絞り込む

AI

以下のようにget_level_valuesメソッドでindexのうち一つの列を選択してmaskをかけられる。 mask: Series = self.features.index.get_level_values(1) == pred_date self.features.loc[mask, SALES_COUNT] = pred[PRED_SALES_COUNT] multi indexはほんとは扱…

pytestのassertはlist同士の比較もできる

AI

listの中の値をassertしたい場合でもassert ==で検査できる。配列やtupleが入れ子になっていても大丈夫。 assert actual == [1, 7, ["平均", "mean"]] 以下によるとunittestではTestCase.assertItemsEqualとか使わないといけないっぽい。pytestは楽だなあ。 …

DataFrameの処理を並列化すると非常に遅くなることがある

AI

例えば、以下のようにグループ毎に集計する処理の場合 sums: DataFrame = train.groupby(ids)[SALES_COUNT].sum() 以下のようにするとグループ単位で並列化できるので速くなりそうに思える。 def func(df): return df[SALES_COUNT].sum() ret_list: List = P…

DataFrame.locで複数列を一度に代入できない

AI

以下のようなコードで、あるDataFrameの4つの列に別のDataFrameの値を代入しようとしたが、できなかった(代入してもsalesの値がNaNのまま) sales.loc[mask, [SALES_COUNT_MA14, SALES_COUNT_MMAX14, SALES_COUNT_MMIN14, SALES_COUNT_MS14, SALES_COUNT_MM…

docker runを実行すると「ERROR: for Cannot start service : OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"process_linux.go:385: running prestart hook 1 caused \\\"error running h

AI

原因はGPUの無いマシンでdocker-compose.yamlに runtime:nvidia と書いた状態でコンテナを起動しようとしたことだった。 runtime:nvidia を削除すると直った。

PythonでPath.mkdirを実行すると「UnicodeEncodeError: 'ascii' codec can't encode character」エラー

AI

原因はmkdirの中でOSのデフォルトエンコーディングに従ってmkdirに渡したpath文字列をエンコードしているため。 CPython実装を見ると、Py_FileSystemDefaultEncodingに従ってエンコードしているように見える。 cpython: 54c93e0fe79b Modules/posixmodule.c …

DataFrameのgroupbyして集計する処理を並列化すると10倍速くなった

AI

コア数が20あるCPUでシングルプロセスで処理していたのをマルチプロセスにしたところ10倍速くなってビックリした。 やり方も簡単で、以下のようにgroup毎に集計する処理を並列化するだけでいい。これは便利。 def aggregate(sales: DataFrame, window: int):…

pythonプログラムを実行すると「Process finished with exit code 137」エラー

AI

原因はOut of memoryだった。使うメモリ量を減らさないといけないんだけど、苦戦中。。 参考: stackoverflow.com

DataFrameでgroupbyして移動平均等の統計量を計算する

AI

売上の移動平均・最大・最小・標準偏差・最頻値を計算したい場合のコードは以下。以外と手こずった。。 return sales.groupby([STORE_ID, ITEM_ID])[SALES_COUNT_LAG_1].rolling(window)\ .agg(["mean", "max", "min", "std", lambda x: x.mode()[0]]) \ .re…

PandasのDataFrameのIndexのrenameをする方法

AI

single indexの場合は df.set_index("seq_idx") でいい。 multi indexの場合は一度reset_indexしないといけない。

pandasの永続化フォーマットはpickleがいい

AI

永続化フォーマットとして今までparquetを使っていたが、float16に対応していなかったりして困ったのでフォーマットを変えることにした。 github.com 以下によるとpickleが良さそう。こういう検証は有り難い。。 blog.amedama.jp

pandasで移動平均を計算すると「ValueError: cannot convert to 'float64'-dtype NumPy array with missing values. Specify an appropriate 'na_value' for this dtype.」エラー

AI

以下のようなコードで移動平均を出そうとしたところ、「ValueError: cannot convert to 'float64'-dtype NumPy array with missing values. Specify an appropriate 'na_value' for this dtype.」エラーが発生した。 return sales.groupby([STORE_ID, ITEM_I…

JupyterLab2.1を入れてdebuggerを使おうと思ったが、色々制約があるのでやめた話

AI

www.publickey1.jp この記事をみてワクワクしながらJupyterLab2.1とdebuggerを入れてみたが・・以下の理由で使うのを断念した。 debuggerを使うにはxeus-python kernelを使わないといけないが、これはmagic commandに対応していない。 使っているextensionが…

JupyterLab ExtensionをDockerfileでinstallする

AI

JupyterLab Extensionはpythonパッケージのようにenvironment.yamlからinstallできない。 extensionの実体はnpmパッケージなのでpackage.jsonからinstallできたらいいのだが、 そのような方法は見付からなかった。 今のところ以下のように一つずつextension…

JupyterLabのExtensionManagerタブに「Error communicating with server extension.」と表示される

AI

原因はnodejsが正しくインストールできていないことだった。 Dockerfile内でnvmをinstallし、さらにnodejsをinstallしていたが、 root userに対してインストールしていたので通常使うuserからはnodejsが実行出来ない状態だった。 通常使うuserにsuしてからno…

Pythonでstr⇒boolに変換

AI

以下のようにbool()とstrtobool()を組み合わせるとbool型に変換できる。 bool(strtobool("true")) bool()も使わないといけないのは紛らわしいことにstrtoboolはboolでなくintを返すから。なんだこの仕様。。 参考: qiita.com

matplotlibの単体テスト

AI

pytest-mpl を使うとmatplotlibで生成した画像と期待結果画像を比較して違っていたらエラーにできる。 matplotlibを便利に使うためのクラスを作っているので助かる。 参考: github.com

PyTorchを実行すると「ctdet/coco_res18THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1535491974311/work/aten/src/THC/THCGeneral.cpp line=663 error=11 : invalid argument」エラー

AI

PyTorchのバージョンが古いと発生するらしい。使っていたバージョンは0.4.0。 以下サイトでinstallコマンドがわかるので、これを実行して最新版をインストールしたら直った。 pytorch.org 参考: discuss.pytorch.org discuss.pytorch.org

pycocotoolsをyamlファイル経由でインストールすると「ImportError: No module named Cython」エラー

AI

pycocotoolsがCythonへの依存関係を正しく設定出来てなくてCythonをインストールする前にpycocotoolsをインストールしようとしてエラーになっているように見える。 以下のIssueで報告されているがずっと放置されてる。。 github.com しょうが無いのでyamlか…

CenterNetをインストールしようとすると「nvcc: command not found」エラー

AI

CenterNetのインストール手順にmake.shを実行する手順があるが、これを実行すると「nvcc: command not found」エラーが発生した。 https://github.com/xingyizhou/CenterNet/blob/master/readme/INSTALL.md nvccはcudaのコンパイラで、cuda toolkitに含まれ…

conda env create~を実行すると「ERROR: Could not find a version that satisfies the requirement 」エラー

AI

原因はメッセージの通り指定したバージョンがないことだけど、今回conda env createで使ったファイルは既存の仮想環境から exportしたものだったのでびっくりした。 pythonだとパッケージのバージョンが消えることがあるのか。。 今回はpytorchの0.4.1.post2…

pip install pycocotoolsを実行すると「gcc: error: pycocotools/_mask.c: No such file or directory」エラー

AI

pip install cython でcythonをインストールすると直る。 参考: github.com

pythonでログにstacktraceを出力する

AI

以下のようにexc_info=Trueを指定すると例外をraiseしたところからのスタックトレースを出力してくれる。 catchした例外オブジェクトを渡さなくてもいいんだね。 logger.info("hmm", exc_info=True) 参考: qiita.com docs.python.org

SQL Alchemyで実行されたSQL文をログに出す

AI

以下のようにconfigを設定すればいい。 app = Flask(__name__) app.config["SQLALCHEMY_ECHO"] = 1 他にも色々とflaskに設定できる項目があるので詳細は以下参照。 flask-sqlalchemy.palletsprojects.com