日々精進

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

%%timeで処理時間を計測するとwall timeとcpu timeが全然違う

IT

Jupyterで%%timeを使って処理時間を計測したところ wall timeが140sでcpu timeが2sぐらいだった。 原因は並列処理をしていたため。cpu timeはメインスレッドの処理時間のみ計測した結果っぽい。 並列処理をした場合の全スレッドのcpuを使った時間は出せない…

ubuntuのバージョンを18.04にするとdocker imageのbuildがtzdataのinstallで止まるようになった

IT

原因はtzdataのinstall時にtimezoneを選択するよう求められること。 Dockerfileに以下を追加すると選択しなくてよくなる。 ENV DEBIAN_FRONTEND=noninteractive 参考: qiita.com

Pythonで「ImportError: No module named」エラー

IT

色々原因はありうるが、自作モジュールでかつコマンドラインから実行している.pyファイルと別のフォルダにあるモジュールでこのエラーが出ている場合、 モジュール検索パスが通っていないことがある。 モジュール検索パスを追加したい場合はPYTHONPATHかsys.…

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

AI

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

dockerコマンドを実行すると「An HTTP request took too long to complete.」エラー

IT

docker daemonを再起動したら直った。謎なエラーだ。。 参考: qiita.com

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オプションを指定すると直る。この挙動をデフォルト…

S3のフォルダ名を変更する

IT

直接変更する方法はなく、以下の手順が必要。 ・以下をEC2で実行する aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to> ・古い名前のフォルダを削除する もっと簡単にフォルダ名変えられるようにしてほしい。。 参考: stackoverflow.com</folder_name_to></bucket></folder_name_from></bucketname>

userがsudoできるようにする

IT

以下でsudoできるようになる。 usermod -G sudo <ユーザ名> 参考: webkaru.net

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…

dockerでmountしたフォルダにwrite権限が無い場合の挙動

IT

docker composeファイルで以下のようにホスト側のフォルダをmountしている場合。 volumes: - "/var/log/app:/home/my-user/app/log" /home/my-user/app/log(コンテナ側のフォルダ)にwrite権限がないユーザでファイルを保存しようとすると、Permission Denied…

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…

Windows10を初期化する方法

IT

Windows10には初期化機能があり、簡単に初期化できる。詳細は以下参照。 www.comshop.co.jp こんなに簡単に初期化できるとは。。便利。 ただ、初期化だけだと初期化前にあったファイルを復元できてしまう可能性があるので、他の人にPCを譲る場合は初期化後に…

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 を削除すると直った。

localeについて

IT

localeとは言語、単位、時刻など国毎に異なる設定をまとめたもの。 C localeはデフォルトのlocale。基本アメリカに合わせた設定になるはず。 LANG, LC_TYPE, LC_ALLなどいくつかの環境変数を使って設定する。 en_US.UTF-8のように 言語_国.エンコーディング…

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

AI

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

プロセスのメモリ使用量の履歴を簡単に表示する

IT

cloudwatchのような監視ツールがあればメモリ使用量もグラフで出してくれるんだろうけど、 そこまでしなくていいやという場合。以下をコンソールで実行すると1秒に一度特定のプロセスのメモリ使用量などを取ってきて表示してくれる。 top -d 1 -b |grep <process> 参</process>…

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しないといけない。

S3にはバージョニング機能がある

IT

知らなかった。。S3にはバージョニング機能があるのでoldフォルダにファイルを取っておいたりしないで良かったのか。 バケット単位でのON/OFFしかできないのでその点はちょっと使いづらいが、便利そう。 qiita.com

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…

PythonでバイナリデータをAES256/CBC/PKCS5Paddingで暗号化・復号するサンプルコード

IT

PyCryptodomeがインストールされている前提。 from Crypto import Random from Crypto.Cipher import AES from test.util.test_util import AES_KEY block_size: int = 32 def test_encrypt_image(): with open("sample.jpg", "rb") as f: plain_image: byte…