首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError从RapidMiner Studio中执行RapidMiner处理器返回熊猫时的RapidMiner

ValueError从RapidMiner Studio中执行RapidMiner处理器返回熊猫时的RapidMiner
EN

Stack Overflow用户
提问于 2020-01-21 19:18:14
回答 1查看 226关注 0票数 1

在RapidMiner Studio 9.5.1中,在我的python脚本完成后,我可以打印出结果数据,并看到它是按照预期的方式生成的,并使用适当的列。rapidminer处理器在消息中仍然失败:

代码语言:javascript
复制
Exception: com.rapidminer.operator.OperatorException
Message: Script terminated abnormally: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Stack trace:
  com.rapidminer.extension.pythonscripting.operator.scripting.AbstractScriptRunner.run(AbstractScriptRunner.java:137)
  com.rapidminer.extension.pythonscripting.operator.scripting.AbstractScriptingLanguageOperator.doWork(AbstractScriptingLanguageOperator.java:210)
  com.rapidminer.extension.pythonscripting.operator.scripting.python.PythonScriptingOperator.doWork(PythonScriptingOperator.java:434)
  com.rapidminer.operator.Operator.execute(Operator.java:1032)
  com.rapidminer.operator.execution.SimpleUnitExecutor.execute(SimpleUnitExecutor.java:77)
  com.rapidminer.operator.ExecutionUnit$2.run(ExecutionUnit.java:812)
  com.rapidminer.operator.ExecutionUnit$2.run(ExecutionUnit.java:807)
  java.security.AccessController.doPrivileged(Native Method)
  com.rapidminer.operator.ExecutionUnit.execute(ExecutionUnit.java:807)
  com.rapidminer.operator.OperatorChain.doWork(OperatorChain.java:423)
  com.rapidminer.operator.Operator.execute(Operator.java:1032)
  com.rapidminer.Process.executeRoot(Process.java:1378)
  com.rapidminer.Process.lambda$executeRootInPool$5(Process.java:1357)
  com.rapidminer.studio.concurrency.internal.AbstractConcurrencyContext$AdaptedCallable.exec(AbstractConcurrencyContext.java:328)
  java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
  java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
  java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
  java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

没有提供任何其他洞察力,也没有引用脚本中我的代码中的一行。我已经更新了numpy库,以防它与旧版本存在兼容性问题,但仍然没有解决方案。

代码语言:javascript
复制
numpy                     1.14.5                   pypi_0    pypi
numpy-base                1.16.4           py36hc3f5095_0    defaults
numpydoc                  0.9.1                      py_0    defaults
pandas                    0.25.3           py36ha925a31_0    defaults

此外,当检查python环境是否正常(Anaconda )时,从Settings>Preferences>Python脚本到RapidMiner,所有测试都会成功通过。

来自.rmp文件的处理器xml是:

代码语言:javascript
复制
  <operator activated="true" class="python_scripting:execute_python" compatibility="9.5.000" expanded="true" height="103" name="Execute Python" width="90" x="313" y="34">
    <parameter key="script" value="import pandas&#10;&#10;# rm_main is a mandatory function, &#10;# the number of arguments has to be the number of input ports (can be none)&#10;def rm_main(data):&#10;    print('Hello, world!')&#10;    # output can be found in Log View&#10;    print(type(data))&#10;&#10;    #your code goes here&#10;&#10;    #for example:&#10;    data2 = pandas.DataFrame([3,5,77,8])&#10;&#10;    # connect 2 output ports to see the results&#10;    return data, data2"/>
    <parameter key="script_file" value="%{ResourcePath}\detect_aggressive_language.py"/>
    <parameter key="notebook_cell_tag_filter" value=""/>
    <parameter key="use_default_python" value="true"/>
    <parameter key="package_manager" value="conda (anaconda)"/>
    <description align="center" color="transparent" colored="false" width="126">Detect Script</description>
  </operator>

到目前为止,我已经尝试过:

  1. 用我的计算列更新初始的DataFrame (数据)并返回它。
  2. 用我的列创建一个新的DataFrame,然后单独或作为数据之后的第二个参数返回。
  3. 创建一个方法(在脚本中),它接受初始DataFrame数据作为参数,进行修改,然后返回它。
  4. Pickle新DataFrame,保存它,加载它并返回它。

所有这些尝试都导致了上述相同的错误。

我的猜测是,RapidMiner对处理器的完成进行了某种检查,它使用了产生上述错误的代码,因此它失败了,处理器终止了。

是否有一种特殊的适当方法来处理和返回DataFrames中的RapidMiner以绕过错误,或者我还可以检查其他什么方法来找出问题的所在?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-26 10:18:05

为了进一步调试这个问题,我开始一个接一个地将新列添加到我生成的DataFrame中。这使我得出以下发现:

当DataFrame包含一个列(pandas.DataFrame.Series),其元素是numpy.ndarrays或lists,其元素都是零(整数或浮点数)时,就会出现问题。当“执行Python”处理器返回时,RapidMiner试图确定DataFrame的每个单元格是以Null格式返回还是具有一个值。为此,根据异常堆栈跟踪,当元素是列表或numpy ndarray时,代码必须检查单元格的内容是否为None,这不是进行此检查的有效方法。因此出现了异常消息,它告诉我们,当数组中存在更多的元素时,不能确定真值(或它是否为空),尽管它们都为零。

因此,在本例中,解决方案是确保当返回的DataFrame有包含列表或数组的列时,它们的任何实例都不包含所有零。还可以避免在返回的DataFrame中放置列表或数组。另一件可以工作的事情是在代码中进行适当的无效检查(使用array.all()),当找到一个包含所有零元素的数组或列表时,整个单元格的内容将被替换为None或另一个值,结果的接收方将其解释为null。当然,我们也可以等待RapidMiner Studio的下一个版本,它可能以正确的方式进行检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59847830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档