Python để phân tích dữ liệu ngs

Nhận toàn quyền truy cập vào Tin sinh học với Python Cookbook và hơn 60 nghìn đầu sách khác, với bản dùng thử miễn phí 10 ngày của O'Reilly

Ngoài ra còn có các sự kiện trực tuyến trực tiếp, nội dung tương tác, tài liệu chuẩn bị chứng nhận, v.v.

Không có gì bí mật khi chúng tôi là những người hâm mộ cuồng nhiệt của Python tại công ty tư vấn Amber Biology của chúng tôi. Ít nhất 90% tất cả các dự án tư vấn của chúng tôi liên quan đến một số mã Python và đó là một ngôn ngữ linh hoạt, hiệu quả và biểu cảm đến mức chúng tôi muốn gọi nó là "Con dao lập trình của quân đội Thụy Sĩ". Tuy nhiên, một trong những điều chúng ta thường nghe về Python lại diễn ra như thế này

"Họ nói rằng Python quá chậm và không hiệu quả để sử dụng cho các tác vụ tính toán nặng vì nó là một ngôn ngữ thông dịch. "

Đây có phải cũng chính là "họ" cũng nói rằng bạn có thể phát triển tầm nhìn ban đêm phi thường bằng cách ăn nhiều cà rốt không?

Tại Amber Biology, chúng tôi đã sử dụng Python cho nhiều vấn đề nghiên cứu chuyên sâu về tính toán, chẳng hạn như mô phỏng việc sử dụng một giao thức phòng thí nghiệm mới trên bộ gen người

Có, bản phân phối Python tiêu chuẩn có thể không nhanh trong một số trường hợp nhất định như một số ngôn ngữ được biên dịch khác [chẳng hạn như C ], nhưng có nhiều cách tiếp cận để sử dụng Python theo những cách có thể nâng cao hiệu suất của nó lên mức ít nhất là

Ngoài việc được viết bằng chính ngôn ngữ Python, các mô-đun Python cũng có thể được viết bằng các ngôn ngữ khác như C, sau đó được biên dịch thành các lệnh thực thi của máy và được liên kết với trình thông dịch Python. Điều này có nghĩa là mã Python của bạn có thể chạy dưới dạng mã được giải thích hoặc trực tiếp dưới dạng hướng dẫn thực thi bằng máy - tất cả đều từ trong cùng một ứng dụng

Trình thông dịch Python chính thức thực sự được viết bằng C, cũng như nhiều mô-đun đi kèm với nó như một phần của Thư viện chuẩn Python. Điều này có nghĩa là khi bạn gọi các mô-đun thư viện chuẩn này từ mã đang chạy trong trình thông dịch Python, các hàm và phương thức mà các mô-đun này chứa có thể được chạy trực tiếp [và rất hiệu quả] dưới dạng các hướng dẫn thực thi bằng máy được biên dịch miễn là chúng . Về cơ bản, điều này có nghĩa là nếu bạn cấu trúc mã của mình tốt, bạn có thể nhận được thứ gì đó tương tự như hiệu suất của ngôn ngữ được biên dịch, thậm chí từ ngôn ngữ "được thông dịch" như Python

Không tin chúng tôi?

Các nhà nghiên cứu làm việc trong lĩnh vực giải trình tự thế hệ tiếp theo và bộ gen, thường xuyên làm việc với các trình tự có số lượng hàng triệu hoặc thậm chí hàng tỷ cơ sở. Để làm ví dụ về việc Python có thể hoạt động nhanh và hiệu quả như thế nào khi áp dụng cho các loại vấn đề này, chúng ta hãy lấy phần liền kề lớn nhất của bộ gen người, Nhiễm sắc thể 1 và sử dụng Python để tìm kiếm khoảng 250 triệu cơ sở của nó cho các trình tự khởi động gen tiềm năng.

Trình khởi động gen thường bao gồm các trình tự nhận biết tương đối bảo tồn được phân tách bằng trình tự đệm, thường có độ dài thay đổi. Ví dụ, nhiều promoter gen của vi khuẩn bao gồm hai trình tự nhận biết riêng biệt ngược dòng của gen được phiên mã như thế này

5' ----PPPPPP-------------------PPPPPP----GGGGGGGGGGG … 3'
       |                        |         |
      -35                     -10         start of gene

Trình tự đồng thuận cho trang web công nhận ở vị trí -10 là tataat trong khi trang web -35 có trình tự đồng thuận là ttgaca. Chúng ta có thể dễ dàng tạo một biểu thức chính quy Python để tìm kiếm bộ gen cho các vùng quảng bá đồng thuận như thế này

promoter = 'ttgaca...................tataat'

Điều này sẽ khớp với bất kỳ trình tự nào bao gồm chính xác hai vị trí nhận dạng đồng thuận được phân tách bằng một số cơ sở cố định [với bất kỳ cơ sở nào trong số 4 cơ sở được cho phép tại các vị trí đó]

Nhưng nếu khoảng cách giữa các chuỗi đồng thuận có độ dài thay đổi thì sao?

Hóa ra các biểu thức chính quy cũng cho chúng ta một cách đơn giản và mạnh mẽ để giải quyết tình huống này. Chúng tôi có thể tạo các mẫu tìm kiếm cho phép số lượng cơ sở khác nhau giữa các trang web nhận dạng như thế này

promoter = 'ttgaca.{15,25}tataat'

Dấu ngoặc nhọn sau dấu chấm được sử dụng để biểu thị sự lặp lại từ 15 đến 25 lần xuất hiện của ký tự trước dấu ngoặc - trong trường hợp này là dấu chấm phù hợp với bất kỳ cơ sở nào. Mẫu tìm kiếm này sẽ khớp với bất kỳ đoạn nào của bộ gen bao gồm hai vị trí nhận dạng đồng thuận, cách nhau từ 15 đến 25 cơ sở thuộc bất kỳ loại nào

Vì vậy, bây giờ chúng tôi có một mẫu trình khởi động gen để tìm kiếm, hãy sử dụng Python để tạo Nhiễm sắc thể 1 tổng hợp - đặc biệt vì đây chỉ là một bài kiểm tra hiệu suất tính toán và nó giúp chúng tôi tiết kiệm thời gian tìm tệp Nhiễm sắc thể 1 từ một người trực tuyến . Để tạo nhiễm sắc thể tổng hợp, chúng ta chỉ cần sử dụng một trong các phương thức trong mô-đun ngẫu nhiên của Python để tạo chuỗi ngẫu nhiên gồm 250 triệu cơ sở, như thế này

import random
bases = ['a', 't', 'c', 'g']
sequenceList = []
for n in range[0, 250000000]:
    sequenceList.append[random.choice[bases]]
chromosome = ‘’.join[sequenceList]

Quá trình này thực sự mất vài phút trên iMac của tôi - lâu hơn [rất nhiều] thời gian cần thiết để tìm kiếm nhiễm sắc thể tổng hợp này để tìm các trình tự khớp với mẫu trình tự thúc đẩy gen đồng thuận của chúng tôi, như chúng ta sẽ thấy trong một phút nữa

Vì vậy, đối với bài kiểm tra hiệu suất này, chúng ta sẽ cần sử dụng mô-đun thời gian của Python, đúng như tên gọi của nó, xử lý thời gian. Thời gian. time[] trả về số giây kể từ ngày và giờ cố định tùy ý được gọi trong tài liệu Python là bắt đầu kỷ nguyên. Tất cả điều này nghe có vẻ rất thời tiền sử và/hoặc ngày tận thế, nhưng bạn có thể ngạc nhiên khi biết rằng buổi bình minh vĩ đại này của lịch sử thực sự là ngày 1 tháng 1 năm 1970

Có thật không?

Điều này liên quan đến thực tế là phương pháp tiêu chuẩn để đếm thời gian trên máy tính đã được các kỹ sư của Unix xác định, đây là một trong những hệ điều hành máy tính thực sự đầu tiên và nó đã được hầu như tất cả các nền tảng máy tính khác kế thừa như một loại thực tế.

Và - vì chúng ta sẽ sử dụng các biểu thức chính quy của Python, nên chúng ta cũng sẽ cần nhập mô-đun re của Python, từ đó chúng ta sẽ sử dụng re. finditer[] để tìm kiếm các trình tự khởi đầu gen đồng thuận của chúng tôi. Thay vì chỉ trả về các chuỗi khớp, phương thức finditer[] trả về một bộ sưu tập các đối tượng MatchObject trong Python có thể lặp lại, cho phép phân tích kết quả tìm kiếm chi tiết hơn [ví dụ: vị trí bắt đầu và kết thúc của các chuỗi khớp cũng được ghi lại]

Khi chúng tôi kết hợp tất cả lại với nhau, mã để tìm kiếm Nhiễm sắc thể tổng hợp 1 của chúng tôi cho các trình tự thúc đẩy gen đồng thuận trông như thế này

import time, re
promoter = 'ttgaca.{15, 25}tataat' 
t1 = time.time[] 
result = re.finditer[promoter, chromosome] 
t2 = time.time[] 
print 'Search time was', [t2-t1], 'seconds'

Vì vậy, hãy chạy mã Python này và xem những gì chúng tôi nhận được

Search time was 0.00100994110107 seconds

Trên máy tính để bàn iMac khiêm tốn của tôi [khoảng năm 2014], Python chỉ mất khoảng một phần nghìn giây để tìm kiếm 250 triệu chuỗi cơ sở của Nhiễm sắc thể 1 cho mẫu trình khởi động gen đồng thuận này

Do đó, bằng phép ngoại suy, chúng ta có thể mong đợi rằng không bao gồm thời gian cần thiết để tải và đọc các tệp trình tự nhiễm sắc thể riêng lẻ của bộ gen người - sẽ chỉ mất khoảng 15 mili giây để tìm kiếm toàn bộ 3 tỷ cơ sở của mẫu trình tự khởi động gen này.

Nhân tiện - đề phòng trường hợp bạn thắc mắc liệu nó có nhanh không chỉ vì không có gì để tìm, hãy thêm một chút mã bổ sung để in ra chi tiết của các kết quả tìm thấy. Chúng tôi sẽ sử dụng dữ liệu được lưu trữ trong Python MatchObject để in điểm bắt đầu và điểm cuối của từng chuỗi khớp, cũng như chính chuỗi khớp đó [và để tiết kiệm dung lượng, chúng tôi sẽ chỉ hiển thị 3 kết quả khớp đầu tiên và 3 kết quả khớp cuối cùng ở đây - nhưng bạn nhận được . Cuối cùng, chúng tôi cũng sẽ in tổng số trình tự khởi động gen phù hợp đã được tìm thấy trong nhiễm sắc thể tổng hợp của chúng tôi

nmatches = 0 
for match in result:
     nmatches += 1     
     print match.start[], match.end[], match.group[] 
print 'Number of search hits = ', nmatches

Và khi chúng tôi bao gồm mã bổ sung này, chúng tôi nhận được điều này

1199566 1199603 ttgacactcacatcatcagagccccacatagtataat
2103278 2103308 ttgacacacacagggtttgtgatttataat
3702112 3702141 ttgacactctttcaaaccaggactataat
 … 
 …
245627316 245627350 ttgacaaggtctccgtggccccggctattataat
246256184 246256220 ttgacaggattcctctcgttaattacatcgtataat
248653641 248653674 ttgacaaccgggctcgtaacgtattagtataat
Number of search hits =  185

Vì vậy, có bạn có nó

Lần tới khi ai đó nói với bạn rằng Python quá chậm để tính toán nặng vì nó là ngôn ngữ thông dịch - chỉ cần lịch sự nói với họ rằng bạn đã nghe nói về một cây cầu ở bang New York được rao bán với giá hời

© 2018 Nhà sinh vật học kỹ thuật số

Khoa học máy tính, Sinh học kỹ thuật số nhà sinh học kỹ thuật số Ngày 2 tháng 7 năm 2018 Tin sinh học, sinh học điện toán, gen, di truyền học, bộ gen, giải trình tự thế hệ tiếp theo, trăn,

Chủ Đề