Slide 1

Slide 1 text

【第12回】ゼロから始めるゲノム解析 (Python編) Inferring mRNA from Protein: Products and Reductions of Lists @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

本日のお題 https://rosalind.info/problems/mrna/ 与えられたタンパク質に翻訳される異なる RNAの数を1,000,000で割った余りを求めよ

Slide 6

Slide 6 text

前提知識編

Slide 7

Slide 7 text

デカルト積 >>> from itertools import product >>> from pprint import pprint >>> combos = list(product(*codons)) >>> pprint(combos) [('AUG', 'GCA', 'UAA'), ('AUG', 'GCA', 'UAG'), ('AUG', 'GCA', 'UGA'), ('AUG', 'GCC', 'UAA'), ('AUG', 'GCC', 'UAG'), ('AUG', 'GCC', 'UGA'), ('AUG', 'GCG', 'UAA'), ('AUG', 'GCG', 'UAG'), ('AUG', 'GCG', 'UGA'), ('AUG', 'GCU', 'UAA'), ('AUG', 'GCU', 'UAG'), ('AUG', 'GCU', 'UGA')] 第9回で扱ったitertools.product()でデカルト積を生成できる

Slide 8

Slide 8 text

剰余演算におけるオーバーフロー >>> 5 % 2 1 %演算子による剰余の計算 >>> import math >>> math.prod(range(1, 1000)) % 1000000 0 math.prod()で1000の階乗で1,000,000の余りを求めようとするとfloatの上限を超えてしまうため結果が0になってしまう

Slide 9

Slide 9 text

functools.reduce() >>> reduce(lambda x, y: x + y, possible) 8 2つの引数を受け取る関数を定義して配列を累積的に処理して 1つの値を返す >>> reduce(lambda x, y: x * y, possible) 12 Sum Product 1 4 3 + 5 3 + 8 1 4 3 * 4 3 * 12

Slide 10

Slide 10 text

解法編

Slide 11

Slide 11 text

Solution 1: RNAコドン表の辞書を使う ①第7回で扱ったRNAコドン表の辞書 ②タンパク質配列+ストップコドンの該当するアミノ酸の コドンを取り出してその長さを計算 ③math.prod()を使ってもできるが、Pythonの制限ない integerに依存しない関数を定義して使用 ① ②

Slide 12

Slide 12 text

(参考)オーバーフローの回避 ①aのmodで割った余りを計算(0ならaを返す) ②bが奇数ならresにaを足してmodした結果でresを更新 ③aを2倍してmodした結果でaを更新 ④bを2で割って更新 ②~④をbが0になるまでループ https://www.geeksforgeeks.org/how-to-avoid-overflow-in-modular-multiplication/ ① ② ③ ④ >>> modprod(range(1, 1001), 1000000) math.prod()では結果が0になっていた1000の階乗でも計算できる

Slide 13

Slide 13 text

Solution 2: 辞書のkeyをアミノ酸にする >>> pprint(dict(map(reversed, c2aa.items()))) {'*': 'UGA', 'A': 'GCU', 'C': 'UGU', 'D': 'GAU', 'E': 'GAG', 'F': 'UUU', 'G': 'GGU', 'H': 'CAU', 'I': 'AUU', 'K': 'AAG', 'L': 'UUG', 'M': 'AUG', 'N': 'AAU', 'P': 'CCU', 'Q': 'CAG', 'R': 'CGU', 'S': 'UCU', 'T': 'ACU', 'V': 'GUU', 'W': 'UGG', 'Y': 'UAU'} reversed()するだけだとvalueが1つのコドンだけになってしまう >>> aa2codon = defaultdict(list) >>> for k, v in c2aa.items() aa2codon[v].append(k) >>> pprint(aa2codon) defaultdict(, {'*': ['UAA', 'UAG', 'UGA'], 'A': ['GCA', 'GCC', 'GCG', 'GCU'], 'C': ['UGC', 'UGU'], 'D': ['GAC', 'GAU'], 'E': ['GAA', 'GAG'], 'F': ['UUC', 'UUU'], 'G': ['GGA', 'GGC', 'GGG', 'GGU'], 'H': ['CAC', 'CAU'], 'I': ['AUA', 'AUC', 'AUU'], 'K': ['AAA', 'AAG'], 'L': ['CUA', 'CUC', 'CUG', 'CUU', 'UUA', 'UUG'], 'M': ['AUG'], 'N': ['AAC', 'AAU'], 'P': ['CCA', 'CCC', 'CCG', 'CCU'], 'Q': ['CAA', 'CAG'], 'R': ['AGA', 'AGG', 'CGA', 'CGC', 'CGG', 'CGU'], 'S': ['AGC', 'AGU', 'UCA', 'UCC', 'UCG', 'UCU'], 'T': ['ACA', 'ACC', 'ACG', 'ACU'], 'V': ['GUA', 'GUC', 'GUG', 'GUU'], 'W': ['UGG'], 'Y': ['UAC', 'UAU']})

Slide 14

Slide 14 text

Solution 2: 辞書のkeyをアミノ酸にする ①アミノ酸がkeyでコドンがvalueの辞書 ②タンパク質配列+ストップコドンの該当するアミノ酸を keyにコドンのリストを取り出してその長さを計算 ① ②

Slide 15

Slide 15 text

Solution 3: 辞書のvalueをコドンの数にする ①アミノ酸をコードするコドンの数だけ分かればよいので辞書のvalueをその数にしておく ②タンパク質配列+ストップコドンの該当するアミノ酸をkeyに取り出した値がコドンの数 ① ②

Slide 16

Slide 16 text

ベンチマーキング hyperfine -L prg \ ./solution1_dict.py,./solution2_rev_dict.py,./solution3_slim_dict.py \ '{prg} tests/inputs/3.txt' --prepare 'rm -rf __pycache__'

Slide 17

Slide 17 text

追加課題 プログラムを拡張して、異なるRNA配列を1つの正規表現で出力してください。 例えば、AUGGCAUAAとAUGGCAUAGであればAUGGCAUA[AG]のように出力する。

Slide 18

Slide 18 text

本日学んだこと ● itertools.product()によるデカルト積の作成 ● functools.reduce()によるイテラブル要素の結合 ● %演算子による剰余演算 ● 辞書のkeyとvalueの反転