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.
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:
Este código realiza lo siguiente:
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ámetrothresh=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.