【问题标题】:Return values from a Python Entrez dictionary of dictionaries从 Python Entrez 字典返回值
【发布时间】:2014-12-09 03:18:20
【问题描述】:

我想从 Entrez Gene 页面中抓取 Interactions 表。

Interactions 表是从 Web 服务器填充的,当我尝试在 R 中使用 XML 包时,我可以获得 Entrez 基因页面,但 Interactions 表体是空的(它没有被 Web 服务器填充) .

在 R 中处理网络服务器问题可能是可以解决的(我很想看看如何解决),但 Biopython 似乎是一条更容易的路径。

我整理了以下内容,这给了我想要的示例基因:

# Pull the Entrez gene page for MAP1B using Biopython

from Bio import Entrez
Entrez.email = "jamayfie@vasci.umass.edu"
handle = Entrez.efetch(db="gene", id="4131", retmode="xml")
record = Entrez.read(handle)
handle.close()

PPI_Entrez = []
PPI_Sym = []

# Find the Dictionary that contains the Interaction table
    for x in range(1, len(record[0]["Entrezgene_comments"])):
   if ('Gene-commentary_heading', 'Interactions') in record[0]["Entrezgene_comments"][x].items():
       for y in range(0, len(record[0]["Entrezgene_comments"][x]['Gene-commentary_comment'])):
          EntrezID = record[0]["Entrezgene_comments"][x]['Gene-commentary_comment'][y]['Gene-commentary_comment'][1]['Gene-commentary_source'][0]['Other-source_src']['Dbtag']['Dbtag_tag']['Object-id']['Object-id_id']
          PPI_Entrez.append(EntrezID)
          Sym = record[0]["Entrezgene_comments"][x]['Gene-commentary_comment'][y]['Gene-commentary_comment'][1]['Gene-commentary_source'][0]['Other-source_anchor']
          PPI_Sym.append(Sym)

# Return the desired values: I want the Entrez ID and Gene symbol for each interacting protein
PPI_Entrez  # Returns the EntrezID
PPI_Sym  # Returns the gene symbol

这段代码有效,给了我想要的东西。但我认为它很难看,并且担心如果 Entrez 基因页面的格式稍有变化,它会破坏代码。特别是,必须有一种比指定完整路径更好的方法来提取所需信息,就像我所做的那样:

record[0]["Entrezgene_comments"][x]['Gene-commentary_comment'][y]['Gene-commentary_comment'][1]['Gene-commentary_source'][0]['Other-source_anchor']

但如果不指定要下降的每个级别,我无法弄清楚如何在字典中进行搜索。当我尝试 find() 之类的函数时,它们会在下一层运行,但不会一直运行到底部。

是否有通配符、Python 等效的“//”,或者我可以用来在不命名完整路径的情况下访问 ['Object-id_id'] 的函数?也感谢其他关于更简洁代码的建议。

【问题讨论】:

    标签: python xml r dictionary ncbi


    【解决方案1】:

    我不确定 Python 中的 xpath,但如果代码有效,那么我不会担心删除完整路径或 Entrez Gene XML 是否会改变。由于您第一次尝试 R,因此您可以使用下面对 Entrez Direct 的系统调用或像rentrez 这样的包来获取 XML。

    doc <- xmlParse( system("efetch -db=gene -id=4131 -format xml", intern=TRUE) )
    

    接下来,在http://www.ncbi.nlm.nih.gov/gene/4131#interactions处获取表中行对应的节点

    x <- getNodeSet(doc, "//Gene-commentary_heading[.='Interactions']/../Gene-commentary_comment/Gene-commentary" )
    
    length(x)
    [1] 64
    x[1]
    x[50]
    

    先尝试简单的东西

    xmlToDataFrame(x[1:4])
    
      Gene-commentary_type  Gene-commentary_text Gene-commentary_refs Gene-commentary_source                         Gene-commentary_comment
    1                   18   Affinity Capture-MS             24457600   BioGRID110304BioGRID   255BioGRID110304255GeneID8726EEDBioGRID114265
    2                   18 Reconstituted Complex             20195357   BioGRID110304BioGRID   255BioGRID110304255GeneID2353FOSBioGRID108636
    3                   18 Reconstituted Complex             20195357   BioGRID110304BioGRID 255BioGRID110304255GeneID1936EEF1DBioGRID108256
    4                   18   Affinity Capture-MS     2345592220562859   BioGRID110304BioGRID  255BioGRID110304255GeneID6789STK4BioGRID112665
      Gene-commentary_create-date Gene-commentary_update-date
    1                  2014461120                201410513330
    2                201312810490                201410513330
    3                201312810490                201410513330
    4                 20137710360                201410513330
    

    文本、参考文献、来源和日期等一些标签应该易于解析

    sapply(x, function(x) paste( xpathSApply(x, ".//PubMedId", xmlValue), collapse=", "))
    

    我不确定 cmets 或表中列出的产品、交互物和其他基因是如何存储在 XML 中的,但我在这里为每个节点获得了一个或三个符号和三个 id。

    sapply(x, function(x) paste( xpathSApply(x, ".//Gene-commentary_comment//Other-source_anchor", xmlValue), collapse=" + "))
    sapply(x, function(x) paste( xpathSApply(x, ".//Gene-commentary_comment//Object-id_id", xmlValue), collapse=" + "))
    

    最后,由于我认为 Entrez Gene 只是复制 IntAct 和 BioGrid,您也可以尝试这些网站。 Biogrid 有一个非常简单的 Rest 服务,但你必须注册一个密钥。

    url <- "http://webservice.thebiogrid.org/interactions?geneList=MAP1B&taxId=9606&includeHeader=TRUE&accesskey=[ your ACCESSKEY ]"
    
    biogrid <- read.delim(url)
     dim(biogrid)
    [1] 58 24
    
    head(biogrid[, c(8:9,12)])
      Official.Symbol.Interactor.A Official.Symbol.Interactor.B      Experimental.System
    1                       ANP32A                        MAP1B               Two-hybrid
    2                        MAP1B                       ANP32A               Two-hybrid
    3                       RASSF1                        MAP1B Affinity Capture-Western
    4                       RASSF1                        MAP1B               Two-hybrid
    5                       ANP32A                        MAP1B Affinity Capture-Western
    6                          GAN                        MAP1B Affinity Capture-Western
    

    【讨论】:

    • 谢谢克里斯!我曾计划用 Python 编写脚本,然后从 R 对其进行系统调用。但这要容易得多(至少对我来说)。我不知道 Entrez Direct,但它很好地解决了 Web 服务器问题,让我回到通过 Node 进行解析,而不是尝试深入研究 Python 字典。
    • 在开始这个项目之前我考虑过 BioGrid、HERD 等,但我喜欢 NCBI 将 IntAct 和 BioGrid 整理到一张表中,如果可能的话,我想从那里开始。
    • 我可以通过指定获取相互作用蛋白质的EntrezID: sapply(x, function(x) paste( xpathSApply(x, ".//Gene-commentary_comment//..//Dbtag_db[. ='GeneID']//..//Object-id_id", xmlValue), collapse=""))
    • Entrez Direct 或rentrez 包在您需要保存历史记录(esearch -> efetch)时很有用。如果你有 id,你也可以使用doc &lt;- xmlParse("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=gene&amp;id=4131&amp;retmode=xml)
    • 我忘记了代码中的结尾引号,无法再编辑评论。 doc &lt;- xmlParse("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=gene&amp;id=4131&amp;retmode=xml")。你也可以传递一个逗号分隔的 id 列表。
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 2018-08-05
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多