Source code for acore.publications_analysis

from urllib import error

import pandas as pd

try:
    from Bio import Entrez, Medline
except ImportError as e:
    raise ImportError(
        "Error importing Bio modules. Make sure biopython is installed. "
        "Install it with: pip install biopython"
        f"\n\nError: {e}"
    ) from e


# TODO: This should probably be changed to the email of the person installing ckg?
Entrez.email = "kg@dtu.dk"


[docs] def getMedlineAbstracts(idList): fields = { "TI": "title", "AU": "authors", "JT": "journal", "DP": "date", "MH": "keywords", "AB": "abstract", "PMID": "PMID", } pubmedUrl = "https://www.ncbi.nlm.nih.gov/pubmed/" abstracts = pd.DataFrame() try: handle = Entrez.efetch( db="pubmed", id=idList, rettype="medline", retmode="json" ) records = Medline.parse(handle) results = [] for record in records: aux = {} for field in fields: if field in record: aux[fields[field]] = record[field] if "PMID" in aux: aux["url"] = pubmedUrl + aux["PMID"] else: aux["url"] = "" results.append(aux) abstracts = pd.DataFrame.from_dict(results) except error.URLError as e: print("URLError: Request to Bio.Entrez failed. Error: {}".format(e)) except error.HTTPError as e: print("HTTPError: Request to Bio.Entrez failed. Error: {}".format(e)) except Exception as e: print("Request to Bio.Entrez failed. Error: {}".format(e)) return abstracts
[docs] def get_publications_abstracts( data, publication_col="publication", join_by=["publication", "Proteins", "Diseases"], index="PMID", ): """ Accesses NCBI PubMed over the WWW and retrieves the abstracts corresponding to a list of one or more PubMed IDs. :param data: pandas dataframe of diseases and publications linked to a list of proteins (columns: 'Diseases', 'Proteins', 'linkout' and 'publication'). :param str publication_col: column label containing PubMed ids. :param list join_by: column labels to be kept from the input dataframe. :param str index: column label containing PubMed ids from the NCBI retrieved data. :return: Pandas dataframe with publication information and columns 'PMID', 'abstract', 'authors', 'date', 'journal', 'keywords', 'title', 'url', 'Proteins' and 'Diseases'. Example:: result = get_publications_abstracts(data, publication_col='publication', join_by=['publication','Proteins','Diseases'], index='PMID') """ abstracts = pd.DataFrame() if not data.empty: abstracts = getMedlineAbstracts( list(data.reset_index()[publication_col].unique()) ) if not abstracts.empty: abstracts = abstracts.set_index(index) abstracts = abstracts.join( data.reset_index()[join_by].set_index(publication_col) ) abstracts.index.name = index abstracts = abstracts.reset_index() return abstracts