Ошибка типа: при генерации комбинаций с групповым - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь реализовать алгоритм интеллектуального анализа правил ассоциации Apriori. Я переключился на использование генераторов для создания пар наборов кандидатов. Когда я пытаюсь создать комбинации, я получаю 'TypeError:' int 'объект не может быть подписан'

вот пример фрейма данных заказов

https://puu.sh/DdJSj/0b6401efac.png

from collections import Counter
from itertools import groupby, combinations
import pandas

#now we will use a generator instead of dicts to save memory
def generate_pairs(orders, k):
    #generate item list for order
    for id, order in groupby(orders, lambda x: x[0]):
        items = [item[0] for item in order]

    #generate pairs for each itemlist
    for pair in combinations(items, k):
        yield pair

def itemcount(iterable):
    if type(iterable) == pandas.core.series.Series:
        return iterable.value_counts().rename("count")
    else:
        return pandas.Series(Counter(iterable)).rename("count")
pair_generator = generate_pairs(orders, 2)
print(pair_generator)
pairs = itemcount(pair_generator).to_frame("count(AB)")

Результаты в

Traceback (most recent call last):
  File "C:/Users/Cosco/PycharmProjects/untitled/finalp/final.py", line 183, in <module>
    rules = generate_rules(transactions, supp_percent)
  File "C:/Users/Cosco/PycharmProjects/untitled/finalp/final.py", line 80, in generate_rules
    pairs = itemcount(pair_generator).to_frame("count(AB)")
  File "C:/Users/Cosco/PycharmProjects/untitled/finalp/final.py", line 33, in itemcount
    print(type(pandas.Series(Counter(iterable)).rename("count")))
  File "C:\Users\Cosco\Miniconda3\lib\collections\__init__.py", line 534, in __init__
    self.update(*args, **kwds)
  File "C:\Users\Cosco\Miniconda3\lib\collections\__init__.py", line 621, in update
    _count_elements(self, iterable)
  File "C:/Users/Cosco/PycharmProjects/untitled/finalp/final.py", line 22, in generate_pairs
    for id, order in groupby(orders, lambda x: x[0]):
  File "C:/Users/Cosco/PycharmProjects/untitled/finalp/final.py", line 22, in <lambda>
    for id, order in groupby(orders, lambda x: x[0]):
TypeError: 'int' object is not subscriptable

Что я делаю не так? Я понимаю, что x должен быть итеративным, однако при отладке x представляет собой один item_id

edit: генератор работает (некорректно), когда generate_pairs () изменяется следующим образом:

def generate_pairs(orders, k):
    orders = orders.reset_index().values
    #generate item list for order
    for id, order in groupby(orders, lambda x: x[0]):
        itemlist = [item[1] for item in order]

    #generate pairs for each itemlist
    for pair in combinations(itemlist, k):
        yield pair

1 Ответ

0 голосов
/ 12 апреля 2019

Вы предполагаете, что панды DataFrames работают как списки, но они не работают.

Вы можете изменить свою программу следующим образом:

def generate_pairs(orders, k):
    orders = orders.values.tolist()
    ...

Но помните, что вы не сможете получить доступ к меткам или форматированию внутри generate_pairs.

Примечание : Вы также можете обойтись с orders = orders.values - это избавит вас от O(n) копирования данных (от numpy до PyList), но может оказаться проблематичным, если вы ожидаете orders тип, чтобы быть точно списком.

...