Правильно реализовать асинчо - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать браузер генома ensembl api для получения геномной информации.Проблема в том, что каждый сетевой запрос может занять несколько секунд, поэтому я пытался использовать asyncio для ожидания этих сетевых запросов при одновременной работе с имеющимися у меня данными.

Вот пример ввода данных DataFrameчто я использую:

import pandas as pd
df = pd.DataFrame({'Gene Name': {0: 'A1CF', 1: 'A1CF', 2: 'A1CF'},
 'Sample Name': {0: 'ATL045', 1: 'QC2-20-T2', 2: 'GHE0624'},
 'CDS Mutation': {0: 'c.234A>C', 1: 'c.492C>T', 2: 'c.490G>A'},
 'AA Mutation': {0: 'p.K78N', 1: 'p.V164V', 2: 'p.V164I'}})

Цель состоит в том, чтобы использовать Gene Name и CDS Mutation информацию из приведенного выше df, чтобы получить некоторую другую геномную информацию.

Этот первый методпредназначен для вызова метода ensembl_calls, который отправит сетевой запрос и вернет проанализированный вывод.В идеале этот анализируемый вывод объединяется во что-то вроде главного кадра данных панд.

async def concurrent_location_info(df):
    import pandas as pd
    import asyncio

    full_df = pd.DataFrame()

    # iterate through DataFrame
    dfs = [asyncio.ensure_future(ensembl_calls(row)) for index, row in df.iterrows()]

    print(dfs)

В этом методе я пытаюсь выполнить сетевые запросы и проанализировать информацию, которую я получаю.

# this makes the network ensembl call asynchronously
async def ensembl_calls(row):
    new_df = {}

    try: # sometimes ensembl can't find what i'm looking for
        # this can take a while
        await info = Ensembl(row['Gene Name'], row['CDS Mutation']).info().split(',')

        # parse the output
        new_df['Gene'] = row['Gene Name']
        new_df['Chrom'] = info[0]
        new_df['Start'] = info[1]
        new_df['End'] = info[2]
        new_df['WT'] = info[3]
        new_df['Var'] = info[4]
        new_df['Sift_Index'] = info[5]
    except:
        pass

    return new_df # ideally somehow gets added to a master pd dataframe

Я на правильном пути здесь?Есть ли способ заставить это работать?

1 Ответ

0 голосов
/ 25 февраля 2019

Попробуйте это:

import pandas as pd
import asyncio


async def concurrent_location_info(df):
    # iterate through DataFrame
    tasks = [ensembl_calls(row) for _, row in df.iterrows()]
    df = pd.concat(asyncio.gather(*tasks))
    print(df)

и измените вторую функцию следующим образом

info = await Ensembl(...)

Это предполагает, что Ensembl имеет асинхронный init метод, который являетсянеобычный образец.

...