Slide 1

Slide 1 text

【第2回】ゼロから始めるゲノム解析 (Python編) Transcribing DNA into mRNA: Mutating Strings, Reading and Writing Files @onouyek

Slide 2

Slide 2 text

本勉強会の概要・目的 書籍名 対象者/目的 Mastering Python for Bioinformatics Python・バイオインフォ知識ほぼゼロの人 を対象に、正しいPythonのコーディング手 法について学ぶ 頻度 毎週〜隔週開催予定 登壇者 募集中!

Slide 3

Slide 3 text

Rosalindとは ● 問題解決を通じてバイオインフォマティク ス、プログラミング、およびアルゴリズムを 学習するためのプラットフォーム ● 大学やハッカソン、就職の面接にも 600回 以上の採用実績あり 参考:https://qiita.com/_kimoton/items/d534d0fa9b83dd7dc412 概要

Slide 4

Slide 4 text

環境構築 - 必要パッケージ群のインストール # 公開されているレポジトリからファイル群を取得 $ git clone https://github.com/kyclark/biofx_python $ cd biofx_python # requirements.txt に記載のパッケージをインストール $ pip3 install -r requirements.txt # pylintの設定ファイルをホームディレクトリに移動 $ cp pylintrc ~/.pylintrc # mypyの設定ファイルをホームディレクトリに移動 $ cp mypy.ini ~/.mypy.ini

Slide 5

Slide 5 text

本日のお題 与えられたDNA配列を RNA配列に変換せよ http://rosalind.info/problems/rna/

Slide 6

Slide 6 text

本日学ぶこと ● 複数ファイルの引数設定 ● ディレクトリの存在確認と作成 ● ファイルの読み込みと書き込み ● 文字列の変換

Slide 7

Slide 7 text

前提知識編

Slide 8

Slide 8 text

argparseとは 実行時にコマンドライン引数を取れるようにするPythonの標準ライブラリ $ ./rna.py -h usage: rna.py [-h] [-o DIR] FILE [FILE ...] Transcribe DNA into RNA positional arguments: FILE Input DNA file optional arguments: -h, --help show this help message and exit -o DIR, --out_dir DIR Output directory (default: out) rna.pyでは、 位置引数として FILE オプション引数として --help と--out_dirが定義されている デフォルトの名前はout

Slide 9

Slide 9 text

位置引数の定義の仕方 ①-なしの場合は位置引数 ②ヘルプメッセージにおける表記を定義 ③引数の型を定義。 誤った入力をした場合 に早期に不適切な入力を検知可能 ④引数の数を定義 4 1 2 3 シンボル 意味 ? 0または1 * 0以上 + 1以上

Slide 10

Slide 10 text

オプション引数の定義の仕方 ①引数の1文字表記は-、長い名前は--はじま り ②ヘルプメッセージにおける表記を定義 ③引数の型を定義(デフォルトは str) ④デフォルトの値を定義(指定なければ None) 4 1 2 3

Slide 11

Slide 11 text

NamedTupleとargparseを用いたプログラム構成 1 2 3 ①NamedTupleを継承してArgsクラスを作成 ②ArgsクラスはTextIO属性をもつlist型の filesと定義している。 ③TextIOはファイルハンドラの型ヒント get_args()で引数解析をしてArgsクラスに 渡して返す

Slide 12

Slide 12 text

ディレクトリの存在確認と作成 1 2 ①out_dirで定義したディレクトリが存在するかを確認 ②os.makedirs()で出力ディレクトリを作成(親ディレクトリが存在しない場 合にも作成される) demo

Slide 13

Slide 13 text

擬似コードを用いてアウトラインを描く 新しいプログラムを書く際は擬似コードで何をする処理かを明確にしておくと進めやすい

Slide 14

Slide 14 text

出力ファイルの作成 os.pathモジュールのdirname()でディレクトリのパスを、 basename()でファイル名をファイルパスから取得できる。 >>> import os >>> os.path.dirname('./tests/inputs/input1.txt') './tests/inputs' >>> os.path.basename('./tests/inputs/input1.txt') 'input1.txt' os.path.join()で出力ファイルのパスを作成する os.path.basename('tests/inputs/input1.txt') ↓ os.path.join("rna", "input1.txt") → "rna/input1.txt" ↑ args.out_dir demo

Slide 15

Slide 15 text

ファイルを開く - open() open()関数のデフォルトでは読み込みモードになっているので書き込みモードの wを指定 処理モード 意味 w 書き込み r 読み込み a 追記 内容モード 意味 t テキスト b バイト

Slide 16

Slide 16 text

(参考)with文 ● 処理中に例外が発生しても必ず最後にファイルをちゃんと閉じてくれる。 ● 同じことを try-finally ブロックを使って書くより簡潔に書ける。 ※with キーワードを使用しない場合は、ファイルのために利用されたシステムリソースを直ちに解 放するために f.close() を呼び出してファイルを閉じてください。 >>> with open(workfile) as f: >>> read_data = f.read() >>> # We can check that the file has been automatically closed. >>> f.closed False

Slide 17

Slide 17 text

ファイルへの書き込み ファイルハンドルのwrite()でファイルに書き込み print()のfileオプションに出力のファイルハンドルを指定することでも書き出せる。 demo

Slide 18

Slide 18 text

テスト- bad_input 1 2 3 ①終了ステータスが 0でないことをチェック ②usage:が出力されることをチェック ③エラーメッセージが出力されることをチェック

Slide 19

Slide 19 text

テスト- good_input 1 2 3 ①出力ディレクトリの存在確認 ②出力ファイルの存在確認 ③出力内容が正しいか確認 ④テスト後にディレクトリ削除 4

Slide 20

Slide 20 text

(参考)pytest fixture 1 2 Yield fixturesでtestに使ったディレクトリを Cleanup ①関数にpytest.fixture デコレーターを つけるとテスト関数の引数として渡せる。 ②outdirが呼ばれるとyieldまで実行さ れてout_dirを返す。 テストの実行が終わると yieldより後の処 理が行われる。

Slide 21

Slide 21 text

解答編

Slide 22

Slide 22 text

解法 1 str.replace()メソッドで変換

Slide 23

Slide 23 text

解法 2 正規表現モジュールのre.sub()を用いて置換 検索する文字列 入力文字列  ↓  ↓ re.sub('T', 'U', 'ACGT')  ↑ 置換する文字列

Slide 24

Slide 24 text

(参考)ベンチマーキング 1 2 1 2 str.replace()を用いた実行時間 re.sub()を用いた実行時間 100万塩基長の100配列の処理速度を計測 demo

Slide 25

Slide 25 text

追加課題 Q. RNAの配列を出力する代わりに配列の長さを出力するように修正してください。また 最後に最小、最大、平均の長さを出力してください。

Slide 26

Slide 26 text

本日学んだこと ● argparse.FilteTypeを用いたファイル引数のバリデーション ● os.path.isdir()によるディレクトリの確認 ● os.makedirs()によるディレクトリの作成 ● open()によるファイルの読み込み ● open()によるファイルの書き込み ● str.replace(), re.sub()による文字列の変換