使用pandas更快地计算行之间的相似性/距离

时间:2016-04-12 18:20:07

标签: python pandas dataframe

我是Python和Pandas的新手。 我在Pandas Datframe中有以下列:

歌曲编号歌词ID专辑ID艺术家类似艺术家艺术家霍夫斯歌曲歌曲音乐响度节奏年度

使用artistHotnesss到年份列的数字数据。 所以我尝试使用以下代码计算歌曲之间的距离/余弦:

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)

所以这基本上需要循环10 ^ 4 * 10 ^ 4次。 如果我在m = 1000时执行此操作,我会得到2249秒或37.48分钟的结果,所以我没有得到m = 10000的结果。

如何加快速度(通过避免循环?pandas功能)?

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

您可以使用scikit-learn中的euclidean_distances功能来避免使用循环。

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.        ]])