Создание ошибочного графика средней длины белка - PullRequest
0 голосов
/ 07 марта 2020

Я работаю с данными в расширении .fasta. В этом файле у вас есть данные в следующем формате.

>tr|A0A181ZH50|A0A181ZH50_HHV11 E3 ubiquitin-protein ligase ICP0 OS=Human herpesvirus 1 (strain 17) OX=10299 GN=ICP0_3 PE=4 SV=1 UPId=UP000272535 PPId=UP000009294
MHRFCIPCMKTWMQLRNTCPLCNAKLVYLIVGVTPSGSFSTIPIVNDPQTRMEAEEAVRA
GTAVDFIWTGNQRFAPRYLTLGGHTVRALSPTHPEPTTDEDDDDLDDGEAGGGEDPGGGG
GGGGGGEREE

Длина белка - это длина этих букв во второй части, в приведенном выше примере это MHRF C ...

У меня проблемы с получением сообщения об ошибке. Мне удалось сделать нормальный гистограмму средней длины белка для 9 организмов.

import os
from itertools import groupby
import re
import matplotlib.pyplot as plt


directory_in_str="C:\\Users\\rysza\\Desktop\\python data analysis"
directory = os.fsencode(directory_in_str)
#Parser to get parts of fasta file
def fasta_iter(fasta_name):
    f = open(fasta_name)
    faiter = (x[1] for x in groupby(f, lambda line: line[0] == ">"))

    for header in faiter:
            # drop the ">"
       headerStr = header.__next__()[1:].strip()
     # join all sequence lines to one.
       seq = "".join(s.strip() for s in faiter.__next__())

       yield (headerStr, seq)    
mylist=[]  
nameslist=[] 
listaminoacid=[]
odchyleniestd=[]
standarddeviation=[]
#getting average protein length
for filename in os.listdir(directory):
    filename=filename.decode("UTF8")
    if filename.endswith(".fasta"):
        fiter = fasta_iter(filename)
        suma=0
        number=0
        stddeviation=0
        count = {}

        for ff in fiter:
            headerStr, seq = ff

            suma+=len(seq)
            number=number+1
            for i in seq:
                if i in count:
                    count[i]+=1
                else:
                    count[i]=1
        nameslist.append(re.search('OS=(.*?) OX=', headerStr).group(1))  
        average=suma/number
        total = sum(count.values(), 0.0)
        count = {k: v / total for k, v in count.items()}
        mylist.append(average)
        listaminoacid.append(count)

#making plot       
fig, ax = plt.subplots()
width = 0.35
ax(nameslist, mylist, width, color='darkorchid')
for i, (name, height) in enumerate(zip(nameslist, mylist)):
    ax.text(i, height, ' ' + name, color='seashell',
            ha='center', va='top', rotation=-90, fontsize=8)
ax.set_ylabel('Average protein length')
ax.set_title('Average protein length by bacteria')
ax.set_xticks([]) # 

Теперь, чтобы сделать это ошибочным графиком, мне нужно было бы получить стандартное отклонение. Чтобы сделать это, я думал поставить

for ff in fiter:
    headerStr, seq = ff
    stddeviation+=(len(seq)-average)^2

после

listaminoacid.append(count) 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...