XLRD/ Entrez: поиск в Pubmed и извлечение счетчиков

Я работаю над проектом, который требует от меня поиска pubmed с использованием входных данных из электронной таблицы Excel и вывода подсчета результатов. Я использовал xlrd и entrez для выполнения этой работы. Вот что я пробовал.

  1. Мне нужно выполнить поиск по pubmed, используя имя автора, его/ее медицинскую школу, диапазон лет и имя его/ее наставника, которые все находятся в электронной таблице Excel. Я использовал xlrd, чтобы превратить каждый столбец с необходимой информацией в списки строк.

    from xlrd import open_workbook
    book = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0)
    med_name = []
    for row in sheet.col(2):
        med_name.append(row)
    med_school = []
    for row in sheet.col(3):
        med_school.append(row)
    mentor = []
    for row in sheet.col(9):
        mentor.append(row)
    
  2. Мне удалось распечатать количество моих конкретных запросов с помощью Entrez.

    from Bio import Entrez
    Entrez.email = "[email protected]"
    handle = Entrez.egquery(term="Jennifer Runch AND ((2012[Date - Publication] : 2017[Date - Publication])) ")
    handle_1 = Entrez.egquery(term = "Jennifer Runch AND ((2012[Date - Publication] : 2017[Date - Publication])) AND Leoard P. Byk")
    handle_2 = Entrez.egquery(term = "Jennifer Runch AND ((2012[Date - Publication] : 2017[Date - Publication])) AND Southern Illinois University School of Medicine")
    record = Entrez.read(handle)
    record_1 = Entrez.read(handle_1)
    record_2 = Entrez.read(handle_2)
    pubmed_count = []
    for row in record["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count.append(row["Count"])
    
    for row in record_1["eGQueryResult"]:
        if row["DbName"] == "pubmed":
             pubmed_count.append(row["Count"])
    
    for row in record_2["eGQueryResult"]:
         if row["DbName"] == "pubmed":
             pubmed_count.append(row["Count"])
    print(pubmed_count)   
    >>>['3', '0', '0']
    

    Проблема в том, что мне нужно заменить имя студента («Дженнифер Ранч») на имя следующего студента в списке имен студентов («med_name»), медицинскую школу на следующую школу и имя текущего наставника на следующий имя наставника из списка.

Я думаю, что мне следует написать цикл for после того, как я объявлю свою электронную почту pubmed, но я не уверен, как связать два блока кода вместе. Кто-нибудь знает эффективный способ соединить два блока кода или знает, как сделать это более эффективным способом, чем тот, который я пробовал? Благодарю вас!


person Molly Zhao    schedule 10.10.2016    source источник
comment
Вопрос еще открыт?   -  person Maximilian Peters    schedule 20.10.2016
comment
@MaximilianPeters У меня есть дополнительный вопрос по этому поводу, который я отправил в другую ветку: stackoverflow.com/questions/40161460/   -  person Molly Zhao    schedule 20.10.2016


Ответы (1)


Вы получили большую часть кода на месте. Его просто нужно было немного изменить.

Предполагая, что ваша таблица выглядит так:

Jennifer Bunch  |Southern Illinois University School of Medicine|Leonard P. Rybak
Philipp Robinson|Stanford University School of Medicine         |Roger Kornberg

вы можете использовать следующий код

import xlrd
from Bio import Entrez
sheet = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0)

med_name = list()
med_school = list()
mentor = list()
search_terms = list()
for row in range(0, sheet.nrows):
    search_terms.append([sheet.cell_value(row, 0), sheet.cell_value(row,1), sheet.cell_value(row, 2)])

pubmed_counts = list()

for search_term in search_terms:
    handle = Entrez.egquery(term="{0} AND ((2012[Date - Publication] : 2017[Date - Publication])) ".format(search_term[0]))
    handle_1 = Entrez.egquery(term = "{0} AND ((2012[Date - Publication] : 2017[Date - Publication])) AND {1}".format(search_term[0], search_term[2]))
    handle_2 = Entrez.egquery(term = "{0} AND ((2012[Date - Publication] : 2017[Date - Publication])) AND {1}".format(search_term[0], search_term[1]))
    record = Entrez.read(handle)
    record_1 = Entrez.read(handle_1)
    record_2 = Entrez.read(handle_2)

    pubmed_count = ['', '', '']

    for row in record["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count[0] = row["Count"]
    for row in record_1["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count[1] = row["Count"]
    for row in record_2["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count[2] = row["Count"]

    print(pubmed_count)
    pubmed_counts.append(pubmed_count)

Выход


['3', '0', '0']
['1', '0', '0']

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

Некоторые другие модификации, которые не являются необходимыми, но могут быть полезными:

  • цикл над листом Excel только один раз
  • сохраните pubmed_count в предопределенном списке, потому что, если значения возвращаются пустыми, размер вывода будет варьироваться, что затрудняет угадывание, какое значение принадлежит какому запросу
  • все может быть еще больше оптимизировано и улучшено, например. сохранить запросы в списке и перебрать их, что привело бы к меньшему повторению кода, но теперь он выполняет свою работу.
person Maximilian Peters    schedule 11.10.2016