2013-12-13 3 views
4

팬더에 Apriori 알고리즘을 구현하는 가장 좋은 방법은 무엇입니까? 지금까지 for 루프를 사용하여 패턴을 추출하는 것을 변형하는 데 막혔다. for 루프 이후의 모든 것은 작동하지 않습니다. 팬더에서 벡터화 된 방법이 있습니까?Python 팬더에서 Apriori를 구현하는 가장 좋은 방법

import pandas as pd 
import numpy as np 

trans=pd.read_table('output.txt', header=None,index_col=0) 

def apriori(trans, support=4): 
    ts=pd.get_dummies(trans.unstack().dropna()).groupby(level=1).sum() 
    #user input 

    collen, rowlen =ts.shape 

    #max length of items 
    tssum=ts.sum(axis=1) 
    maxlen=tssum.loc[tssum.idxmax()] 

    items=list(ts.columns) 

    results=[] 
    #loop through items 
    for c in range(1, maxlen): 
     #generate patterns 
     pattern=[] 
     for n in len(pattern): 
      #calculate support 
      pattern=['supp']=pattern.sum/rowlen 
      #filter by support level 
      Condit=pattern['supp']> support 
      pattern=pattern[Condit] 
      results.append(pattern) 
    return results 

results =apriori(trans) 
print results 

나는 지원이를 삽입하면 3

 a b c d e 
0      
11  1 1 1 0 0 
666  1 0 0 1 1 
10101 0 1 1 1 0 
1010 1 1 1 1 0 
414147 0 1 1 0 0 
10101 1 1 0 1 0 
1242 0 0 0 1 1 
101  1 1 1 1 0 
411  0 0 1 1 1 
444  1 1 1 0 0 

이해야

Pattern support 
    a   6 
    b   7 
    c   7 
    d   7 
    e   3 
    a,b  5 
    a,c  4 
    a,d  4 
+0

수익이 잘못된 위치에와 렌 (패턴)에서 N입니다 잘못도 .... 내가 패턴 길이는하지 않는 손으로 그 일을 할 때 첫 번째 오류를 붙여 출신 @AndyHayden –

+0

입니다 나는 a, b와 같은 패턴 조합을 생성하는 방법을 알아 내지 못했기 때문에 작동합니다. a, c; 또는 a, b, c – user3084006

+0

지원은 어떻게 정의됩니까? 나는 짐작할 만하다. 그러나 그것은 네 d 값으로는 정사각형이 아니다. (나는 4가 될 것이라고 생각했지만, 3이라고 말한다.) – DSM

답변

4

같은 출력 뭔가 어쩌면, 당신이 계신 이해

from itertools import combinations 
def get_support(df): 
    pp = [] 
    for cnum in range(1, len(df.columns)+1): 
     for cols in combinations(df, cnum): 
      s = df[list(cols)].all(axis=1).sum() 
      pp.append([",".join(cols), s]) 
    sdf = pd.DataFrame(pp, columns=["Pattern", "Support"]) 
    return sdf 

가정 당신을 시작할 것입니다 :

>>> s = get_support(df) 
>>> s[s.Support >= 3] 
    Pattern Support 
0  a  6 
1  b  7 
2  c  7 
3  d  7 
4  e  3 
5  a,b  5 
6  a,c  4 
7  a,d  4 
9  b,c  6 
10  b,d  4 
12  c,d  4 
14  d,e  3 
15 a,b,c  4 
16 a,b,d  3 
21 b,c,d  3 

[15 rows x 2 columns] 
+0

예, 그렇습니다. 그러나 팬더만으로 그것을 할 수있는 방법이 있습니까? – user3084006

+2

@ user3084006 : 확실하지 않습니다. 불행히도이 질문에 시간을 할애하지 않았습니다. 바라건대 다른 사람이 당신을 도울 수 있기를 바랍니다! – DSM

+0

고마워, 근본적인 문제가 해결 됐어. 다른 질문을 올리면 안된다. – user3084006

관련 문제