Добавление новых методов, функций и классов#

Хотя добавление кода в SciPy в большинстве случаев довольно просто, есть несколько мест, где это не так. Этот документ содержит подробную информацию о некоторых конкретных ситуациях, когда с самого начала может быть неясно, что требуется для выполнения задачи.

Добавление нового статистического распределения#

В течение сотен лет статистикам, математикам и ученым требовалось понимать, анализировать и моделировать данные. Это привело к множеству статистических распределений, многие из которых связаны друг с другом. Моделирование новых типов данных продолжает порождать новые распределения, как и теоретические соображения, применяемые к новым дисциплинам. SciPy моделирует около дюжины дискретных распределений Дискретные статистические распределения и 100 непрерывных распределений Непрерывные статистические распределения.

Для добавления нового распределения необходим хороший справочный материал. Scipy обычно использует [JKB] в качестве эталонного стандарта, с WikipediaDistributions статьи часто предоставляют дополнительные детали и/или графические построения.

Как создать новое непрерывное распределение#

Есть несколько шагов для добавления непрерывного распределения в SciPy. (Добавление дискретного распределения аналогично). Мы будем использовать фиктивное распределение «Белка» в инструкциях ниже.

Перед реализацией#

  1. См., если Squirrel уже реализовано — это экономит много усилий!

    • Возможно, он был реализован под другим названием.

    • Возможно, он был реализован с другой параметризацией (параметры формы).

    • Это может быть специализация более общего семейства распределений.

    Очень часто разные дисциплины открывают/переоткрывают распределение (или его специализацию, или другую параметризацию). В SciPy уже есть несколько распределений, которые являются специализациями других распределений. Например, scipy.stats.arcsine распределение является специализацией scipy.stats.beta распределение. Эти дублирования существуют по (очень!) историческим и широко распространенным причинам использования. В настоящее время добавление новых специализаций/репараметризаций существующих распределений в SciPy не поддерживается, в основном из-за увеличения путаницы пользователей, возникающей в результате таких добавлений.

  2. Создать Проблема SciPy на GitHub, перечисляя распределение, ссылки и причины его включения.

Реализация#

  1. Найти уже существующее распределение, похожее на Squirrel. Используйте его код в качестве шаблона для Squirrel.

  2. Прочитайте строку документации для класса rv_continuous в scipy/stats/_distn_infrastructure.py.

  3. Написать новый код для класса squirrel_gen и вставить его в scipy/stats/_continuous_distns.py, который находится (в основном) в алфавитном порядке по названию распределения.

  4. Имеет ли распределение бесконечную поддержку? Если нет, то левая и/или правая границы a, b нужно указать при вызове squirrel_gen(name='squirrel', a=?, b=?).

  5. Если поддержка зависит от параметров формы, squirrel_gen._get_support() должен быть реализован.

  6. Унаследованный по умолчанию _argcheck() реализация проверяет, что параметры формы положительны. Создайте более подходящую реализацию.

  7. Если squirrel_gen.ppf() дорого вычислять по сравнению с squirrel_gen.pdf(), рассмотрите установку momtype в вызове к squirrel_gen().

  8. Если squirrel_gen.rvs() дорого вычислять, рассмотрите реализацию специфического squirrel_gen._rvs().

  9. Добавьте имя в список в docstring для scipy/stats/__init__.py.

  10. Добавить имя и хороший набор примерных параметров формы к distcont список в scipy/stats/_distr_params.py. Эти параметры формы используются как для тестирования, так и для автоматической генерации документации.

  11. Добавить имя и _недопустимый_ набор примерных параметров формы в список в invdistcont, также в _distr_params.py. Эти параметры формы также используются для тестирования.

  12. Добавить TestSquirrel класс и любые специфические тесты для scipy/stats/tests/test_distributions.py.

  13. Запустить и пройти(!) тесты.

После реализации#

  1. Добавить учебное пособие doc/source/tutorial/stats/continuous_squirrel.rst

  2. Добавить его в список непрерывных распределений в doc/source/tutorial/stats/continuous.rst.

  3. Обновить number of continuous distributions в примере кода в doc/source/tutorial/stats.rst.

  4. Успешно собрать документацию.

  5. Отправить PR.

Ссылки#

[JKB]

Johnson, Kotz, and Balakrishnan, “Continuous Univariate Distributions, Volume 1”, Second Edition, John Wiley and Sons, p. 173 (1994).