如何在 Pandas 数据帧内修复 Numpy 'otypes'?
How to fix Numpy 'otypes' within Pandas dataframe?
Objective: 运行 二进制值数据集上的关联规则
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
这就是我在 Pandas 中的数据类型,如有任何帮助,我们将不胜感激。
col1 int64
col2 int64
col3 int64
dtype: object
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
迭代(方便,但速度不快)。但是为了确定它 return 是哪种数组 (dtype
),它使用 keys
的第一个元素执行测试 运行。执行此测试 运行 的另一种方法是使用 otypes
参数。
无论如何,在这个特定的 运行 中,keys
显然是空的,一个 0 大小的数组或列表。它可以 return 一个等效形状的结果数组,但它仍然必须设置一个 dtype
。因此错误。
显然,代码编写者从未预料到 keys
为空的情况。所以你需要解决为什么它是空的问题?
我们需要查看 association_rules
代码,看看 keys
是如何设置的。它在第 129 行中的使用表明它具有与 values
相同数量的元素,这是从 df
派生的:
values = df['support'].values
如果 keys
有 0 个元素,那么 values
也是如此,而 df
有 0 个 'rows'.
frequent_itemsets
的尺寸是多少?
我添加了一个mlxtend
标签,因为在使用它的代码过程中出现了错误。 You/we 需要检查该代码或其文档以确定此数据帧为何为空。
解决方法:
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
Objective: 运行 二进制值数据集上的关联规则
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
这就是我在 Pandas 中的数据类型,如有任何帮助,我们将不胜感激。
col1 int64
col2 int64
col3 int64
dtype: object
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
迭代(方便,但速度不快)。但是为了确定它 return 是哪种数组 (dtype
),它使用 keys
的第一个元素执行测试 运行。执行此测试 运行 的另一种方法是使用 otypes
参数。
无论如何,在这个特定的 运行 中,keys
显然是空的,一个 0 大小的数组或列表。它可以 return 一个等效形状的结果数组,但它仍然必须设置一个 dtype
。因此错误。
显然,代码编写者从未预料到 keys
为空的情况。所以你需要解决为什么它是空的问题?
我们需要查看 association_rules
代码,看看 keys
是如何设置的。它在第 129 行中的使用表明它具有与 values
相同数量的元素,这是从 df
派生的:
values = df['support'].values
如果 keys
有 0 个元素,那么 values
也是如此,而 df
有 0 个 'rows'.
frequent_itemsets
的尺寸是多少?
我添加了一个mlxtend
标签,因为在使用它的代码过程中出现了错误。 You/we 需要检查该代码或其文档以确定此数据帧为何为空。
解决方法:
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