カテゴリー: Python

  • 物体認識を使った新しい行動解析ツール”YORU”とは一体なんなのか

    物体認識を使った新しい行動解析ツール”YORU”とは一体なんなのか

    2024年11月にbioRxivにこれまでの行動解析ツールとは異なる手法を使ったYORUという行動解析ツールについて発表されました。
    今回はそのツールについてどのようなツールなのかを解説していきたいと思います。

    YORUのプレプリント

    YORUのドキュメント

    YORUとは

    YORUとは深層学習を使った動物の行動解析ツールです。

    YORUのサイトより引用


    これまでもDeepLabCutSLEAPといった深層学習を使ったツールは多く公開されています。
    これらのツールは深層学習と用いて動物の体の部位をトラッキング、そして姿勢推定を行うツールです。(ここではトラッキングツールと呼びます。)

    姿勢を推定することによって、動物がどのような姿勢をしているのかを明らかにし、行動解析を行います。

    これに対して、YORUは物体認識というアルゴリズムを用いて行動を認識します。
    簡潔には、身体部位のトラッキング等は行わず、動物の行動している様子から行動を直接定義します。

    人がりんごやみかんを見分けるときに、形や色といったことを情報に見分けていると思います。
    物体認識では物体を分類することに長けているため、こういった見た目によるものの見分けを行います。

    これを動物の行動解析に用いることで、動物の行動をその見た目から分類します。
    YORUのツール内では、これを行動オブジェクト(Behavior object)と呼んでいます。

    トラッキングツールでは行動は点と線で認識され、YORUでは行動をボックスで囲われるように解析されます。

    物体認識による行動定義のメリット

    物体認識による行動のメリットとしては

    ・個体数が増えてもエラーが出にくい

    ・動物の向きに影響されにくい

    ・解析速度が速い

    ・トラッキングでは捉えにくい行動(マウスがうずくまるといったような行動)を捉えられる

    といったことが考えられます。

    トラッキングツールの弱点である、複数個体の行動解析を簡単に、かつ解析コストをかなり抑えて解析することが可能です。
    さらに、身体部位の位置情報による行動定義が困難な行動も簡単に解析可能です。

    例えば、手をあける、閉じるという行動を考えてみましょう。
    トラッキングツールであればカメラで指先をトラッキングして閉じている、開いているを定義すると思いますが、手を閉じたときに指先が見えなくなると、トラッキングできず、位置情報を正確に計算できなくなります。

    しかし、物体認識であれば手がひらいた状態と閉じた状態の手の形を見ているので、一部が見えなくなっても正確に捉えることが可能です。

    個体数増加に強いという理由に関しても、トラッキングツールであれば個体数が増えると、身体部位がどの個体なのかを割り振って、正確に各個体の行動をとらえなければなりませんが、YORUであれば各個体の形状のみで解析するため、個体の識別や各個体への割り振りを行う必要がありません。

    解析速度も速いため、リアルタイム解析が可能であり、ある行動をしたときに装置制御を行うといったことも可能であり、行動実験の自動化を行うことができます。

    物体認識による行動定義のデメリット

    もちろんデメリットもあり、

    ・一連の行動は捉えることができない

    ・個体識別は行えない

    ・未知の行動を捉えることはできない

    ・見た目でわかりにくい行動は捉えられない

    ・定義した行動の詳細がわからない

    といったことがあります。
    これらのデメリットは逆にトラッキングツールの強みとしても挙げられるところであり、どちらが優れているというよりは、メリット・デメリットをお互いに補完し合っているような感じです。

    そのため、実験者は状況に応じた適切な手法を選ぶ必要があります。

    YORUは何がすごいのか

    さて、YORUの根本に使われている物体認識による行動解析のメリット・デメリットを述べましたが、YORUは一体何がすごいのでしょうか。

    全てGUI化されている

    YORUではプログラミングを行うことなく、行動解析を行うことが可能です。

    これはDeepLabCutやSLEAPなどのツールも同様であり、生物学者にとってこれらの解析を使うための一助となります。

    デザイン


    YORUのデザインはこれまでのツールと違い、かなり研究ツールっぽくはない感じがします。

    リアルタイム解析を導入している

    YORUではこれまでのツールでは珍しく、リアルタイム解析のGUIが完備されています。

    リアルタイム解析のシステムを作るのはプログラミングがある程度できればそこまで問題ではありませんが、そうでないとかなりハードルが高いです。

    ただ、YORUでは全てプログラミングなしで、リアルタイム解析、さらには外部トリガーまでを行うことが可能になっています。

    多様な実験装置に適応可能である点

    リアルタイム解析の最も高いハードルとして、自身の実験系の装置を動かすコードとこれらの解析をどのように組み合わせるのかというのがあります。

    YORUではプラグインシステムを導入しており、外部装置を制御するプログラムを選ぶことができます。

    つまり、自身のシステムにあったプラグインを選択すれば良いのです。

    また、プラグインは自作することも可能であり、自身の装置の制御プログラムをプラグインにすることで簡単にYORUのリアルタイム解析と合致させることができます。

    これは他のツールにはない、かなり使いやすいシステムとなっています。

    最後に

    YORUは発表されたてで、まだまだ使いにくい点・ドキュメントの不足が目立ちます。

    しかし、これからこれらが整備されていくことによって、どのように使われていくのか非常に楽しみです。

  • elifを使った条件分岐がうまくいかない!![Python]

    elifを使った条件分岐がうまくいかない!![Python]

    if文で複数条件で複数の条件分岐を行いたいときに、elifでやってみたらエラーは出ていないんだけど、なんか結果がうまくいかないという時ってないでしょうか。
    もしかしたら、下の事象が当てはまっているかもしれません。
    参考までに、僕が間違えてしまっていたので、メモ書きします。

    問題となるプログラム

    if、elifに二条件を記載して、elifを含むプログラムを作成した状況で問題が起こります。

    def trable(a, b):
        if a >= 10 & b >= 10:
            print("patern A")
        elif a >= 10 & b < 10:
            print("patern B")
        elif a < 10 & b >= 10:
            print("patern C")
        else:
            print("patern D")
    
    trable(11, 11)
    trable(11, 9)
    trable(9, 11)
    trable(9, 9)

    上記のプログラムを実行したときに、上から順にA, B, C, Dのパターンに分類分けされてほしいようにも思えますが、実際には下の出力になります。

    patern A
    patern B
    patern C
    patern B

    順序を入れ替えてみてはどうでしょうか。

    def trable(a, b):
        if a >= 10 & b >= 10:
            print("patern A")
        elif a < 10 & b < 10:
            print("patern B")
        elif a >= 10 & b >= 10:
            print("patern C")
        else:
            print("patern D")
    
    trable(11, 11)
    trable(9, 11)
    trable(11, 9)
    trable(9, 9)

    とやって、patern B, Cのプログラムを入れ替えて、A, B, C, Dと出力してほしいというプログラムを作ると、実際には下記の出力になります。

    patern A
    patern D
    patern D
    patern D

    elif自体は複数条件を定義したいときに下記のように使用します。

    if 条件式A:
      条件式Aが真(True)となった場合の処理
    elif 条件式B:
      条件式Aが偽(False)で、条件式Bが真(True)となった場合の処理
    else:
      条件式Aが偽(False)で、条件式Bも偽(False)となった場合の処理

    しかし、if文、elif文の条件式が二条件になると、上記のような問題が起こると想定されます。
    よって、目的の出力にならないことが起こります。

    これの厄介なところはエラーが排出されないので、実際に結果を見てみないとうまくいっているかどうかがわからないという点です。

    改善策

    複数条件で複数の条件式で分けたいときには、elif文で複数条件を指定しないようにします。

    def resolve(a, b):
        if a>= 10:
            if b >= 10:
                print("patern A")
            else:
                print("patern B")
    
        else:
            if b >= 10:
                print("patern C")
            else:
                print("patern D")
    
    resolve(11, 11)
    resolve(11, 9)
    resolve(9, 11)
    resolve(9, 9)

    煩わしくなりましたが、こうすることで思っている想定通りの出力を行うことができます。

    プログラムではこのような思わぬ落とし穴があるので、書いたプログラムはしっかり確認することの教訓になりますね。

    追記(2022年8月)

    ()で括っていないことが問題であったみたいです。

    def trable(a, b):
        if (a >= 10) & (b >= 10):
            print("patern A")
        elif (a < 10) & (b < 10):
            print("patern B")
        elif (a >= 10) & (b >= 10):
            print("patern C")
        else:
            print("patern D")

    とすると、うまく条件分岐できました。
    もしくは、&をandと表記することでも解決することができます。

    def trable(a, b):
        if a >= 10 and b >= 10:
            print("patern A")
        elif a < 10 and b < 10:
            print("patern B")
        elif a >= 10 and b >= 10:
            print("patern C")
        else:
            print("patern D")

    &とandって同じように思えますが、&には論理積という側面があり、元々のプログラムだと

    a >= 10 & b < 10

    これは a >= (10 & b) < 10 の意味になるようで、
    a=9, b=9だと不等式が
    9>=8<10となり、Trueとなってしまうそうです。

    難しいですね・・・。

  • 【2022年12月更新】YOLOv5のインストール方法[物体認識ツール]

    【2022年12月更新】YOLOv5のインストール方法[物体認識ツール]

    YOLOv5とは

    YOLOは物体検出を行うアルゴリズムです。YOLOはYou Look Only Onseの頭文字をとっています。
    物体のトラッキングとはまた少し違い、オブジェクトと、それがなんなのかを検出することができます。

    YOLOのHPより引用(https://pjreddie.com/darknet/yolo/)

    自動運転などでは、人なのか、ペットなのか、車なのかといった、人間がものを判断するように物体を検出、分類します。

    分類するアルゴリズムは複雑なので、ここでは説明は省きますが、調べてみると非常に多くのサイトで解説されています。

    現在YOLOは大体隔年ぐらいのペースで新しいバージョンが出ており、今ではYOLO v1~YOLOv5、そして、2021年8月に新しいバージョンであるYOLO Xが公表されました。
    バージョンによって何が違うのかは、細かい部分で大きな変更がありますが、基本的には新しくなるにつれて精度がよくなっていきます。

    今回は十分な精度かつ、現在かなり情報が多くなり、導入しやすくなったYOLO v5のインストールと動作確認までのステップを紹介していきたいと思います。

    インストール環境

    OS : Windows 10 (macOS Montereyでもできました)
    Python : 3.9.7 (3.6以降)
    CUDA : 11.3

    インストール方法

    仮想環境の作成

    Anacondaを用いて、仮想環境を作成します。
    Anacondaをインストールしていない人は、インストールしましょう。

    YOLOv5をインストールする際にはかなり多くのパッケージがあるので、仮想環境でインストールをお勧めします。
    仮想環境の名前はなんでもいいのですが、今回は”Yolov5_env”とします。
    anaconda promptで以下のコマンドを入力します。

    conda create -n Yolov5_env python=3.9

    これで仮想環境が作成されるはずです。
    仮想環境に以下のコマンドで入ります。

    conda activate Yolov5_env

    CUDAのインストール

    まず、機械学習のライブラリを初めてインストールする方で、YOLOの学習をGPUで行うおうとする方はCUDAをインストールしましょう。(CPUでの学習はありえないほど時間がかかるのでおすすめしません)
    CUDAは公式サイトからダウンロードできます。

    CUDAのバージョンは、PyTorchで対応しているCUDAのバージョンを確認してから、そのバージョンをインストールするといいと思います。
    PyTorchの公式サイト

    過去のバージョンをインストールするには、Download nowを押した後の画面で、下の方のResourcesのArchive of Previous CUDA Releasesでインストールすることができます。

    最新バージョンでもできるかもしれませんが、取り合えず、PyTorchに合わせておけば問題なく動かすことができると思います。

    インストールされているかはwindowsで、「システム環境変数の編集」を開き、詳細設定>環境変数と開き、
    CUDA_PATHからはじまるパスがあるか確認しましょう。
    Vの後の数字がバージョンを示しています。

    PyTorchのインストール

    まず、インストールする前に、pipの更新をしておきましょう。
    Anaconda Promptで仮想環境に入り、以下のコマンドを実行します。

    python -m pip install --upgrade pip

    PyTorchの公式サイトに行き、自分の環境に合ったインストール方法を選びましょう。
    しかし、ここで問題となるのが、Packageの欄で、ここではpipを選択しましょう
    condaでインストールするとその後でエラーが出てしまいます。

    Run this Commandのコマンドをコピペして、仮想環境にインストールします。

    インストールが終わったら、以下のコマンドでPyTorchがインストールされているか確認しましょう。

    pip list

    この中に、torchが入っていればOKです!!!
    一応動作確認として、pythonを起動し、以下のコマンドを実行してみましょう。

    import torch
    print(torch.cuda.is_available())

    出力でTrueと出れば問題なくインストールできており、torchをGPUで動かす準備が整ったということになります。
    (Macに導入する際やGPUがないパソコンには、Folseと出てきますが、imortが出てきたら大丈夫です)
    エラーが出たらもう一度、インストールを見直してみましょう。

    YOLOv5のインストール

    GitHubからYOLOv5のファイルをダウンロード(クローン)します。

    git clone https://github.com/ultralytics/yolov5

    gitコマンドが使えない方は、gitをインストールするか、YOLOv5のGitHubからファイルをダウンロードします。

    次に、以下のコマンドをAnaconda promptの仮想環境で実行します。

    cd yolov5
    pip install -r requirements.txt

    最初のコマンドは、GitHubでダウンロードしたyolov5のフォルダに移動するコマンドで、gitコマンドでインストールした人はこれで大丈夫ですが、直接サイトからダウンロードしたかたはそのディレクトリに頑張って移動しましょう。

    ダウンロードしたyolov5のフォルダには”requirements.txt”というファイルがあり、ここに必要なパッケージが入っているので、これを読み取り専用で開き、記載されているパッケージをインストールするコマンドが二つ目のコマンドです。

    インストールが終了したらどんなパッケージがインストールされたか確認しましょう。

    pip list 

    かなり多くのパッケージがインストールされたと思います。
    一旦これでYOLOv5のインストールは完了です。

    動作

    動作確認として、元々yolov5のフォルダに入っているデータで確かめてみましょう。
    Anaconda promptで仮想環境に入り、cdコマンドでyolov5のフォルダに移動します。

    そして、以下のコマンドを実行します。

    python detect.py --source ./data/images/ --weights yolov5s.pt --conf 0.4

    detect.pyがyoloを使って、物体認識するプログラムです。
    sourceで物体認識してほしい素材があるフォルダのパスを指定します。
    今回はyolov5に入っているimagesの画像を用いました。

    weightsでどのモデルを使用するかを選択します。
    今回はyolov5.ptを用います。

    confではどれぐらいの尤度(Likelihood)で物体を認識するかを示します。
    これに関しては、機械学習を勉強する際によく出てくる言葉です。
    わからなければこのままで問題ないと思います。

    実行すると、yolov5のフォルダのruns\detect\expに認識された画像が入っていると思います。
    このようにしてYOLOv5では物体認識が行われます。

    直面したエラー

    ModuleNotFoundError: No module named ‘torch’

    Yoloを動かそうとしたときにこのようなエラーが出ることがあります。
    これはPyTorchが利用できていない、モジュールが見つからないというようなエラーです。

    このエラーが出た際には、まず仮想環境でtorchがインストールされているかどうか確認しましょう。

    pip list

    ここにtorchがなければPyTorchをインストールしましょう。
    あるけれどうまくいかない、よくわからないというときは、pythonを起動し、PyTorchをインポート、利用できているかみましょう。

    import torch
    torch.cuda.is_acailable()

    利用できる際には、Trueと返され、うまくいかないときは、上記のエラーが表示されるかと思います。

    エラーの原因として考えられる一つとして、PyTorchをcondaコマンドでインストールしているという可能性があります。
    PyTorchはcondaコマンドでインストールしているけど、他のパッケージはpipコマンドでインストールしていると上記のエラーが出てしまうことがあります。

    その際には、condaコマンドでtorchをアンインストールし、pipコマンドでインストールしなおしましょう。

    モジュールが見つからない問題は、インストールする際のコマンドがpipなのか、condaなのかごっちゃになっている可能性があります。
    今回はpipで統一していますが、常にどのコマンドでインストールしているか気にするといいでしょう。

    リンク集

    Anaconda
    CUDA
    PyTorch
    YOLOv5 GitHub
    YOLOホームページ

    おまけ

    パソコンどれを使えばいいのかわからない方へ、パソコン購入相談をココナラでやることにしました!

    あなたの要望に合わせてパソコンを選び、提案します パソコン選びに困っている方々へ!様々な目的に対応できます!

    パソコンを選んだり、アドバイスすることが多く多くの友人からパソコンの相談やったら儲かるのにと言われました。
    それに感化されて一旦やってみようと思いました!

    パソコンの利用目的に合わせて、そしてパソコンの予算に合わせて購入をご提案します。
    特に機械学習に用いるパソコンを多く選び、使ってきています。

    そして、希望があればパソコンを今後買う時にどこに注目すると良いかもアドバイスしていきたいと思います。

    今まで選んだことあるパソコンとして、研究室の解析用パソコン、実用パソコン、ゲーム配信用パソコン、大学の新入生用のパソコン、建築学科用のCADが使えるパソコン、とりあえずのパソコンなど。

    MacとWindowsの両方使っているので、どちらのお話、ご提案もできます!

    ぜひ利用してみてください!

  • labelImgのインストール方法[2022年12月更新]

    labelImgのインストール方法[2022年12月更新]

    物体クラスタリングを行う上で、元々ある学習モデルだけでなく、自分が作った学習モデルも使いたくなる時があると思います。

    物体クラスタリングで有名なツールとして、YOLOがありますが、その学習データーを作る際に、labelImg(大文字でLABELIMG)は非常に有用なツールとなります。

    そのlabelImgのインストール方法についてご紹介します。

    環境

    OS : Windows 10 (macOS Montereyでもできました)
    Python :3.9.7 (3.6以降)

    インストール方法

    Anacondaを用いて、仮想環境を作り、そこでインストールする方法をおすすめします。
    それによって、他の環境に影響を与えることなく、インストールすることができます。

    仮想環境の名前はわかれば良いので、なんでも良いのですが、今回は”labelimg_env”にします。
    以下のコマンドをAnaconda promptで実行しましょう。

    conda create -n labelimg_env python=3.9

    今回はpython3.9でインストールしていますが、3.6以降であれば特に問題はないかと思います。

    次に、pipとsetuptoolsの更新をおこなっておきましょう。
    これを行うことによって、謎のエラーを防げます(多分)。

    python -m pip install --upgrade pip setuptools

    そして、labelImgをインストールします。

    pip install labelImg

    インストールされたか確認は以下のコマンドで確認できます。

    pip list

    この中に、labelImgがあれば成功です。

    起動

    まず、仮想環境に入ります。

    conda activate labelimg_env

    labelImgを起動します。

    labelImg

    別のウィンドウで画面がひらけばOKです!!

    あとがき

    LabelImgはPyQt5によって、GUIが作られています。
    pythonのバージョンが3.6以降がいいのは、PyQt5のバージョンでPython 3.6以降を必須としているからです(現状)。

    基本的には最新バージョンで問題ないかと思います。

  • Python Video Annotatorインストール方法

    Python Video Annotatorインストール方法

    Python Video Annotatorとは

    Python Video Annotatorとは、撮影した動画を解析、動画内のイベントを時系列的にノートすることができるアプリケーションです。

    神経科学や行動学の研究者が、動物の動画を撮影し、その動物たちの行動を解析、定量するためなどに利用することができます。
    例として、マウスの行動を記録する際に、舌を出す、尻尾を振る、耳を動かすなど、記録したい行動があったとします。
    それが、動画のいつ起こっていて、どれぐらいの時間継続しているのか。
    毎度動画を見て、エクセルに記録するのだと、定義した行動が多いとあまりに大変です。
    こういったツールを用いることで、動画にノートとして記録し、時間情報やイベント情報を取り出すことができます。

    元々、動物の行動を記録するアプリケーションとして、VCodeと呼ばれるオープンソースのソフトがありました。
    しかし、現在のパソコンのOSに対応していないという問題がありました。

    Python Video Annotatorでは、最新のPCに対応し、必要な機能は残しつつ、さらに外部のセンサー情報(圧力計など)やDeepLabCutなどの行動定量ツールと組み合わせることができ、非常に研究を行う人にとって有用なツールとなっています。

    インストール方法

    ホームページにインストール方法は詳しく書かれていますが、僕のパソコンではうまく入れることができませんでした。(多分そのままインストールしたら、元々インストールされているパッケージとの相性が悪かったのかもしれません。)
    そこで、GitHubのサイトに記載されている、Anacondaを使って仮想環境を構築、インストールするという方法を行いました。

    言葉で言うと難しそうですが、やることは非常に簡単です。
    現在(2021年10月20日地点)では最新のmacOS(Big Sur 11.6)には対応していないらしく、近日中に改善されると思われます。
    なので、今回はWindowsを例にとって説明します。

    ただ、macOSでもAnacondaを入れて、condaコマンドを使えるようにしてからは基本的には操作は一緒なので、使えるようになったら参考にしてください。(詳しくは前回の記事より)

    Anacondaをインストールし、Anaconda promptを開きます。
    そして、仮想環境を作成し、仮想環境をアクティベートしましょう。

    conda create -n videoannotator python=3.6
    conda activate videoannotator

    その後、必要なパッケージをインストールします。

    pip install opencv-python-headless pyqt5==5.14.1 pyqtwebengine==5.14.0

    その後、python Video Annotatorをインストールします。

    pip install python-video-annotator

    色々処理が終わったらインストール完了です。

    起動するときは、仮想環境をアクティベートしてから、実行します。

    conda activate videoannotator
    start-video-annotator

    これでソフトが起動したら完了です。

  • macOSでCondaコマンドを使う

    macOSでCondaコマンドを使う

    MacOSでのAnacondaのインストール、ターミナルの環境設定を行いたいと思います。

    Anacondaのインストール

    Anacondaのホームページへと行き、下の方にスクロールするとダウンロードがあります。

    ここでは自分の環境にあったものをインストールしましょう。
    今回は、MacOSの説明なので、64-bit Graphical Installerを選択しましょう。

    インストーラーを起動し、指示に従ってインストールしましょう。

    Macでインストーラーが二つありますが、64-bit Graphical InstallerはGUIによってAnacondaをインストールする方法で、こちらの方が親しみが深く、何もなければこちらでAnacondaをインストールできます。

    64-bit Command Line Installerはダウンロードすると *.shのファイルがインストールされます。
    これはシェルスクリプトによるインストールで、ターミナルを使ってインストールする際に使用します。

    Linuxでのソフトのインストールがターミナルを用いたインストールが基本なので、Linuxに親しんでいる人はこちらの方がインストールしやすいんですかね。(多分)

    コマンドラインの環境設定

    MacOSでインストールすると、ソフト一覧にAnaconda-Navigaterが出てくるだけで、このままだとターミナルでAnacondaやPythonを使えません。

    ソフトのインストールなどで、condaコマンドを使用したい場合には、Anacondaを有効にしなければなりません。
    Anacondaを有効にするには(Conda コマンドを使えるようにするには)

    conda activate

    とする必要があります。
    これでcondaコマンドを使えるはずです。

    いちいちconda環境をアクティベートするのがめんどくさい方は、自動でconda環境を有効にすることもできます。
    その時にはターミナルで、

    ~/opt/anaconda3/bin/conda init シェル名

    とします。
    シェル名は自分の使用しているシェル名を使うのですが、なんだそれ、いじったことないぞという方はデフォルトのシェル(MacOSだとzsh)だと思うので、これをシェル名に代入しましょう。

    ~/opt/anaconda3/bin/conda init zsh

    これで、ターミナルを再起動すると、自動的にconda環境が有効になり、conda activateのコマンドを打たなくても良くなります。

    自動有効をオフにする場合には、

    conda config --set auto_activate_base false

    とターミナルで実行しましょう。

  • データフレームにおける特定の値の抜き出し[Python]

    データフレームにおける特定の値の抜き出し[Python]

    Pythonのデータフレームに関して、ある特定の値を抜き出すことは意外にも難しいです。
    それは、Pythonのデータフレームはデータフレームの形式で扱うことが前提であり、ある行を抜き出したり、切り取ったり、追加したりは非常に簡単に行うことができます。

    ただ、値を抜き出そうとする時にはなぜか値として抜き出せず、データフレームの形のままだったり、問題がいろいろ発生します。

    ここでは、ある特定の条件を満たすデータフレームの値を抜き出す方法を記載します。
    他に多分いい方法とかあるのかもしれませんが、今現状僕の状態ではこれが限界です。

    まず、状況として、以下のデータフレームがあったときに、赤枠で囲った20の値を抜き出そうとします。

    ここで問題になるのは、上記のような単純なデータフレームであればインデックスがわかり、一発で抜き出すことができますが、大量のデータであったときにインデックス番号を確認してそれを使うことは非常に難しいです。

    大量にデータがあったときに、キーとなる列(顧客番号、idなど)を手がかりにデータを抜き出すことが効率的です。
    そこで、下のような状況で抜き出そうとします。

    つまり、Aの列でAichiの行のBの値を抜き出したいとします。
    その時には一度で抜き出すことはできず、二段階踏んで値を抜き出します。

    まず、上記と同様のデータフレームを作成します。

    import pandas as pd
    df = pd.DataFrame({ 'A' : ["Tokyo", "Aichi", "Osaka"],
                        'B' : [10, 20, 30],
                        'C' : [100, 200, 300]})
    df

    次に、Aの列のAichiの行を抜き出します。

    a = df[df["A"] == "Aichi"]
    
    print(a)

    そうすることで、Aichiを含む行を抜き出すことができました。
    最後に、この行のBの列の値を抜き出します。

    b = a.at[a.index[0], "B"]
    
    print(b)

    このようにすることで、抜き出すことができます。
    回りくどいですが、これが僕が現在使っている方法です。

    他に方法があればコメント等で教えていただけると幸いです。

    import pandas as pd
    df = pd.DataFrame({ 'A' : ["Tokyo", "Aichi", "Osaka"],
                        'B' : [10, 20, 30],
                        'C' : [100, 200, 300]})
    
    a = df[df["A"] == "Aichi"]
    b = a.at[a.index[0], "B"]
    print(b)

    上記のプログラムのまとめです。

  • Pythonの例外処理を行うtry, except

    Pythonの例外処理を行うtry, except

    pythonでのプログラムの時に、エラーが起こることがあります。
    エラーはプログラムが正常に組み立てられていないことを示してくれるいいやつなのですが、
    時に、エラーのせいでプログラムが動かなくなってしまう時があります。

    構文的には正しいのに、実行時にエラーが出ることがあります。
    構文が文法的に正しくない時に出るエラーを構文エラー
    文法的に正しいのに、論理的に間違っているエラーを例外と言います。

    例外の例として、
    TypeError:演算する者同士の方が異なっている
    EX. word/2 , 4*number

    ZeroDivisionError:0で割ってしまっている
    EX. 3/0

    ValueError:型は合っているが、値が適切でない
    EX. int(“string”)

    条件分岐をすることによって、エラーを未然に防ぎ、論理的に正いプログラムを作成することも可能ですが、エラーが怒った時には例外処理を行うという処理を行うという選択肢を取ることもできます。

    その時に使用するのがtry, exceptです。

    try: 
        実行したい処理(例外を含むかもしれない)
    except エラー名:
        例外発生時に行う処理

    といったように使います。
    例として、

    try:
        print(10 / 0)
    except ZeroDivisionError:
        print('できませんでした')
    #出力
    できませんでした

    となります。
    ただ、exceptで捉えることができるエラーは指定されたエラーのみ
    (今回のプログラムではZeroDivisionErrorのみ)なので、そのほかのエラーが発生した場合に関しては、プログラム実行時にエラーとして出力されます。

    複数のエラーが想定される際には、except エラー名: を追加しましょう。

    try:
        print(10 / 0)
    except ZeroDivisionError:
        print('できませんでした')
    except ValueError:
        print('値がうまく合致しませんでした')

    except節は複数指定することができます。

    except節で例外名を全て指定しないと、全ての例外をキャッチすることが可能です。

    try:
        print(10 / 0)
    except:
        print('できませんでした')

    ただ、これに関して、全ての例外をキャッチしてしまうということで、プログラム制作者が想定していない例外が発生した時にもそのエラーを隠してしまうので、使用する際には非常に注意が必要です。

    try-exceptの構文に関連して、例外が発生した後の処理を指定したりする説があります。
    それを軽く記述しておきます。
    詳しくは別のブログで紹介しようと思います。

    • raise:故意に例外を発生させる
    • pass例外発生後に何も処理を行わない
    • else例外が発生しなかった場合にのみ処理
    • finally例外の発生に関わらず必ず処理

  • PythonでArduinoを制御したいのだ!

    PythonでArduinoを制御したいのだ!

    ArduinoはArduino言語によって制御します。
    ただ、もっと複雑な処理をしたい、何かのプログラムと一緒にArduinoを制御したいという時が訪れることでしょう。

    今回紹介するpySerialというモジュールはRaspberry PiやArduinoとシリアル通信を行うことができます。
    シリアル通信をすることによって、pythonのプログラムからArduinoやRaspberry Piに指令を出し、pythonプログラムを通して制御することができます。

    今回はその基本的なプログラム紹介します。
    これが使えるだけで、プログラムでできることの幅がかなり広がるでしょう。

    インストール方法

    pip install pyserial

    ターミナルやコマンドプロントでpythonを開き、インストールできます。
    もしくは、PyCharmなどのターミナルでインストールもできます。

    プログラム例

    今回は1秒ずつLEDをつけたり消したりするプログラムです。
    もともとArduinoについているLEDの13ピンに出力して検証したいと思います。
    Pythonのプログラムでは

    import serial, time
    
    def main():
        #  COMポートを開く
        print("Open Port")
        ser = serial.Serial("COM3", 9600)
        while True:
            #  LED点灯
            ser.write(b"1")
            time.sleep(1)
            #  LED消灯
            ser.write(b"0")
            time.sleep(1)
    
        print("Close Port")
        ser.close()
    
    if __name__ == '__main__':
        main()

    serial.Serialでポートと、シリアル通信の設定を行います。
    Arduino UNOでは9600を指定します。
    これはボードによって異なるので、Arduino IDEで確認しましょう。

    b”1″のbは非常に重要な役割を担っています。
    serial.write()関数では、シリアル通信をするためにはbyte列にして数字や文字列を送信しなければなりません。
    このようにして、byte列であることを示す必要性があります。

    このプログラムは無限ループなので、1秒ごとのLEDのオンオフがプログラムを止めるまで続きます。

    次にArduino側のプログラムです。

    void setup() {
      Serial.begin(9600);
      pinMode(13, OUTPUT);
      digitalWrite(13, LOW);  //  初期化
    }
    
    void loop() {
      byte var;
      var = Serial.read();
      switch(var){
        case '0':
          digitalWrite(13, LOW);
          break;
        case '1':
          digitalWrite(13, HIGH);
          break;
        default:
          break;
      }
    }

    ここではswitch case構文を使っています。
    このほうがプログラムがわかりやすいです。
    詳しくは前回のブログを見てみてください。

    ここでは0が送信されるとLOW、1が送信されるとHIGHとなります。
    このプログラムをベースに使うことによって、色々なパターンでArduinoをPythonプログラムで制御することができます。

  • 詳しいことは分かりませんが、Pythonでプログラミングしたいです!(1)

    詳しいことは分かりませんが、Pythonでプログラミングしたいです!(1)

    プログラミングの勉強を始めるにあたって、いったい何から始めるかっていうのが最初の関門だと思います。
    ネットで調べたりしたはいいけど、そこからじゃあどうしましょう。プログラムを書くソフトは一体どうしたらいいの?

    僕自身それでかなり困りました。

    プログラムを書くにあたって書くためのツールが大きく二つあります。
    一つは対話型であり、一つは文章型です。(ここでは分かりやすく。正しいのかはイマイチわからないですが…)

    対話型は文章を一つ打ったら、一つ返答が返ってくる
    という具合に一文一文プログラムを書いて実行してを繰り返します。

    文章型は作文をしたらその感想が返ってくる
    というように、一気にプログラムを実行するイメージです。
    いわゆる想像するプログラムは文章型であり、訳のわからないコードがたくさん並んでいるように見えるかと思います。

    ただ、文章型のプログラムをしようとした際にじゃあ一体どのソフトでやるのか?というのが困ります。

    それも、プログラミングを学ぶ初級では対話型を行うことが多いが、中級になると急に文章のコードを書くようになり、何を使って書くかはあまり明記されなかったり、本によって全く違ったりします。

    対話型はコマンドプロントであったり、ターミナルなどの、もともとパソコン本体に既存のもので
    “Python”と打ってから始めます。

    しかし文章型のプログラムはどれで書くのでしょうか。

    文章型のプログラムの多くは、IDE(総合開発環境)によって書くことがほとんどです。(困ったときには”Python IDE おすすめ”で検索するとたくさん記事が出てきます。)

    僕の文章型のプログラムを書くときに普段使っているのは
    Jupyter NotebookとPyCharmです。
    (Jupyter はジュピターと読む派と、ジュパイターと読む派がいるみたいです。)

    統計解析やグラフを書くときはJupyter Notebook、機械とか動かしたり、複雑なプログラムはPyCharmを使います。

    それぞれどんな感じなのかを説明していきたいと思います。

    まずJupyter Notebookについて。
    これはAnacondaをダウンロードすると付随して入ります。
    Jupyter Notebookを起動すると、まずSafariやFirefoxなどのパソコンのブラウザが開きます。

    そして、パソコンのファイル一覧が表示されます。
    そこで目的のフォルダーを開き、右上のほうにあるnewをクリック。
    その後、Python3をクリックすることで下の画像のような画面が開かれます。
    このファイルを保存すると *.ipynbファイル となります。

    一つ一つの塊にプログラムを打ち、上部にあるRUNというボタンをクリックすることによって、各固まりずつプログラムを動かすことができます。

    グラフや統計を行う際に、この一つの塊ずつコードを実行するというのはとても利点となります。
    なので僕はよく利用してます。

    PyCharmは *.py ファイルを開くときに使っています。
    開けるファイルが違うので、注意が必要です。

    PyCharmは他のサイトを参考にしてみてください。
    (まだあんまり使ったことがないので、詳しい使い方に関しては今後の記事で紹介したいと考えています。)

    Anacondaのサイトはこちらから

    Jupyter Notebookのサイトはこちらから

    PyCharmのサイトはこちらから
    ダウンロードはprofessionalではなく、灰色のCommunityのほうが無料で使えるほうです。
    はじめはそちらのダウンロードをおすすめします。

    Jupyter Notebookは最近頻繁につかっているので、僕の学習のメモとして、そしてプログラムを学びたい方向けに今後も更新していきたいと思います。