优化for循环以获得更快的性能

时间:2016-09-05 17:03:36

标签: python pandas for-loop optimization

我有一个数据框,其中包含针对100种产品(data_neighbours)的每100种产品的相似性得分100x100。我有另一个数据框,其中包含用户和产品级别的数据(1000x100)。我想为每个用户浏览每个产品,并从data_neighbours获得前10个类似的产品及其相应的相似性得分,并计算函数getScore如下:

def getScore(history, similarities):
   return sum(history*similarities)/sum(similarities)

for i in range(0,len(data_sims.index)):
    for j in range(1,len(data_sims.columns)):
        user = data_sims.index[i]
        product = data_sims.columns[j]

        if data.ix[i][j] == 1:
            data_sims.ix[i][j] = 0
        else:
            product_top_names = data_neighbours.ix[product][1:10]
            product_top_sims = data_ibs.ix[product].order(ascending=False)[1:10]
            user_purchases = data_germany.ix[user,product_top_names]

            data_sims.ix[i][j] = getScore(user_purchases,product_top_sims)

如何优化此循环以加快处理速度。这里引用了这个例子:http://www.salemmarafi.com/code/collaborative-filtering-with-python/

示例数据: 数据:(1000x101)用户是第101列:

Index   user    song1   song2.....
0        1       0       0
1        33      0       1
2        42      1       0
3        51      0       0

data_ibs(相似性得分) - (100x100):

    song1   song2   song3   song4
song1   1.00    0.00    0.02    0.05
song2   0.00    1.00    0.05    0.03
song3   0.02    0.05    1.00    0.11
song4   0.05    0.03    0.11    1.00

data_neighbours(根据data_ibs的排序得分为每首歌曲排名前10首类似的歌曲) - (100x10):

          1       2      3......... 10
song1   song5   song10  song4
song2   song8   song11  song5
song3   song9   song12  song10

德国数据(每首歌曲的用户级别数据为列,用户除外) - (1000x100):

index   song1   song2   song3
1        0        0     0
2        1        0     0
3        0        0     1

预期数据集(data_sims) - 1000x101:

user    song1   song2   song3
1      0.00     0.00    0.22
33     0.09     0.00    0.11
42     0.00     0.10    0.00
51     0.09     0.09    0.00

如果任何歌曲的数据值为1,基本上其分数设置为0,其他情况下,前10首歌曲从data_neighbours获取,相应的分数来自data_ibs。现在检查这些歌曲是否已经存在于用户或者不存在(1,0)在user_purchases数据集中。最后,使用user_purchses(每个前10首歌曲的1/0值)计算ixj位置的相似性得分,乘以来自data_ibs的相似性得分,并除以总前10个相似度得分的总和。对所有用户x歌曲组合重复相同的操作。

0 个答案:

没有答案