Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Finding the Hamming Distance: Counting Point Mu...
Search
onouyek
January 07, 2022
Programming
0
430
Finding the Hamming Distance: Counting Point Mutations
【第6回】ゼロから始めるゲノム解析(Python編)
onouyek
January 07, 2022
Tweet
Share
More Decks by onouyek
See All by onouyek
Finding Open Reading Frames
onouyek
0
340
Inferring mRNA from Protein: Products and Reductions of Lists
onouyek
0
320
Finding the Longest Shared Subsequence: Finding K-mers, Writing Functions, and Using Binary Search
onouyek
0
250
Find a Motif in DNA: Exploring Sequence Similarity
onouyek
0
310
Creating the Fibonacci Sequence: Writing, Testing, and Benchmarking Algorithms
onouyek
1
450
Transcribing DNA into mRNA: Mutating Strings, Reading and Writing Files
onouyek
0
510
DNA methylation analysis using bisulfite sequencing data
onouyek
0
780
Operations on Genomic Intervals and Genome Arithmetic
onouyek
0
340
Exploratory Data Analysis with Unsupervised Machine Learning
onouyek
0
310
Other Decks in Programming
See All in Programming
Zendeskのチケットを Amazon Bedrockで 解析した
ryokosuge
3
310
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.4k
AIでLINEスタンプを作ってみた
eycjur
1
230
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
600
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
170
機能追加とリーダー業務の類似性
rinchoku
2
1.3k
為你自己學 Python - 冷知識篇
eddie
1
350
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
330
Improving my own Ruby thereafter
sisshiki1969
1
160
Swift Updates - Learn Languages 2025
koher
2
490
スケールする組織の実現に向けた インナーソース育成術 - ISGT2025
teamlab
PRO
1
120
AI時代のUIはどこへ行く?
yusukebe
18
9k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
It's Worth the Effort
3n
187
28k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
What's in a price? How to price your products and services
michaelherold
246
12k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Thoughts on Productivity
jonyablonski
70
4.8k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
Transcript
【第6回】ゼロから始めるゲノム解析 (Python編) Finding the Hamming Distance: Counting Point Mutations @onouyek
本勉強会の概要・目的 書籍名 対象者/目的 Mastering Python for Bioinformatics Python・バイオインフォ知識ほぼゼロの人 を対象に、正しいPythonのコーディング手 法について学ぶ
頻度 毎週〜隔週開催予定 登壇者 募集中!
Rosalindとは • 問題解決を通じてバイオインフォマティク ス、プログラミング、およびアルゴリズムを 学習するためのプラットフォーム • 大学やハッカソン、就職の面接にも 600回 以上の採用実績あり 参考:https://qiita.com/_kimoton/items/d534d0fa9b83dd7dc412
概要
環境構築 - 必要パッケージ群のインストール # 公開されているレポジトリからファイル群を取得 $ 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
本日のお題 http://rosalind.info/problems/hamm/ DNA配列sとtのハミング距離を求めよ
前提知識編
ハミング距離 文字列sからtに変換するのに必要な編集(置換)の数 AAACCCGGGTTT || | CGACGATATGTC AAACCCGGGTTT ||||||||||| AACCCGGGTTTA 例1:sとtで共通のものは12塩基のうち3塩基なのでハミング距離は
9 例2:sとtの配列はほぼ共通( 92%)だが開始位置から比べるのでハミング距離は 4 AAACCCGGGTTT || || || || AACCCGGGTTTA s t s t s t
位置引数の複数指定 位置引数は順番があるのでargparseで指定した順番にして渡す $ ./hamm.py -h usage: hamm.py [-h] str str
Hamming distance positional arguments: str Sequence 1 str Sequence 2 optional arguments: -h, --help show this help message and exit
abs():絶対値を求める >>> seq1, seq2 = 'AC', 'ACGT' >>> len(seq1) -
len(seq2) -2 2つの配列が異なる場合、差をとると負になる場合がある >>> distance = abs(len(seq1) - len(seq2)) 2 abs()で絶対値を求めることができる
min():最小値を求める range()の引数に求めた最小値を渡せばインデックスを使って文字を比較できる >>> seq1, seq2 = 'AC', 'ACGT' >>> min(len(seq1),
len(seq2)) 2 2つの配列を比べる場合、短い方の長さだけ調べれば良い min()で最小値が求められる >>> for i in range(min(len(seq1), len(seq2))): ... print(seq1[i], seq2[i]) ... A A C C
解法編
Solution 1: min() ①seq1とseq2の長さの差の絶対値をdistanceに代入 ②seq1とseq2の短い方の長さでイテレーション ③seq1とseq2の同じ位置の文字を比較して異なればdistanceをインクリメント ① ② ③
Solution 2: zip() min()で短い方の長さを求めなくても、zip()で短い方に合わせて2つの リストからそれぞれの要素を取り出せる >>> list(zip('AC', 'ACGT')) [('A', 'A'),
('C', 'C')]
Solution 3: zip_longest() zip_longest()で長い方に合わせて2つのリストからそれぞれの要素を取り出せる 短い方は要素がなくなるとNoneが返されるのでabs()で初期値を求める必要がなくなる >>> from itertools import zip_longest
>>> list(zip_longest('AC', 'ACGT')) [('A', 'A'), ('C', 'C'), (None, 'G'), (None, 'T')]
Solution 4: リスト内包表記 リスト内包表記で1行で書くことができる >>> seq1, seq2 = 'GAGCCTACTAACGGGAT', 'CATCGTAATGACGGCCT'
>>> [1 if c1 != c2 else 0 for c1, c2 in zip_longest(seq1, seq2)] [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0] demo
Solution 5: filter() filter()とlambda関数を使って2つの配列の異なる要素のイテレーターが得られる >>> seq1, seq2 = 'AC', 'ACGT'
>>> list(filter(lambda t: t[0] != t[1], zip_longest(seq1, seq2))) [(None, 'G'), (None, 'T')]
Solution 6: map() map()とlambda関数を使って2つの配列の要素を比較したbool値のイテレーターが得られる map(lambda t: t[0] != t[1], zip_longest('AC',
'ACGT'))) map(lambda t: t[0] != t[1], [('A', 'A'), ('C', 'C'), (None, 'G'), (None, 'T')]) lambda('A', 'A'): 'A' != 'A' -> False lambda('C', 'C'): 'C' != 'C' -> False lambda(None, 'G'): None != 'G' -> True lambda(None, 'T'): None != 'T' -> True
Solution 7: starmap() starmap()を使うことで、関数にタプルを展開して渡してくれる def not_same(t): return t[0] != t[1]
starmap(not_same, zip_longest('AC', 'ACGT')) starmap(lambda a, b: a != b, [('A', 'A'), ('C', 'C'), (None, 'G'), (None, 'T')]) *('A', 'A') lambda 'A', 'A': 'A' != 'A' -> False demo
operatorモジュール:関数形式の標準演算子 >>> import operator >>> operator.ne('A', 'A') False >>> operator.ne('A',
'T') True >>> 1 + 2 3 >>> operator.add(1, 2) 3 >>> 'AC' + 'GT' 'ACGT' >>> operator.concat('AC', 'GT') 'ACGT'
追加課題 プログラムを拡張して、2つ以上の入力配列を扱えるようにしてください。各配列のペア 間のハミング距離を表示するようにしてください。
本日学んだこと • abs() • min() • zip() • zip_longest() •
filter() • map() • starmap() • operatorモジュール