首页 > 解决方案 > 如何在 Python 中使用 C3.ai Data Lake 正确获取所有基因组冠状病毒序列及其元数据?

问题描述

我的目标是使用 Python 及其请求库,使用它的 fetch API 从 C3.ai 数据湖中提取序列数据。使用生成的 JSON,我计划使用 pandas 库来创建一个数据框,该数据框存储来自 BiologicalAsset 对象的一堆序列元数据,以及实际序列的列、长度和序列类型字段,这些字段来自序列对象。打印此数据,然后将其移至 R 以进一步查看结果。但是,我无法从 C3.ai 获取我想要的数据,我不知道为什么。

在下面的代码中,我指定包括生物资产以及序列子对象、长度和序列类型。这一切都正常工作,因为在我用json_normalize(). 我使用"filter": "sequence.length >= 28900",过滤掉任何太短而不能成为完整基因组的序列。问题是我只得到了 105 个符合这个标准的结果,我知道这是错误的,因为 NCBI 冠状病毒数据中心有近 3000 个序列被标记为完整。此外,过滤在子对象中具有有效序列的核苷酸序列使用"filter": "assetType == 'nucleotide sequence' && exists(sequence.sequence)",产生相同的结果。使用"filter": "exists(sequence.sequence)",显示只有 1314 个任何类型的序列,包括蛋白质序列,实​​际上在其子序列对象中具有数据。使用序列获取 API"https://api.c3.ai/covid/api/1/sequence/fetch"和适当的长度和存在过滤器运行这些相同的搜索给了我相同的数字。

浏览我使用序列获取创建的表,以不使用过滤器检索所有可能的序列,我发现序列对象本身可能存在于我需要的所有序列中,但实际序列字段本身缺失。这是我的方法还是数据湖的问题?

谢谢你的帮助!

链接到 NCBI COVID 19 中心

https://www.ncbi.nlm.nih.gov/labs/virus/vssi/#/virus?VirusLineage_ss=Severe%20acute%20respiratory%20syndrome%20coronavirus%202%20(SARS-CoV-2),%20taxid: 2697049&SeqType_s=核苷酸&Completeness_s=完整

生物资产获取代码

import requests
import pandas

def retrieve_data():
    has_more = True
    data = pandas.DataFrame
    url = "https://api.c3.ai/covid/api/1/biologicalasset/fetch"


    jsonRequest =   {
    "spec": {
        "include": "this, sequence.sequence, sequence.length, sequence.sequenceType",
        "filter": "sequence.length >= 28900", 
       "limit": -1
    }
  }


    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    }

    response = requests.post(url=url, json=jsonRequest, headers=headers)

    result = response.json()
    print(result["hasMore"], type(result["hasMore"]))  # checks if any left over sequences
    flatDict = pandas.json_normalize(result["objs"])  # flattens JSON
    return flatDict

print(retrieve_data())  # runs function
print(retrieve_data().columns)  # prints column names


序列获取 JSON 并注释掉可能的过滤器。

jsonRequest = {
        "spec": {
            #"include": "this, parent",
            #"filter": "sequenceType == 'GenBank' && length > 28900",
            #"filter": "sequenceType == 'complete'",
            #"filter": "exists(sequence)",
            #"filter": "length > 28900",


            "limit": -1
        }
    }

标签: jsonpython-requestsc3ai-datalake

解决方案


推荐阅读