[PYTHON] Créer une bibliothèque de mutations de séquences protéiques avec des pandas

introduction

Objectif

En étudiant la corrélation séquence-fonction des protéines Une séquence mutante dans laquelle une mutation arbitraire d'acide aminé est appliquée à un site arbitraire pour une certaine séquence protéique Je l'ai créé parce que je voulais le générer facilement. Cela sert également de pratique pour python, donc je vous serais reconnaissant si vous pouviez m'apprendre d'autres méthodes ou de meilleures méthodes.

GitHub https://github.com/kyo46n/Mutant-Library-Generator

Environnement d'exécution

jupyter notebook python 3.7.4 (Anaconda) pandas 0.25.3 biopython 1.74

Contenu

importer

En supposant que vous ayez la séquence de protéine parente dans un fichier fasta Utilisez biopython pour lire et écrire des fichiers.


from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
import pandas as pd

Définition des fonctions

Lire le nom de la séquence (id) et la séquence (seq) du fichier fasta dans le type dictionnaire, Après avoir converti la partie seq en un DataFrame avec un caractère et une chaîne, insérez la colonne de nom de séquence comme nom à l'extrémité gauche. Si elle est laissée telle quelle, la séquence d'acides aminés commencera à 0 et la position du site s'écartera de l'intuition. 1 Corrigez l'index de colonne au début.

#fasta to dataframe
def fd(p):
    d = {rec.id : list(str(rec.seq)) for rec in SeqIO.parse(p, "fasta")}
    df = pd.DataFrame(d.values())
    for i in d.keys():
        name = i
    df.insert(0, 'name', name)
    df.iat[0, 0] = name
    plus_one = {}
    j = 1
    for i in range(len(df.columns)+1):
        plus_one[i] = j
        j = j+1
    df = df.rename(columns=plus_one)
    return df

En fonction du calcul de base Avec sdm () qui convertit un site spécifique en un acide aminé spécifique Créez ssm () qui convertit un site spécifique en tous les acides aminés.

#for calculation of site directed mutagenesis
def sdm(df, site, mut):
    df_mut = df.copy()
    df_mut.iat[0, 0] = df_mut.iat[0,0] + "_" + df_mut.iat[0,site] + str(site) + mut
    df_mut.iat[0,site] = mut
    return df_mut

#for calculation of site saturation mutagenesis
def ssm(df, site):
    aa_list = ['R', 'H', 'K', 'D', 'E', 'S', 'T', 'N', 'Q', 'C', 'G', 'P', 'A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W']
    df_mut = df.copy()
    for i in range(20):
        df_mut = df_mut.append(df.iloc[0])
    j = 1
    for i in aa_list:
        df_mut.iat[j, 0] = df_mut.iat[0,0] + "_" + df_mut.iat[0,site] + str(site) + i
        df_mut.iat[j,site] = i
        j = j + 1
    df_mut.reset_index(drop=True,inplace=True)
    return df_mut

Créez isdm () et issm () afin que plusieurs variantes puissent être générées ensemble. Ces deux fonctions génèrent une séquence avec une mutation à n'importe quel endroit dans une ligne séparée.

#individual site directed mutagenesis
def isdm(df, site_list, mut_list):
    mylist = []
    j = 0
    for i in site_list:
        mylist.insert(j, sdm(df, i, mut_list[j]))
        j = j+1
    df = pd.concat(mylist)
    df = df.drop_duplicates(subset='name')
    df.reset_index(drop=True,inplace=True)
    return df

#individual site site saturation mutagenesis
def issm(df, site_list):
    mylist = []
    j = 0
    for i in site_list:
        mylist.insert(j, ssm(df,i))
        j = j+1
    df = pd.concat(mylist)
    df = df.drop_duplicates(subset='name')
    df.reset_index(drop=True,inplace=True)
    return df

Créez ssdm () pour générer une séquence avec des mutations à plusieurs endroits en même temps.

#simultaneous site directed mutagenesis
def ssdm(df, site_list, mut_list):
    j = 0
    for i in site_list:
        df = sdm(df, i, mut_list[j])
        j = j+1
    return df

Créez sssm () pour générer toutes les combinaisons de plusieurs mutations de saturation.

#simultaneous site saturation mutagenesis
def sssm(df, site_list):
    for x in range(len(site_list)):
        df_mut = df.copy()
        templist = []
        j = 0
        for i in range(len(df_mut)):
            dftemp = ssm(df_mut[i:i+1], site_list[x])
            templist.insert(j, dftemp)
            j = j + 1
        df = pd.concat(templist)
        df = df.drop_duplicates(subset='name')
        df.reset_index(drop=True,inplace=True)
    return df

Exemple d'exécution

Input.txt (format fasta, id: seq1 seq: MTIKE) est préparé en tant qu'échantillon de séquence parent. Lis.

#read fasta
file = "input.txt"
df_wt = fd(file)
df_wt

image.png

Si vous souhaitez générer une variante de plusieurs sites ↓

site_list = [2,4,5]
mut_list = ["L","A","R"]
df_isdm = isdm(df_wt, site_list, mut_list)
df_isdm

image.png

Si vous souhaitez générer des variantes saturées sur plusieurs sites ↓ (Par exemple, variantes saturées du 2e au 5e)

site_list = range(2,6)
df_issm = issm(df_wt, site_list)
df_issm

image.png

Si vous souhaitez générer une séquence avec des mutations sur plusieurs sites ↓

site_list = [2,4,5]
mut_list = ["L","A","R"]
df_ssdm = ssdm(df_wt, site_list, mut_list)
df_ssdm

image.png

Si vous souhaitez générer une combinaison de variantes saturées sur plusieurs sites ↓

site_list = [2,3]
df_sssm = sssm(df_wt, site_list)
df_sssm

image.png

Rejoindre et supprimer les doublons

Puisqu'il est difficile à utiliser dans la recherche s'il reste un caractère et une chaîne, combinez-le dans un format de tableau et supprimez le même tableau.

df = df_sssm.copy()
df.insert(1, 'sequence', "-")
df.loc[:,'sequence'] = df[1].str.cat(df[range(2,len(df.columns)-1)])
df_seq = df.iloc[:,0:2]
df_seq = df_seq.drop_duplicates(subset='sequence')
df_seq.reset_index(drop=True,inplace=True)
df_seq

image.png

exportation

Exporter respectivement vers csv et fasta.

df_seq.to_csv("output.csv")

with open("output.txt", "w") as handle: 
    for i in range(len(df_seq.index)):
        seq = Seq(df_seq.iloc[i,1])
        rec = SeqRecord(seq, description="")
        rec.id = df_seq.iloc[i,0]
        SeqIO.write(rec, handle, "fasta")

en conclusion

Je pense qu'il y a beaucoup de gaspillage dans la façon de créer des fonctions et autour des déclarations, mais pour le moment, je peux obtenir le résultat que je veux.

Tâches futures

--Mutation unique mélangée et mutation saturée (si "X", exécuter une mutation saturée)

Recommended Posts

Créer une bibliothèque de mutations de séquences protéiques avec des pandas
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un lecteur CSV avec Flask
Créer un conteneur DI avec Python
Créez un Dataframe pandas à partir d'une chaîne.
Créer un fichier binaire en Python
Créer une chaîne aléatoire en Python
Créer un bot LINE avec Django
Créer une application Python-GUI dans Docker (PySimpleGUI)
[GPS] Créer un fichier kml avec Python
Créer un bloc de données à partir d'Excel à l'aide de pandas
Flask-Créer un service Web avec SQLAlchemy + PostgreSQL
Créez un environnement de test Vim + Python en 1 minute
Créer un fichier GIF en utilisant Pillow en Python
Créer un fichier qui peut être exécuté dans le langage de script
Je veux créer une fenêtre avec Python
Créer un graphique de distribution normale standard en Python
Comment créer un fichier JSON en Python
Créer un environnement virtuel avec conda avec Python
Créer un modèle d'investissement dynamique simple en Python
Extraire des lignes contenant une "chaîne" spécifique avec Pandas
Créer une nouvelle page en confluence avec Python
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
Créer un package contenant des commandes globales en Python
Comment créer une API Rest dans Django
Jusqu'à ce que vous créiez une nouvelle application dans Django
Créez un fichier MIDI en Python en utilisant pretty_midi
Créer un modèle d'antenne cadre en Python dans KiCad
[Docker] Créez un environnement jupyterLab (python) en 3 minutes!
dlopen () ltrace un appel de fonction dans une bibliothèque partagée
Créer un bot de collecte de données en Python à l'aide de Selenium
[API LINE Messaging] Créez un menu riche avec Python
Créer un plugin pour exécuter Python Doctest sur Vim (2)
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
Créer un serveur Web en langage Go (net / http) (1)
Créez un faux serveur Minecraft en Python avec Quarry
Publier / télécharger une bibliothèque créée en Python vers PyPI
Créez un arbre de décision à partir de zéro avec Python et comprenez-le (3. Bibliothèque d'analyse de données édition Pandas)