在RapidMiner Studio 9.5.1中,在我的python脚本完成后,我可以打印出结果数据,并看到它是按照预期的方式生成的,并使用适当的列。rapidminer处理器在消息中仍然失败:
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库,以防它与旧版本存在兼容性问题,但仍然没有解决方案。
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是:
<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 # rm_main is a mandatory function, # the number of arguments has to be the number of input ports (can be none) def rm_main(data): print('Hello, world!') # output can be found in Log View print(type(data)) #your code goes here #for example: data2 = pandas.DataFrame([3,5,77,8]) # connect 2 output ports to see the results 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>到目前为止,我已经尝试过:
所有这些尝试都导致了上述相同的错误。
我的猜测是,RapidMiner对处理器的完成进行了某种检查,它使用了产生上述错误的代码,因此它失败了,处理器终止了。
是否有一种特殊的适当方法来处理和返回DataFrames中的RapidMiner以绕过错误,或者我还可以检查其他什么方法来找出问题的所在?
发布于 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的下一个版本,它可能以正确的方式进行检查。
https://stackoverflow.com/questions/59847830
复制相似问题