2016-04-12 21 views
2

Ich bin ziemlich neu in Python und Pandas. Ich habe folgende Spalten in einer Pandas Datframe:Berechnen Ähnlichkeit/Abstand zwischen Zeilen mit Pandas schneller

SongNumber songID ALBUMID artistID similarArtists artistHotttnesss songHotness Lautstärke Tempo Jahr

Mit numerischen Daten von artistHotnesss zu Jahr Spalten. So versuchte ich Berechnung Entfernung/Kosinus zwischen den Songs des folgenden Code verwendet:

t1=time() 
m = 1000 
mat = np.zeros((m, m)) 

for i in range(0,m): 
    for j in range(0,m): 
     if i != j: 
      mat[i][j] = euclidean(data.ix[i,5:], data.ix[j,5:]) 
      '''if data.ix[i,2] == data.ix[j,2]: 
       mat[i][j] += 1 
      if data.ix[i,3] == data.ix[j,3]: 
       mat[i][j] += 1 
      #l1,l2 - list of similar artists 
      l1_str = data.ix[i,4].strip(']')[1:] 
      l2_str = data.ix[j,4].strip(']')[1:] 
      l1 = l1_str.split() 
      l2 = l2_str.split() 
      common = len(set(l1).intersection(l2)) 
      mat[i][j] += common 
      mat[i][j] /= 3''' 
     else: 
      mat[i][j] = 0.0 
t2 =time() 
print(t2-t1) 

So erfordert dies im wesentlichen 10^4 * 10^4 mal Looping. Wenn ich dies für m = 1000 führe, erhalte ich Ergebnisse in 2249 Sekunden oder 37,48 Minuten, so dass ich die Ergebnisse für m = 10000 nicht rechtzeitig erhalte.

Wie kann ich es beschleunigen (durch die Vermeidung von Schleifen? Pandas Funktionen)?

Vielen Dank für Hilfe

Antwort

4

Sie können mithilfe der Funktion euclidean_distances in scikit-learn mit Schleifen vermeiden.

from sklearn.metrics.pairwise import euclidean_distances 
import numpy as np 

mat = np.random.rand(5, 5) 
pairwise_dist_mat = euclidean_distances(mat) 
pairwise_dist_mat 
array([[ 0.  , 1.19602663, 1.08341967, 1.07792121, 1.1245057 ], 
    [ 1.19602663, 0.  , 0.52135682, 0.82797734, 0.78247091], 
    [ 1.08341967, 0.52135682, 0.  , 0.87764513, 0.81903634], 
    [ 1.07792121, 0.82797734, 0.87764513, 0.  , 0.1386294 ], 
    [ 1.1245057 , 0.78247091, 0.81903634, 0.1386294 , 0.  ]]) 
+0

Können Sie beweisen, dass 'sklearn' schneller ist als' numpy' und 'for' loops? –

+0

weil es lineare Algebra im Gegensatz zu For-Schleifen verwendet, um Entfernungen zu berechnen. aus der Dokumentation ist die Formel dist (x, y) = sqrt (Punkt (x, x) - 2 * Punkt (x, y) + Punkt (y, y)) (wo Punkt ist das Skalarprodukt) – dmb

+0

können Sie machen Sie Ihre eigene vektorisierte Funktion mit numpy, wenn Sie wollen, aber es gibt keine Möglichkeit, dass For-Schleifen schneller sein werden – dmb

Verwandte Themen