Применение кодировщика транзакций к набору данных - PullRequest
2 голосов
/ 17 октября 2019

Я хочу применить алгоритм Apriori к набору данных розничной торговли (данные о корзине из розничного магазина). Он имеет данные в виде: -

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
30 31 32 
33 34 35 
36 37 38 39 40 41 42 43 44 45 46 
38 39 47 48 
38 39 48 49 50 51 52 53 54 55 56 57 58 
32 41 59 60 61 62 
3 39 48 

Итак, чтобы использовать алгоритм Apriori, мне нужны данные в виде списка списков Python в массив Numpy в виде: -

Column Names as 0 1 2 3 4 5 6 7 8 9 10........

Набор данных как:

0 1 2 3 4 5 6 7 8 9 10 .........30 31 32 33 34 35....
1 1 1 1 1 1 1 1 1 1 1...........0  0  0  0  0  0...
0 0 0 0 0 0 0 0 0 0 0...........1  1  1  0  0  0..
and so on..

Для этого я пытаюсь использовать Transaction Encoder: -

dataset = pd.read_csv('retail.dat', header=None)
from mlxtend.preprocessing import TransactionEncoder

transactionEncoder = TransactionEncoder()
dataset = transactionEncoder.fit(dataset).transform(dataset)
dataset.astype('int')
print(dataset)

Но я получаю ошибку: -

TypeError: 'int' object is not iterable

Я также хочу прикрепить имена столбцов как 0 1 2 .... к вновь сформированному набору данных, но print(transactionEncoder.columns_) не дает допустимых столбцов. Пожалуйста, расскажите, в чем может быть проблема и как правильно применить Transaction Encoder к этому набору данных ...

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

IIUC, вы можете сложить кадр данных и попробовать crosstab:

df =  pd.read_csv('retail.dat', sep=' ', header=None)
new_df = df.stack().astype(int).reset_index(name='value')
pd.crosstab(new_df['level_0'], new_df['value'])

Вывод:

value    0   1   2   3   4   5   6   7   8   9   ...  53  54  55  56  57  58  ...
level_0                                          ...                           
0         1   1   1   1   1   1   1   1   1   1  ...   0   0   0   0   0   0   
1         0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   
2         0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   
3         0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   
4         0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   
5         0   0   0   0   0   0   0   0   0   0  ...   1   1   1   1   1   1   
6         0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   
7         0   0   0   1   0   0   0   0   0   0  ...   0   0   0   0   0   0   
1 голос
/ 17 октября 2019

Вы можете попробовать это:

import pandas as pd
import numpy as np
from io import StringIO
from mlxtend.preprocessing import TransactionEncoder

inputstr = StringIO("""0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
30 31 32 
33 34 35 
36 37 38 39 40 41 42 43 44 45 46 
38 39 47 48 
38 39 48 49 50 51 52 53 54 55 56 57 58 
32 41 59 60 61 62 
3 39 48 """)

df = pd.read_csv(inputstr, header=None,sep='\s+')
df_out = df.apply(lambda x: list(x.dropna().values), axis=1).tolist()

transactionEncoder = TransactionEncoder()
dataset = transactionEncoder.fit(df_out).transform(df_out)
dataset = dataset.astype('int')
print(dataset)

Вывод:

[[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
  0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]
 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

и преобразование в фрейм данных:

dataset_df = pd.DataFrame(dataset)

Вывод:

    0   1   2   3   4   5   6   7   8   9   ...  53  54  55  56  57  58  59 
0   1   1   1   1   1   1   1   1   1   1  ...   0   0   0   0   0   0   0   
1   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   
2   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   
3   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   
4   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   
5   0   0   0   0   0   0   0   0   0   0  ...   1   1   1   1   1   1   0   
6   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   1   
7   0   0   0   1   0   0   0   0   0   0  ...   0   0   0   0   0   0   0 
...