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%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:
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% 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