Python: Wie erstellt man ein Histogramm mit gleich * großen * Bins?

8

Ich habe eine Reihe von Daten und möchte daraus ein Histogramm machen. Ich brauche die Bins, um die gleiche Größe zu haben, mit der ich meine, dass sie die gleiche Anzahl von Objekten enthalten müssen, anstatt das häufigere (numpy.histogram) Problem mit gleichen Abständen Mülleimer. Dies wird natürlich auf Kosten der Behälterbreiten gehen, die - und im Allgemeinen - anders sein können.

Ich gebe die Anzahl der gewünschten Bins und den Datensatz an und erhalte die Bins-Kanten im Gegenzug.

%Vor%

So enthalten die Bins alle 2 Punkte, aber ihre Breiten (0,3, 0,8, 0,02) sind unterschiedlich.

Es gibt zwei Einschränkungen: - Wenn eine Gruppe von Daten identisch ist, könnte der Behälter, der sie enthält, größer sein. - Wenn N Daten und M Bins angefordert werden, gibt es N / M Bins plus eins, wenn N% M nicht 0 ist.

Dieses Stück Code ist etwas, was ich geschrieben habe, was bei kleinen Datensätzen gut funktioniert. Was ist, wenn ich 10 ** 9 + Punkte habe und den Prozess beschleunigen möchte?

%Vor%     
astabada 12.10.2012, 16:07
quelle

4 Antworten

10

Verwenden Sie Ihren Beispielfall (Fächer mit 2 Punkten, 6 Gesamtdatenpunkte):

%Vor%     
aganders3 12.10.2012, 16:21
quelle
2

Update für verzerrte Distributionen:

Ich stieß auf das gleiche Problem wie @astabada und wollte Bins erstellen, die jeweils die gleiche Anzahl von Samples enthalten. Als ich die Lösung @ aganders3 anwendete, fand ich heraus, dass sie nicht besonders gut für verzerrte Distributionen funktioniert. Im Falle von schiefen Daten (z. B. etwas mit einer ganzen Menge von Nullen) garantiert stats.mstats.mquantiles für eine vordefinierte Anzahl von Quantilen nicht die gleiche Anzahl von Proben in jeder Bin. Sie werden Behälterkanten erhalten, die wie folgt aussehen:

%Vor%

In diesem Fall ist der erste Behälter leer.

Um mit verzerrten Fällen umzugehen, habe ich eine Funktion erstellt, die stats.mstats.mquantiles aufruft und dann dynamisch die Anzahl der Klassen ändert, wenn die Samples innerhalb einer bestimmten Toleranz nicht gleich sind (30% der kleinsten Beispielgröße im Beispielcode) . Wenn Samples zwischen Bins nicht gleich sind, reduziert der Code die Anzahl der gleichmäßig verteilten Quantile um 1 und ruft stats.mstats.mquantiles erneut auf, bis die Sample-Größen gleich sind oder nur ein Bin existiert.

Ich habe die Toleranz im Beispiel hart codiert, aber dies könnte zu einem Schlüsselwortargument geändert werden, falls gewünscht.

Ich bevorzuge es auch, die Anzahl von gleich beabstandeten Quantilen als ein Argument für meine Funktion zu geben, anstatt benutzerdefinierte Quantile an stats.mstats.mquantiles zu geben, um zufällige Fehler zu reduzieren (d. h. etwas wie [0., 0.25, 0.7, 1.] ).

Hier ist der Code:

%Vor%     
SpicyBaguette 10.05.2016 13:25
quelle
0

Sortieren Sie die Daten einfach und teilen Sie sie in feste Bins nach Länge! Natürlich können Sie niemals in genau gleich große Bins aufteilen, wenn die Anzahl der Samples nicht genau durch die Anzahl der Bins geteilt wird.

%Vor%     
samwise 31.08.2017 17:05
quelle
0

Ich möchte auch die Existenz von pandas.qcut erwähnen, was gleichmässig bevölkerten Binning auf eine sehr effiziente Art und Weise macht. In deinem Fall würde es so etwas wie

funktionieren %Vor%     
Pietro Marchesi 29.01.2018 11:53
quelle

Tags und Links