【发布时间】:2021-03-21 11:35:24
【问题描述】:
我还是个初学者,我的朋友(到目前为止还没有回答)为我提供了从 Ensembl.org 下载基因组序列并使用字典将其写入 *.csv 文件的代码。不幸的是,该文件仅包含一列和 89870 行,我不知道如何修复它。它会减轻我的计数工作,因为它在绘制绘图时表现得很奇怪。我不知道哪里可能是错误的。代码如下:
from Bio.SeqIO.FastaIO import FastaIterator
record_ids = []
records = []
with open("equus_cds.fa") as handle:
for record in FastaIterator(handle):
record_ids.append(record.id)
records.append(record)
data_cds = {}
for record in records:
data_cds[record.id] = {'A': 0, 'G': 0, 'C': 0, 'T': 0, 'N': 0}
for letter in str(record.seq):
data_cds[record.id][letter] += 1
import csv
with open('data_cds.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter = "\t")
writer.writerow(['ID', 'A', 'G', 'C', 'T', 'N'])
for key, values in data_cds.items():
writer.writerow([key, values['A'], values['G'], values['C'], values['T'], values['N']])
with open ("data_cds.csv") as file:
print (file.readline())
for lines in file.readlines():
print(lines)
输出显示了一个滚动的目录,但它有点偏移:
ID A G C T N
ENSECAT00000046986.1 67 64 83 71 0
ENSECAT00000031957.1 81 83 75 85 0
等等。等等,想象一下超过 8 万行。 然后我想计算所有“N”的总和(它并不总是零),我不知道如何用这种格式来做...... 提前致谢!
编辑:我从这里下载了序列:http://ftp.ensembl.org/pub/release-103/fasta/equus_caballus/cds/,解压缩:
handle = gzip.open('file1.fa.gz')
with open('equus_cds.fa', 'wb') as out:
for line in handle:
out.write(line)
然后我发布的代码如下。 *.csv 文件始终包含特定基因的名称(ID - ENSECAT000... 等),然后是氮碱基(A、T、G、C)和未知碱基(N)。然后,整个文件有 8k 行,但只有一列,我希望将其正确分开(如果可能,每个碱基到一列),因为这样更容易计算整个文件中有多少碱基(如何很多 Ns 要具体)。 我想知道这一点的原因是当我制作一个图时,我正在比较两个序列,cds(编码序列)和 cDNA(互补 DNA),在减去 N 后,图的行为很奇怪,cds 变得比 cDNA 大,那就是废话。这是情节的代码:
data1 = pd.read_csv ("data_cds.csv", delimiter="\t")
data1['x'] = (data1['G'] + data1['C'] - data1['N']) / (data1['A'] + data1['G'] + data1['C'] + data1['T'] - data1['N'])
data1['x'].plot.hist(bins=2000)
plt.xlim([0, 1])
plt.xlabel("cds GC percentage")
plt.title("Equus caballus", style="italic")
我正在为我的论文分析哺乳动物,我并没有在每个物种中都遇到这个问题,但这仍然足够了。我希望我的问题现在更容易理解了。
编辑 2:
我要么数学很差,要么在这里太晚了,要么文件表现得很奇怪......为什么N个碱基的总和不同?
df['N'].sum()
3504.0
df['cds_wo_N'] = df["A"]+df["G"]+df["C"]+df["T"]-df["N"]
df['cds_wo_N'].sum()
88748562.0
df['cds_w_N'] = df["A"]+df["G"]+df["C"]+df["T"]+df["N"]
df['cds_w_N'].sum()
88755570.0
df['N_subt'] = df['cds_w_N']-df['cds_wo_N']
df['N_subt'].sum()
7008.0
【问题讨论】:
-
您正在创建一个制表符分隔的输出文件(不是逗号分隔的),这是您想要的吗?如果没有,删除
delimiter = "\t" -
我试图更具体,希望现在更清楚。
标签: python pandas csv bioinformatics biopython