簡體   English   中英

從 RapidMiner Studio 中的執行 Python 處理器返回 pandas DataFrame 時出現 ValueError

[英]ValueError when returning pandas DataFrame from Execute Python processor in RapidMiner Studio

在 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 env)時,從 RapidMiner 中的設置>首選項>Python 腳本,所有測試都成功通過。

來自 .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&#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 對使用產生上述錯誤的代碼的處理器完成進行某種檢查,因此它失敗並且處理器終止。

是否有一種特殊的正確方法來處理和返回 RapidMiner 中的 DataFrames 以繞過錯誤,或者是否有其他我可以檢查以找出問題所在的方法?

為了進一步調試問題,我開始將新列一一添加到生成的 DataFrame 中。 這使我有以下發現:

當 DataFrame 包含一列 (pandas.DataFrame.Series),其元素為 numpy.ndarrays 或列表,其元素為零(整數或浮點數)時,就會出現問題。 當“Execute Python”處理器返回時,RapidMiner 嘗試確定 DataFrame 的每個單元格是否返回 Null 或是否具有值。 為了做到這一點,基於異常堆棧跟蹤,代碼必須檢查單元格的內容是否為 None,當元素是列表或 numpy ndarrays 時,這不是進行此檢查的有效方法。 因此,異常消息告訴我們,當數組中存在多個元素時,無法確定真值(或是否為 None),盡管它們全為零。

因此,在這種情況下,解決方案是確保當返回的 DataFrame 有一個包含列表或數組的列時,它們的任何實例都不包含全零。 還可以避免將列表或數組放入返回的 DataFrame 中。 另一件可行的事情是在代碼中進行適當的無效檢查(使用 array.all()),當找到一個包含所有零元素的數組或列表時,整個單元格的內容將替換為 None 或另一個值結果的接收者將解釋為 null。 當然,也可以等待下一個版本的 RapidMiner Studio,它可能會以正確的方式進行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM