Я работаю с данными в расширении .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)
строки, но это не работает, как если бы я мог только один раз сделать эту итерацию. Если кто-то может помочь, это было бы здорово.