json - 如何在 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 中心
生物资产获取代码
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
}
}
解决方案
推荐阅读
- sql - 计算多列中某个值的出现次数 - postgres
- java - Mockito 验证对模拟对象的最后一次调用
- docker - 构建时的 Docker 代理日志记录 url
- fiware-orion - NGSI 代理线云
- svg - SVG 元素的可点击超链接
- azure - 使用 Azure 数据工厂从私有 s3 实现复制数据
- javascript - 如何使用javascript获取激活的标签名称
- python - 为最小项目重命名应用程序
- java - 如何将具有复合键的键值结构映射到Java中的json对象
- google-app-engine - 如何在谷歌云平台上创建聊天(websocket)服务器