【问题标题】:calculate support of a rule in large dataset计算大型数据集中规则的支持度
【发布时间】:2018-08-07 06:58:22
【问题描述】:
df = pd.Series([["26"], ["81", "15", "27"], ["50"], ["8"], ["81", "15"], 
["10"], ["81"]]).to_frame(name='itemsets')


       itemsets
0          [26]
1  [81, 15, 27]
2          [50]
3           [8]
4      [81, 15]
5          [10]
6          [81]

rule = [["81"],["15"]]

我试过这个,但它很慢,因为数据集有 900 万行,所以我寻找一个有效的解决方案来执行这个代码,这个解决方案需要超过 4 秒,这是一种将数据帧转换为 numpy 的方法数组或执行此代码的所有内容?

def support(rule):
    rule = rule[0] + rule[1]
    support = 0
    support = sum([set(rule)<=set(row) for row in df])
return support/SIZE

when i try it on the largest dataset which contains 9 million transactions the result is :

support(rule)
0.001039247773829178

这个想法是计算数据帧中非严格子集的出现次数

【问题讨论】:

  • 您能否提供您想要的结果并更详细地描述您想要达到的目标?!
  • 不清楚你想要的结果是什么。
  • 我编辑了帖子你能看一下吗
  • 不清楚你的函数是如何在整个系列中应用的,或者SIZE 的来源。您应该使用您提供的示例数据集清楚地概述问题中的步骤。
  • SIZE 是整个数据集的大小,即 pandas 数据框 SIZE 等于 8286763

标签: python pandas function numpy optimization


【解决方案1】:

IIUC:

rule 定义为

rule = ['81', '15']

df.itemsets.apply(set).le(set(rule)).mean()

0.2857142857142857

Numpy 替代方案

应该加快速度

def support(rule, series):  
    n = len(series)  
    i = np.arange(n).repeat(series.str.len())
    out = np.ones(n, bool)
    np.logical_and.at(out, i, np.in1d(np.concatenate(series), rule))
    return out.mean()

support(rule, df.itemsets)

0.2857142857142857

【讨论】:

  • 它不返回真实值并且需要5秒它太慢并且不返回确切值
  • “它没有返回真实值”是什么意思?您的函数返回一个数字。和我的一样。如果不是数字,你想要什么作为输出?
  • 当我在数据集上尝试你的函数时它没有。返回规则的确切支持
  • 我可以比较一下,根据您提供的输入,结果或确切值是多少?另外,SIZE 是什么?我认为这是数据帧的长度。
  • 我尝试使用此规则 ['24','25','20'] 并返回 0.011245645615785078 我的解决方案是准确的,但太慢了
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多