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#

  1. Prüfen Sie, ob Squirrel bereits 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.arcsine Verteilung eine Spezialisierung der scipy.stats.beta Verteilung. 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.

  2. Erstellen Sie ein SciPy-Issue auf GitHub, in dem die Verteilung, Referenzen und Gründe für ihre Aufnahme aufgeführt sind.

Implementierung#

  1. Finden Sie eine bereits vorhandene Verteilung, die Squirrel ähnelt. Verwenden Sie deren Code als Vorlage für Squirrel.

  2. Lesen Sie den Docstring für die Klasse rv_continuous in scipy/stats/_distn_infrastructure.py.

  3. Schreiben Sie den neuen Code für die Klasse squirrel_gen und fügen Sie ihn in scipy/stats/_continuous_distns.py ein, das (meistens) alphabetisch nach Verteilungsnamen sortiert ist.

  4. Hat die Verteilung eine unendliche Trägerfunktion? Wenn nicht, müssen die linken und/oder rechten Endpunkte a, b in dem Aufruf von squirrel_gen(name='squirrel', a=?, b=?) angegeben werden.

  5. Wenn die Trägerfunktion von den Formparametern abhängt, muss squirrel_gen._get_support() implementiert werden.

  6. Die standardmäßige geerbte Implementierung von _argcheck() prüft, ob die Formparameter positiv sind. Erstellen Sie eine passendere Implementierung.

  7. Wenn squirrel_gen.ppf() im Vergleich zu squirrel_gen.pdf() teuer in der Berechnung ist, erwägen Sie, momtype im Aufruf von squirrel_gen() festzulegen.

  8. Wenn squirrel_gen.rvs() teuer in der Berechnung ist, erwägen Sie, ein spezifisches squirrel_gen._rvs() zu implementieren.

  9. Fügen Sie den Namen der Auflistung im Docstring von scipy/stats/__init__.py hinzu.

  10. Fügen Sie den Namen und einen guten Satz von Beispiel-Formparametern zur Liste distcont in scipy/stats/_distr_params.py hinzu. Diese Formparameter werden sowohl für Tests als auch für die automatische Dokumentationsgenerierung verwendet.

  11. 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.

  12. Fügen Sie eine TestSquirrel Klasse und alle spezifischen Tests zu scipy/stats/tests/test_distributions.py hinzu.

  13. Führen Sie die Tests aus und bestehen Sie sie!

Nach der Implementierung#

  1. Fügen Sie ein Tutorial doc/source/tutorial/stats/continuous_squirrel.rst hinzu

  2. Fügen Sie es der Liste der kontinuierlichen Verteilungen in doc/source/tutorial/stats/continuous.rst hinzu.

  3. Aktualisieren Sie die number of continuous distributions im Beispielcode in doc/source/tutorial/stats.rst.

  4. Erstellen Sie die Dokumentation erfolgreich.

  5. Reichen Sie einen PR ein.

Referenzen#

[JKB]

Johnson, Kotz und Balakrishnan, „Continuous Univariate Distributions, Volume 1“, Zweite Auflage, John Wiley and Sons, S. 173 (1994).