Aproximación a la Bioinformática con Python

En este notebook se presenta la manipulación de cadenas de texto que corresponden a 60 bases nitrogenadas del genoma de la Saccharomyces cerevisiae tomadas de la página https://www.ncbi.nlm.nih.gov/genbank/samplerecord/ como una motivación a la bioinformática.


In [1]:
secuencia_A="gatcctccatatacaacggtatctccacctcaggtttagatctcaacaacggaaccattg".upper()

In [2]:
secuencia_B="caggtttagatctcaacaacggaaccattggatcctccatatacaacggtatctccacct".upper() # secuencia_A partida en mitades

In [3]:
secuencia_C="ccgacatgagacagttaggtatcgtcgagagttacaagctaaaacgagcagtagtcagct".upper()

In [4]:
secuencia_D="tttactctcacatcctgtagtgattgacactgcaacagccaccatcactagaagaacaga".upper()

In [5]:
len(secuencia_A)


Out[5]:
60

In [6]:
print(secuencia_A.count("A"))
print(secuencia_A.count("G"))
print(secuencia_A.count("C"))
print(secuencia_A.count("T"))


18
9
18
15

In [7]:
for i in secuencia_A:
    print(i)


G
A
T
C
C
T
C
C
A
T
A
T
A
C
A
A
C
G
G
T
A
T
C
T
C
C
A
C
C
T
C
A
G
G
T
T
T
A
G
A
T
C
T
C
A
A
C
A
A
C
G
G
A
A
C
C
A
T
T
G

Secuencias complementarias

Construyamos una función que nos retorne la secuencia complementaria de otra secuencia. El argumento de esta función debe ser la secuencia original mientras que el valor de retorno es la secuencia complementaria deseada


In [9]:
def secuenciaComplementaria(secuencia_original):
    secuencia_complementaria=""
    for i in secuencia_original:
        if(i=="A"):
            secuencia_complementaria+="T"
        if(i=="T"):
            secuencia_complementaria+="A"
        if(i=="C"):
            secuencia_complementaria+="G"
        if(i=="G"):
            secuencia_complementaria+="C"
    return secuencia_complementaria

Probemos que la función arroje un resultado correcto


In [10]:
print(secuencia_A)
print(secuenciaComplementaria(secuencia_A))


GATCCTCCATATACAACGGTATCTCCACCTCAGGTTTAGATCTCAACAACGGAACCATTG
CTAGGAGGTATATGTTGCCATAGAGGTGGAGTCCAAATCTAGAGTTGTTGCCTTGGTAAC

Obteniendo secuencia de RNA

Podemos construir una función que nos retorne la transcripción de una secuencia de DNA dando como resultado una de RNA


In [11]:
def secuenciaRNA(secuencia_original):
    secuencia_rna=""
    for i in secuencia_original:
        if(i=="T"):
            secuencia_rna+="U"
        else:
            secuencia_rna+=i
    return secuencia_rna

Probemos nuestra función


In [12]:
print(secuencia_A))
print(secuenciaRNA(secuenciaComplementaria(secuencia_A)))


GAUCCUCCAUAUACAACGGUAUCUCCACCUCAGGUUUAGAUCUCAACAACGGAACCAUUG
CUAGGAGGUAUAUGUUGCCAUAGAGGUGGAGUCCAAAUCUAGAGUUGUUGCCUUGGUAAC

Manipulando secuencias

Comparemos si dos secuencias son iguales


In [13]:
if(secuencia_A==secuencia_B):
    print("Son secuencias iguales")
else:
    print("Son secuencias diferentes")


Son secuencias diferentes

Como ejercicio de programación, comprobemos que tanta información comparten dos secuencias en términos de cuantas A-G-T-C comparten entre sí.


In [175]:
''.join(sorted(secuencia_A)) # Este método permite ordenar una secuencia alfabéticamente


Out[175]:
'AAAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCCCCGGGGGGGGGTTTTTTTTTTTTTTT'

Construímos una función que compara dos secuencias ordenadas y nos dice en cuanto se parecen una a la otra en términos de porcentaje


In [15]:
def secuenciaSimilaridad(secuencia_primera,secuencia_segunda):
    porcentaje=0.0
    sec_P_org=''.join(sorted(secuencia_primera))
    sec_S_org=''.join(sorted(secuencia_segunda))
    for i in range(0,len(secuencia_primera)):
        if(sec_P_org[i]==sec_S_org[i]):
            porcentaje+=1.0
    return porcentaje/len(secuencia_primera)

In [16]:
secuenciaSimilaridad(secuencia_A,secuencia_B)


Out[16]:
1.0

In [55]:
secuenciaSimilaridad(secuencia_A,secuencia_C)


Out[55]:
0.85

In [187]:
secuenciaSimilaridad(secuencia_A,secuencia_D)


Out[187]:
0.9333333333333333

In [188]:
secuenciaSimilaridad(secuencia_C,secuencia_D)


Out[188]:
0.8833333333333333

In [186]:
secuenciaSimilaridad(secuencia_D,secuencia_D)


Out[186]:
1.0

Búsqueda de patrones en DNA

Se crea una función para buscar un patrón dentro de una cadena de texto. En este caso la cadena de texto consiste en una secuencia de ADN y el patrón es una secuencia de menor tamaño.


In [18]:
def secuenciaPatron(secuencia_original,secuencia_patron):
    status=0
    lugares=list()
    for i in range(0,len(secuencia_original)):
        for j in range(0,len(secuencia_patron)):
            if(i+j<len(secuencia_original)):
                if(secuencia_original[i+j]==secuencia_patron[j]):
                    status+=1
                    #print(i+j,j,status)
                else:
                    status=0
                    break
            if(status==len(secuencia_patron)):
                lugares.append(i)
    return lugares

In [19]:
secuenciaPatron(secuencia_A,"CAAC")


Out[19]:
[13, 43, 46]

In [20]:
secuenciaPatron(secuencia_B,"CAAC")


Out[20]:
[13, 16, 43]

In [21]:
secuenciaPatron(secuencia_C,"CAAC")


Out[21]:
[]

In [191]:
secuenciaPatron(secuencia_D,"CAAC")


Out[191]:
[32]