es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calcula la similitud coseno entre dos vectores (valores en filas) en un DataFrame de Pandas.

Así es como se ve mi conjunto de datos en una estructura de Pandas DataFrame:

df

índice id tiempo var1 var2 var3 var4 var5
1 1 1 . . . . .
2 1 2 1 1 2 2 3
3 1 3 . . . . .
4 1 4 1 3 1 2 6
5 1 5 . . . . .
6 2 1 2 1 3 3 2
7 2 2 . . . . .
8 2 3 . . . . .
9 2 4 4 3 1 2 3

Donde hay múltiples registros para cada id a lo largo del tiempo con algunas otras columnas que se utilizarán para calcular la similitud coseno (Cosine Similarity – CS).

He buscado recursos para poder aplicar el cálculo de CS en mi contexto, pero no he encontrado uno bueno.

Lo que quiero hacer es calcular un CS que se derivará como un solo valor entre el vector del índice 2 (1,1,2,2,3) y el vector del índice 4 (1,3,1,2,6). Al mismo tiempo, también necesito evitar filas faltantes para hacer esto. Cada grupo de ids tiene solo dos vectores.

De la misma manera para el id 2, como CS entre (2,1,3,3,2) y (4,3,1,2,3).

A continuación, el código es lo que he pensado que podría aplicarse en mi caso, que generará CS como un solo valor:

import scipy
from scipy import spatial
vector1 = [1, 1, 2, 2, 3]
vector2 = [1, 3, 1, 2, 6]

similitud_coseno = 1 - spatial.distance.cosine(vector1, vector2)
print (similitud_coseno)

Salida: 0.8994895926845297

¿Cuál sería una buena manera de abordar esto teniendo en cuenta algunas de las restricciones?

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para calcular la similitud del coseno entre dos vectores en un DataFrame de Pandas teniendo en cuenta los valores faltantes y agrupando por id, el siguiente código puede ser útil:

    import pandas as pd
    import numpy as np
    from scipy.spatial.distance import cosine
    
    # Crear un DataFrame con datos de muestra
    df = pd.DataFrame({'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
                       'var1': [np.nan, 1, np.nan, 1, np.nan, 2, np.nan, np.nan, 4],
                       'var2': [np.nan, 1, np.nan, 3, np.nan, 1, np.nan, np.nan, 3],
                       'var3': [np.nan, 2, np.nan, 1, np.nan, 3, np.nan, np.nan, 1],
                       'var4': [np.nan, 2, np.nan, 2, np.nan, 3, np.nan, np.nan, 2],
                       'var5': [np.nan, 3, np.nan, 6, np.nan, 2, np.nan, np.nan, 3],
                       })
    
    # Crear un DataFrame para almacenar las similitudes del coseno calculadas por id
    cosine_df = pd.DataFrame(columns=['id', 'cosine_similarity'])
    
    # Agrupar el DataFrame por id e iterar sobre cada grupo
    for name, group in df.groupby('id'):
    
        # Seleccionar los dos registros que tienen todos los valores disponibles
        group = group.dropna(thresh=5)
    
        # Si hay dos registros, calcular la similitud del coseno y almacenar en cosine_df
        if len(group) == 2:
            vector1 = group.iloc[0, 1:].values
            vector2 = group.iloc[1, 1:].values
            cosine_similarity = 1 - cosine(vector1, vector2)
            cosine_df = cosine_df.append({'id': name, 'cosine_similarity': cosine_similarity}, ignore_index=True)
    
    # Imprimir las similitudes del coseno resultantes
    print(cosine_df)
    

    Este código realiza lo siguiente:

    1. Crea un DataFrame de muestra con datos de ejemplo.
    2. Inicializa un DataFrame vacío para almacenar las similitudes del coseno calculadas.
    3. Agrupa el DataFrame por id e itera sobre cada grupo.
    4. Elimina cualquier registro en el grupo que tenga más de un valor faltante.
    5. Si quedan dos registros en el grupo, selecciona los vectores para calcular la similitud del coseno entre ellos.
    6. Calcula la similitud del coseno y la almacena en el DataFrame cosine_df.
    7. Imprime las similitudes del coseno resultantes.

    Es importante tener en cuenta que el método dropna() se utiliza para eliminar cualquier registro que tenga más de un valor faltante. Esto se debe a que la similitud del coseno no se puede calcular con valores faltantes. El parámetro thresh=5 indica que cada registro debe tener al menos 5 valores no faltantes. Puede ajustar este parámetro según sea necesario dependiendo de cuántas columnas tenga.

Comments are closed.