"model_selection/output/cv_metrics/metrics.xlsx" did not exist on "cf69c55ed26f5261332a26ed38a3b934701c6564"
funciones_reposicionamiento.py 13.8 KB
Newer Older
Maria Marin's avatar
Maria Marin committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
#! /usr/bin/env python

"""
# ---------------------------------------------------------------------------
#
# funciones_reposicionamiento.py
#
# Archivo con todas las funciones que he utilizado para identificar fármacos
candidatos de reposicionamiento a un subconjunto de enfermedades neurológicas:
demencia, bipolaridad, epilepsia y esquizofrenia.

# TFG: Ciencia de redes y reposicionamiento de fármacos: potencial a través 
# de la medicina de redes
#
# María Marín Tercero
# ----------------------------------------------------------------------------
"""

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import networkx as nx
from networkx.algorithms import bipartite
import nxpd
import funciones_reposicionamiento
import re
    
# =================================================================================


def farmacos_candidatos(df_combinado, nombre_enf, arch):
    """
    Esta función permite obtener un DataFrame con las siguientes columnas:
    1. Enfermedades de estudio: enfermedades para las que buscamos fármacos de
    reposicionamiento.
    2. Fármacos candidatos: medicamentos candidatos de reposicionamiento para la
    patología situada en su misma fila, pero en la columna 1.
    3. Enfermedades candidatas: patologías asociadas a los fármacos situados en 
    su misma fila, pero en la columna 2. 
    
    Datos de entrada: 
    1. df_combinado: DataFrame con las siguientes columnas: enfermedades, fármacos, 
    tratamiento, dc, dc_mean, dc_std, dc_zscore, targets en módulo (el DataFrame 
    que se obtiene como resultado en la función targets_modulo.
    2. nombre_enf: nombre de la enfermedad.
    3. arch: archivo que contiene las relaciones entre fármacos y las patologías que
    tratan
    """
    #Filtro los datos para generar dos nuevos dataframes, uno con los datos de los fármacos que se empleen como tratamiento de la enfermedad (identificada por su nombre según nombre_enf), y otro con los datos para el resto de fármacos.
    farmacos_tratamiento = df_combinado[(df_combinado['Enfermedades'] == nombre_enf) & (df_combinado['Tratamiento'] == 'yes')]
    farmacos_no_tratamiento = df_combinado[(df_combinado['Enfermedades'] == nombre_enf) & (df_combinado['Tratamiento'] == 'unknown')]
    
    #Calculo los valores correspondiente al primer cuartil y al mínimo de la separación de los fármacos empleados como tratamiento al módulo de la enfermedad
    primer_cuartil_tratamiento = farmacos_tratamiento['dc'].quantile(0.25)
    minimo_tratamiento = farmacos_tratamiento['dc'].min()
    
    if nombre_enf == "Demencia": #si la enfermedad es Demencia
        
        #filtro los fármacos tratamiento con una cercanía mayor o igual a la separación mínima de los fármacos tratamiento, que además no presenten ninguna de sus proteínas diana en el módulo de la enfermedad, y con un z-score de la separación al módulo de la enfermedad menor o igual a -0.15 (lo que indica qye son fármacos significativamente próximos al módulo).
        farmacos_seleccionados = farmacos_no_tratamiento[(farmacos_no_tratamiento["dc"] >= minimo_tratamiento) & 
                                           (farmacos_no_tratamiento["Target en módulo"] == "No") &
                                           (farmacos_no_tratamiento["dc_zscore"] <= -0.15)]
    else: #si la enfermedad no es Demencia
        #filtro los fármacos tratamiento con una cercanía mayor o igual al primer cuartil de la separación de los fármacos tratamiento, que además no presenten ninguna de sus proteínas diana en el módulo de la enfermedad, y con un z-score de la separación al módulo de la enfermedad menor o igual a -0.15 (lo que indica qye son fármacos significativamente próximos al módulo).
        farmacos_seleccionados = farmacos_no_tratamiento[(farmacos_no_tratamiento["dc"] >= primer_cuartil_tratamiento) & 
                                           (farmacos_no_tratamiento["Target en módulo"] == "No") &
                                           (farmacos_no_tratamiento["dc_zscore"] <= -0.15)]
        
    #Ordeno los fármacos de forma ascendente según su z-score y selecciono los 5 primeros
    farmacos_seleccionados = farmacos_seleccionados.sort_values(by="dc_zscore").head(5)
    
    # Filtro el DataFrame arch para obtener solo las filas correspondientes a los fármacos seleccionados
    arch_filtrado = arch[arch['dru'].isin(farmacos_seleccionados['Fármacos'])]

    # Creo el DataFrame con los resultados obtenidos
    df_candidatos = pd.DataFrame({
        "Enfermedades de estudio": [nombre_enf] * len(arch_filtrado),
        "Fármacos candidatos": arch_filtrado['dru'].tolist(),
        "Enfermedades candidatas": arch_filtrado['dis'].tolist()
    })
    
    return df_candidatos

# =================================================================================


def spl_candidatos(spl_files, id_enfermedades, arch_candidatos):
    """
    Esta función genera un DataFrame compuesto por seis columnas:
    1. Enfermedades de estudio: enfermedades para las que buscamos fármacos de
    reposicionamiento.
    2. Fármacos candidatos: medicamentos candidatos de reposicionamiento para la
    patología situada en su misma fila, pero en la columna 1.
    3. Enfermedades candidatas: patologías asociadas a los fármacos situados en 
    su misma fila, pero en la columna 2. 
    4. SPL proyectada enf-gen: Shortest Path Length en la red proyectada de
    enfermedades relacionadas en función de genes patológicos entre las enfermedades 
    de la columna 1 y 3 situadas en la misma fila.
    5. SPL proyectada enf-dru: Shortest Path Length en la red proyectada de
    enfermedades relacionadas en función de fármacos entre las enfermedades 
    de la columna 1 y 3 situadas en la misma fila.
    6. SPL proyectada enf-sym: Shortest Path Length en la red proyectada de
    enfermedades relacionadas en función de síntomas entre las enfermedades 
    de la columna 1 y 3 situadas en la misma fila.
    
    Datos de entrada:
    1. spl_files: lista con el nombre de los archivos que contienen el SPL entre 
    todos los nodos de cada red (values). 
    2. id_enfermedades: código identificador de las enfermedades. 
    3. arch_candidatos: archivo que relaciona en cada fila la enfermedad neurológica de
    estudio, un fármaco candidato de reposicionamiento y una de las enfermedades que tratan
    dicho fármaco.
    """
    spls_gen = [] #lista en la que añadiré el SPL en la red proyectada de enfermedades - genes
    spls_dru = [] #lista en la que añadiré el SPL en la red proyectada de enfermedades - fármacos
    spls_sym =[] #lista en la que añadiré el SPL en la red proyectada de enfermedades - síntomas
    
    spl_enfermedad_gen, spl_enfermedad_dru, spl_enfermedad_sym = spl_files #asocio cada elemento de la lista spl_files a una variable
    
    df_resultados = arch_candidatos.copy() #copio el DataFrame con la información sobre los fármacos candidatos de reposicionamiento (arch_candidatos)
    
    for i, enfermedad in enumerate(arch_candidatos["Enfermedades de estudio"]): #para cada enfermedad neurológica de estudio
        id_enfermedad = id_enfermedades[enfermedad] #obtengo su id en el diccionario de identificadores de enfermedades
        
        fila_gen = spl_enfermedad_gen.columns.get_loc(id_enfermedad) #localizo el id en el archivo de fármacos candidatos
        columna_gen = arch_candidatos["Enfermedades candidatas"][i] #obtengo la enfermedad tratada por dicho fármaco en su misma fila
        
        if columna_gen in spl_enfermedad_gen.columns.tolist(): #si dicha enfermedad forma parte d ela red proyectada de enfermedades y genes
            spls_gen.append(spl_enfermedad_gen.loc[fila_gen, columna_gen]) #aádo a la lista spl_gen el SPL entre la enfermedad neurológica estudiada y la enfermedad tratada por el fármaco candidato de reposicionamiento. Para ello, localizo el SPL en la fila de la enfermedad estudiada y la columna de la enfermedad tratada por el fármaco.
        else:
            spls_gen.append("Unknown") #si la enfermedad tratada no está en la red pruyectada, añado "unknown" a la lista spl_gen
            
        #repito el proceso anterior para la red proyectada de enfermedades - fármacos
        fila_dru = spl_enfermedad_dru.columns.get_loc(id_enfermedad)
        columna_dru = arch_candidatos["Enfermedades candidatas"][i]
        
        if columna_dru in spl_enfermedad_dru.columns.tolist():
            spls_dru.append(spl_enfermedad_dru.loc[fila_dru, columna_dru])
        else:
            spls_dru.append("Unknown")
        
        #repito el proceso anterior para la red proyectada de enfermedades - síntomas
        fila_sym = spl_enfermedad_sym.columns.get_loc(id_enfermedad)
        columna_sym = arch_candidatos["Enfermedades candidatas"][i]
        
        if columna_sym in spl_enfermedad_sym.columns.tolist():
            spls_sym.append(spl_enfermedad_sym.loc[fila_sym, columna_sym])
        else:
            spls_sym.append("Unknown")
    
    #añado los spls entre las enfermedades en cada red al DataFrame de resultados
    df_resultados["SPL proyectada enf - gen"] = spls_gen
    df_resultados["SPL proyectada enf - dru"] = spls_dru
    df_resultados["SPL proyectada enf - sym"] = spls_sym
    
    return df_resultados

# =================================================================================

def distribucion_enf_candidatas(arch_candidatos, nombre_enf):
    """
    Esta función crea un DataFrame que contiene los fármacos candidatos de 
    reposcionamiento para una enfermedad neurológica, el total de enfermedades tratadas
    por dicho fármaco, y el número de estas enfermedades conectadas a la enfermedad
    neurológica en las redes proyectadas de enfermedades - genes, enfermedades - fármacos
    y enfermedades síntomas.
    
    Datos de entrada:
    1. arch_candidatos: DataFrame con las enfermedades neurológicas estudiadas, 
    sus fármacos candidatos de reposcionamiento, las enfermedades tratadas por cada uno de 
    los fármacos candidatos, y el SPL entre las enfermedades neurológicas y cada una de las 
    enfermedades tratadas por los fármacos candidatos en las tres redes proyectadas.
    2. nombre_enf: nombre de la enfermedad neurológica cuyos candidatos de reposicionamiento
    se encuentran en la lista anterior. 
    """
    
   # Filtrar las filas que incluyen enfermedades tratadas por fármacos candidatos de reposicionamiento para la enfermedad neurológica nombre_enf
    filt_enf = arch_candidatos[arch_candidatos["Enfermedades de estudio"] == nombre_enf]

    #Obtengo la lista de fármacos candidatos para reposicionamiento de nombre_enf
    lista_candidatos = set(filt_enf["Fármacos candidatos"])
    
    # Filtrar las filas que incluyen enfermedades tratadas por fármacos candidatos de reposicionamiento para la enfermedad neurológica nombre_enf que se conecten a nombre_enf en la red proyectada enf-genes.
    filt_gen = filt_enf[filt_enf["SPL proyectada enf - gen"] != "Unknown"]
                               
    # Filtrar las filas que incluyen enfermedades tratadas por fármacos candidatos de reposicionamiento para la enfermedad neurológica nombre_enf que se conecten a nombre_enf en la red proyectada enf-fármacos.
    filt_dru = filt_enf[filt_enf["SPL proyectada enf - dru"] != "Unknown"]
    
    # Filtrar las filas que incluyen enfermedades tratadas por fármacos candidatos de reposicionamiento para la enfermedad neurológica nombre_enf que se conecten a nombre_enf en la red proyectada enf-síntomas.
    filt_sym = filt_enf[filt_enf["SPL proyectada enf - sym"] != "Unknown"]
   
    #listas en la que añadiré el número de enfermedades tratadas por cada fármaco candidato que pueden conectarse a nombre_enf en cada red proyectada.
    enf_gen_lista = []  #conexión con nombre_enf en red proyectada enfermedades-genes.
    enf_dru_lista = []  #conexión con nombre_enf en red proyectada enfermedades-fármacos.
    enf_sym_lista = []  #conexión con nombre_enf en red proyectada enfermedades-síntomas.
    
    #listas en la que añadiré el número total de enfermedades tratadas por cada fármaco candidato que pueden conectarse a nombre_enf al menos en una de las redes proyectadas
    total_enf = []
                            
    for farmaco in list(lista_candidatos):  # para cada fármaco de la lista de candidatos de reposicionamiento para nombre_enf
        #cuento el número de enfermedades tratadas por uno de los fármacos candidatos que pueden conectarse a nombre_enf en cada red proyectada
        #el número de enfermedades para cada fármaco en cada caso se corresponde con el número de líneas en el que aparece dicho fármaco en los DataFrames filtrados
        enf_gen = len(filt_gen[filt_gen["Fármacos candidatos"] == farmaco])  #conexión con nombre_enf en red proyectada enfermedades-genes.
        enf_dru = len(filt_dru[filt_dru["Fármacos candidatos"] == farmaco])  #conexión con nombre_enf en red proyectada enfermedades-fármacos.
        enf_sym = len(filt_sym[filt_sym["Fármacos candidatos"] == farmaco])  #conexión con nombre_enf en red proyectada enfermedades-síntomas.
        enf_total = len(filt_enf[filt_enf["Fármacos candidatos"] == farmaco]) #total de enfermedades asociadas al fármaco
        # añado los resultados a las listas correspondientes para cada fármaco
        total_enf.append(enf_total)
        enf_gen_lista.append(enf_gen) 
        enf_dru_lista.append(enf_dru)
        enf_sym_lista.append(enf_sym)

    # creo el DataFrame de resultados
    df_candidatos = pd.DataFrame({
        "Fármacos candidatos " + str(nombre_enf): list(lista_candidatos),
        "Total enfermedades tratadas": total_enf,
        "Enfermedades en red proyectada enf-genes": enf_gen_lista,
        "Enfermedades en red proyectada enf-dru": enf_dru_lista,
        "Enfermedades en red proyectada enf-sym": enf_sym_lista,
     })

    return df_candidatos

# =================================================================================