Hinzufügen neuer Methoden, Funktionen und Klassen#
Das Hinzufügen von Code zu SciPy ist in den meisten Fällen recht einfach, aber es gibt einige Stellen, an denen dies nicht der Fall ist. Dieses Dokument enthält detaillierte Informationen zu einigen spezifischen Situationen, in denen es auf den ersten Blick unklar sein mag, was die Aufgabe beinhaltet.
Hinzufügen einer neuen Statistikverteilung#
Seit Jahrhunderten müssen Statistiker, Mathematiker und Wissenschaftler Daten verstehen, analysieren und modellieren. Dies hat zu einer Fülle von Statistikverteilungen geführt, von denen viele miteinander verwandt sind. Die Modellierung neuer Datentypen führt weiterhin zu neuen Verteilungen, ebenso wie theoretische Überlegungen, die auf neue Disziplinen angewendet werden. SciPy modelliert etwa ein Dutzend diskrete Verteilungen Diskrete statistische Verteilungen und 100 kontinuierliche Verteilungen Kontinuierliche statistische Verteilungen.
Um eine neue Verteilung hinzuzufügen, ist eine gute Referenz erforderlich. Scipy verwendet typischerweise [JKB] als Goldstandard, wobei WikipediaDistributions Artikel oft zusätzliche Details und/oder grafische Darstellungen liefern.
Wie erstelle ich eine neue kontinuierliche Verteilung#
Es gibt einige Schritte, die unternommen werden müssen, um eine kontinuierliche Verteilung zu SciPy hinzuzufügen. (Das Hinzufügen einer diskreten Verteilung ist ähnlich). Wir werden die fiktive „Squirrel“-Verteilung in den folgenden Anweisungen verwenden.
Vor der Implementierung#
Prüfen Sie, ob
Squirrelbereits implementiert wurde – das spart viel Mühe!Sie wurde möglicherweise unter einem anderen Namen implementiert.
Sie wurde möglicherweise mit einer anderen Parametrisierung (Formparameter) implementiert.
Es könnte sich um eine Spezialisierung einer allgemeineren Verteilungsfamilie handeln.
Es ist sehr üblich, dass mehrere Disziplinen eine Verteilung (oder eine Spezialisierung oder eine andere Parametrisierung) entdecken/wiederentdecken. Es gibt einige bestehende SciPy-Verteilungen, die Spezialisierungen anderer Verteilungen sind. Z.B. ist die
scipy.stats.arcsineVerteilung eine Spezialisierung derscipy.stats.betaVerteilung. Diese Duplikate existieren aus (sehr!) historischen und weit verbreiteten Nutzungsgründen. Derzeit wird das Hinzufügen neuer Spezialisierungen/Reparametrisierungen bestehender Verteilungen zu SciPy nicht unterstützt, hauptsächlich aufgrund der zunehmenden Verwirrung bei den Benutzern, die sich aus solchen Ergänzungen ergeben.Erstellen Sie ein SciPy-Issue auf GitHub, in dem die Verteilung, Referenzen und Gründe für ihre Aufnahme aufgeführt sind.
Implementierung#
Finden Sie eine bereits vorhandene Verteilung, die
Squirrelähnelt. Verwenden Sie deren Code als Vorlage fürSquirrel.Lesen Sie den Docstring für die Klasse
rv_continuousin scipy/stats/_distn_infrastructure.py.Schreiben Sie den neuen Code für die Klasse
squirrel_genund fügen Sie ihn in scipy/stats/_continuous_distns.py ein, das (meistens) alphabetisch nach Verteilungsnamen sortiert ist.Hat die Verteilung eine unendliche Trägerfunktion? Wenn nicht, müssen die linken und/oder rechten Endpunkte
a,bin dem Aufruf vonsquirrel_gen(name='squirrel', a=?, b=?)angegeben werden.Wenn die Trägerfunktion von den Formparametern abhängt, muss
squirrel_gen._get_support()implementiert werden.Die standardmäßige geerbte Implementierung von
_argcheck()prüft, ob die Formparameter positiv sind. Erstellen Sie eine passendere Implementierung.Wenn
squirrel_gen.ppf()im Vergleich zusquirrel_gen.pdf()teuer in der Berechnung ist, erwägen Sie,momtypeim Aufruf vonsquirrel_gen()festzulegen.Wenn
squirrel_gen.rvs()teuer in der Berechnung ist, erwägen Sie, ein spezifischessquirrel_gen._rvs()zu implementieren.Fügen Sie den Namen der Auflistung im Docstring von scipy/stats/__init__.py hinzu.
Fügen Sie den Namen und einen guten Satz von Beispiel-Formparametern zur Liste
distcontin scipy/stats/_distr_params.py hinzu. Diese Formparameter werden sowohl für Tests als auch für die automatische Dokumentationsgenerierung verwendet.Fügen Sie den Namen und einen _ungültigen_ Satz von Beispiel-Formparametern zur Liste
invdistcont, ebenfalls in _distr_params.py, hinzu. Diese Formparameter werden ebenfalls für Tests verwendet.Fügen Sie eine
TestSquirrelKlasse und alle spezifischen Tests zu scipy/stats/tests/test_distributions.py hinzu.Führen Sie die Tests aus und bestehen Sie sie!
Nach der Implementierung#
Fügen Sie ein Tutorial
doc/source/tutorial/stats/continuous_squirrel.rsthinzuFügen Sie es der Liste der kontinuierlichen Verteilungen in doc/source/tutorial/stats/continuous.rst hinzu.
Aktualisieren Sie die
number of continuous distributionsim Beispielcode in doc/source/tutorial/stats.rst.Erstellen Sie die Dokumentation erfolgreich.
Reichen Sie einen PR ein.
Referenzen#
Johnson, Kotz und Balakrishnan, „Continuous Univariate Distributions, Volume 1“, Zweite Auflage, John Wiley and Sons, S. 173 (1994).