Python 3 – wie man Mosaikplots aus höherdimensionalen Daten macht?

Ich habe ein Pandas-DataFrame:

data = pd.read_csv(r'C:\data-path\demographics.csv', sep=',') print(data)

  • Wie kann ich Python 3 in Cython's setup.py angeben?
  • Umgang mit Standardparametern in Zython
  • Mit Cython können Sie Funktionalität einer anderen Anwendung aussetzen
  • Cython memoryview transpose: Typfehler
  • Mit einem Wörterbuch in Cython, vor allem im Nogil
  • Wie benutzt man Cython, um Python 3 in C zu kompilieren
  • PersonID Married No. of Children Sex 1 yes 0 male 2 no 0 female 3 no 1 male 4 yes 1 male 5 no 1 female 6 no 2 female 7 no 1 male 8 no 2 male 9 no 2 male 10 no 1 male 11 no 0 female

    Jetzt versuche ich, ein Mosaikplot daraus zu machen, mit statsmodels.graphics.mosaicplot

    mosaic(data, ['Married', 'No. of Children'])

    … was funktioniert aber, wann immer ich versuche, eine dritte Dimension hinzuzufügen, zum Beispiel:

    mosaic(data, ['Married', 'No. of Children', 'Sex'])

    … bekomme ich folgende Fehlermeldung:

    ValueError: at least one proportion should begreater than zero

    Ich bin mir nicht sicher, was es von mir will Gibt es einen Parameter fehlt / falsch eingestellt?

    Es spielt auch keine Rolle, welche Spalten / Abmessungen ich wähle oder in welcher Reihenfolge. Immer wenn ich mehr als 2 habe, bekomme ich einen Fehler.

    Jemand hat eine Idee?

    Danke im Voraus

  • Löschen Sie eine Spalte in einem mehrdimensionalen Array, wenn alle Elemente in dieser Spalte eine Bedingung erfüllen
  • Wie man Zeilen aus einer Datei in ein multidimensionales Array (oder ein Array von Listen) in Python liest
  • Wie initialisiert man ein zweidimensionales Array in Python?
  • Matrix Transponieren in Python
  • Holen Sie sich die Indizes der N höchsten Werte in einem ndarray
  • Pythonische Art, 2D-Liste zu drucken - Python
  • One Solution collect form web for “Python 3 – wie man Mosaikplots aus höherdimensionalen Daten macht?”

    Nach einigen Basteln fand ich die Lösung aber nicht den Ursprung des Bugs.

    Es liegt im Code der Mosaikplot-Klasse / -Modul: http://nipy.bic.berkeley.edu/nightly/statsmodels/doc/html/_modules/statsmodels/graphics/mosaicplot.html

    Kurz gesagt: Es ist nicht möglich, Klassen in einem Datensatz zu behandeln, die leer sind, dh 0 Instanzen haben.

    Betrachten Sie den Datensatz aus der ursprünglichen Frage und dann den folgenden Funktionsaufruf:

    mosaic(data, ['Married', 'No. of Children'])

    Was die "Mosaik" -Methode tun wird, ist zu bestimmen, wie viele Klassen die erste Kategorie hat (in diesem Fall: 2) und dann, wie oft jede der Klassen auftritt. Es wird dann eine Liste von "Proportionen" für die Handlung der Handlung auf der Grundlage der, die im Falle der 'Married'-Kategorie wird

    [2, 9]

    … da gibt es 2 'ja' und 9 'nein' Instanzen.

    Für jede der Klassen gibt es neue Splits, nach der zweiten Kategorie, hier: 'Nr. von Kindern'. Es gibt 3 Klassen (0, 1 und 2) und dies erzeugt die folgenden "Proportionen":

    [1, 1, 0] (1 verheiratet mit 0 Kindern, 1 verheiratet mit 1 Kind, 0 verheiratet mit 2 Kindern)

    [2, 4, 3] (1 Einzelzimmer mit 0 Kindern, etc ….)

    Auf der Grundlage der oben genannten allein ist es in der Lage, eine perfekt feine Mosaik-Plot zu zeichnen.

    Sobald wir aber eine dritte Kategorie berücksichtigen (zB: "Sex"), wird das 0 in einer der oben genannten Listen zum Problem. Es wird die Liste [0, 0], wie sie sind 0 verheiratete Männer / Frauen mit 2 Kindern.

    Und in der Zeile 45 des Quellcodes gibt es eine if-Klausel, die die Ausnahme überhaupt-0-Listen erhöhen wird (da sie "nicht sinnvoll" sind).

    Wie oben gesagt, war ich nicht in der Lage, eine Fix / Workaround zu finden, um dies zu tun. Einfach ausgehende if-Klausel wird es erlauben, dass alle Splits normal ausgeführt werden, aber dies wird auch dazu führen, dass die Zeichnung der Mosaik-Plot eine Ausnahme in matplotlib's backend_agg.py zu werfen, wie irgendwie sind sie jetzt Werte, die NaN sind (Keine Zahl).

    Warum das ist, ich habe keine Ahnung, und ich würde mich freuen, wenn jemand heller und erfahrener wäre, als ich das anschauen würde.

    Ich werde immer noch nicht ausschließen, dass ich nur einige Parameter anders einstellen muss.

    Python ist die beste Programmiersprache der Welt.