[FIXED] NotImplementedError beim Aufrufen von pandas_profiling.ProfileReport.to_widgets() in Apache Zeppelin

Ausgabe

Ich versuche, das Paket pandas_profiling zu verwenden, um einige Datenrahmen aus Apaceh Zeppelin automatisch zu beschreiben.

Der Code, den ich ausführe, ist:

%pyspark

import sys
print(sys.version_info)

import numpy as np
print("numpy: ", np.__version__)
import pandas as pd
print("pandas: ", pd.__version__)
import pandas_profiling as pp
print("pandas_profiling: ", pp.__version__)

from pandas_profiling import ProfileReport

df = spark.sql("SELECT * FROM database.table")

profile = ProfileReport(df, title="Report: table")

profile.to_widgets()

Mein Ergebnis ist:

sys.version_info(major=3, minor=6, micro=8, releaselevel='final', serial=0)
numpy:  1.19.5
pandas:  1.1.5
pandas_profiling:  3.1.0


Fail to execute line 19: profile.to_widgets()
Traceback (most recent call last):
  File "/tmp/1662648724242-0/zeppelin_python.py", line 158, in <module>
    exec(code, _zcUserQueryNameSpace)
  File "<stdin>", line 19, in <module>
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 414, in to_widgets
    display(self.widgets)
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 197, in widgets
    self._widgets = self._render_widgets()
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 315, in _render_widgets
    report = self.report
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 179, in report
    self._report = get_report_structure(self.config, self.description_set)
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 166, in description_set
    self._sample,
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/model/describe.py", line 56, in describe
    check_dataframe(df)
  File "/usr/local/lib/python3.6/site-packages/multimethod/__init__.py", line 209, in __call__
    return self[tuple(map(self.get_type, args))](*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pandas_profiling/model/dataframe.py", line 10, in check_dataframe
    raise NotImplementedError()
NotImplementedError

Gibt es eine Möglichkeit, dies zu umgehen? Irgendeine Hoffnung, es von Zeppelin aus zu umgehen?

Lösung

Die NotImplementedErrorwird erhoben von check_dataframe: https://github.com/ydataai/pandas-profiling/blob/v3.1.0/src/pandas_profiling/model/dataframe.py#L10 . check_dataframeverwendet Multimethod , um das Senden mehrerer Argumente an Funktionen zu ermöglichen, die derzeit nur Pandas DataFrames unterstützen: https://github.com/ydataai/pandas-profiling/blob/v3.1.0/src/pandas_profiling/model/pandas/dataframe_pandas.py#L11 . Im Code-Snippet stellen Sie einen Spark-Datenrahmen (das Ergebnis von spark.sql(...)) bereit, für den es anscheinend keine registrierte Funktion für den dynamischen Versand gibt. Wenn Sie den Spark-Datenrahmen mithilfe der toPandasMethode in einen Pandas-Datenrahmen konvertieren, sollte er die richtige check_dataframeFunktion aufrufen:

%pyspark

import sys
print(sys.version_info)

import numpy as np
print("numpy: ", np.__version__)
import pandas as pd
print("pandas: ", pd.__version__)
import pandas_profiling as pp
print("pandas_profiling: ", pp.__version__)

from pandas_profiling import ProfileReport

df = spark.sql("SELECT * FROM database.table").toPandas() 

profile = ProfileReport(df, title="Report: table")

profile.to_widgets()

Alternativ können Sie versuchen, Ihre eigene Funktion zum Überprüfen von Spark-Datenrahmen zu registrieren, dh;

from pandas_profiling.model.dataframe import check_dataframe
from pyspark.sql import DataFrame as SparkDataFrame
@check_dataframe.register
def spark_check_dataframe(df: SparkDataFrame):
   # do something here or just make it a `pass`

aber nachgelagerte Funktionen in der Berichtslogik sind möglicherweise nicht mit Spark-Datenrahmen kompatibel (und sind es wahrscheinlich nicht).

Eine weitere Alternative, wenn Sie aufgrund des Umfangs der Daten oder des Komforts mit der API weiterhin mit Spark-Datenrahmen arbeiten möchten, ist spark-df-profiling , das auf Pandas-Profilerstellung basiert, aber für die Handhabung von Spark-Datenrahmen entwickelt wurde.


Beantwortet von –
danielcahall


Antwort geprüft von –
Clifford M. (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like