#!/usr/bin/env python# -*- coding: utf-8 -*-## This file is part of the `pypath` python module## Copyright 2014-2023# EMBL, EMBL-EBI, Uniklinik RWTH Aachen, Heidelberg University## Authors: see the file `README.rst`# Contact: Dénes Türei (turei.denes@gmail.com)## Distributed under the GPLv3 License.# See accompanying file LICENSE.txt or copy at# https://www.gnu.org/licenses/gpl-3.0.html## Website: https://pypath.omnipathdb.org/#"""Methods working on objects from `pypath.core` which might be useful to accesswithout importing the main modules."""fromfuture.utilsimportiteritemsimportreimportpandasaspdimportpypath.share.commonascommonimportpypath_common._constantsas_const
[docs]deffilter_network_df(df,resource=None,entity_type=None,data_model=None,interaction_type=None,only_directed=None,only_undirected=None,only_signed=None,only_proteins=None,effect=None,entities=None,source_entities=None,target_entities=None,swap_undirected=True,remove_loops=True,entities_or=False,**kwargs):""" Filters a network data frame. """args=locals().copy()args.update(kwargs)query_elements={}_node_attrs={'id','entity_type'}_synonyms={'resource':'sources','data_model':'dmodel','interaction_type':'type','entities':'id','entity':'id',}ifswap_undirectedandnotonly_directedandnotonly_signed:undirected=df.query('not directed',inplace=False)withpd.option_context('mode.chained_assignment',None):undirected.rename({'id_a':'id_b','id_b':'id_a','type_a':'type_b','type_b':'type_a',},inplace=True,axis='columns',)df=df.append(undirected,ignore_index=True,sort=False)ifonly_directed:args['directed']=Trueifonly_signed:args['effect']={1,-1}ifonly_undirected:args['directed']=Falseifonly_proteins:args['entity_type']='protein'forvar,valiniteritems(args):ifvalisNone:continuenode_postfix=Noneifvar.startswith('source_')orvar.endswith('_a'):node_postfix=['_a']var=re.sub(r'(?:source_)?(\w+)(?:_a)?',r'\1',var)ifvar.startswith('target_')orvar.endswith('_b'):node_postfix=['_b']var=re.sub(r'(?:target_)?(\w+)(?:_b)?',r'\1',var)ifvar=='type':raiseValueError('`type` is ambiguous, use either ''`interaction_type` or `entity_type`.')var=_synonyms[var]ifvarin_synonymselsevarnode_postfix=(['_a','_b']ifvarin_node_attrsandnotnode_postfixelsenode_postfixor[''])forpfinnode_postfix:var_pf='%s%s'%(var,pf)var_pf=var_pf.replace('entity_type','type')ifvar_pfindf.columns:query_elements[var_pf]=valquery=[]entity_query=[]forvar,valiniteritems(query_elements):first=varsecond='@query_elements["%s"]'%varifdf.dtypes[var].name=='object':first,second=second,firstop='in'ifisinstance(val,_const.SIMPLE_TYPES)else'&'else:op='=='ifisinstance(val,_const.SIMPLE_TYPES)else'in'q='%s%s%s'%(first,op,second)ifvar.startswith('id_'):entity_query.append(q)else:query.append(q)ifentities_orandlen(entity_query)>1:query.append('(%s)'%' or '.join(entity_query))else:query.extend(entity_query)ifremove_loops:query.append('id_a.astype("str") != id_b.astype("str")')query=' and '.join(query)result=df.query(query)ifqueryelsedfreturnresult