Как стать автором
Обновить

Python для биологов

Время на прочтение 8 мин
Количество просмотров 11K

Каждый, кто слышит словосочетание "язык программирования", наверняка представляет себе код или скрипт, который выполняет строгий порядок действий для решения сложной технической задачи. Если спросить прохожего, для каких целей используются языки программирования, первое, что придет ему на ум - разработка, а любой гуманитарий скажет, что это скучно и совершенно не интересно. Однако, мне хотелось бы развеять эти стереотипы. Учитывая современные тенденции роста научно-технического прогресса, важно отметить, что программирование перестало быть чисто "техническим" инструментом.

Сегодня программирование позволяет не только создавать алгоритмы для управления техникой, но и делать научные открытия, например в биологии. Оно позволяет понять, как устроена биоинженерная машина внутри наших клеток, какие функции выполняет каждый отдельно взятый ген, какие гены ответственны за наши болезни, как вирусы и бактерии влияют на нас на молекулярном уровне, как создать новый фармацевтический препарат и множество других вопросов.

Языков программирования в современном мире довольно много. Однако, для аналитических и научных задач самым распространенным является Python. Я думаю, что сейчас каждый хотя бы примерно представляет, что такое Python. Поэтому, я не буду останавливаться здесь подробно на его определении, скажу лишь следующее.

Python - высокоуровневый язык программирования, который широко применяется в самых разных сферах деятельности: в разработке, в тестировании, в администрировании, в анализе данных, в моделировании, а также в науке. Широкое распространение он получил не только, благодаря своей простоте и лаконичности, но и в силу своей модульности, возможности интегрироваться с другими языками программирования и наличия большого количества пакетов для анализа больших данных и научных расчетов.

Давайте посмотрим теперь, какие задачи биологии Python способен решить.

Простые манипуляции с данными

В биологии используются самые разные типы данных: строки, числа, таблицы и комплексные объекты.

Известно, что основными элементами биологических исследований являются белки, гены и ДНК. Все они представляют из себя последовательности. Например, белок - это композиция из "строительных" молекул, которые называются аминокислотами. А ДНК (или гены) - композиция из "строительных" молекул, которые называются нуклеотидами. Вот так могут выглядеть последовательности: CAGGATGTATATATCTGACACGT (ДНК), MFVFLVLLPLVSSQCVNLTTRTQLPPAYT (белок). Таким образом, биологические последовательности можно представить в виде строки.

Помимо этого, биологи часто анализируют количественные показатели, такие как экспрессия (активность) гена, силы взаимодействия и другие. Они соответсвенно представлены в виде чисел, а также табличных данных. Например, можно измерить экспрессию одного и того же гена в разных клетках для того, чтобы оценить различия между этими клетками. В результате мы будем иметь числовую таблицу для анализа.

Также не редко есть необходимость создавать более сложные типы данных, описывать их уникальные свойства и методы, что можно реализовать самостоятельно, благодаря объектно-ориентированности Python.

Очевидно, все манипуляции с данными здесь просты и понятны.

Задача 1. Допустим у вас имеется последовательность кодирующей цепочки ДНК caggatgtatatatctgacacgttaacctggagactagggagtaatccccaattggcggttaaaacgc. Чтобы найти последовательность РНК, которая образуется в результате транскрипции, можно использовать следующий код:

convertion_dict={
    'A' : 'U',
    'T' : 'A',
    'G' : 'C',
    'C' : 'G'
}
dna_seq='acggatgtatatatctgacacgttaacctggagactagggagtaatccccaattggcggttaaaacgc'
rna_string=''
for letter in dna_seq:  
  rna_string = rna_string + convertion_dict[letter.upper()]
print(rna_string)

#UGCCUACAUAUAUAGACUGUGCAAUUGGACCUCUGAUCCCUCAUUAGGGGUUAACCGCCAAUUUUGCG

Хранение данных

Важной задачей в биологии и науке является хранение данных. Вообще говоря, здесь используется далеко не только Python. Сами базы данных, которые хранят в себе нуклеотидные или аминокислотные последовательности, молекулярные структуры, мутации, библиографию научных публикаций, могут быть реализованы иными инструментами. Однако для манипуляции с данными, полученными из перечисленных баз данных, намного проще использовать готовые инструменты. Так, библиотека Biopython содержит в себе комплекс утилит, которые позволяют работать с биоинформатическими форматами записей и базами данных.

Более подробный туториал по Biopython я опишу позже. А пока, рассмотрим на примере некоторых прикладных задач.

Задача 2. Например, вам необходимо получить белковую последовательность, которая получится в результате синтеза исследуемого гена. Тогда можно воспользоваться модулем Seq:

from Bio.Seq import Seq
my_seq = Seq("AGTACACTGGT")
print(my_seq) #Seq('AGTACACTGGT')
print(my_seq.translate()) #Seq('STL')

Модуль так же позволяет получить комплементарную цепь, обратно комплементарную цепь, транскрипцию в РНК и обратную транскрипцию в РНК.

Задача 3. Другим примером может быть задача получения доступа к базе данных NCBI. Для этого используется модуль Entrez. Допустим, вы хотите получить всю информацию из белковой базы данных, которая находится здесь (поверхностный гликопротеин коронавируса).

from Bio import SeqIO, Entrez
Entrez.email = "A.N.Other@example.com"
handle = Entrez.efetch(db="protein", id="YP_009724390", rettype="gb", retmode="text")
for s in SeqIO.parse(handle, 'gb'):
  print(s)

# ID: YP_009724390.1
# Name: YP_009724390
# Description: surface glycoprotein [Severe acute respiratory syndrome coronavirus 2]
# Database cross-references: BioProject:PRJNA485481
# Number of features: 18
# /topology=linear
# /data_file_division=VRL
# /date=18-JUL-2020
# /accessions=['YP_009724390']
# /sequence_version=1
# /db_source=REFSEQ: accession NC_045512.2
# /keywords=['RefSeq']
# /source=Severe acute respiratory syndrome coronavirus 2 (SARS-CoV-2)
# /organism=Severe acute respiratory syndrome coronavirus 2
# /taxonomy=['Viruses', 'Riboviria', 'Orthornavirae', 'Pisuviricota', 'Pisoniviricetes', 'Nidovirales', 'Cornidovirineae', 'Coronaviridae', 'Orthocoronavirinae', 'Betacoronavirus', 'Sarbecovirus']
# /references=[Reference(title='A new coronavirus associated with human respiratory disease in China', ...), Reference(title='Direct Submission', ...), Reference(title='Direct Submission', ...)]
# /comment=PROVISIONAL REFSEQ: This record has not yet been subject to final
# NCBI review. The reference sequence is identical to QHD43416.
# Annotation was added using homology to SARSr-CoV NC_004718.3. ###
# Formerly called 'Wuhan seafood market pneumonia virus.' If you have
# questions or suggestions, please email us at info@ncbi.nlm.nih.gov
# and include the accession number NC_045512.### Protein structures
# can be found at
# https://www.ncbi.nlm.nih.gov/structure/?term=sars-cov-2.### Find
# all other Severe acute respiratory syndrome coronavirus 2
# (SARS-CoV-2) sequences at
# https://www.ncbi.nlm.nih.gov/genbank/sars-cov-2-seqs/
# COMPLETENESS: full length.
# Method: conceptual translation.
# /structured_comment=OrderedDict([('Assembly-Data', OrderedDict([('Assembly Method', 'Megahit v. V1.1.3'), ('Sequencing Technology', 'Illumina')]))])
# /molecule_type=protein
# Seq('MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDL...HYT')

Причем, s является таким объектом, что к каждой единице информации можно получить доступ. Например,

handle = Entrez.efetch(db="protein", id="YP_009724390", rettype="gb", retmode="text")
for s in SeqIO.parse(handle, 'gb'):
  print(s.id)
  print(s.description)

#YP_009724390.1
#surface glycoprotein [Severe acute respiratory syndrome coronavirus 2]

Визуализация данных

Визуализацию данных в биологии можно разделить на 2 типа: визуализация аналитических данных и визуализация структур.

Банальным примером аналитической визуализации может быть изучение статистических данных. Биологи строят линейные и нелинейные функции, гистограммы, бокс-плоты, теплокарты и многое другое.

Задача 4. Допустим у вас есть информация о количестве водородных связей между изучаемым пептидом и формамидом и внутри структуры самого пептида в зависимости от времени. Для того, чтобы визуально оценить временные интервалы, в которых количество водородных связей падало или возрастало, можно построить график:

Количество водородных связей между пептидом и формамидом и в структуре самого пептида
Количество водородных связей между пептидом и формамидом и в структуре самого пептида

Здесь синим цветом показано количество связей внутри самого пептида. Видно, что количество водородных связей в нем в целом стабильно. Зеленый график отражает количество связей между пептидом и формамидом. Он менее стабильный. Можно заметить, что приблизительно с момента времени t= 2500 количество водородных связей между пептидом и формамидом возрастает, при этом, если присмотреться, количество водородных связей внутри пептида немного сокращается. Из чего можно сделать вывод о наблюдаемой обратной корреляции между количеством водородных связей между пептидом и формамидом и количеством водородных связей внутри самого пептида. Иными словами, биолог получает следующий вывод: плавление пептида происходит благодаря появившимся водородным связям.

Задача 5. Более интересная визуализация получается тогда, когда биологи работают со структурами молекул. Для этого в Python существуют специальные библиотеки, например nglview. Рассмотрим простой пример:

import nglview as nv

!wget https://files.rcsb.org/view/2rh1.pdb # ссылка для скачивания pdb-структуры

view = nv.show_structure_file('2rh1.pdb')
view
Визуализация структуры 2rh1
Визуализация структуры 2rh1

Причем, структуру в виджете можно поворачивать и перемещать с помощью мышки. При наведении на структуру появляется интерактивное описание объекта, на который указывает мышь. Если нажать на какой-нибудь объект структуры, то он перестанет быть интерактивным, а в левом верхнем углу появится его описание.

Анализ больших данных

Немаленькую роль в биологии занимает и анализ данных и машинное обучение. Примером служит хорошо известная нейросеть AlphaFold, которая предсказывает пространственную структуру белка. Это программа разработана компанией Google DeepMind на базе искусственного интеллекта. Ее точность достигла 95% RMSD, а частота ошибок в 2 раза ниже, по сравнению с другими методами:

Точность AlphaFold CASP14 по сравнению с другими методами.
Точность AlphaFold CASP14 по сравнению с другими методами.

Помимо нейросетей, биологи используют и классическое обучение для более простых задач.

Молекулярное моделирование

В отдельный раздел стоит выделить молекулярное моделирование. Оно включает в себя комплекс подходов для исследования пространственной структуры и свойств молекул вычислительными методами. Чтобы интерпретировать результаты молекулярного моделирования, их необходимо визуализировать. Python позволяет реализовывать и такие задачи. Например, библиотека MDAnalysis позволяет анализировать траектории из моделирования молекулярной динамики. Она позволяет считывать траектории каждой частицы молекулы и получать атомные координаты.

Задача 6. MDAnalysis поддерживает множество популярных форматов. Мы рассмотрим на простом примере PDB-структуры:

import nglview as nv
import MDAnalysis as mda

!wget https://files.rcsb.org/view/2rh1.pdb # ссылка для скачивания pdb-структуры

s=mda.Universe("2rh1.pdb")
prot=s.select_atoms('protein and resid 29:342')
lig = s.atoms.select_atoms('resname CAU')
prot.write("2rh1_prot.pdb")
lig.write("2rh1_ligand.pdb")
view = nv.show_structure_file('2rh1_ligand.pdb')
view

Структура 2rh1 состоит из двух компонент: человеческий B2-adrenergic рецептор (один из подтипов адренорецепторов) и лиганд CAU. С помощью команды select_atoms вытаскиваем сначала рецептор, а затем лиганд CAU. Записываем в файл и визуализируем лиганд с помощью библиотеки nglview:

Структура лиганда CAU
Структура лиганда CAU

С помощью MDAanalysis можно настраивать визуализацию структуры таким образом, чтобы удобно было оценить сперва незаметные глазу детали. Например, можно выделять интересующие нас атомы другим цветом, менять представление отдельной структуры или всего комплекса, оценивать расстояния между атомами и другие полезные штуки.

Заключение

В заключение хочется отметить, что разнообразие инструментов для анализа биологических данных в Python достаточно обширно. Конечно, перечисленные технологии и задачи на этом не заканчиваются. Есть еще очень много разнообразных примеров. Но я надеюсь, что моя статья достаточно убедительно демонстрирует актуальность Python и других средств программирования в биологии и науке в целом.

Спасибо, что дочитали статью доконца! Надеюсь, что она окажется для вас полезной :)

Теги:
Хабы:
+18
Комментарии 6
Комментарии Комментарии 6

Публикации

Истории

Работа

Python разработчик
136 вакансий
Data Scientist
66 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн