最近做数据预处理,需要将两个本体数据集处理成字典,简单记录下遇到的坑
1.obo本体
[Term]
id: OBT:000591
name: PCE contaminated site
synonym: "perchloroethylene contaminated site" EXACT []
synonym: "tetrachloroethene contaminated site" EXACT []
is_a: OBT:000524 ! site contaminated with organic compound
数据格式大概是这样,总共1w多行,一个term记录了本体的id、name、同义词、继承关系,这个本体处理比较方便,用Python读取每行,遇到[term]就将后面的键和值存起来
def parse_lines(lines):
for line in lines:
i = line.find('!')
if i == 0:
line = line[0:i]
line = line.strip()
if line:
yield line
def read_stanzas(lines):
def unescape(str):
return str.strip()
single_valued = set(['synonym'])
stanza = defaultdict(list)
stanza['@type'] = 'Header'
for line in lines:
if line.startswith('['):
yield stanza
stanza = defaultdict(list)
else:
k, v = line.split(':', 1)
key = unescape(k)
val = unescape(v)
if key in single_valued:
stanza[key].append(val)
else:
stanza[key] = val
yield stanza
2.NBCI_Taxonomy
这个数据集有六七个文件,最多的一个200多w行,每行大概长这样
2 | 131567 | superkingdom | | 0 | 0 | 11 | 0 | 0 | 0 | 0 | 0 | |
通过'\t|\t'进行分割,在用Python时,感觉pandas对DataFrame的列进行字符串处理不方便。于是转用R,发现方便很多,推荐dplyr包,读取速度很快,'\t|\t'都不用自己写,读完就分割好了。
然后进行多表链接,最后想把数据写进mysql,先是用RMySQL,建立连接成功,但是自己的DataFrame就是写不进去,提示sql语法问题。转用Python 的mysql-python包,安装失败,按着网上的方法试了很多次,卒。
最后还是回到R, 用RODBC搞定,就是觉得写入速度太慢,200w行数据写了半个多小时才写了一半,希望以后找到更好的替代方法。