Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【第3回】ゼロから始めるゲノム解析(Python編)

nkimoto
November 26, 2021

 【第3回】ゼロから始めるゲノム解析(Python編)

2021/11/26 (金) 【第3回】ゼロから始めるゲノム解析(Python編) 資料

nkimoto

November 26, 2021
Tweet

More Decks by nkimoto

Other Decks in Programming

Transcript

  1. 環境構築 - 必要パッケージ群のインストール # 公開されているレポジトリからファイル群を取得 $ 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
  2. 文字列を反転(リストのindexを使用) >>> dna = 'AAAACCCGGT' >>> dna[:2] 'AA' >>> dna[-2:]

    'GT' 終了位置を指定しないと、最終文字列までの指定になる 開始位置を指定しないと、最初文字列からの指定になる >>> dna[::-1] 'TGGCCCAAAA' 第3の引数としてstep_sizeを指定可能。-1を指定すると、反転方向に並び替えることができる
  3. 文字列を反転(reversed() 関数を使用) >>> reversed(dna) <reversed object at 0x7ff4e5c2bf70> イテレータから取り出した反転文字列を空文字列を結合文字に用いて結合 reversed()

    関数はイテレータを返す >>> ''.join(dna) 'TGGCCCAAAA' イテレータとは for 文などで要素を1つずつ取り出せるオ ブジェクトを指す
  4. 文字列を反転(forループを使用) >>> rev = '' >>> for base in reversed(dna):

    ... rev += base ... >>> rev 'TGGCCCAAAA' 1 2 3 2 反転文字列のイテレータから1文字 ずつbaseに格納 3 rev変数に追加 1 相補鎖を格納するrev変数を初期化
  5. 文字列を反転 → 相補鎖の生成 revc = '' for base in reversed(dna):

    if base == 'A': revc += 'T' elif base == 'T': revc += 'A' elif base == 'G': revc += 'C' elif base == 'C': revc += 'G' elif base == 'a': revc += 't' elif base == 't': revc += 'a' elif base == 'g': revc += 'c' elif base == 'c': revc += 'g' else: revc += base 1 相補鎖を格納するrevc変数を初期化 2 反転文字列のイテレータから1文字 ずつbaseに格納 3 大文字/小文字の塩基に該当すれば相 補的な塩基をrevc変数に追加 1 2 3
  6. 解法 1 .forループとif/elifによる分岐を使用 • 塩基配列のlookupにif/elif/elseではなく辞書 型を使う • for文ではなくリスト内包表記を使用する • str.translate()

    メソッドを使用する • Bio.Seq オブジェクトと付随する相補鎖生成 のためのメソッドを使用する 改善案
  7. 解法 2 辞書型を用いたlookup 1 相補鎖としてどの塩基を返すかを示した 辞書 2 3 2 相補鎖を格納するcomplement変数を初

    期化 3 引数で与えたDNA文字列を1文字ずつ baseに格納 1 4 5 4 baseを相補鎖に変換した塩基を complement変数に追加 5 complement変数の文字列を反転した結 果を出力
  8. リスト内包表記 for base in args.dna: trans.get(base, base) [trans.get(base, base) for

    base in arg.dna] リスト内包表記を用いるとリスト内の要素に特定の処理を行った結果を一行で取得する ことができる。
  9. str.translate() メソッド >>> trans = { ... 'A': 'T', 'C':

    'G', 'G': 'C', 'T': 'A', ... 'a': 't', 'c': 'g', 'g': 'c', 't': 'a' ... } >>> str.maketrans(trans) {65: 'T', 67: 'G', 71: 'C', 84: 'A', 97: 't', 99: 'g', 103: 'c', 116: 'a'} >>> 'AAAACCCGGT'.translate(str.maketrans(trans)) 'TTTTGGGCCA' str.maketrans() メソッドはkeyがASCIIコードとなった辞書型を作成する str.translate() メソッドはkeyがASCIIコードとなった辞書型を引数にとり、文字列を変換する # 文字 → ASCIIコード >>> ord('A') 65 # ASCIIコード → 文字 >>> chr(65) 'A'
  10. Bio.Seqクラス $ python3 -m pip install biopython biopythonパッケージのインストール >>> from

    Bio import Seq Seqクラスをimport >>> Seq.reverse_complement('AAAACCCGGT') 'ACCGGGTTTT' Seq.reverse_complement() メソッドを使用して変換
  11. (参考)ベンチマーキング 100万塩基長の配列を生成 demo >>> with open("sample.dna.large", "w") as wf: ...

    wf.write(''.join([random.choice('ATGC') for i in range(10000000)])) $ for py in ./solution*; echo $py && time $py sample.dna.large ; end 100万塩基長の配列に対して各手法を適用し、 timeコマンドにより実行時間を測定
  12. 1 2 3 4 5 1 2 3 4 5

    Bio.Seqクラスを用いた 実行時間 forループとif/elifを 用いた実行時間 str.translate() メ ソッドを用いた実行時間 リスト内包表記を使用し た実行時間 辞書型のlookupを用いた 実行時間
  13. 本日学んだこと • if/elseを用いる/辞書を用いたlookupにより決定木を実装できる • 文字列とリストはいずれもforループでイテレーションできる、+=オペレータで追加できる 点で似ている • reversed() 関数はイテレータを返す遅延評価関数 •

    str.maketrans() 及び str.translate() を使うと文字列の置換を効率的に行うことができ る • Biopythonはバイオインフォマティクスに利用される関数群が含まれたパッケージ • Bio.Seq.reverse_complementメソッドを用いると相補鎖を作成することができる