Моя цель - использовать Python и его библиотеку запросов для извлечения данных последовательности из озера данных C3.ai с помощью его API извлечения. Используя полученный JSON, я планирую использовать библиотеку pandas для создания фрейма данных, который хранит набор метаданных последовательностей из объектов BiologicalAsset вместе со столбцами для фактической последовательности, ее длины и ее полей sequenceType, которые поступают из объекта Sequence. Эти данные распечатываются и затем перемещаются в R для дальнейшего просмотра результатов. Однако у меня возникают проблемы с получением данных от C3.ai, и я не знаю, почему.
В приведенном ниже коде я указываю, что включаю биологический актив, а также дочерний объект последовательности, длину и тип последовательности. Все это работает правильно, потому что я получаю фрейм данных со всеми правильными столбцами после того, как сглаживаю JSON с помощью json_normalize()
. Я использую "filter": "sequence.length >= 28900",
, чтобы отфильтровать любые последовательности, которые слишком короткие, чтобы быть полным геномом. Проблема в том, что я получаю только 105 результатов, соответствующих этим критериям, и я знаю, что это неверно, потому что в центре данных NCBI Coronavirus есть почти 3000 последовательностей, которые он помечает как завершенные. Более того, фильтрация нуклеотидных последовательностей, имеющих допустимые последовательности в дочернем объекте, с использованием "filter": "assetType == 'nucleotide sequence' && exists(sequence.sequence)",
дает тот же результат. Использование "filter": "exists(sequence.sequence)",
показывает, что существует только 1314 последовательностей любого типа, включая последовательности белков, которые действительно имеют данные в их дочернем объекте последовательности. Выполнение тех же поисков с использованием API выборки последовательности "https://api.c3.ai/covid/api/1/sequence/fetch"
и соответствующих фильтров длины и существования дало мне те же числа.
Просматривая таблицу, которую я создал с помощью выборки последовательности, которую я сделал для извлечения всех возможных последовательностей без использования фильтра, я обнаружил, что сами объекты последовательности существуют, вероятно, для всех необходимых мне последовательностей, но что фактические поля последовательности сами отсутствуют. Это проблема с моим подходом или с Data Lake?
Спасибо за вашу помощь!
Ссылка на узел NCBI COVID 19
https://www.ncbi.nlm.nih.gov/labs/virus/vssi/# / virus? VirusLineage_ss = Тяжелый% 20acute% 20respiratory% 20syndrome% 20coronavirus% 202% 20 (SARS-CoV-2), % 20taxid: 2697049 & SeqType_s = Nucleotide & Completeness_s = complete
Код получения биологического актива
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
}
}