Как исправить Numpy 'otypes' в рамках данных Pandas? - PullRequest
0 голосов
/ 27 октября 2018

Цель: запустить правила ассоциации для набора данных двоичных значений

d = {'col1': [0, 0,1], 'col2': [1, 0,0], 'col3': [0,1,1]}
df = pd.DataFrame(data=d)

Создает фрейм данных с 0 и 1 для соответствующих значений столбца.

Проблема в том, что я использую код, подобный следующему:

from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
frequent_itemsets = apriori(pattern_dataset, min_support=0.50,use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
rules

Обычно это работает просто отлично, но в этот раз я столкнулся с ошибкой.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-61-46ec6f572255> in <module>()
      4 frequent_itemsets = apriori(pattern_dataset, min_support=0.50,use_colnames=True)
      5 frequent_itemsets
----> 6 rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
      7 rules

D:\AnaConda\lib\site-packages\mlxtend\frequent_patterns\association_rules.py in association_rules(df, metric, min_threshold, support_only)
    127     values = df['support'].values
    128     frozenset_vect = np.vectorize(lambda x: frozenset(x))
--> 129     frequent_items_dict = dict(zip(frozenset_vect(keys), values))
    130 
    131     # prepare buckets to collect frequent rules

D:\AnaConda\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
   1970             vargs.extend([kwargs[_n] for _n in names])
   1971 
-> 1972         return self._vectorize_call(func=func, args=vargs)
   1973 
   1974     def _get_ufunc_and_otypes(self, func, args):

D:\AnaConda\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
   2040             res = func()
   2041         else:
-> 2042             ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
   2043 
   2044             # Convert args to object arrays first

D:\AnaConda\lib\site-packages\numpy\lib\function_base.py in _get_ufunc_and_otypes(self, func, args)
   1996             args = [asarray(arg) for arg in args]
   1997             if builtins.any(arg.size == 0 for arg in args):
-> 1998                 raise ValueError('cannot call `vectorize` on size 0 inputs '
   1999                                  'unless `otypes` is set')
   2000 

ValueError: cannot call `vectorize` on size 0 inputs unless `otypes` is set

Это то, что я имею для dtypes в Пандах, любая помощь будет оценена.

col1    int64
col2    int64
col3    int64
dtype: object

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Обходной путь:

def encode_units(x):
    if x <= 0:
        return 0
    if x >= 1:
        return 1

yourdataset_sets = yourdataset.applymap(encode_units)

frequent_itemsets = apriori(yourdataset_sets, min_support=0.001, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)

Кредит: saeedesmaili

0 голосов
/ 28 октября 2018
    128     frozenset_vect = np.vectorize(lambda x: frozenset(x))
--> 129     frequent_items_dict = dict(zip(frozenset_vect(keys), values))

Здесь np.vectorize оборачивает функцию frozenset(x) в код, который может принимать массив или список (keys) и передавать каждый элемент для оценки. Это своего рода numpy итерация (удобно, но не быстро). Но чтобы определить, какой тип (dtype) массива он возвращает, он выполняет тестовый запуск с первым элементом keys. Альтернативой этому тестовому прогону является использование параметра otypes.

В любом случае, в данном конкретном прогоне keys, очевидно, пуст, массив или список 0 размера. Он может вернуть эквивалентный массив результатов формы, но ему все равно нужно установить dtype. Отсюда и ошибка.

Очевидно, автор кода никогда не ожидал, что keys будет пустым. Поэтому вам нужно решить вопрос, почему он пуст?

Нам нужно посмотреть на код association_rules и посмотреть, как установлен keys. Его использование в строке 129 предполагает, что оно имеет то же количество элементов, что и values, которое получено из df с:

values = df['support'].values

Если keys имеет 0 элементов, то values также имеет, а df имеет 0 'строк'.

Какой размер frequent_itemsets?

Я добавляю тег mlxtend, потому что ошибка возникает во время использования его кода. Вам / нам нужно изучить этот код или его документацию, чтобы определить, почему этот фрейм данных пуст.

...