当前位置: 首页 > 面试题库 >

如何匹配运行时间太长的python中的所有键值对

洪鸿博
2023-03-14
问题内容

用户项目的亲和力和建议:
我正在创建一个表,建议“购买此商品的客户也购买了算法
输入数据集

productId   userId
Prod1        a
Prod1        b
Prod1        c
Prod1        d
prod2        b
prod2        c
prod2        a
prod2        b
prod3        c
prod3        a
prod3        d
prod3        c
prod4        a
prod4        b
prod4        d
prod4        a
prod5        d
prod5        a

需要输出

Product1    Product2    score
Prod1       prod3
Prod1       prod4
Prod1       prod5
prod2       Prod1
prod2       prod3
prod2       prod4
prod2       prod5
prod3       Prod1
prod3       prod2



Using code : 
#Get list of unique items
itemList=list(set(main["productId"].tolist()))

#Get count of users
userCount=len(set(main["productId"].tolist()))

#Create an empty data frame to store item affinity scores for items.
itemAffinity= pd.DataFrame(columns=('item1', 'item2', 'score'))
rowCount=0

#For each item in the list, compare with other items.
for ind1 in range(len(itemList)):

    #Get list of users who bought this item 1.
    item1Users = main[main.productId==itemList[ind1]]["userId"].tolist()
    #print("Item 1 ", item1Users)

    #Get item 2 - items that are not item 1 or those that are not analyzed already.
    for ind2 in range(ind1, len(itemList)):

        if ( ind1 == ind2):
            continue

        #Get list of users who bought item 2
        item2Users=main[main.productId==itemList[ind2]]["userId"].tolist()
        #print("Item 2",item2Users)

        #Find score. Find the common list of users and divide it by the total users.
        commonUsers= len(set(item1Users).intersection(set(item2Users)))
        score=commonUsers / userCount

        #Add a score for item 1, item 2
        itemAffinity.loc[rowCount] = [itemList[ind1],itemList[ind2],score]
        rowCount +=1
        #Add a score for item2, item 1. The same score would apply irrespective of the sequence.
        itemAffinity.loc[rowCount] = [itemList[ind2],itemList[ind1],score]
        rowCount +=1

#Check final result
itemAffinity

该代码在示例数据集上运行良好,但是
该代码花费的时间太长,无法在包含100,000行的数据集中运行。请帮助我优化代码。


问题答案:

此处的关键是创建productId的笛卡尔积。参见下面的代码,

result=(main.drop_duplicates(['productId','userId'])
            .assign(cartesian_key=1)
            .pipe(lambda x:x.merge(x,on='cartesian_key'))
            .drop('cartesian_key',axis=1)
            .loc[lambda x:(x.productId_x!=x.productId_y) & (x.userId_x==x.userId_y)]
            .groupby(['productId_x','productId_y']).size()
            .div(data['userId'].nunique()))

result

Prod1   prod2   0.75
Prod1   prod3   0.75
Prod1   prod4   0.75
Prod1   prod5   0.5
prod2   Prod1   0.75
prod2   prod3   0.5
prod2   prod4   0.5
prod2   prod5   0.25
prod3   Prod1   0.75
prod3   prod2   0.5
prod3   prod4   0.5
prod3   prod5   0.5
prod4   Prod1   0.75
prod4   prod2   0.5
prod4   prod3   0.5
prod4   prod5   0.5
prod5   Prod1   0.5
prod5   prod2   0.25
prod5   prod3   0.5
prod5   prod4   0.5

方法2

result = (df.groupby(['productId','userId']).size()
            .clip(upper=1)
            .unstack()
            .assign(key=1)
            .reset_index()
            .pipe(lambda x:x.merge(x,on='key'))
            .drop('key',axis=1)
            .loc[lambda x:(x.productId_x!=x.productId_y)]
            .set_index(['productId_x','productId_y'])
            .pipe(lambda x:x.set_axis(x.columns.str.split('_',expand=True),axis=1,inplace=False))
            .swaplevel(axis=1)
            .pipe(lambda x:(x['x']+x['y']))
            .fillna(0)
            .div(2) 
            .mean(axis=1))


 类似资料:
  • 问题内容: 我有一个运行长时间运行的作业的Web服务(大约几个小时)。我正在使用Flask,Gunicorn和nginx进行开发。 我正在考虑做的事情是拥有一条需要很长时间才能完成的路由,调用一个创建线程的函数。然后,该函数将向路径返回一个GUID,并且路径将返回一个URL(使用GUID),用户可以使用该URL来检查进度。我正在将线程设为守护程序(thread.daemon = True),以便如

  • 我已经在Ubuntu14.04中安装了Android studio。我试图清理这个项目,但它花了太长时间,已经1小时了,因为gradle正在运行。在我的Gradle控制台中,我得到了如下错误: 线程“png-cruncher_8”java.lang.runtimeException:在等待从aapt进程时超时,请确保在/home/files/android/sdk/build-tools/23.0

  • 通过特定的标签/键从整个JSON中删除任意值的简单方法是什么?我的JSON可能具有任意深度,因此按标签删除应该递归完成。 并且我想删除所有带有标签的元素,以便最终结果如下所示: 使用/会产生意想不到的结果(尤其是当有嵌套对象要删除时),因此它必须是一个支持JSON的实用工具,如jq或类似工具。

  • 我有一个web应用程序,也在做真正密集的数据处理。有些函数非常慢(想想几分钟)。 这个重构的问题是tornado服务器阻塞了,同时无法为其他请求提供服务。 所以问题是:有没有一种方法可以重构处理程序,而不触及,也不创建新的线程/进程?

  • 问题内容: 有没有办法确保子句中的所有值都匹配? 例: 我可以将IN用作:。 我需要它像跨多个行一样工作。 更新: 我需要它来列出数据库中符合指定参数的公司。公司和分类法之间存在很多关系。我正在使用Yii框架。这是我的控制器的代码: 问题答案: 您可以执行以下操作: 如果您提供架构和一些示例数据,我可以提供一个更相关的答案。 SQL小提琴示例

  • 我有以下数据框: 我正在尝试为这个熊猫数据框确定适当的语法,如何为列“通道”等于A或B的所有实例编制索引。一旦找到所有实例,我想打印出来。此外,我希望能够在脚本中调用每个索引以获得进一步的应用程序。 我希望显示器是: 然后我想有一个“for循环”,它遍历并分别打印出每个索引实例,这样就很容易识别并单独调用它们,以便在脚本中进一步使用。有人能给点建议吗?