Как правильно получить все последовательности геномов c коронавируса вместе с их метаданными с помощью озера данных C3.ai в Python? - PullRequest
1 голос
/ 27 мая 2020

Моя цель - использовать 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
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...