2016-10-10 8 views
1

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

  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'] 
    

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

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

+0

Вопрос еще не открыт? –

+0

@MaximilianPeters У меня есть следующий вопрос по этому вопросу, который я отправил в другой поток: http://stackoverflow.com/questions/40161460/searching-on-pubmed-using-biopython –

ответ

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'] 

Необходимая модификация сделать запросы переменная с использованием format.

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

  • петля над Excel лист только один раз
  • Хранить pubmed_count в заранее определенном списке, потому что, если значения возвращаются пустыми, размер выход будет меняться, из-за чего трудно угадать, какое значение принадлежит какому запросу
  • все может быть еще более оптимизировано и преувеличено, например хранить запросы в списке и перебирать их, что уменьшит количество повторений кода, но теперь оно выполняет эту работу.