pandasインストール時のエラー

表題の通り、Pandasを再インストール指定たら、下記のようなエラーが出ました。

AttributeError: partially initialized module 'pandas' has no attribute '_pandas_parser_CAPI' (most likely due to a circular import)

多少難儀したので、解決方法をメモしておきます。
ちなみにエラーが出力されたのはバージョンは2.2.0

解決法

まずpip uninstall pandasでアンインストールしてからpip install pandas==2.1.0で旧バージョンをインストールしたら直りました。

Pythonでよく使うコード:その3 Pandas編

publicjournal.hatenablog.com
publicjournal.hatenablog.com

Pandasの基礎

抽出

pythondatascience.plavox.info
列の抽出はdf.loc[:,['A','B']]でもいけるし,df[['A','B']]でもいける
deepage.net

イテレータ

sinhrks.hatenablog.com

blog.mwsoft.jp

qiita.com
これは割とはまり易いので注意。apply後の連結はSeriesを使うべし。DataFrameだと、indexが合わないので変になる。

Jsonファイルの取り扱い

qiita.com
teratail.com
qiita.com

データの型

qiita.com

大容量を読み込む

qiita.com

Dockerによる環境構築

先日、図書館に行ったら良さげな本が置いてあったので借りてきました。最低限の機能を使いこなすために必要な知識を丁寧に解説している良書でした。

そういえば、これまでDockerを自己流で使っていました。必要なものだけを調べるだけで、体系的には勉強していませんでした。折角なので、これを機に勉強してみます。

勉強がてらに、この記事に本書の要点をメモしておきます。

本書のメモ

環境を立ち上げる

この書籍では、まず環境を立ち上げるコマンドとして、次のものが紹介されています。

docker run --name tutorial -d -p 80:80 docker/getting-started

コマンドについては次の通り。

コマンド 説明
run コンテナを作成し、実行するコマンド。containerという単語は省略可。
name tutorial ダウンロードしたコンテナに名前を付けるための引数。今回はtutorialという名前が指定されているが、この引数を指定しない場合でも、自動的に名前が付けられる。
p 80:80 仮想コンピュータ内とホストコンピュータ側を接続するための引数。`80:80`は接続するポート番号を示しており、ホストコンピュータ側で80番ポートで接続すると、仮想コンピュータ側の80番ポートに接続される。
docker/getting-started 取り込むイメージファイルを指定するための引数。

dockerコマンドの例

本書で紹介されている代表的なコマンドについて、記載しておきます。
コンテナの停止、削除

// コンテナの停止
docker stop tutorial

// コンテナの一覧を表示
docker ps -a

// 削除
docker rm tutorial

あとは、この書籍では「すべて破棄するまでがDocker」と解説されていました。これまではあまりそういう意識が無かったです・・。作りっぱなしで放置でした。

// イメージを削除
docker image re

// イメージの一覧を表示して、存在するイメージを確認
docker image ls

Docker composeを試す

コマンドだけでは大変なのでDocker composeというDockerの立ち上げ設定書の機能があります。(ここら辺は知っている話なので、割愛)
コンテナとイメージについて紹介されていて、各々には次のような違いがあります。

  • イメージ:プログラムのもととなるファイルのようなもの
  • コンテナ:そのイメージを使って作成するもの

参考:'Docker のイメージとコンテナ: どう違う?' | CircleCI

Docker composeのyamlを編集するにあたって、ボリュームのマウントというのがあります。ボリュームというのは、OSによって定義された区切りであり、ストレージの単位の一つ。マウントの仕方については次の通りです。

  • ボリュームマウント :Docker Engine上でマウント
  • バインドマウント :パソコンに作成したファイルやディレクトリにマウント
  • モリーマウント :パソコンのメモリにマウント

Docker composeのコマンド

イメージの作成 build
docker compose build
コンテナの作成 create
docker compose create
コンテナの起動 start 、既存コンテナの再起動 restart、 既存コンテナの停止 stop
docker compose start
docker compose restert
docker compose stop
コンテナの廃棄 rm
docker compose rm
一気にコンテナを立ち上げる up、 一式のコンテナを停止して廃棄する down
docker compose up -d

docker compose down

// コンテナが削除されているかを確認する
docker compose images
コンテナを実行 run

runの後にはdocker-compose.ymlファイルのservice内のimage名を入力する

docker compose run httpd bash
特定のコンテナ内でコマンドを実行 exec

runとの違いは既にコンテナがupされているかどうかという違いです。対話形式のコマンドbushも立ち上げられます。新しい画面を開いてほかの操作をするのと同じ感覚でコンテナを操作できる。exitでbushから出る。

docker compose up -d
docker compose exec httpd bash

#exit
docker compose down
docker run -d -p 8001:80 docker5-1

ハンズオンで試してみる

基礎の部分を一通り読んでみたので、自分で手を動かしてみます。最近はよくPythonを使うので、Python環境を作ってみます。本書の解説とググって出てきた下記のサイトを参考に動作を試してみます。

まずは作業ディレクトリを作成する

test_docker_pythonというディレクトリを作ってみます。この中にyamlとDockerfileを置いておきます。

docker-compose.ymlは次の通りに設定しました。今回はWindows側のDドライブの中に後述のtest.pyというスクリプトを置いて、これの動作を試します。

version: '3'
services:
  python3:
    build:
      context: .
      dockerfile: Dockerfile   
    container_name: 'test_python_env'
    volumes:
      - /mnt/d/test://new_dir
    tty: true


Dockerfileも下記のように作ってみます。よく使うライブラリをインストールする、という想定で作成してみました。

FROM continuumio/miniconda3 

RUN conda create -n chemodel python==3.10

RUN conda install numpy
RUN conda install scipy

RUN conda install pandas

イメージを作成する

dockerを起動して、buildコマンドを実行します。

buildした時に、下記のようなメッセージが出力されました。

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

これはこれで、一応ビルドされているっぽいです。

コンテナを作成する

背景色が見づらいですが、下記のように実行します。

コンテナを起動する

起動されていることを確認

Python起動

凄い簡単に作ったtest.pyを動かしてみます。マウントされているWindows側のファイルを指定します。

# test.py
import pandas as pd 
import os 
path ='test_csv.csv'
print(os.path.exists(path)) 
#pd = pd.read_csv(path)

トラブル

下記のようにexceコマンドが実行できないというトラブルがありました。元々は下記のようにDocker composeを書いていました

version: '3'
services:
  python3:
    build:
      context: .
      dockerfile: Dockerfile   
    container_name: 'test_python_env'
    volumes:
      - /mnt/d/test://new_dir

これだと、ただbashを実行しただけで終わってしまいます。 State が「Exit 0」(正常終了)で終わっています。

なので、下記を参考にttyを入れました。
teratail.com
もしくはdocker compose startを忘れても同じメッセージが表示されます。

その他

code .Vs codeからもbashが使えます。

WSL2にDockerをインストールする

去年の夏くらいに条件付きでDocker Desktop有償になりました。誤って有償の条件に当てはまっていたら面倒なので、無償の方法を模索して環境構築をしました。
あの時はネットの記事を調べて断片的に実施していったものの、まとまっている記事がなかった気がします。そのせいか、最近PCを変えてDocker無償環境構築をしようとおもってもどうやったのか忘れました・・・。
なので、Dockerの環境構築の方法をメモしておきます。加えて、最近は良くPythonを使うので、Visual Studio CodeとJupyter Notebook上でPythonを使う方法を書いておきます。

WSL2をインストールする

ここら辺は公式ドキュメントやQiita記事を読んだほうが分かりやすいです。とくにハマるところも無いし。転記するのも面倒なのでリンク先を参照のこと。
www.kagoya.jp
qiita.com
【Note】

  • 昔インストールしたときはMicrosoft storeから「Ubuntu 20.04 LTS」をインストールした

Docker環境を構築する

Docker Engineをインストールする

この辺もリンク先を参照のこと。
docs.docker.com

Docker Engineを起動する

# 起動
sudo service docker start
# 状態確認
sudo service docker status
# 動作確認
sudo docker run --rm hello-world

Pythonライブラリに関するチートシート

以前からプログラミング作業効率化のために、Pythonでよく使うライブラリについてまとめていました。
publicjournal.hatenablog.com
publicjournal.hatenablog.com

最近、チートシートTwitterで流れてきたので、リンクを貼っておきます。

チートシートリンク

Pandas

github.com

Matplotlib

github.com

DockerにNumPyroをインストールする

先日までCmdStanPyを使っていました。が、Anaconda をアンインストールしてPipやconda forgeから再インストールしたら、何故かうまく動作しませんでした。。。やっぱりStan系はインストールが大変です、、。
「諦めてPyStanを使うか、PyCM3に戻ろうかなぁ」なんて思っていた矢先、こういう記事を発見しました。

NumPyroというパッケージがあって、これがなかなか興味深いです。ノーUターンサンプラでMCMCの計算が出来るので、CmdStanPyの代わりになりそうです。NumPyroの公式ドキュメントを以下に貼り付けておきます。

さて、CmdStanPyのインストールを試しているうちに、ローカル環境がぐちゃぐちゃになってしまいました、、。これを反省して、今回からはDocker上に環境構築をします。
(「Numpyro インストール」でググってみるとGoogle Colaboratoryを利用した方法が多く紹介されていましたが、練習もかねてDockerを使いました)

インストール

Pipを利用するといろいろと上手くいかなかったので、miniconda上に構築しました。Docker fileを次のように書きました。割とシンプルな例ですが、結構試行錯誤しました。

FROM continuumio/miniconda3  

RUN conda create -n chemodel python==3.10 
  
RUN conda install numpy 
RUN conda install scipy 
RUN conda install -c conda-forge jax 
RUN conda install -c conda-forge numpyro